was läuftn hier über? bzw wo steckt der wurm

tach, hab nen kleines problem.

Versuche grade nen Temperatur graphen zu kritzeln jedoch läuft nach einigen ausrufen etwas über… finde aber nicht was.

es werden über den tag 85 einträge ins eeprom geschrieben an 85*4 fortlaufende adressen im abstand von 1016sec aber immer an selbe stelle. sprich der tag ist in 85 abschnitte unterteilt und immer zum passenden abschnitt uhrzeitabhängig

float tempval[85];

//hole daten aus eeprom ins array

void readtempchart() {

  //erstmal array leeren
  for (int i = 0; i <= 85;  i++ )
  {
    tempval[i] = (float)00.00;
  }

  //hole daten aus eeprom ins array
  for (int ie = 0; ie <= 85; ie++)
  {
    read(tempval[ie], starttempeeprom);
    starttempeeprom = starttempeeprom + 4;
  }

}

//berechne passenden temperaturpunkt

float calcpoint (float temp)
{
hits++;
  float point = 0;
  unsigned int value = 0;
  unsigned int zeropoint = 0;

  if (temp == 00.00) {
    value = 400;
  } else {
    zeropoint = (float)temp * (float)9.40;
    point = 494 - zeropoint;
    value = (unsigned int)point;
  }

  //debug
    Serial.print(hits);
    Serial.print(".Zeropoint: ");
    Serial.print(zeropoint);
    Serial.print(" Point: ");
    Serial.print(point);
    Serial.print(" Value: ");
    Serial.print(value);
    Serial.print(" Temp: ");
    Serial.print(temp);
    Serial.println("");

  return value;
}

//graphen erstellen

readtempchart();



  myGLCD.setColor(RED);

  x1 = 40; //startpositionen
  x2 = 49; //startpositionen
  
  for (int ie = 0; ie < 84; ie++)
  {
    int ien = 0;
    ien = ie + 1;

//für fehlersuche nur
    Serial.print("lese array ");
    Serial.print(ie);
    Serial.print("=");
    Serial.print(tempval[ie]);
    Serial.println("");
    myGLCD.drawLine(x1, calcpoint(tempval[ie]), x2, calcpoint(tempval[ien]));

   // char buff[100];
   // sprintf(buff, "myGLCD.drawLine(%02d, calcpoint(tempval[%f]), %02d, calcpoint(tempval[%f]));", x1, calcpoint(tempval[ie]), x2, calcpoint(tempval[ien]));
    //Serial.println(buff);

    x1 = x1 + 9;
    x2 = x2 + 9;

  }
  myGLCD.setColor(WHITE);

so. Beim ersten aufruf erstellt er das ding wie er es soll.

Beim 2ten aufruf wird es schon mehr als es soll

und ab dem 3ten aufruf passiert irgendwas ausserhalb des sichtbereiches schon.

EEprom werte:

0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
23.50
0.00
23.50
23.75
23.75
23.62
23.50
23.50
23.75
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00

meine debuging versuche im txt file

debug.txt (20.9 KB)

Ein Array mit 85 Einträgen geht von 0 - 84. Man muss also immer auf < abfragen. Nicht auf <=

Ah danke :slight_smile: werde es morgen mal korrigieren und testen :slight_smile:

Besser ist auch du machst die Array Größe als Konstante. Wenn du dann immer diese verwendest kommst du auch nicht auf die Idee da einmal 84 und einmal 85 zu schreiben.

habs geändert aber immernoch…

hier siehste mal visuell was passiert…

bild1 ist noch richtig.

bild 4 ist der due tot und lässt nur noch reset zu

habs gefunden:D

readtempchart(300);


void readtempchart(int starton) {

  starttempeeprom = starton;
  //erstmal array leeren
  for (int i = 0; i < 85;  i++ )
  {
    tempval[i] = (float)00.00;
  }

  //hole daten aus eeprom ins array
  for (int ie = 0; ie < 85; ie++)
  {
    read(tempval[ie], starttempeeprom);
    starttempeeprom = starttempeeprom + 4;
  }
  

}

problem war starttempeeprom wurde immer weiter um 4 erhöht und beim 2ten aufruf des graphen hat er im eeprom gelesen wo nichts mehr war… bzw wo er nichts zu suchen hatte

problem war starttempeeprom wurde immer weiter um 4 erhöht und beim 2ten aufruf des graphen hat er im eeprom gelesen wo nichts mehr war… bzw wo er nichts zu suchen hatte

Problem war eigentlich, du hast globale Variable verwendet wo sie keinen Sinn machen :wink:

void readtempchart(int starton) {
  // temporäre Variable wie starttempeeprom werden ausserhalb nicht gebraucht
  int starttempeeprom = starton;
  ...
  
}

jupp,

habs jetzt so gemacht da ich 3 tage loggen möchte

    if (hour() == 00 && minute() == 00 && second() == 00)
    {
      setlogday();

    }


//täglich um mitternacht logday ändern 
void setlogday() {

  int logday = 0;
  int lastlogday = 0;

  lastlogday = readData(LASTLOGDAY);
  logday = readData(LOGDAY);

  //wenn noch kein eepromwert vorhanden ist setze auf 1 und diesen tag
  if (lastlogday == 0) {
    writeData(LOGDAY, 1);
    writeData(LASTLOGDAY, day());
  }

//wenn tag sich ändert dann auch logday ändern
  if (lastlogday != day())
  {
    lastlogday++;

//wenn tag 3 dann beginne bei 1 wieder
    if (logday == 3) {
      writeData(LOGDAY, 1);
      writeData(LASTLOGDAY, day());
    } else {
      logday++;
      writeData(LOGDAY, logday);
      writeData(LASTLOGDAY, day());
    }

  }
}

//liefert logposition 1-3
int getlogday() {

  int logday = 0;
  logday = readData(LOGDAY);

  return logday;
}


//liefert start eeprom adresse für den aktuellen tageslogger tag1-300 tag2-640 tag3-980
int geteepromadd() {

  int logday = 0;
  int starton = 0;

  logday = readData(LOGDAY);

  if (logday == 1) starton = starttemp1eeprom;
  if (logday == 2) starton = starttemp2eeprom;
  if (logday == 3) starton = starttemp3eeprom;
  
  return starton;
}

void readtempchart(int daynr) {

  int starton = 0;
  starton = geteepromadd();

  //erstmal array leeren
  for (int i = 0; i < 85;  i++ )
  {
    tempval[i] = (float)00.00;
  }

  //hole daten aus eeprom ins array
  for (int ie = 0; ie < 85; ie++)
  {
    read(tempval[ie], starton);
    starton = starton + 4;
  }
}

hoffe es funzt auch richtig =)