*Arduino* Zahlenwert Speichern, auch wenn Arduino ausgeschaltet wird

freak1051

Ensign
Registriert
Dez. 2012
Beiträge
197
Hallo Boardies,

Papa war mal wieder am Arduino Spielen, kommt Mama und sagt, mach doch mal was gescheites damit, bisher mahcht des ding ja noch nicht viel...(Typisch Frauen :) )

Ich wagte es zu fragen, was denn etwas gescheites wäre, und sie meinte, na so n Gießcomputer zum Beispiel. Abgesehen davon, das son fertiges Dingens günstiger kommt, hat mich dennoch der Ehrgeiz gepackt.

Vorab: es existiert noch keine Zeile Code! UND: Ja, ich bin Elektrofachkraft, warum seht ihr unten :)

Hier mal mein "Brainstorming":

Eingesetzt wird ein Arduino Nano v3. Dieser ist mit einer 2-Kanal-Relais Karte getuned, die dann 2 Aquariumpumpen ansteuern soll (5 Sicherheitsregeln...). (Ich fragte auch, warum müssen es denn 2 Pumpen sein?!? " Na Tomaten brauchen nicht so viel Wasser wie Gurken"...oder so:cool_alt: )

Anfänglich habe ich mit dem Gedanken gespielt über bekannte Feuchtigkeitssensoren die Bodenfeuchte zu messen. Die Idee wurde abgeschafft. Erstens zu viel Verkabelungsuafwand und 2. sollen die dinger anscheinend nach ner weile Korrodieren und mehr schätzen als messen.

Da die Pflanzis nachts nicht so viel/kein Wasser benötigen kommt ein RTC Modul zum Einsatz (DS1307)

Also kam mir der Gedanke, ich lass die Pumpen immer 10 Sekunden laufen, und das in einem Abstand x, welchen ich über 2 Inkrementalgeber einstelle. (habe ich noch nie eingesetzt, aber belesen, dürfte kein Problem sein. Man(n) wächst mit seinen Aufgaben)

Angezeigt wird die Zeit Per Display. So kann Mama dann am Geber drehen und für jede Pflanze/Beet einzeln einstellen, wie viele Minuten zeit zwischen den 10 Sekunden gepumpe liegen soll.

Weiters kommt ein Ultraschall Sensor zum einsatz, der den Wasserstand im Reservoir misst, um ein Trockenlaufen der Pumpen zu vermeiden.


Woran hänge icht jetzt? Falls mal Stromausfall sein sollte, werden die beiden Zählerwerte, welche ich mit dem Inkrementalgeber verändere wieder initialisiert. Würde ich nun als Default-Wert 0 vergeben, würde im abstand von 0 Minuten die Pumpen 10 Sekunden laufen. Die Sauerei wäre egal, aber das geschrei von Mama, weil ich die Pflanzen ersaufe.... Klar am einfachsten wäre es, den Default wert auf meinetwegen 30 zu setzen, damit bei Initialisierung es vielleicht kein optimales Gießergebnis gibt, aber wenigstens die Pflanzen nicht sterben.

Nun dachte ich mir, dass der Arduino ja einen nicht flüchtigen Speicher hat. Also wäre es ja nicht dumm, die eingestellten Werte in besagten Speicher zu setzen. Wäre ja die vornehmste Variante. Nun habe ich mich dies Bezüglich belesen. Mir ist klar, dass ich dieses Speicher nicht unendlich beschreiben kann. Allerdings ist fraglich ob ich das muss. Eigentlich beschreibe ich den Speicher bei Wertänderung. Anfangs, bis sich alles eingependelt hat, wird dies evtl öfter Passieren, aber keine 1000 mal. Wäre also vertretbar. Hier Problem 1: Ich habe irgendwie keine gescheite "Anleitung" im Netz gefunden, wo mir sagt, wie ich son wert in den EEprom bringe. Dachte mir irgendiwe wenn Istwert != letzerwert dann befeuere den Prom... Wäre super wenn mir da Schon jemand helfen könnte.

Weiters bin ich dann aber bei meinen Recherchen eben auf mein RTC modul gestolpert, welches ja auch einen nicht flüchtigen, Batteriegepufferten Speicher hat. Nun gibt es ettliche Bib´s für den DS1307. Alle hab ich sie geladen, aber keie behandelt das Flash speichern.

Nun habe ich auch gelesen, dass wenn die Batterie des RTC Moduls leer ist, die Daten auch weg sind. Also denke ich werde ich zur Arduino EEPROM variante Tendieren. Ich habe irgendwas um die 100.000 schreibzyklen gelesen, und diese übersteige ich niemals. Allerdings würde es mich dennoch Interessieren, wie das mit dem RTC funktioniert.

Nun wäre wirklich super, wenn mir jemand mit meinem Problem1 : EEPROM befeuern helfen könnte. Falls Jemand sich mit Problem2, DS1307 auskennt wäre es interessehalber aber auch interessant, zu wissen wie es da geht.

Ich danke euch schon mal

Daniel
 
Hallo,
Arduino hat für fast alles fertige Funktionen. Schau einfach mal hier:
https://www.arduino.cc/en/Tutorial/EEPROMWrite

Scheint recht einfach zu sein:
#include <EEPROM.h>
byte value;

EEPROM.write(addr, value);

value = EEPROM.read(address);

Laut dem hier hat der Atmega8 512 Byte:
https://www.mikrocontroller.net/articles/AVR-Tutorial:_Speicher
D.h. die Adresse muss zwischen 0 und 511 liegen.

Wegen Stromausfall. Hier ist eine Idee von der ich mal gelesen habe: Um die Schreibzyklen zu reduzieren kann man auch einen großen Kondensator/Goldcap als Puffer für die Stromversorgung verwenden und dessen Spannung analog überwachen. Sobald die beginnt runterzugehen, kann man die benötigten Daten noch schnell wegspeichern. Hab das aber selber nie probiert.

Zum RTC: Hier ist das Datenblatt
https://datasheets.maximintegrated.com/en/ds/DS1307.pdf
Der wird über I2C angebunden. Der RAM hat die Adressen 0x08 bis 0x3F. I2C Adresse ist 0b1101000 = 104. SDA ist Pin A4, SLC ist Pin A5.
Dafür gibts die Wire Bibliothek:
https://www.arduino.cc/en/Reference/Wire
Geht etwa so:
#include <Wire.h>

// Schreiben
Wire.beginTransmission(104);
Wire.write(byte(0x08)); // Adresse
Wire.write(byte(value)); // Wert
Wire.endTransmission();

// Lesen
Wire.beginTransmission(104);
Wire.write(byte(0x08)); // Adresse
Wire.endTransmission();
Wire.requestFrom(104, 1);
if (Wire.available()) value = Wire.read();
Ich besitze selber keinen Arduino. Ist schon eine Weile her das ich was damit gemacht habe. Deshalb kann ich den Code nicht testen (ist eh unvollständig). Aber das sollte mal eine ungefähre Orientierung geben.
 
Zuletzt bearbeitet:
Wie wäre es, wenn du einfach jede Minute prüfst, ob sich dein Wert geändert hat und nur dann den EEPROM beschreibst. Damit reduzierst du die Last stark und bekommst trotzdem starke Robustheit gegen Stromausfälle.

Zusätzlich kannst du die Schreibvorgänge auch noch über den EEPROM verteilen, um die einzelnen Zellen zu entlasten. Dazu wählst du nur einen kompletten Adressblock im EEPROM aus, nullst diesen komplett und schreibst von da an den nächsten Wer immer in die nächste freie Zelle. Beim einschalten suchst du die letzte Zelle in der keine Null steht und übernimmst diesen Wert. Ist der Block komplett voll, nullst du ihn einfach wieder vor dem nächsten Schreibvorgang. So kannst du alle Schreibzugriffe auf einem beliebig großen Teil des EEPROMs verteilen.

BTW: Da missverständlich, "nullen" soll heißen löschen, was bei einem EEPROM eher "einsen" heißen sollte.
 
Zuletzt bearbeitet:
tree-snake schrieb:
Statt den DS1307 RTC nimmlieber einen PCF8523 oder sowas.


Es wär ab und an von Vorteil zu erwähnen, warum der denn besser sein soll?!?!

" nimm Lieber nen Benz, bevor du nen BW nimmst...." Warum?
Ergänzung ()

michi.o schrieb:
Hallo,
Arduino hat für fast alles fertige Funktionen. Schau einfach mal hier:
https://www.arduino.cc/en/Tutorial/EEPROMWrite

Scheint recht einfach zu sein:


Laut dem hier hat der Atmega8 512 Byte:
https://www.mikrocontroller.net/articles/AVR-Tutorial:_Speicher
D.h. die Adresse muss zwischen 0 und 511 liegen.

Wegen Stromausfall. Hier ist eine Idee von der ich mal gelesen habe: Um die Schreibzyklen zu reduzieren kann man auch einen großen Kondensator/Goldcap als Puffer für die Stromversorgung verwenden und dessen Spannung analog überwachen. Sobald die beginnt runterzugehen, kann man die benötigten Daten noch schnell wegspeichern. Hab das aber selber nie probiert.

Zum RTC: Hier ist das Datenblatt
https://datasheets.maximintegrated.com/en/ds/DS1307.pdf
Der wird über I2C angebunden. Der RAM hat die Adressen 0x08 bis 0x3F. I2C Adresse ist 0b1101000 = 104. SDA ist Pin A4, SLC ist Pin A5.
Dafür gibts die Wire Bibliothek:
https://www.arduino.cc/en/Reference/Wire
Geht etwa so:

Ich besitze selber keinen Arduino. Ist schon eine Weile her das ich was damit gemacht habe. Deshalb kann ich den Code nicht testen (ist eh unvollständig). Aber das sollte mal eine ungefähre Orientierung geben.

Na de ist ja mal super, damit kann ich auf jeden fall was anfangen.

Wie gesagt:
1. haben wir nicht so viele Stromausfälle, dass es warscheinlich großartig zum tragen kommt.

2. denke ich, werde ich sogar einen kleinen Umweg gehen. Meine Inkrementalgeber haben ja einen Klick. Ich werde einfach per klick das zeug in den EEprom schreiben. So kann man rumprobieren, bis die Wassermenge passt, und danach klick ab in EEPROM.

Werde auf jeden Fall beide Varianten Testen, dann aber wenns klappt eher auf das RTC speichern, des kostet 4 €.


@NeoExacun: Hast du absolut recht, aber wie gesagt, ich denke nicht dass ich den aufwand betreibe wegen vllt 100 Speicherzyklen. Wenn Mama dann mal zufreiden ist, kann man dann damit mal am richtigen Bord rumspiele:)
 
Zum Thema Brainstorming... Meine Gedanken:

Also wenn du an der Stelle noch WLAN empfang hast kannst du auch einen ESP8266 oder einen ESP32 verwenden und die Uhrzeit übers Internet abfragen. Die Uhrzeit brauchst du, weil man Pflanzen gängiger Weise dann gießt, wenn die Sonne nicht gerade auf 12 Uhr steht. Ansonsten tut es ein RTC auch.

Die Sache mit dem EEPROM würde ich komplett sein lassen und einfach analoge Potentiometer verwenden. Dieser Gedanke Verträgt sich aber nicht sonderlich gut mit der WLAN Geschichte aber analoge Potis sind deiner Frau bestimmt auch lieber.

Zur Thema EEPROM… Wenn man einmal pro Stunde einen Wert in den EEPROM schreibt hält dieser 10 bis 100 Jahr.

@NeoExacun Danke für das Beispiel! Ich habe schon von ähnlich Techniken gehört aber noch nie wie man es genau umsetzt.
 
Servus SupaKevin,

Das ist der nächste Step. Aktuell muss ne "schnelle" Lösung her. Der Zweite schritt ist dann mit ner NodeMCU das ganze "Smart" zu machen. Evtl sogar mit nem Webinterface. und spätestens dann sind meine Potis auch wieder doof. Wenn ich die Werte auch "Online" ändern kann sind die Inkrementalgeber doch wieder geschickter.

Das mit dem Potis is so ne Sache. 1. Würde ich gerne die Geber so mal testen und 2. meinte sie schon "Des is ja voll Oldscool, die kann man ja gar nicht so toll im Kreis drehen" ;´:) Immer diese Ansprüche

Aber 10-100 Jahre sind ne Zeit, für das ich das ding gerne auslege. Und ich werde nicht stündlich schreiben. ich schreibe bei Wertänderung. Klar hab ich die Anfangs öfter, bis sich alles eingependelt hat, aber wenns läuft ändert sich da eigentlich nichts mehr, bis nächstes Jahr.
 
Zurück
Oben