Der SRAM Speicher beim Arduino Uno und Nano hat 2 kByte für Variablen und Strings.
> Infos zum Arduino Speicher.
Das reicht manchmal nicht aus um alle Strings zu speichern und dann kann der Programmspeicher (FLASH) zusätzlich verwendet werden. Hier stehen immerhin 32 kByte zur Verfügung, abzüglich Programm und Bootloader. Dazu gibt es zwei Möglichkeiten.
1. Mit F() wir ein Feld definiert, dass im Programmspeicher liegen soll.
#define Ausgabe F("Dies ist ein langer Satz.")
Das kann ganz normal mit Serial.println(Ausgabe); gesendet werden.
2. Mit PROGMEM kann eine Konstante im Programmspeicher abgelegt werden. Eine Beschreibung ist hier.
const char satz[] PROGMEM = "Und noch ein langer zweiter Satz.";
Die Ausgabe ist dann etwas komplizierter und wird mir dieser Funktion erledigt.
void PPrintln(const prog_char str[]) { // PROGMEM print line char c; while((c = pgm_read_byte(str++))) // alle chars lesen Serial.write(c); // und ausgeben Serial.write('\n'); // neue Zeile }
Und wird dann einfach aufgerufen mit PPrintln(satz);
Das fertige Programm
// String aus dem Programmspeicher ausgeben // 1. mit #define // 2. mit char[] PROGMEM // // Matthias Busse Version 1.0 vom 2.11.2014 #define Ausgabe F("Dies ist ein langer Satz.") const char satz[] PROGMEM = "Und noch ein langer zweiter Satz."; void setup() { Serial.begin(38400); } void loop() { Serial.println(Ausgabe); PPrintln(satz); delay(1000); } void PPrintln(const prog_char str[]) { // PROGMEM print line char c; while((c = pgm_read_byte(str++))) // alle chars lesen Serial.write(c); // und ausgeben Serial.write('\n'); // neue Zeile }
von Matthias Busse
die Funktion PPrintln() wird eigendlich nicht benötigt,
man kann einfach schreiben:
Serial.print((const __FlashStringHelper *) satz);
[zitat]
2. Mit PROGMEM kann eine Variable im Programmspeicher abgelegt werden. Eine Beschreibung ist hier.
const char satz[] PROGMEM = „Und noch ein langer zweiter Satz.“;
[/zitaz]
[Klugscheissmodus]
wenns const ist nennt sich das Konstante nicht Variable …
[/Klugscheissmodus]
gruess
Das ist korrigiert 😉
Guten Tag alle zusammen,
für Interessierte hier noch folgender Nachtrag:
https://www.arduino.cc/reference/en/language/variables/utilities/progmem/
Unter Berücksichtigung des oben eingefügten Links genügt es sogar sich einen beispielsweise einen Wert aus eurem in der Flash Memory gespeicherten Arrays wie folgt in den SRAM zu holen:
//Hochladen in den Flashspeicher
const datatype ArrayName[ ] PROGMEM = {Wert_1, Wert_2, Wert_3, etc., }
/
/von dem Flashspeicher in SRAM holen
neuerNamedesWertes = pgm_read_word_near(ArrayName + PositiondesWertes);
Wobei natürlich wieder darauf zu achten, dass der erste Wert im Array die Position 0 und nicht 1 erhält.
Vielleicht hilft das ja dem ein oder anderen noch.
Gruß
Mr. Sensor
P.S. Es wäre nett, falls sich noch jemand zu meinem Kommentar im Artikel „Die Auflösung des ADC vom Arduino UNO erhöhen auf 16 Bit mit Oversampling“ melden würde.
http://shelvin.de/die-aufloesung-des-adc-vom-arduino-uno-erhoehen-auf-16-bit/#comment-35314