INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
digitale Werte trotz Stromunterbrechung nicht verlieren
29.12.2015, 14:20
Beitrag #25
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
jetzt gibt es keine fehlermeldung mehr - also funktionierts irgendwie - aber es zählt nicht - gibt immer dieselbe zahl raus

ich hab's mit
counter = counter + 12.732;
probiert - keine auswirkung - muss ich eine neue variable schreiben, wo die zahl, die ausgelesen wird, reingeschrieben wird und dann damit weitergezählt werden kann?

ich verwende arduino um den code zu schreiben - wieso?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2015, 14:53
Beitrag #26
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
Ich kapiere einfach nicht, wieso ein Float Wert mit jedem Tastendruck um eine "krumme" Float Zahl erhöht werden muss.

Die Frage war hier schon einmal:

Ist der Zählerwert statisch ?

Wenn Ja, dann könnte man doch in Ganzzahlen arbeiten und Diese mit dem statischen Float-Wert multiplizieren.

Ganzzahlen lassen sich doch viel einfacher handeln beim Speichern, als Floats.

Nehmen wir an, wir wollen den Kilometerstand am Fahrrad speichern:

Jede Radumdrehung mach 2,69 Meter.
Jede Radumdrehung wird gezählt.
nach 88 Umdrehungen hat man 88 x 2,69 Meter = 236,72 Meter.

die Ganzzahl 88 benötigt als INT Variable 2 bytes
Den Float muss man mit 4 bytes speichern.

Wenn man jetzt noch etwas Toleranz zulassen kann, aktualisiert man erst alle 10 Radumdrehungen, sprich alle 26,90 Meter.
Dadurch reduziert man den "Speicherverschleiss" aber um 90%.

Also worum gehts hier eigentlich genau ?

Binatone
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2015, 15:30
Beitrag #27
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
ja die zahl die gezählt werden muss ist statisch - ist immer die gleiche.
sorry für die verwirrnis - ich dachte, ich müsste das resultat speichern und nicht nur die anzahl klicks
wie müsste ich das denn schreiben, wenn man nur die klicks zählt, diese ausliest und danach mit der zahl multipliziert?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2015, 16:20 (Dieser Beitrag wurde zuletzt bearbeitet: 29.12.2015 16:26 von avoid.)
Beitrag #28
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
sorry, aber jetzt fühle ich mich schon etwas verarscht ...
ein par tastendrücke zu zählen ist so einfach das du es selbst hin bekommen solltest.
zumindest Google auf zu rufen und dort eine suche danach zu starten sollte drin sein. Undecided
https://www.google.de/?gws_rd=ssl#q=ardu...%C3%A4hlen

so unglaublich es scheinen mag, es gibt sogar hier im Forum eine Suchfunktion und Beiträge die schon das eine oder andere behandelt haben. Wink
http://www.arduinoforum.de/arduino-Threa...astendruck

---- nachtrag ----
genau genommen lernst du alles nötige aus dem Beispielsketch "Digital->Button" und "Digital->Debounce".
hochzählen ist dann nur noch Nebensache so wie das multiplizieren mit irgendwas um z. b. eine Entfernung an zu zeigen.

Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2015, 16:35 (Dieser Beitrag wurde zuletzt bearbeitet: 29.12.2015 18:25 von goldfisch.)
Beitrag #29
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
hey - sorry! ich will dich ganz sicher nicht verarschen... mir ist einfach das berühmte licht nicht aufgegangen IdeaSad

jetzt zählt es und ich kann es auch im eeprom abspeichern und wieder lesen - auch nach stomunterbruch ist die zahl noch da - aber - nach 256 x klicken ist schluss - da fängt er wieder vorne an.
das liegt ja jetzt wohl an der adresse, die ich mit EEPROM.write(254,(counter)); irgendwie fix belege und die ist nach 256 x klick voll.
was muss ich jetzt machen, damit ich 300'000 x clicken kann? und er keine altlasten von bereits beschriebenem mitnimmt?

ich hab jetzt mit hilfe der examples
https://www.arduino.cc/en/Tutorial/EEPROMWrite
https://www.arduino.cc/en/Tutorial/EEPROMRead

versucht, höher als 255 zu zählen - leider funktioniert es nicht - es hüpft jetzt glaub von adresse zu adresse - zählt aber nicht mehr - und innerhalb der einnzelnen adresse geht es ja auch nicht weiter als bis 255.

ich weiss nicht, wie ich das schreiben muss, dass es klappt - bitte helft mir weiter Undecided
hier ist mein script

Code:
// include the library code:
#include <LiquidCrystal.h>
#include <EEPROM.h>

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

// set pin numbers:
const int switchPin =2; // choose the input pin (for a pushbutton)
const int ledPin = 13; // choose the pin for the LED


int val = LOW; // variable for reading the pin status
int tasterGedrueckt = 0;          // abfragen ob Taster gedrückt war
int counter = 0;
int ledStatus = LOW;

int entprellZeit = 200;           // Zeit für Entprellung, anpassen!

unsigned long tasterZeit = 0;     // Zeit beim drücken des Tasters
unsigned long ledMillis = 0;      // Zeit für den Blinkrythmus der LED

float multipliziert = 0;

int addr = 0;//aus eeprom-write
byte value;// aus eeprom-read


void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  
  lcd.print("m done ");lcd.print(EEPROM.read(addr));lcd.print("acl");

  
    // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(switchPin, INPUT);
  Serial.begin(9600);
  
  lcd.setCursor(0, 1);
  //lcd.print(EEPROM.read(254)*1.5);lcd.print(" m");//als startanzeige nach unterbruch
   lcd.print(EEPROM.read(addr)*1.5);lcd.print(" m");//als startanzeige nach unterbruch
    Serial.print(EEPROM.read(addr)*1.5);Serial.println(" m startanzeige aus addr");//als startanzeige nach unterbruch
    Serial.print(EEPROM.read(addr));Serial.println(" anzahl clicks als startanzeige");
}

void loop() {

  // int val = analogRead(0) / 4;//aus eeprom write script - brauche ich nicht oder? bin ja auf digitalRead

  
     // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 1);
  
val = digitalRead(switchPin); // read input value


if (val == HIGH) { // check if the input is HIGH (button released)
    tasterZeit = millis();      // aktualisiere tasterZeit
    tasterGedrueckt = 1;        // speichert, dass Taster gedrückt wurde
  }
  
// Wenn die gewählte entprellZeit vergangen ist und der Taster gedrückt war...
  if ((millis() - tasterZeit > entprellZeit) && tasterGedrueckt == 1)
    {
      

  value = EEPROM.read(addr) + 100;  
  counter = value;
  
      //counter = EEPROM.read(254) + 1;             //  wird um +1 erhöht
      tasterGedrueckt = 0;      // setzt gedrückten Taster zurück

   //aus eeprom-read
  Serial.print(addr);
  Serial.print("\t");
  Serial.print(value, DEC);
  Serial.println();

  
    multipliziert = counter * 1.5;
      
    //EEPROM.write(254,(counter));
    
    //EEPROM.write(addr, val);//original aus eeprom-write
    
    EEPROM.write(addr,(counter));
    
  
  addr = addr + 1;
  if (addr == EEPROM.length()) {
    addr = 0;
  }
  
        lcd.print(multipliziert,3);lcd.print(" m ");
       // lcd.print(counter,3);lcd.print(" m ");
        Serial.print(counter);Serial.println(" ganzzahl aus counter");

          Serial.print(multipliziert,3);Serial.println(" m aus multipliziert");

        //Serial.print(EEPROM.read(254));Serial.println(" anzahl klicks als ganzzahl aus EEPROM ");Serial.println();
        Serial.print(EEPROM.read(addr));Serial.println(" anzahl klicks als ganzzahl aus EEPROM addr ");Serial.println();
      
         lcd.print(counter);lcd.print(" cl");    
    }
  
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2015, 18:29 (Dieser Beitrag wurde zuletzt bearbeitet: 29.12.2015 18:36 von Binatone.)
Beitrag #30
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
ganz einfach:
MEHRERE Bytes im Eprom belegen

Entweder, eine unsigned INT (4 bytes) über diese "Bytemühle" - Methode aufdröseln und 4 bytes speichern.
Achtung, bei 100.000 mal neu schreiben ist schluss.

Oder:
hmmm....
Das jetzt in Worte zu fassen, fällt mir echt schwer und ist ganz sicher nicht das, was man als "NonplusUltra" werten kann.
Den gesamten Speicher gleichmäßig nutzen.
Verwende das erste byte eprom(0) als Multiplikator-Zähler von 0-255, die anderen (1-1023) als eigentlichen Zähler.

Ich versuchs mal so:
Am Anfang erstmal ein Sketch, was alle Speicherzellen auf 0 setzt. (Den Sketch später wieder überschreiben)
Dann mit Speicherzelle 1 anfangen, bis sie den Wert 255 enthält, dann eine Speicherzelle weiter gehen.
Auf diesem Weg, bis Du in Zelle 1023 bist.
Ist diese auch voll, erhöhst Du den Wert in Zelle 0 um 1 und setzt gleichzeitig alle Werte in Zelle 1-1023 wieder auf null.
So wird jede Zelle 256 mal pro Durchlauf neu beschrieben und du hast 255 Durchläufe, also schreibst Du 65280 mal in jede Speicherzelle des Eproms. (also Zelle 1-1023)
Du kannst damit aber Zahlen speichern von 1 bis 255*255*1023 = 66.520.575
Bei einem Radumfang (Beispiel Fahrrad) von 2,5 Meter sind das "nur" 66520575*2,5/1000 = 166.301 km
Wenn Du jetzt nur jede vierte Radumdrehung zählst (sprich alle 10 Meter) sind das 665.205 km
Ich glaub, wenn man die abgestrampelt hat, ist das Rad eh durch Big Grin

Binatone
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2015, 18:58
Beitrag #31
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
ok - das beispiel mit dem rad ist gut
- dann würde ich als erstes das eeprom_clear aus den beispielen übers arduino laufen lassen. das ergäbe ja dann überall 0.
soweit kann ich folgen Smile
Zitat:Dann mit Speicherzelle 1 anfangen, bis sie den Wert 255 enthält,
das kann ich mir auch noch vorstellen - aber
Zitat:dann eine Speicherzelle weiter gehen.

ich kann es mir zwar vorstellen, wie es funktionieren soll aber ich weiss nicht, wie ich das schreiben muss - ganz praktisch - kannst du mir ein praktisches beispiel machen? also richiger code? wäre echt froh Undecided
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
29.12.2015, 19:04
Beitrag #32
RE: digitale Werte trotz Stromunterbrechung nicht verlieren
wenn ich das richtig verstehe bist du nun wieder bei int anstelle von float?
dein int wert besteht aus zwei Byte, du speicherst aber nur in eine speicherstelle des eeprom, also auch wieder nur einen teil deiner zahl.

   
Ich hoffe das Bild veranschaulicht es verständlich.

versuche mal das hier für dich zu adaptieren:
Code:
#include <EEPROM.h>
int counter = 1234; // dein 16 bit (2 byte) großer wert.  (int = highbyte & lowbyte)
int adresse = 256;  // max. 512 speicherstellen nutzbar.

void setup() {
   Serial.begin(9600);
}

void loop() {
  // so kannst du zweibyte werte speichern
  EEPROM.write(adresse,highByte(counter));   // speichert die oberen 8 bits der variablen an die angegebene adresse des eeprom
  Serial.println("HighByte ist: "); Serial.println(highByte(counter));
  EEPROM.write(adresse+1,lowByte(counter));  // speichert die unteren 8 bits der variablen hinter die angegebene adresse des eeprom
  Serial.println("LowByte ist: "); Serial.println(lowByte(counter));
  
  // so kannst du zweiByte Werte wieder lesen
  counter = (EEPROM.read(adresse))*256 + EEPROM.read(adresse+1);
  Serial.println("Counter ist: "); Serial.println(counter);
  
  delay(5000);
}

Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Arduino lässt sich nicht installieren bergfrei 4 155 20.11.2016 18:34
Letzter Beitrag: bergfrei
  Arduino Mega 2560 läuft nicht Wolfgang50 6 189 13.11.2016 10:50
Letzter Beitrag: Wolfgang50
  Ardublock übertragt nicht an IDE oder UNO R3 tobi83 5 361 16.10.2016 14:07
Letzter Beitrag: Pit
  Upload funktioniert nicht Levi 5 250 22.09.2016 20:19
Letzter Beitrag: hotsystems
  ESP8266 tuts nicht sowerum 7 397 19.09.2016 21:01
Letzter Beitrag: sowerum
  If-Bedingung funktioniert nicht bei Serial1.write Datatom 6 227 16.09.2016 20:36
Letzter Beitrag: Datatom
  SD Karte wird nicht erkannt... Maxi290997 2 209 16.08.2016 14:36
Letzter Beitrag: Maxi290997
  Arduino lässt sich nicht mehr beschreiben Maxi290997 15 989 07.08.2016 11:40
Letzter Beitrag: Maxi290997
  Arduino Uno+Motor Shield+Velleman Mustercode funktionieren nicht Dubidu 8 492 20.07.2016 19:05
Letzter Beitrag: Scheams
  Sketch konnte nicht angelegt werden Sarius 2 244 16.07.2016 15:59
Letzter Beitrag: Sarius

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste