Pages: [1]   Go Down
Author Topic: Komplikationen bei Verwendung von EEPROM.h und SD.h  (Read 755 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 1
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo!
Kann es sein das die zwei oben genannten Libraries nicht in ein und dem selben Sketch funktionieren? Ich habe einen Sketch von jemandem übernommen der Daten ins Eprom schreibt, ich möchte die Daten zusätzlich auf eine SD Karte schreiben. Aber sobald ich nur irgendeinen  Befehl für die SD Karte benutze, spielt mein Sketch totat verrückt. Schließt die Benutzung einer Library die andere aus oder muss ich irgendwas anpassen damit es funktioniert?

Gruß Heinz
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20165
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Die beiden Bibliotheken müßten miteinander klarkommen.
Gib uns mal den Sketch.
Grüße Uwe
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Es handelt sich um einen Sketch der eine Wetterstation ausliest. Im Original werden die Daten nach dem Auslesen auf einen Server geladen und ich möchte aber die Daten auf SD Karte speichern. Ich hab den original Sketch genommen und alles rausgelöscht was mit Ethernet zutun hat. Sobald ich aber die SD Funktion einbringe funtioniert der ganze Sketch nicht mehr. Ich habe zum testen einfach den Sample Code Datenlogger genommen und 1 zu 1 in den Sketch eingefügt.

Die Ursprung kommt von hier:
http://andreaspagel.homeip.net/blog/index.php

Der Sketch ist leider zu groß um ihn hier zu posten, hier kann man sie downloaden:

WS2350_SD_keine_funkion.ino


« Last Edit: April 30, 2013, 06:45:04 am by Scherheinz » Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 96
Posts: 4662
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hast Du schon versucht, im setup() ein

Code:
digitalWrite(10, HIGH);

einzufügen, damit der SPI-Bus frei ist für die SD-Karte?
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hey super, der Sketch läuft jetzt weiter! Das Speichern klappt zwar noch nicht aber ich weiß zumindest das die beiten Libraries sich vertragen.

Vielen Dank!
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hab mich zu früh gefreut. Dank dem Tip von pylon funktioniert der Sketch wenn ich den Sketch "Cardinfo" intigriere. Will ich aber auf die SD Karte schreiben und intigriere z.b. den Sketch "Datenlogger" oder was Eigenes, bliebt der Sketch wieder ein dieser Stelle stehen. Woran kann das liegen??
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 234
Posts: 20165
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dann mußt Du wahrscheinlich
Code:
digitalWrite(10, HIGH);
öfters einfügen.
Grüße Uwe
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hab es jetzt an noch 10 Stellen eingefügt, vorallem dort wo der Sketch immer hängen bleibt. Über die Konsole sieht das dann so aus:

Quote
Initializing SD card...
card initialized.
Initialisiere WS2350
Memory available: %d bytes
Lese Temperatur...
002001327333780AA0024021062
19420012233B3638214650300120
Lese Datum..
2001220303657382146503076
Lese Uhrzeit...
Lese Luftfeuchtigkeit...
20014213933AA309771
Fehler beim Auslesen Aussenfeuchte
200152D38
Lese Luftdruck...
Fehler beim Auslesen 4
632001522373305FE4144
Lese Windrichtung...
2001522373305FE4144
Lese Windgeschwindigkeit...
Fehler beim Auslesen 5
200142B0202
Lese Regen 1 Std.
Fehler beim Auslesen Regen 1h 8
2001429373A00000027220059
Lese Regen 24 Std. ...
7184191200020D1202
Lese Regen 1 Jahr...
Fehler beim Auslesen Regen 1 Jahr 10
20012263B311212
Lese Tendenzpfeil...
20012263B311212
Lese Wettergrafik...
Readerror? Wert:1
Letzte Aktualisierung:
04.05.2013 21:38:57
Aussenfeuchte %: 82
Temperatur C: -30.0
Luftdruck hPa rel.: 998.3
Windrichtung: OST
Windgeschwindigkeit km/h: 0.0
Regen letzte Stunde: 0000.0
Regen 24 Stunden: 0000.0
Regen im Jahr: 1758.96
Tendenz: 0
Welches Icon/ Symbol?: 2

Initializing SD card...1
1Falsche Werte
Lese Temperatur...
2€€€€001327333780AA0024021062
Fehler beim Auslesen 1

Die Aktion auf der SD Karte wird noch ausgeführt und beim nächsten Einlesevorgang bleibt bei dem ersten Versuch die Temperatur einzulesen das Programm stehen
« Last Edit: May 04, 2013, 02:49:05 pm by Scherheinz » Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 96
Posts: 4662
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du hast eine Funktion writemem() die vom Namen her suggeriert, dass sie in den Speicher schreiben würde, in Wirklichkeit wird aber in das EEPROM geschrieben. Das führst Du in jedem (!) Loop durch, was mich zu der Annahme verleitet, dass Dein EEPROM schon bald hin sein dürfte (das übersteht ca. 100'000 Schreibzugriffe). Eine einzelne Zelle der SD-Karte übersteht zwar weniger Schreibzugriffe, aber dort ist ein intelligenter Kontroller dafür zuständig, die Schreibzugriffe so über alle Zellen zu verteilen, dass sie in etwa gleich belastet werden. Somit düftest Du dort später Probleme bekommen. Schlimmer werte ich, dass es, vorausgesetzt, ich habe nicht eine wichtige Funktion bei der ersten Durchsicht übersehen, komplett überflüssig ist und Du die Werte auch gleich im RAM behalten könntest.

Auch beim Schreiben auf die SD-Karte nimmst Du zwar "datalog.txt" als Dateinamen, aber ein Log schreibst Du dort nicht hinein, sondern nur jeweils die aktuellen Werte.

Weiter verwendest Du die String-Klasse, obwohl Dein Programm so geschrieben ist, dass Du auch problemlos mit C-Strings (Byte-Arrays) arbeiten könntest. Die String-Klasse ist für Mikrokontroller ohne MMU denkbar schlecht geeignet und hat in den aktuellen IDE-Versionen zudem einen Fehler, der zu Memory-Leaks (RAM-Speicher geht verloren) führt.

All das muss nicht die Ursache für Deine Probleme sein, aber zumindest in der Kombination könnte es so sein. Versuche das mal zu korrigieren, dann formatieren Deinen Code so, dass er lesbarer wird (die IDE hat einen Menüpunkt der das automatisch machen kann) und poste ihn nochmals.
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Erstmal vielen Dank das du dir hier so viel Mühe machst!
Ich selbst bin der Programmiersprache nicht so mächtig, hab es nie gelernt und versuche aber besser zu werden. Ich brauche die Eeprom Funktion eigentlich überhaupt nicht. Diese gehört zum Originalsketch der die Daten aus dem Eeprom zu einem Server schickt. Die Serverfunktion hab ich soweit rausgelöscht bekommen aber die Eepromgeschichte war mir zu komplex. Und ich dachte ich könnte stattdessen einfach die Daten auf SD schreiben indem ich das dazu einfüge. Hab es mir wohl zu einfach gemacht. Ich versuch mal die Eepromgeschichte rauszubekommen wenn ich es schaffe.... smiley-roll-sweat smiley-roll-sweat
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 96
Posts: 4662
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Kannst Du mal umschreiben, was Dein Sketch genau tun soll? Bitte zähle alles genau auf, was Du wirklich brauchst bzw. willst, dann können wir Dir vielleicht Tips geben, welche Teile Du entfernen kannst.
Logged

Offline Offline
Jr. Member
**
Karma: 1
Posts: 59
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Einfach nur die Daten Temperatur, Luftfeuchte, Luftdruck, Windstärke/Richtung und das Datum mit Uhrzeit aus der Wetterstation auslesen und in einer CSV auf SD abspeichern.
Was ich verstehe ist z.b. das mit diesen Befehl
Code:
digitalWrite(rts, HIGH);
  digitalWrite(dtr, LOW);
  delay(2000);
  digitalWrite(rts, LOW);
  digitalWrite(dtr, HIGH);
die Station beginnt ihre Daten über die serielle Verbindung zu senden.

Der Teil der z.b. die Temperatur empfängt sieht so aus:
Code:
String getTemp(){   
  // read outside temperature

  datastr= args[0];
  inString= args[0];
  datastr.reserve(25);
  inString.reserve(25);

  char buff [10]; //(HEX to Char)
  int my_array[] = {
    0x82,0x8E,0x9E,0x8E,0xDE    };
  Serial.println("Lese Temperatur...");
  inString=strDataRead(my_array);

  if (inString.length()>19 && (inString.substring(8,10) == "37")){
    // wdt_reset();
    memset(buff,0,sizeof(buff));
    datastr.concat(inString.substring(12,14));
    datastr.concat(".");
    datastr.concat(inString.substring(10,11));
    datastr.toCharArray(buff,datastr.length()+1);
    datastr = args[0];

    float fdatastr=(atof(buff)-30); //float- Array from datastring -30 (offset)
    dtostrf(fdatastr,2,1,buff); //float- Array > Stringarray
    datastr = buff;

  }
  else
  {
    Serial.println("Fehler beim Auslesen 1");
    datastr="error";
    readerror = 1;
   
  }
 
  if (datastr == "-30.0"){
    valuefailure = 1;
   
  }
 
  memset(buff,0,sizeof(buff));
  memset(my_array,0,sizeof(my_array));
  return(datastr); 
}
//End reading outside temperature

Was müsste ich hier z.b. ändern wen ich Eeprom.h rausschmeiße?

Vorallem hab ich keine Ahnung was hier genau gemacht wird:

Code:
String strDataRead (int mem[]) {
  char inChar[3];
  //char CharString[60];
  byte i=0;
  byte time=0;
  String stringread= args[0];
  stringread.reserve(25);
  // String inString;
  byte incomingByte=0; // Where to store the character read
  byte incomingBytehelper=0;
  while ((incomingByte != 2) && (i<24)){
    // wdt_reset();
    i++;
    for (byte x=0;x<5;x++){
      mySerial.write(byte(0x06)); //Initialize weatherstation
      delay(50);
      // wdt_reset();
      x++;
    }

    if ((mySerial.available() > 0) && (time<20)) {
      // wdt_reset();
      delay(50);
      time++;
      // wdt_reset();
      incomingByte = mySerial.read();
      stringread.concat(incomingByte);
      Serial.print(incomingByte);
    }
  }
  stringread= args[0];
  i=0;
  mySerial.flush();
  for (byte tmp=0; tmp<5; tmp++){
    mySerial.write(byte(mem[tmp])); //send the initialization string for safety a second time
    delay(50);
  }

  for (byte tmp=0; tmp<12; tmp++){
    if ((mySerial.available() > 0)) {
      delay(50);
      // wdt_reset();
      incomingByte = mySerial.read();
      memset(inChar,0,sizeof(inChar));
      sprintf(inChar, "%02X", incomingByte);
      // Alt: itoa(incomingByte,inChar,16);

      stringread.concat(inChar[0]);
      stringread.concat(inChar[1]);
      i++;           
    }
  }
  // wdt_reset();
  memset(inChar,0,sizeof(inChar));
  Serial.println(stringread);
  return(stringread);

}
//End Function "read data"
Es ist schwierig so einen großen Code klar darzustellen. Die Station hat auch einen internen Speicher, der ist aber so klein das man ihn alle paar Tage auslesen muss sonst wird überschrieben. Deshalb hab ich eine Möglichkeit gesucht wie die Daten über längeren Zeitraum gesichert werden können ohne gleich einen PC rund um die Uhr laufen lassen zu müssen
« Last Edit: May 07, 2013, 12:31:21 pm by Scherheinz » Logged

Pages: [1]   Go Up
Jump to: