Ich habe den Arduino Uno und wollte damit mal ein Temperaturlog erstellen.
Nur friert mir das Programm ein bzw. läuft nicht mehr sauber (Zeichen im Display werden verändert/weggelassen, ebenso bei Serieller Schnittstelle)
wenn ich die Arraygröße veränder.
Mein plan war die Temperaturwerte Minütlich in ein Array zu schreiben welches 1500 Werte fassen sollte. (wenn es voll währe beginnt es wieder von vorn)
Werteformat Float was dann 4Byte * 1500 = 6KByte entsprechen würde.
Ohne Array speicherung läuft das Programm, mit friert es ein.
Der Compiler bringt auch keinen fehler und platz sollte eigentlich genug sein.
Das Programm selbst wird mit ca 7KByte angezeigt, der Bootloader soll ja ca 2KByte haben plus das Array 6KByte (was komischerweise nicht in der Compilermeldung eingerechnet wird) machen ca 15KByte was ja grade mal die hälfte des platzes auf dem Controller ist.
Ein ATmega ist nach der sogenannten Harvard-Architektur aufgebaut. Dabei gibt es getrennte Speicherbereiche für Programm und Daten. Die 32 KB Speicher des ATmega 328 auf dem UNO sind nur für den Programmcode. Der Datenspeicher beträgt nur 2 KB.
Variablen werden im Ram abgelegt. Der ATmega328 des Arduino UNO hat 2kByte davon. Im Ram werden außer den Variablen des Sketches auch noch Variablen der CPU für die Ausführung des Sketches und der Stack abgelegt.
Wenn Du nun 6kByte an Variablen benutzt werden andere Variablen überschrieben und Du hast komische, nicht vorhersagbare Reaktionen von Arduino.
Um Dir zuvorzukommen die Bibliothek PROGMEM speichert Variablem im Flash-Speicher, aber nur solche die sich nicht ändern und die bei der Kompilierung bereits Werte haben, also zB die Texte für die Ausgabe aufs Display, Arrays des Zeichensatzs für bestimmte Grafikdisplays ecc.
Der ATmega hat 1kByte EEPROM intern, die nicht verwendet werden. Die kannst Du banutzen, aber für 1500 Werte sind das zuwenig Speicher. und die Schreibzyklen des Internen EEPROM sind aber nur 10000 garantiert.
Wieso Speicherst Du die Werte als Float ab? Kannst Du sie nicht mit 10 oder 100 multiplizieren damit Dezimalstellen möglich sind und als Int-Variable speichern? Das spart Die Hälfte an Platz.
Lösungen:
ein esternes EEPROM das über I2C oder SPI angebunden wird. Braucht eien Pause von ca 6mSek zwischen 2 Schreibzyklen und verträgt ca 1000000 Schreibzyklen.
ein externes FRAM. Wird gleich wie das EEPROM programmiert braucht aber keine Programmierzeit beim Schreiben und verträgt praktisch unendlich viele Schreibzyklen. Ist etwas teurer. Hersteller ist Ramtron.
SD-Speicherkarte: Daten werden normalerweise in Files abgelegt, müßte aber auch möglich sein Speicherbereiche direckt zu adressieren. Vorteil: fast unendlich viel Platz und Download der Daten falls als File abgelegt über einen Kartenlesen in einen PC.
Arduino Mega nehmen, der hat einen Controller mit 4kByte EEPROM und die Temperaturwerte als Int abgelegt hätten Platz. Ist aber teurer als die vorherigen Lösungen. und größer. Ein Seeeduino Mega wäre kleiner. Die Schreibzyklen des Internen EEPROM sind aber nur 10000 garantiert.
ein externes FRAM. Wird gleich wie das EEPROM programmiert braucht aber keine Programmierzeit beim Schreiben und verträgt praktisch unendlich viele Schreibzyklen. Ist etwas teurer. Hersteller ist Ramtron.
Ist nicht so einfach. Es ist möglich aber ich kanns Dir nicht sagen.
Versuchs mal mit einem Array von 200 und schaust ob alles funktioniert. Dann erhöhe die Arraygröße u nd kontrollierst wieder. ecc
Grüße Uwe