Analogwerte und Digitalwerte in einem Sketch auslesen!?

Hallo Leute,
da ich mich zur Zeit an einem Projekt befinde, habe ich eine Frage bezüglich meines Sketches. Dieser liefert mir Analogwerte für Licht(0-1023). Diese Werte loggt der vorgefertigte Sketch auch samt Uhrzeit, im Prinzip wie ich es haben möchte. Zusätzlich möchte ich noch die Temperatur mitloggen. Da mein Sketch aber für einen analogen Temperatursensor ausgelegt ist, ich aber einen digitalen Temperatursensor (ds18b20) benutzen möchte, passt der vorgefertigte Sketch des DataloggingShield nicht. Ich habe schon selbst versucht diesen Sketch anzupassen, jedoch bekomme ich immer unterschiedliche Fehlermeldungen. Jetzt die Frage: Würde mir jemand behilflich sein diesen Sketch anzupassen?

Beide Sketches funktionieren unabhängig voneinander zu 100%, jedoch möchte ich wie erwähnt, den "TemperaturSketch", der mir digitale Werte liefert, in den DataloggingSketch einbinden. Ist dies viel Arbeit?

Hier die beiden Sketches:

DataloggingSketch:

#include <SD.h>
#include <Wire.h>
#include "RTClib.h"

// A simple data logger for the Arduino analog pins

// how many milliseconds between grabbing data and logging it. 1000 ms is once a second
#define LOG_INTERVAL  1000 // mills between entries (reduce to take more/faster data)

// how many milliseconds before writing the logged data permanently to disk
// set it to the LOG_INTERVAL to write each time (safest)
// set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to 
// the last 10 reads if power is lost but it uses less power and is much faster!
#define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card
uint32_t syncTime = 0; // time of last sync()

#define ECHO_TO_SERIAL   1 // echo data to serial port
#define WAIT_TO_START    0 // Wait for serial input in setup()

// the digital pins that connect to the LEDs
#define redLEDpin 2
#define greenLEDpin 3

// The analog pins that connect to the sensors
#define photocellPin 0           // analog 0
#define tempPin 1                // analog 1
#define BANDGAPREF 14            // special indicator that we want to measure the bandgap

#define aref_voltage 3.3         // we tie 3.3V to ARef and measure it with a multimeter!
#define bandgap_voltage 1.1      // this is not super guaranteed but its not -too- off

RTC_DS1307 RTC; // define the Real Time Clock object

// for the data logging shield, we use digital pin 10 for the SD cs line
const int chipSelect = 10;

// the logging file
File logfile;

void error(char *str)
{
 Serial.print("error: ");
 Serial.println(str);
 
 // red LED indicates error
 digitalWrite(redLEDpin, HIGH);

 while(1);
}

void setup(void)
{
 Serial.begin(9600);
 Serial.println();
 
 // use debugging LEDs
 pinMode(redLEDpin, OUTPUT);
 pinMode(greenLEDpin, OUTPUT);
 
#if WAIT_TO_START
 Serial.println("Type any character to start");
 while (!Serial.available());
#endif //WAIT_TO_START

 // initialize the SD card
 Serial.print("Initializing SD card...");
 // make sure that the default chip select pin is set to
 // output, even if you don't use it:
 pinMode(10, OUTPUT);
 
 // see if the card is present and can be initialized:
 if (!SD.begin(chipSelect)) {
   error("Card failed, or not present");
 }
 Serial.println("card initialized.");
 
 // create a new file
 char filename[] = "LOGGER00.CSV";
 for (uint8_t i = 0; i < 100; i++) {
   filename[6] = i/10 + '0';
   filename[7] = i%10 + '0';
   if (! SD.exists(filename)) {
     // only open a new file if it doesn't exist
     logfile = SD.open(filename, FILE_WRITE); 
     break;  // leave the loop!
   }
 }
 
 if (! logfile) {
   error("couldnt create file");
 }
 
 Serial.print("Logging to: ");
 Serial.println(filename);

 // connect to RTC
 Wire.begin();  
 if (!RTC.begin()) {
   logfile.println("RTC failed");
#if ECHO_TO_SERIAL
   Serial.println("RTC failed");
#endif  //ECHO_TO_SERIAL
 }
 

 logfile.println("millis,stamp,datetime,light,temp,vcc");    
#if ECHO_TO_SERIAL
 Serial.println("millis,stamp,datetime,light,temp,vcc");
#endif //ECHO_TO_SERIAL

 // If you want to set the aref to something other than 5v
 analogReference(EXTERNAL);
}

void loop(void)
{
 DateTime now;

 // delay for the amount of time we want between readings
 delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL));
 
 digitalWrite(greenLEDpin, HIGH);
 
 // log milliseconds since starting
 uint32_t m = millis();
 logfile.print(m);           // milliseconds since start
 logfile.print(", ");    
#if ECHO_TO_SERIAL
 Serial.print(m);         // milliseconds since start
 Serial.print(", ");  
#endif

 // fetch the time
 now = RTC.now();
 // log time
 logfile.print(now.unixtime()); // seconds since 1/1/1970
 logfile.print(", ");
 logfile.print('"');
 logfile.print(now.year(), DEC);
 logfile.print("/");
 logfile.print(now.month(), DEC);
 logfile.print("/");
 logfile.print(now.day(), DEC);
 logfile.print(" ");
 logfile.print(now.hour(), DEC);
 logfile.print(":");
 logfile.print(now.minute(), DEC);
 logfile.print(":");
 logfile.print(now.second(), DEC);
 logfile.print('"');
#if ECHO_TO_SERIAL
 Serial.print(now.unixtime()); // seconds since 1/1/1970
 Serial.print(", ");
 Serial.print('"');
 Serial.print(now.year(), DEC);
 Serial.print("/");
 Serial.print(now.month(), DEC);
 Serial.print("/");
 Serial.print(now.day(), DEC);
 Serial.print(" ");
 Serial.print(now.hour(), DEC);
 Serial.print(":");
 Serial.print(now.minute(), DEC);
 Serial.print(":");
 Serial.print(now.second(), DEC);
 Serial.print('"');
#endif //ECHO_TO_SERIAL

 analogRead(photocellPin);
 delay(10); 
 int photocellReading = analogRead(photocellPin);  
 
 analogRead(tempPin); 
 delay(10);
 int tempReading = analogRead(tempPin);    
 
 // converting that reading to voltage, for 3.3v arduino use 3.3, for 5.0, use 5.0
 float voltage = tempReading * aref_voltage / 1024;  
 float temperatureC = (voltage - 0.5) * 100 ;
 float temperatureF = (temperatureC * 9 / 5) + 32;
 
 logfile.print(", ");    
 logfile.print(photocellReading);
 logfile.print(", ");    
 logfile.print(temperatureF);
#if ECHO_TO_SERIAL
 Serial.print(", ");   
 Serial.print(photocellReading);
 Serial.print(", ");    
 Serial.print(temperatureF);
#endif //ECHO_TO_SERIAL

 // Log the estimated 'VCC' voltage by measuring the internal 1.1v ref
 analogRead(BANDGAPREF); 
 delay(10);
 int refReading = analogRead(BANDGAPREF); 
 float supplyvoltage = (bandgap_voltage * 1024) / refReading; 
 
 logfile.print(", ");
 logfile.print(supplyvoltage);
#if ECHO_TO_SERIAL
 Serial.print(", ");   
 Serial.print(supplyvoltage);
#endif // ECHO_TO_SERIAL

 logfile.println();
#if ECHO_TO_SERIAL
 Serial.println();
#endif // ECHO_TO_SERIAL

 digitalWrite(greenLEDpin, LOW);

 // Now we write data to disk! Don't sync too often - requires 2048 bytes of I/O to SD card
 // which uses a bunch of power and takes time
 if ((millis() - syncTime) < SYNC_INTERVAL) return;
 syncTime = millis();
 
 // blink LED to show we are syncing data to the card & updating FAT!
 digitalWrite(redLEDpin, HIGH);
 logfile.flush();
 digitalWrite(redLEDpin, LOW);
 
}

TemperaturSketch:

#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into pin 2 on the Arduino
#define ONE_WIRE_BUS 10

// Setup a oneWire instance to communicate with any OneWire devices 
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

void setup(void)
{
 // start serial port
 Serial.begin(9600);
 Serial.println("Dallas Temperature IC Control Library Demo");

 // Start up the library
 sensors.begin();
}


void loop(void)
{
 // call sensors.requestTemperatures() to issue a global temperature
 // request to all devices on the bus
 Serial.print(" Requesting temperatures...");
 sensors.requestTemperatures(); // Send the command to get temperatures
 Serial.println("DONE");

 Serial.print("Temperature for Device 1 is: ");
 Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"? 
   // You can have more than one IC on the same bus. 
   // 0 refers to the first IC on the wire

}

Danke schonmal vielmals.

P.S: Ich bin relativ neu auf diesem Gebiet unterwegs, deshalb entschuldige ich mich schon einmal im vorraus für meine Unwissenheit, hoffe jedoch, dass mir jemand behilflich sein kann.

Danke.

MfG Phil

Code bitte in Code Tags </> einschließen. Du kannst das nachtragen mit Edit more, dann den Code auswählen und </> klicken.

Was hindert Dich, etwas mit
logFile.print(wasAuchImmer);
in den Logfile zu schreiben?

DrDiettrich:
Code bitte in Code Tags </> einschließen. Du kannst das nachtragen mit Edit more, dann den Code auswählen und </> klicken.

Was hindert Dich, etwas mit
logFile.print(wasAuchImmer);
in den Logfile zu schreiben?

Danke schonmal für den Hinweis mit dem Code, sry dafür....

Wie meinst du die Frage, sry aber ich bin recht neu auf dem Gebiet und verstehe die Frage schon nicht(schäm). :wink:

Es geht nur darum, den "DataloggingSketch" so abzuändern, dass ich nicht einen analogen Temperaturwert auslese(so wie es bei dem DataloggingSketch ausgelegt ist), sondern die Werte für Temperatur mit einem digitalen Temperatursensor auslesen und ausgeben möchte. Demnach sollte ich den DataloggingSketch dafür abändern, so hatte ich es mir bis jetzt gedacht...Hoffe wenigstens die Denkweise ist richtig...Danke schonmal!

MfG

Du mußt auf jeden Fall

Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"?

im TemperaturSketch zerlegen, und den Meßwert in eine Variable schreiben, die dann mit Serial.print und logFile.print ausgegeben werden kann. Also sowas wie

float temperatur = sensors.getTempCByIndex(0);
Serial.print(temperatur);

Den passenden Datentyp der temperatur Variablen mußt Du selbst herausfinden, es sollte der selbe Typ sein wie von DallasTemperature::getTempCByIndex().

Danach sollte alles vom TemperaturSketch stückweise in den DataLoggingSketch kopiert werden. Erst mal alles bis void setup(), dann den Inhalt von setup() in DataLoggingSketch setup() kopieren, daraus das doppelte Serial.begin löschen, und dann den Inhalt von loop() nach loop() kopieren.

Was möchtest Du denn anschließend mit dem Logfile machen? Wenn Du das Format änderst, indem Du mehr Meßwerte reinschreibst, muß das Programm zum Lesen der Datei ggf. entsprechend angepaßt werden. Steigst Du da nicht etwas zu hoch ein, wenn Du vom Programmieren noch keine große Ahnung hast?

Danke erstmal für den Ansatz!!!
ich werde versuchen dieses nun umzusetzen!

Der Logfile ist nur dafür da, die Lichtwerte(von einer Photodiode), die Temperaturwerte(von dem Dallas Temperatursensor) samt Uhrzeit zu loggen, sodass ich sehen kann, bei welcher Uhrzeit welcher Lichtwert bzw. welche Temperatur geherrscht hat.
Also im Prinzip sollte im Logfile stehen:

  • Datum/Uhrzeit
  • Lichtwerte der Photodiode
  • Temperatur

Hey nochmal,

habe versuch den Sketch anzupassen, allerdings wieder mehrer Fehlermeldungen...könnte ich den zusammengebauten Sketch nochmal hochladen, dass jemand nen Blick drauf wirft? Ich denke/hoffe das es nur an einer Kleinigkeit liegt....habe aber wie schon erwähnt wenig Ahnung. Wäre echt nett wenn mir jem and helfen würde. Danke schonmal

Ich bekomme jetzt immer ienen TemperaturWert von "-127", iwas mit der Umrechnung scheint nicht zu stimmen,

Ich poste mal den Code...bitte erschlagt mich nicht deswegen :P, es soll nur die Uhrzeit/Datum , Temperatur und die Werte der Photodiode geloggt werden. Spannung usw. kann außer Acht gelassen werden...So wie der Sketch jetzt ist, loggt er mir das Datum/Uhrzeit mit Photodiodenwerte korrekt, allerdings gibt er für die Temperatur immer "-127" aus.. jemand ne Idee?

#include <SD.h>
#include <Wire.h>
#include "RTClib.h"

//Eingefügt aus TempSketch


#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into pin 10 on the Arduino
#define ONE_WIRE_BUS 10

// Setup a oneWire instance to communicate with any OneWire devices 
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// Ende eingefügt TempSketch

// A simple data logger for the Arduino analog pins

// how many milliseconds between grabbing data and logging it. 1000 ms is once a second
#define LOG_INTERVAL  1000 // mills between entries (reduce to take more/faster data)

// how many milliseconds before writing the logged data permanently to disk
// set it to the LOG_INTERVAL to write each time (safest)
// set it to 10*LOG_INTERVAL to write all data every 10 datareads, you could lose up to 
// the last 10 reads if power is lost but it uses less power and is much faster!
#define SYNC_INTERVAL 1000 // mills between calls to flush() - to write data to the card
uint32_t syncTime = 0; // time of last sync()

#define ECHO_TO_SERIAL   1 // echo data to serial port
#define WAIT_TO_START    0 // Wait for serial input in setup()

// the digital pins that connect to the LEDs
#define redLEDpin 2
#define greenLEDpin 3

// The analog pins that connect to the sensors
#define photocellPin 0           // analog 0
#define tempPin 1                // analog 1
#define BANDGAPREF 14            // special indicator that we want to measure the bandgap

#define aref_voltage 3.3         // we tie 3.3V to ARef and measure it with a multimeter!
#define bandgap_voltage 1.1      // this is not super guaranteed but its not -too- off

RTC_DS1307 RTC; // define the Real Time Clock object

// for the data logging shield, we use digital pin 10 for the SD cs line
const int chipSelect = 10;

// the logging file
File logfile;

void error(char *str)
{
  Serial.print("error: ");
  Serial.println(str);
  
  // red LED indicates error
  digitalWrite(redLEDpin, HIGH);

  while(1);
}

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


//eingefügt aus TempSketch

 // Start up the library
 sensors.begin();


// Ende eingefügt TempSketch

  
  // use debugging LEDs
  pinMode(redLEDpin, OUTPUT);
  pinMode(greenLEDpin, OUTPUT);
  
#if WAIT_TO_START
  Serial.println("Type any character to start");
  while (!Serial.available());
#endif //WAIT_TO_START

  // initialize the SD card
  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(10, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    error("Card failed, or not present");
  }
  Serial.println("card initialized.");
  
  // create a new file
  char filename[] = "LOGGER00.CSV";
  for (uint8_t i = 0; i < 100; i++) {
    filename[6] = i/10 + '0';
    filename[7] = i%10 + '0';
    if (! SD.exists(filename)) {
      // only open a new file if it doesn't exist
      logfile = SD.open(filename, FILE_WRITE); 
      break;  // leave the loop!
    }
  }
  
  if (! logfile) {
    error("couldnt create file");
  }
  
  Serial.print("Logging to: ");
  Serial.println(filename);

  // connect to RTC
  Wire.begin();  
  if (!RTC.begin()) {
    logfile.println("RTC failed");
#if ECHO_TO_SERIAL
    Serial.println("RTC failed");
#endif  //ECHO_TO_SERIAL
  }
  

  logfile.println("millis,stamp,datetime,light,temp,vcc");    
#if ECHO_TO_SERIAL
  Serial.println("millis,stamp,datetime,light,temp,vcc");
#endif //ECHO_TO_SERIAL
 
  // If you want to set the aref to something other than 5v
  analogReference(EXTERNAL);
}

void loop(void)
{

// eingefügt aus TempSketch

 // call sensors.requestTemperatures() to issue a global temperature
 // request to all devices on the bus
 sensors.requestTemperatures(); // Send the command to get temperatures
 Serial.print('\n');("DONE");

 Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"? 
   // You can have more than one IC on the same bus. 
   // 0 refers to the first IC on the wire

   // Ende eingefügt aus TempSketch

  
  DateTime now;

  // delay for the amount of time we want between readings
  delay((LOG_INTERVAL -1) - (millis() % LOG_INTERVAL));
  
  digitalWrite(greenLEDpin, HIGH);
  
  // log milliseconds since starting
  uint32_t m = millis();
  logfile.print(m);           // milliseconds since start
  logfile.print(", ");    
#if ECHO_TO_SERIAL
  Serial.print(m);         // milliseconds since start
  Serial.print(", ");  
#endif

  // fetch the time
  now = RTC.now();
  // log time
  logfile.print(now.unixtime()); // seconds since 1/1/1970
  logfile.print(", ");
  logfile.print('"');
  logfile.print(now.year(), DEC);
  logfile.print("/");
  logfile.print(now.month(), DEC);
  logfile.print("/");
  logfile.print(now.day(), DEC);
  logfile.print(" ");
  logfile.print(now.hour(), DEC);
  logfile.print(":");
  logfile.print(now.minute(), DEC);
  logfile.print(":");
  logfile.print(now.second(), DEC);
  logfile.print('"');
#if ECHO_TO_SERIAL
  Serial.print(now.unixtime()); // seconds since 1/1/1970
  Serial.print(", ");
  Serial.print('"');
  Serial.print(now.year(), DEC);
  Serial.print("/");
  Serial.print(now.month(), DEC);
  Serial.print("/");
  Serial.print(now.day(), DEC);
  Serial.print(" ");
  Serial.print(now.hour(), DEC);
  Serial.print(":");
  Serial.print(now.minute(), DEC);
  Serial.print(":");
  Serial.print(now.second(), DEC);
  Serial.print('"');
#endif //ECHO_TO_SERIAL

  analogRead(photocellPin);
  delay(10); 
  int photocellReading = analogRead(photocellPin);  
  
  float temperatur = sensors.getTempCByIndex(0);
Serial.print(temperatur);    
  

  
  logfile.print(", ");    
  logfile.print(photocellReading);
  logfile.print(", ");    
  logfile.print(temperatur);
#if ECHO_TO_SERIAL
  Serial.print(", ");   
  Serial.print(photocellReading);
  Serial.print(", ");    
  Serial.print(temperatur);
#endif //ECHO_TO_SERIAL

  // Log the estimated 'VCC' voltage by measuring the internal 1.1v ref
  analogRead(BANDGAPREF); 
  delay(10);
  int refReading = analogRead(BANDGAPREF); 
  float supplyvoltage = (bandgap_voltage * 1024) / refReading; 
  
  logfile.print(", ");
  logfile.print(supplyvoltage);
#if ECHO_TO_SERIAL
  Serial.print(", ");   
  Serial.print(supplyvoltage);
#endif // ECHO_TO_SERIAL

  logfile.println();
#if ECHO_TO_SERIAL
  Serial.println();
#endif // ECHO_TO_SERIAL

  digitalWrite(greenLEDpin, LOW);

  // Now we write data to disk! Don't sync too often - requires 2048 bytes of I/O to SD card
  // which uses a bunch of power and takes time
  if ((millis() - syncTime) < SYNC_INTERVAL) return;
  syncTime = millis();
  
  // blink LED to show we are syncing data to the card & updating FAT!
  digitalWrite(redLEDpin, HIGH);
  logfile.flush();
  digitalWrite(redLEDpin, LOW);
  
}

Hier mal ein Screenshot des seriellen Monitors.

Serieller Monitor

in der jeweils ersten Zeile gibt er auch die "-127" aus.... warum das?

Ich möchte einfach " datetime, light, temp " ausgeben

"datetime" gibt er mir die korrekten Werte,

"light" ebenfalls,

jedoch gibt er bei "temp" -127 aus....

man ich komme nich wirklich weiter, bin schon ein paar Stunden dran und bekomms nich hin.....

muss ich denn den Digitalen Pin angeben? (in meinem Fall Pin 10), also der digital Pin für den Temperatursensor, wenn ja wo im Sketch?...

Wäre echt nett wenn jemand ne Ahnung hat

Wenn der Wert -127 angezeigt wird, liegt es evtl. an einem defekten oder falsch angeschlossenen Sensor.

Den Pin 10 hast du in der Deklaration (#define ONE_WIRE_BUS 10) schon angegeben.

Du solltest die Temperaturmessung mit dem Sensor einmal separat vornehmen. Verwende dazu die in der Library vorhandenen Beispiele. Damit kannst du prüfen, ob es der Sensor ist.

Und um es in deinem Sketch übersichtlicher zu gestalten, verwende für die Temperaturmessung eine eigene Funktion. Das wird übersichtlicher und ist auch für eine Fehlersuche einfacher.

Danke erstmal für die schnelle Antwort! Der Temperatursensor funktioniert alleine einwandfrei...habe ich im ersten Post oben auch geschrieben, allerdings spuckt er mir beim einbinden in den dataloggingSketch immer den Wert -127 aus.... naja ich probier mal noch rum...danke erstmal für die Antwort!

Aus dem Temp Sketch

// Data wire is plugged into pin 2 on the Arduino

#define ONE_WIRE_BUS 10

// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

Aus dem SD Sketch

// for the data logging shield, we use digital pin 10 for the SD cs line[/color]

const int chipSelect = 10;

Klassische Fall von Doppel Belegung in deinem SD-Karten Sketch ist pin 10 als SlaveSelect benutz (also Ausgang zur Device Anwahl für den SPI_BUS)
und in einem Temperatur Sketch auch der Pin 10 für den One-Wire Bus.
Ändere in deinem Copy+Pasta Sketch

#define ONE_WIRE_BUS 10

auf z.B. 9 (Wenn ich richtig gesehen habe ist der noch frei) und natürlich auch den Sensor auf den Pin verbinden.

#define ONE_WIRE_BUS 9

Dann sollte es auch laufen.
Um dies in Zukunft zu umgehen packe oben in deine Code am besten alles zusammen was mit Pins zu tun hat und am besten auch über "#define "s dann siehst du sowas sofort.
Gruß
DerDani

Wow, daran hatte ich jetzt nich gedacht, dass beide auf einen Pin gelegt sind! Da scheint wirklich das Problem zu liegen! Ich teste es mal aus und berichte! Danke schonmal! echt super, dass du den Fehler gefunden hast!

Es hat geklappt! Wow besten Dank an Euch bzw. vor allem an dich Dani !!!! Super Super Super! Finds echt genial wie manche von euch Fehler finden ohne das Projekt "vor sich zu haben"! Besten Dank!