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
Loop wird doppelt ausgeführt
23.11.2018, 10:20
Beitrag #1
Loop wird doppelt ausgeführt
Hallo ArduinoForum,
bin seit ca. 4 Wochen begeisteter Arduino-Fan. Habe auch schon kleinere Projekte umgesetzt. Beim jetzigen Projekt komm ich nicht weiter.
Kurze Beschreibung: Nano + Deek-Robot, nano datalogging shield ID 8105 + DS18B20 Temp-Fühler.
Den Sketch hab ich aus dem Internet geholt und nichts verändert. Das funktioniert auch, also Temperatur und Uhrzeit werden auf SD-Karte geschrieben.
Nun zu meinem Problem: Sowohl im Seriellen Monitor, als auch auf der SD-Karte wird der Loop (data stored) zweimal nacheinander ausgeführt (siehe Foto), und ich finde die Ursache nicht.

Ich hoffe, meine Informationen sind ausreichend und bitte um Unterstützung. Danke.

[Bild: monitord3imk.jpg]



Code:
// arduino_sd_datalogger_shield_org

#include <OneWire.h>
#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "RTClib.h"
const int chipSelect = 10; //cs or the save select pin from the sd shield is connected to 10.
RTC_DS1307 RTC;
float celsius, fahrenheit;

OneWire  ds(8);  // temperature senor on pin 8 (a 4.7K resistor is necessary) //

File dataFile;
DateTime now;

void setup(void) {
  Serial.begin(9600);
  //setup clock
  Wire.begin();
  RTC.begin();
//check or the Real Time Clock is on
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    // uncomment it & upload to set the time, date and start run the RTC!
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
//setup SD card
   Serial.print("Initializing SD card...");

  // see if the SD card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");

  //write down the date (year / month / day         prints only the start, so if the logger runs for sevenal days you only findt the start back at the begin.
    now = RTC.now();
    dataFile = SD.open("datalog.txt", FILE_WRITE);
    dataFile.print("Start logging on: ");
    dataFile.print(now.year(),DEC);
    dataFile.print('/');
    dataFile.print(now.month(),DEC);
    dataFile.print('/');
    dataFile.print(now.day(),DEC);
    dataFile.println(" ");
    dataFile.println("Celsius              Time");
    dataFile.close();
}

void loop(void) {
  
// read temperature
pickUpTemperature();
//read the time
  now = RTC.now();
  
  //open file to log data in.
   dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  // log the temperature and time.
  if (dataFile) {
    dataFile.print(celsius);
    dataFile.print("                 ");
    
    dataFile.print(now.hour(),DEC);
    dataFile.print(":");
    dataFile.print(now.minute(),DEC);
    dataFile.print(":");
    dataFile.println(now.second(),DEC);
  
    dataFile.close();
    // print to the serial port too:
    Serial.println("data stored");
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }
  //delay(60000); // this will log the temperature every minute.
  delay(3000);
}


// fuction with check the temperature sensor and update the tempeature.
void pickUpTemperature(){
    byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];

  
  if ( !ds.search(addr)) {
    //Serial.println("No more addresses.");
   //Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  //Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
   // Serial.write(' ');
   // Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();

  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
     // Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
    //  Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
    //  Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
   //   Serial.println("Device is not a DS18x20 family device.");
      return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  //Serial.print("  Data = ");
  //Serial.print(present, HEX);
  //Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
   // Serial.print(data[i], HEX);
   // Serial.print(" ");
  }
// Serial.print(" CRC=");
// Serial.print(OneWire::crc8(data, 8), HEX);
// Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
  
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.11.2018, 10:37 (Dieser Beitrag wurde zuletzt bearbeitet: 23.11.2018 11:24 von hotsystems.)
Beitrag #2
RE: Loop wird doppelt ausgeführt
(23.11.2018 10:20)nanoheld schrieb:  .....
Nun zu meinem Problem: Sowohl im Seriellen Monitor, als auch auf der SD-Karte wird der Loop (data stored) zweimal nacheinander ausgeführt (siehe Foto), und ich finde die Ursache nicht.
.....
Hallo,
bist du sicher, dass die Funktion nur 2 mal ausgeführt wird ?
Wenn ja, musst du untersuchen, warum nur 2 mal.
Im Sketch steht doch, alle Minute, wobei du wohl auf 3 Sek. geändert hast.

Wenn alles richtig funktioniert, sollte die "Loop" ständig laufen. deshalb heißt die auch Loop (Schleife).

Unterschiede in dem Zeitverhalten kann auch daran liegen, da der Sensor jeweils 750 mS zum Auslesen der Temperatur braucht.
Wenn du es genauer haben willst, solltest du nicht mit delay arbeiten, sondern mit einem Timer, z.B. den SimpleTimer.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
24.11.2018, 10:58 (Dieser Beitrag wurde zuletzt bearbeitet: 24.11.2018 10:59 von Hilgi.)
Beitrag #3
RE: Loop wird doppelt ausgeführt
Moin,

ich denke auch, das du vlt einfach mal "debugen" solltest:

Schreibe sowas wie:
Code:
Serial.println( "1");
Serial.println( "2" );
...

nicht zeilenweise, aber sinnvoll eingesetzt in den Code.

Dann solltest du nachverfolgen können, wo er springt/hängt/nichtist etc.

Beim einlesen der Datei, wenn da ein Fehler passiert, wird er evtl raus springen, wieder neu ansetzen(dein 2ter durchlauf) und wenn die datei dann beschädigt ist durch den vorigen Fehler, geht er nicht mehr in die Datei und bleibt hängen.
Das wäre ein möglicher Ansatz.



Gruß

Nicht denken,...
...nachdenken... Rolleyes

Smarter - LiveData - KLAMM.de
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.11.2018, 18:38
Beitrag #4
RE: Loop wird doppelt ausgeführt
Hallo Dieter, Hallo Hilgi,

besten Dank für Eure schnellen Antworten. Mit Eueren Ideen konnte ich das Problem weiter einkreisen und musste letztendlich feststellen, dass das nano-datalogging-shield defekt war. Hab's gegen ein anderes Modell ausgetauscht, jetzt funktionierts.

Danke nochmals und Gruß
nanoheld
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.11.2018, 18:48
Beitrag #5
RE: Loop wird doppelt ausgeführt
(26.11.2018 18:38)nanoheld schrieb:  Hallo Dieter, Hallo Hilgi,

besten Dank für Eure schnellen Antworten. Mit Eueren Ideen konnte ich das Problem weiter einkreisen und musste letztendlich feststellen, dass das nano-datalogging-shield defekt war. Hab's gegen ein anderes Modell ausgetauscht, jetzt funktionierts.

Danke nochmals und Gruß
nanoheld
Danke für die Rückmeldung.

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
26.11.2018, 19:09
Beitrag #6
Thumbs Up RE: Loop wird doppelt ausgeführt
Top.
Viel Erfolg noch

Nicht denken,...
...nachdenken... Rolleyes

Smarter - LiveData - KLAMM.de
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.11.2018, 21:06
Beitrag #7
RE: Loop wird doppelt ausgeführt
Prima und danke für die Rückmeldung.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Kennt jemand einen Stepper Closed Loop Sketch? Holzwurm56 16 1.565 17.06.2019 22:37
Letzter Beitrag: georg01
  If...els if wird nich korrekt ausgeführt suterb 18 1.450 28.05.2019 13:51
Letzter Beitrag: Tommy56
  For-Loop verschluckt Ausgabe am seriellen Monitor TimeMen 5 588 14.04.2019 17:59
Letzter Beitrag: Tommy56
  Bedingung wird nicht wiederholt ausgeführt Lite 16 1.713 29.03.2019 05:11
Letzter Beitrag: Lite
  Wasserverbrauchszähler, statische Variablen, komisches Verhalten in der loop() pzYsTorM 14 1.208 19.03.2019 20:33
Letzter Beitrag: Hilgi
  Lokale Variable an loop zurück - Fehler Haukini 3 646 26.02.2019 22:33
Letzter Beitrag: Haukini
  Ram Speicher bei Arduino Mega wird knapp unkreativ 22 1.873 02.02.2019 18:40
Letzter Beitrag: unkreativ
  Befehl wird nicht ausgeführt renesworld 15 1.633 19.10.2018 12:37
Letzter Beitrag: hotsystems
  OneButton geht im loop() nicht uweq 4 1.545 09.08.2018 21:29
Letzter Beitrag: uweq
  MQTT ausgabe auf ili9341 wird flasch dargestellt merz 13 2.546 03.04.2018 11:30
Letzter Beitrag: merz

Gehe zu:


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