Problem mit EEPROM

Hallo zusammen,
Ich möchte die Daten die ich von einem Drucksensor bekomme auf einem externen EEPROM speichern, hier der Code:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;
#include "SparkFun_External_EEPROM.h"
ExternalEEPROM DS;

long p;
long address;
long pData;


void setup(){

  Wire.begin();

  lcd.init();
  lcd.backlight();
  
  Serial.begin(115200); 

  if (DS.begin() == false)
  {
    Serial.println("No memory detected. Freezing.");
    lcd.clear();
    lcd.home();
    lcd.print("No memory detected. Freezing.");
    while (1);
  } 
  
  if (!bmp.begin()) {
  Serial.println("No Sensor found! Freezing.");
  lcd.clear();
  lcd.home();
  lcd.print("No Sensor found! Freezing.");
  while (1) {}
  }

  
  }
void loop(){


  Serial.println("Begin Measuring.");
   lcd.clear();
   lcd.home();
   lcd.print("Begin Measuring.");
   delay(2500); 

  for (address = 0; address <= 200; address++){  
   p = (bmp.readPressure());
   DS.put(address, p);
   Serial.print(address);
   Serial.print("\t");
   Serial.print(p);
   Serial.println("hPa");
   lcd.clear();
   lcd.home();
   lcd.print(p);
   lcd.print("hPa");
   delay(10);
  }
  
   Serial.println("Measuring complete.");
   lcd.clear();
   lcd.home();
   lcd.print("Measuring complete.");
   delay(2500); 
   Serial.println("Begin Readout.");
   lcd.clear();
   lcd.home();
   lcd.print("Begin Readout.");
   delay(2000);

  for (address = 0; address <= 200; address++){
   DS.get(address, pData);
   Serial.print(address);
   Serial.print("\t");
   Serial.println(pData);
   lcd.clear();
   lcd.home();
   lcd.print(pData);
   delay(10);

  }

   
    
   delay(2000);
   Serial.println("Readout complete.");
   lcd.clear();
   lcd.home();
   lcd.print("Readout complete.");

   delay(10000);

   
}

Leider gibt mir der Arduino nur den letzten Wert des Drucksensor aus, ich möchte aber alle Werte.
Der Code funktioniert an sich, es gibt keine Fehlermeldung.
Ich habe folgende Komponenten verwendet:

  • Arduino Mega2560
  • BMP180 (Drucksensor)
  • FT24C256A-Chip (EEPROM, auf einem Pinboard)
  • LCD1602 Modul mit I2C Anschluss

Alle Komponenten wurden per I2C mit dem Arduino verbunden.
Ich hoffe jemand von euch kann mir helfen.

Anbei noch die Ausgabe der Seriellen Konsole.

Serial.Output.txt (5.68 KB)

Eine Adresse im EEROM kann ein Byte (8 Bit) speichern.
Eine Long-Variable hat wieviel Byte bzw. Bit?

versuche statt

for (address = 0; address <= 200; address++){

mal so

for (address = 0; address <= 200; address += sizeof(long)){

Näheres siehe:

long p (erwartest Du negative Werte?) ist 4 Byte lang, Du erhöhst die Adresse aber um 1 Byte.
Hast Du Dich mal über die garantierten Schreibzyklen Deines EEPROM informiert?

Rechne mal durch, wie lange der leben wird.

Gruß Tommy

simon34543:

void loop(){

//[…]
  for (address = 0; address <= 200; address++){ 
  p = (bmp.readPressure());
  DS.put(address, p);



Leider gibt mir der Arduino nur den letzten Wert des Drucksensor aus, ich möchte aber alle Werte.

Du hast ein massiveres Problem.
Du schriebst bei JEDEM Durchlauf von loop() auf 200 Adressen einen Wert.
Du überschreibst teilweise bei jedem schreiben den vorherigen - es bleibt nur der letzte Wert erhalten!

Du bringst gerade mit jedem weiteren Versuch Deinen Eeprom an sein Lebensende.

Für die Variable address habe ich jetzt byte verwendet, da macht long natürlich keinen Sinn, mein Fehler.

Aber wenn ich bei der Variable p nicht long benutze, dann gibt der Drucksensor falsche Werte aus.

Und ich wollte ja alle Werte die der Sensor ausgibt speichern, also muss ich auch jeden einzelnen Wert auf eine eigene Adresse schreiben oder?

Entschuldigt bitte meine Unwissenheit, ich habe mit EEPROMs keine Erfahrung.

simon34543:
Und ich wollte ja alle Werte die der Sensor ausgibt speichern, also muss ich auch jeden einzelnen Wert auf eine eigene Adresse schreiben oder?

Ja.
Aber nicht 200 mal hintereinander. (siehe mein post oben!) Da ändert sich nüscht.

Was man dir beibringen wollte, ist dass eine long Variable in 4 EEPROM bytes gespeichert werden muss.
Das macht put für dich schon, allerdings müsstest du in deiner Schleife address +=4
Oder wie schon ganz zu Anfang erwähnt: address += sizeof(long)
weiterrechnen. ( und bekommst bei address < 200 nur 50 Elemente gespeichert, solange der EEPROM noch nicht kaputt ist. )

uxomm:

for (address = 0; address <= 200; address += sizeof(long))

sizeof(p) würde ich vorziehen. :wink:
Wenn sich das p initial ändert, bliebe der code unangetastet…

Hallo
wer keine Fehler macht, der kann nicht daraus lernen.
Frag mal Konfuzius :slight_smile:

p.s.
und die Auswertung mit der Suche nach delay() ergeben:
delay(2500);
delay(10);
delay(2500);
delay(2000);
delay(10);
delay(2000);
delay(10000);
Ergebnisse.
Bewertung: Die Aufgabenstellung strukturiert analysieren und das Ergebnis in Funktionen(), Abhängigkeiten und Kontrollstrukturen gießen.

paulpaulson:
Frag mal Konfuzius

Er lebte vermutlich von 551 v. Chr. bis 479 v. Chr.

Wiederauferstehung?

Weisst Du was?
:wink:

Jetzt funktioniert´s.

Danke für die guten Ratschläge :slight_smile:

my_xy_projekt:
Wiederauferstehung?

Weisst Du was?
:wink:

NeuDeutsch: Die Route führt zum Endziel :slight_smile:

simon34543:
Jetzt funktioniert´s.

Danke für die guten Ratschläge :slight_smile:

Lässt Du die Interessierten hier auch noch an dem Ergebnis teilhaben?
Vielleicht ergibt sich ja doch noch was, wo Änderungen sinnvoll sind...