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
Float Werte im EEPROM speichern
21.12.2020, 15:24 (Dieser Beitrag wurde zuletzt bearbeitet: 21.12.2020 23:41 von Bitklopfer.)
Beitrag #1
Float Werte im EEPROM speichern
Hallo Programmierer, Bastler und Forum-User,

dank der netten Beigabe ADHS habe ich Probleme mich zu konzentrieren und Strukturen zu erkennen bzw selber Strukturiert zu arbeiten. Derzeit befinde ich mich in Quarantäne. Zum Glück bisher ohne Symptome.

Zu meinem Problem: für den "Bordcomputer" eines Trabant möchte ich 3 Werte in den EEprom schreiben.

float Durchschnitt = 1.00; // 1.00 damit er im beim Start und 0km keine Grütze anzeigt
float Umfang = 0.000; // in Metern um ja genau zu messen
float? long? Gesamt_KM = 0.00 // Int fällt wegen 32767 km aus

Ich benutze einen Nano.

diese Werte sollen in den Eeprom beim abstellen des Fahrzeuges geschrieben und beim Start auch wieder ausgelesen werden. Es gibt viele Beispiele im Netz aber ich verstehe die Struktur dahinter nicht.

Den Rest vom Sketch habe ich mit 278 Zeilen hinbekommen. Vom Tankinhalt auslesen und anzeigen bis hin zum Momentanverbrauch. Hierzu habe ich vom "Mäusekino" die Zählimpulse je Liter ermittelt.

Klar, es ist doof andere für sich arbeiten zu lassen aber ich bin hier einfach an meine Grenzen gestossen...

Also wer hilft?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.12.2020, 15:36 (Dieser Beitrag wurde zuletzt bearbeitet: 21.12.2020 23:42 von Bitklopfer.)
Beitrag #2
RE: Float Werte im EEPROM speichern
Dann zeige uns doch mal Deinen bisherigen Sketch.

float --> 5 bis 6 signifikante Stellen
unsigned long (Du erwartest doch keine negativen Kilometer) ganzzahlig bis 4,294,967,295
Was Du davon willst, musst Du entscheiden.

EEPROM: Am Besten eine Struktur, das klären wir aber, wenn wir den Sketch haben. Da können wir das gleich am konkreten Beispiel machen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.12.2020, 16:54 (Dieser Beitrag wurde zuletzt bearbeitet: 21.12.2020 17:33 von Kein Progammierer.)
Beitrag #3
RE: ich habe keine Ahnung und erbitte Hilfe.
Code:
//die Eingänge
#define Bat_Volt A1
#define Umfang_Einstellung A3
#define VIN A0
#define Tankgeber A2


const int RadumfangSelect = 6;        // Wahlschalter fuer Reifengroesse
const int Menue = 4;                // Eingang vom Menü Taster
const int Reset = 11;               // Setzt den jeweiligen Durchscnitt zurück

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4);

float [color=#FF0000]Umfang[/color] = 0.000;
unsigned long RadUmCounter = 0;     // Zähler Radumdrehungen
float Trip = 0;
volatile int ZeitRadumlauf = 0;     //Zeit für einen Radumlauf
float V = 0.0;
int Vmax = 0;

volatile int Fuelpuls = 0;
float FuelMenge = 0;
float MengeImpuls = 0.06430868;     // 1Liter /15550 Impulse
float [color=#FF0000]Durchschnitt[/color] = 1;             // Durschnitt auf 1 damit kein "NCD" am Anfang
volatile int CounterFuel = 1;       // Zählimpuls Verbrauchsanzeige

int MenueCounter = 0;               // Zähler für Menü
int MenueState = 0;                 // Strom state of Menü Taster
int lastMenueState = 0;             // previous state Menü Taster

int RadumfangSelectCounter = 0;     // Zähler für Menü
int RadumfangSelectState = 0;       // Strom state of Menü Taster
int lastRadumfangSelectState = 0;   // previous state Menü Taster

volatile int FuelP = 0;             //Zeit zwischen Fuel Impulsen
float FuelP_per_sec = 0;            //impulse per sekunde
float ml_je_sec = 0;
float Momentan = 0;

float Strom = 0;
float Spannung = 0;

int Tankinhalt = 0;                 // wird noch ausgelitert

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

  attachInterrupt(0, Fuel, RISING);
  attachInterrupt(1, Tacho, RISING);

  pinMode(RadumfangSelect, INPUT_PULLUP);
  pinMode(Menue, INPUT_PULLUP);
  pinMode(RadumfangSelect, INPUT_PULLUP);
  pinMode(Reset, INPUT_PULLUP);

  lcd.init();      // LCD initialisieren
  lcd.backlight(); // Hintergrundlicht einschalten

  lcd.setCursor(4, 0);
  lcd.print("Trabant P601");
  delay (2000);
  lcd.clear();
  lcd.setCursor(4, 0);
  lcd.print("Km/h");
  lcd.setCursor(15, 0);
  lcd.print("U/min");
}

void loop()
{

  Umfang = analogRead (Umfang_Einstellung) / 1000.00 + 1.00;

  V = (Umfang / ZeitRadumlauf) * 3600;            //*3600 weil zeit in milli und ich aber in stunden brauche
  lcd.setCursor(0, 0);
  if (V <= 100.00) lcd.print(" ");
  if (V <= 10.00) lcd.print(" ");
  if (V <= 1.00) V = 0.00;
  if (RadUmCounter == 0.00) V = 0.00;
  lcd.print(V, 0);
  lcd.setCursor(3, 0);
  lcd.print(" Km/h");                       //damit die stelle vor km/h gelöscht wird
  Vmax = max(V, Vmax);

  Trip = ((Umfang * RadUmCounter) / 1000);

  FuelMenge = (Fuelpuls * MengeImpuls);
  Durchschnitt = (FuelMenge / Trip * 0.10); //*0.10 weil 100km und 1000ml
  if (Trip <= 2.00)
    Durchschnitt = 0.00;

  FuelP_per_sec = (1000.00 / FuelP);        // 1000 weil alles in millis()
  ml_je_sec = (FuelP_per_sec * MengeImpuls);
  Momentan = ((((ml_je_sec / 1000) * 100) / V) * 3600);
  if (FuelP <= 0.00)
    Momentan = 0.00;

  Strom = (((5.0 / 1023.0) * analogRead(VIN)) - 2.5 - 0.14) / 0.02;
  if (Strom <= 0.0)
    Strom = 0;

  Spannung = (5.0 / 1023) * analogRead(Bat_Volt) * 3;

  if (analogRead(Tankgeber) >= 100)
    Tankinhalt = 1;
  if (analogRead(Tankgeber) >= 200)
    Tankinhalt = 2;
  if (analogRead(Tankgeber) >= 300)
    Tankinhalt = 3;
  if (analogRead(Tankgeber) >= 400)
    Tankinhalt = 4;
  if (analogRead(Tankgeber) >= 500)
    Tankinhalt = 5;
  if (analogRead(Tankgeber) >= 600)
    Tankinhalt = 6;
  if (analogRead(Tankgeber) >= 700)
    Tankinhalt = 7;
  if (analogRead(Tankgeber) >= 800)
    Tankinhalt = 8;
  if (analogRead(Tankgeber) >= 900)
    Tankinhalt = 9;
  if (analogRead(Tankgeber) >= 1000)
    Tankinhalt = 10;
  // wird noch ausgelitert

  MenueState = digitalRead(Menue);
  if (MenueState != lastMenueState)
  { if (MenueState == LOW)
    {
      MenueCounter++;
    }
  }
  lastMenueState = MenueState;
  if (MenueCounter >= 5)
  {
    MenueCounter = 0;
  }
  if (MenueState == LOW)                //damit während button drücken display leer ist
  {
    lcd.setCursor(0, 2);
    lcd.print("                    ");
    lcd.setCursor(0, 3);
    lcd.print("                    ");
  }

  if (MenueCounter == 0 && RadumfangSelectState == HIGH)
  {
    lcd.setCursor(0, 1);
    lcd.print("------Fahrdaten-----");
    lcd.setCursor(0, 2);
    lcd.print("Trip         :");
    lcd.setCursor(0, 3);
    lcd.print("Topspeed     :");
    lcd.setCursor(15, 3);
    lcd.print(Vmax);
    lcd.setCursor(15, 2);
    lcd.print(Trip);
  }

  if (MenueCounter == 1 && RadumfangSelectState == HIGH)
  {
    lcd.setCursor(0, 1);
    lcd.print("-------Benzin-------");
    lcd.setCursor(0, 2);
    lcd.print("Tank         :");
    lcd.setCursor(15, 2);
    lcd.print(Tankinhalt);
    if (Tankinhalt <= 10.00) lcd.print(" ");
    lcd.setCursor(0, 3);
    lcd.print("Reichweite   :");
  }

  if (MenueCounter == 2 && RadumfangSelectState == HIGH)
  {
    lcd.setCursor(0, 1);
    lcd.print("------Verbrauch-----");
    lcd.setCursor(0, 2);
    lcd.print("momentan     :");
    lcd.setCursor(15, 2);
    lcd.print(Momentan, 1);
    lcd.setCursor(0, 3);
    lcd.print("Durchschnitt :");
    lcd.setCursor(15, 3);
    lcd.print(Durchschnitt, 1);
  }

  if (MenueCounter == 3 && RadumfangSelectState == HIGH)
  {
    lcd.setCursor(0, 1);
    lcd.print("------Elektrik------");
    lcd.setCursor(0, 2);
    lcd.print("Ampere Lima  :");
    lcd.setCursor(15, 2);
    if (Strom <= 100.00) lcd.print(" ");
    if (Strom <= 10.00) lcd.print(" ");
    if (Strom <= 1.00) Strom = 0.00;

    lcd.print(Strom, 0);

    lcd.setCursor(0, 3);
    lcd.print("Volt Batterie:");
    lcd.setCursor(15, 3);
    lcd.print(Spannung, 1);
  }

  if (MenueCounter == 4 && RadumfangSelectState == HIGH)
  {
    lcd.setCursor(0, 1);
    lcd.print("-------Umwelt-------");
  }
  Serial.println("---------------");


  RadumfangSelectState = digitalRead(RadumfangSelect);
  if (RadumfangSelectState != lastRadumfangSelectState)
  { if (RadumfangSelectState == LOW)
    {
      RadumfangSelectCounter++;
    }
  }
  lastRadumfangSelectState = RadumfangSelectState;
  if (RadumfangSelectCounter >= 2)
  { RadumfangSelectCounter = 0;
  } if (RadumfangSelectState == LOW)
  {
    lcd.setCursor(0, 1);
    lcd.print("--------------------");
    lcd.setCursor(0, 2);
    lcd.print("Radumfang einstellen");
    lcd.setCursor(0, 3);
    lcd.print("Radumfang    :");
    lcd.setCursor(15, 3);
    lcd.print(Umfang, 3);

  }
  //delay(1000);
}                

void Fuel()
{
  unsigned long tempF;
  static unsigned long F_old;
  tempF = millis();
  FuelP = tempF - F_old;
  F_old = tempF;
  Fuelpuls++;
}

void Tacho ()
{
  unsigned long temp;
  static unsigned long T_old;
  temp = millis();
  ZeitRadumlauf = temp - T_old;
  T_old = temp;
  RadUmCounter++;
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.12.2020, 17:03 (Dieser Beitrag wurde zuletzt bearbeitet: 21.12.2020 23:42 von Bitklopfer.)
Beitrag #4
RE: Float Werte im EEPROM speichern
Stelle Deinen Sketch bitte in Codetags.
Wie das geht, steht hier.
Das kannst Du auch noch nachträglich ändern.

Lösche bitte alle auskommentierten Programmteile und kennzeichne die 3 Variablen, die Du in den EEPROM schreiben willst.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.12.2020, 17:36 (Dieser Beitrag wurde zuletzt bearbeitet: 21.12.2020 23:43 von Bitklopfer.)
Beitrag #5
RE: Float Werte im EEPROM speichern
Hallo Tommy, Danke für Deine Mühe!

Das mit dem farblich markieren hat nicht geklappt... zumindest sehe ich es nicht...

Zu erwähnen ist noch, dass ich per Relaise eine Selbsthaltung für 2h machen werde. Soll heissen, dass wenn die die Zündung ausgeschaltet wird es der Arduino per DigitalPin registriert, 2h dann über das Relaise die Vin hält und dann abschaltet. Über diesen DigitalPin soll dann auch das Lesen/schreiben initiiert werden...

Für die Gesamtkilometer weiss ich nicht welcher Variablentyp der richtige ist... int reicht ja wohl nicht oder?

die Variablen:
Gesamtkilometer
float Umfang = 0.000;
float Durchschnitt = 1;
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.12.2020, 17:43 (Dieser Beitrag wurde zuletzt bearbeitet: 21.12.2020 23:43 von Bitklopfer.)
Beitrag #6
RE: Float Werte im EEPROM speichern
Die Gesamt_km sehe ich nicht in Deinem Sketch. Ich würde dafür unsigned long vorschlagen, da wohl ganze km ausreichend sind.

Ok. Was mir noch nicht klar ist: Wann willst Du die Werte in den EEPROM schreiben?
Der EEPROM hat ca. 100.000 Schreibzyklen. Selbst wenn wir mal von Schreiben aller Sekunden ausgehen, ist der EEPROM in reichlich 27 Stunden außerhalb seiner Spezifikation, kann also jederzeit seinen Inhalt verlieren.

Oder soll nur gespeichert werden, wenn Du ausschaltest und im Setup wieder eingelesen werden?


Ok, Fehler von mir. Das mit der Selbsthaltung überlesen. Warum so lange 2 Stunden?
Also wenn die Zündung weg ist, schreiben und im Setup wieder einlesen.

Da würde ich 2 Funktionen machen, die Du dann an der passenden Stelle aufrufst:

Anstelle Deiner Einzelvariablen verwenden wir eine Struktur:
Dein Code:
Code:
float Umfang = 0.0
Neuer Code:
Code:
#include <EEPROM.h>

struct {
    unsigned long Gesamt_km = 0;
    float Durchschnitt = 1.0;
    float Umfang = 0.0;
} myVars;
myVars ist also jetzt das Trio aus Deinen 3 Werten. Der Zugriff erfolgt über myVars.Gesamt_km = 12345; oder Serial.println(myVars.Gesamt_km);
Schreiben und lesen:
Code:
// Beim Ausschalten
void schreibe() {
  EEPROM.put(0,myVars);
}
// im Setup
void lese() {
  EEPROM.get(0,myVars);
  if (myVars.Durchschnitt < 0.01) myVars.Durchschnitt = 1.0; // die 0 abfangen, wenn 0 im EEPROM steht.
}

Das Ganze ist ungetestet. Evtl. vor dem 1. Test einfach die Struktur im Setup nicht lesen, sondern nur schreiben.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.12.2020, 21:15 (Dieser Beitrag wurde zuletzt bearbeitet: 21.12.2020 23:44 von Bitklopfer.)
Beitrag #7
RE: Float Werte im EEPROM speichern
Hey Tommy, ich werde es morgen mal ausprobieren. Warum 2h? Weil VW z.B. auch nach 2 h den Trip zurücksetzt... wenn Du also mal ne Tour machst und nur auf n Eis anhältst bleibt der Computer "online"...

Bis dahin...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.12.2020, 21:43 (Dieser Beitrag wurde zuletzt bearbeitet: 21.12.2020 23:44 von Bitklopfer.)
Beitrag #8
RE: Float Werte im EEPROM speichern
Ok, so gesehen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Ausgabe von formatierten Float-Werten auf LCD Herby007 7 371 10.12.2020 21:47
Letzter Beitrag: Tommy56
  DS1307 RTC - Ausschaltzeitpunkt speichern Foto-Ralf 8 436 09.12.2020 12:15
Letzter Beitrag: Foto-Ralf
  Sensordaten über lokales Netzwerk speichern Dave298 10 730 02.12.2020 22:17
Letzter Beitrag: hotsystems
  Werte sortieren süffi1234 2 248 26.11.2020 16:35
Letzter Beitrag: GuaAck
  Float-Werte mit Bubble-Sort sortieren süffi1234 2 258 25.11.2020 16:36
Letzter Beitrag: süffi1234
  arduino elegoo uno r3 auslesen und HexFile speichern desperando 11 813 29.10.2020 15:11
Letzter Beitrag: GuaAck
  NRF24I01 Empfangenen Text in einer Var. speichern zebrazehn 10 896 19.09.2020 12:54
Letzter Beitrag: hotsystems
  Werte im Sketch in Variablen speichern Bitklopfer 4 682 06.09.2020 10:25
Letzter Beitrag: Bitklopfer
  Serielle Werte in String einlesen um damit zu rechnen 425t 2 585 26.08.2020 13:19
Letzter Beitrag: 425t
  Float über I2C zwischen 2 Arduinos UNO Marduino_UNO 23 10.498 18.08.2020 11:53
Letzter Beitrag: hotsystems

Gehe zu:


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