Zähler Speichern

Hallo zusammen.

Ich neu in der Arduino Welt da ich für ein Projekt einen Stückzähler benötige.
Der Zähler hat 2 Funktionen:
1: momentane Menge die Resetet werden kann
2: gesamt Zähler

das Funzt soweit auch schon.

Nur jezt sollte sich der Gesamt zähler abspeichern da zum beispiel bei einem Stromausfall nicht verloren geht. Da steh ich aber auf dem Schlauch und hoffe hier um Hilfe.

Such mal nach FRAM

EEPROM

OK und wie würde die einbindung im SKetch aussehen das es mir denn totalCounter jedes Mal Speichert und abfragt wenn der Arduino aufgstartet wird.
sorry für die dummen Fragen

Hilfe zur Selbsthilfe:
Google doch einfach nach "fram arduino" und les dich ein, bei mir war das 1. Suchergebnis ein Volltreffer.

horngha1:
Nur jezt sollte sich der Gesamt zähler abspeichern da zum beispiel bei einem Stromausfall nicht verloren geht.

Da Du nicht weißt, wann der Strom- oder ein anderer Ausfall kommt, wirst Du jeden neuen Gesamtzählerwert speichern müssen. Da wird es beim EEPROM ohne Klimmzüge langsam eng mit der Anzahl der Schreibzugriffe. Deshalb würde ich Dir auch den FRAM empfehlen. Hier gab es mal eine Diskussion dazu.

Gruß Tommy

#include <EEPROM.h>

/**
 *  dieses Programm zaehlt alle kleinen x welche du im 
 *  seriellen Montior eingibst.
 *  
 *  Du kannst den EEPROM wert sinnvoll vorbesetzen, wenn du 
 *  die *.eep Datei auf den µC brennst 
 *  
 * 
 */
uint16_t totalCounterImRam = 0;
uint16_t EEMEM totalCounterImEeprom = 0;

void serialEvent()
{
  int c = Serial.read();
  if(c=='x') 
  {
    totalCounterImRam++;
    EEPROM.put((uint16_t)&totalCounterImEeprom,totalCounterImRam);
    Serial.println("Geschrieben:"); Serial.println(totalCounterImRam);
  }
}


void setup() 
{
 Serial.begin(9600);
 Serial.println("Start");
 EEPROM.get((uint16_t)&totalCounterImEeprom,totalCounterImRam);
 Serial.println("Gelesen:"); Serial.println(totalCounterImRam);
}

void loop() 
{

}

ok sollte ich hinbekommen Danke schonmal

noch so eine Frage am Rande wie bekommt mann es hin das die Zahl bei einem 10er schritt nach links springt und nicht nach rechts?

Hi

FRAM: Das Ding kannst Du die nächsten 20 Jahre ohne Unterbrechung mit Daten zumauern, ohne auf den Speicher achten zu müssen - sagt zumindest der Hersteller.
Habe selber 4kb(=512Byte) als DIP und 256kb(=32kByte) als SOP8 (??) zum Spielen hier.
Bisher keine 20 Jahre :wink:

Beim EEprom hast DU das Problem, daß das Ding beim Schrieben verschleißt - wenn Du in jeder Runde den Wert einträgst, ist der Speicher ruck zuck platt.
Wenn Du den Wert nur bei Änderung einträgst, hält auch Das ewig - Du musst halt prüfen, ob sich Dein Wert geändert hat (hat die EEprom-Lib aber wohl eine Methode für).
Wenn Du nur schrieben willst, wenn’s wirklich nögig ist, musst Du noch die Versorgungsspannung überwachen und den Arduino mit gepufferter Energie so lange am Leben halten, bis die Werte sicher geschrieben sind - Das wäre nur mit zusätzlicher Hard- und Software möglich.

Meine Variante wäre wohl der FRam, auch, weil Der schon da ist.
Danach EEprom ‘nur bei Änderung’ - wobei das EEprom schon im Arduino drin verbaut ist, also keinerlei Zusatz-Hardware braucht.

MfG

PS: Ich denke, Dein ‘links springen’ soll bedeuten, daß die 10 halt eine Stelle weiter Links begonnen werden soll?!?
Fange weiter Links mit dem Schreiben an :wink:
ABER: Mache Leerzeichen für führende Nullen.
Zahl:38, Ausgabe mit bis zu 5 Stellen
Ist Zahl<10000 → Leerzeichen
Ist Zahl <1000 → Leerzeichen
Ist Zahl <100 → Leerzeichen
Ist Zahl <10 → Leerzeichen, da wir über >=10 sind, Abbruch(bzw. kein Leerzeichen)
Print Zahl (hier wird die 38 2 stellig ausgegeben)

Die 0 und jede 1-stellige Zahl wird eh 1-stellig ausgegeben.

MfG²

wie würde das dann im sketch aussehen?

Z_hler_ohne_Speicher.ino (1.5 KB)

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

#include <LiquidCrystal.h>

const int  DetectorPin = 8;
const int  ResetButton = 9;


int Counter = 0;   // counter number of cookies temporarily
int CounterTotal = 0; // counter number of cookies total

int DetectorState = 1;         // current state of the Detector
int lastDetectorState = 1;     // previous state of the Detector
int ResetState = 0;            // state of the Reset Button
int buttonState = 0;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);  // initialize the library with the numbers of the interface pins

void setup() {
 
  pinMode(DetectorPin, INPUT);
  pinMode(ResetButton, INPUT);
  
  lcd.begin(16, 2);

  lcd.setCursor(0, 0);
  lcd.print("curr.:");
  lcd.setCursor(0, 1);
  lcd.print("Total:");

}

void loop() {

  lcd.setCursor(10, 0);
lcd.print(Counter);

  
  
  lcd.setCursor(10, 1);

  lcd.print(CounterTotal);
  

  DetectorState = digitalRead(DetectorPin);
  ResetState = digitalRead(ResetButton);

  // compare the buttonState to its previous state
  if (DetectorState != lastDetectorState) {
    // if the state has changed, increment the counter
    if (DetectorState == HIGH) {
      // if the current state is HIGH then the button
      // wend from off to on:
      Counter++;
      CounterTotal++;
    } 
  }
  
 lastDetectorState = DetectorState;

 if (ResetState == HIGH) {
  Counter = 0;
 
  lcd.setCursor(10, 0);
  if (Counter < 100) lcd.print("   ");
  if (Counter < 10) lcd.print("   ");
  lcd.print(Counter);
 }
 
delay(50);
}

Hi

… fast … :wink:

Davon ab - kann der Counter auch negativ werden? Nein? Warum dann int?

if (counter<10000) lcd.print(" ");
if (counter<1000) lcd.print(" ");
if (counter<100) lcd.print(" ");
if (counter<10) lcd.print(" ");
lcd.print(counter);

Jeweils nur 1 Leerzeichen pro überprüfter Stelle.
Man kann Das auch in einer Schleife machen - müsste man Mal schauen, was Das bringt.

MfG

nein Momentaner Zähler geht bis 120 Stück und wird dann resetet und der Gesamte zählt einfach hoch

Hi

BYTE 0...255
unsigned INT 0 ... 65535
INT -32768 ... 32767

Bei den SIGNED-Typen ist der halbe Bereich negativ.
Du brauchst einen Zähler bis 120 - da würde Byte reichen, sogar für die doppelte Menge.
Da Das aber wirklich kein Brot frisst, würde ich hier 'Fünfe gerade sein lassen' und beide Zähler in 32bit auslegen - macht 2x 4 Byte - gibt Schlimmeres.

Da Du wohl nach jedem Count den aktuellen Stand (Hübe ect.pp.) speichern willst, wäre meine Wahl weiter ein FRam FRam 4kb=512 Byte, eBay.
Tommy hatte dazu Mal eine Lib kreiirt, wenn ich Das richtig im Kopf habe - sonst gibt's für die FM24C04A (die 04 sind die 04 kilo bit) auch Lib's in der IDE.

... wobei ein EEprom auch 100000 Schreibzyklen aushält - wenn man jeden neuen Wert immer hinten dran schreibt, muß man nur 1x löschen, wenn Alles so weit vollgeschrieben ist - wird wohl auch 'etwas länger dauern', bis Dem so ist und dann das EEprom 100000x überschrieben wurde.
Blöd - Du hast immer noch die Wahl - Beides ist möglich.

MfG

PS: Im Nachbar-Thread geht's ebenfalls um EEprom:EEPROM-Wert über Tastendruck höher/niedriger machen

postmaster-ino:
... wobei ein EEprom auch 100000 Schreibzyklen aushält - wenn man jeden neuen Wert immer hinten dran schreibt, muß man nur 1x löschen, wenn Alles so weit vollgeschrieben ist - wird wohl auch 'etwas länger dauern', bis Dem so ist und dann das EEprom 100000x überschrieben wurde.

Dann brauchst Du aber eine Möglichkeit zu erkennen, wo der letzte Wert steht und wo der nächste Wert hin soll.

Den Thread mit der Lib zum FRAM habe ich schon verlinkt.

Gruß Tommy

Die Hersteller von Tachos hatten einige sehr interessante Tricks für den Kilometerzähler, als es FRam noch nicht gab, und EEPROM auch noch kleiner und teurer waren.
Z.b. nur jeden hundertsten Kilometer als Wert speichern, und die hundert dazwischen als einzelne bits auf hundert verschiedene Adressen. Schon hat man die Anzahl der Schreibzyklen um den Faktor 100 veringert.
Heutzutage mag das vielleicht nicht mehr so nötig zu sein. Aber ich finde sowas als Herausforderung zu sehen ist eine nette Übung um eine gewisse Kreativität beim Umgang mit den Daten zu lernen.

Hi

@Tommy
Du liest einfach, bis Du einen 'leeren' Wert liest, also eine 'leere' EEprom-Stelle.
Wenn Du damit an das Ende kommst, ganze EEprom löschen und vorne mit Schreiben wieder beginnen.

Bei den Möglichkeiten der FRam aber nur eine Überlegung wert, wenn man Das Alles 'im Chip' haben will.
Externe Hardware kommt eh noch drum herum, da fällt ein 8-Beiner (512 Byte FRam) nicht weiter auf.

MfG

@postmaster-ino: Ich kenne die Varianten. Ich dachte eigentlich der TO würde mal zum Denken angeregt.

Gruß Tommy