Zusammenfügen von 2 Sketchen eines Datenlogger, DS18B20

Hallo!

ich bin momentan dabei mir ein Datenlogger für meine Heizung zu basteln. Da ich neu in der Arduinowelt bin wäre es schön wenn mir einer bei meinem Problem helfen könnte.
Mein Datenlogger besteht aus einem Arduino UNO, 5 DS18B20 Sensoren und einem Adafruit Data Logger Shield.
Meine Sketche (Temperatur auslesen und Daten loggen mit RTC) funktionieren auch schon im Einzelnen nur weiß ich noch nicht wie ich sie richtig zusammenfügen kann, dass er mir auf der SD-Karte einen Temperaturwert mit Datum und Uhrzeit zuordnet.

Hier mein Code für die 5 DS18B20 Sensoren:

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

#define ONE_WIRE_BUS 2


OneWire oneWire(ONE_WIRE_BUS); // Einrichten des OneWire Bus um die Daten der Temperaturfühler abzurufen
DallasTemperature sensors(&oneWire); // Bindung der Sensoren an den OneWire Bus

DeviceAddress tempDeviceAddress; // Verzeichniss zum Speichern von Sensor Adressen
int numberOfDevices; // Anzahl der gefundenen Sensoren

void setup(void)
{
Serial.begin(9600);
Serial.println("Abfrage mehrerer Dallas Temperatur Sensoren");
Serial.println("-------------------------------------------");

// Suche der Sensoren
Serial.println("Suche Temperatur Sensoren...");
sensors.begin();
numberOfDevices = sensors.getDeviceCount();

Serial.print("Habe ");
Serial.print(numberOfDevices, DEC);
Serial.println(" Sensoren gefunden.");

}

void loop(void)
{
// Aufruf der Funktion sensors.requestTemperatures()
// Dadurch werden alle werte abgefragt.
Serial.print("Abfrage der Temperatur... ");
sensors.requestTemperatures();
Serial.println("DONE");

// Ausgabe der Daten für jeden Sensor
for(int i=0 ;i<numberOfDevices; i++) {
float tempC = sensors.getTempCByIndex(i);
Serial.print("Sensor ");
Serial.print(i, DEC);
Serial.print(" hat grad Celsius: ");
Serial.println(tempC);
}
delay(5000);
}

Und mein Code zum Loggen mit Uhrzeit:

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

const int chipSelect = 10; //10 is default by shield, but normally on Pin 4
int interval = 5;  //Log to SD Card every 5 seconds

long timer;
String timestring;
String mvalue;

RTC_DS1307 rtc;

void setup() {
  Serial.begin(9600);
  delay(3000);
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelect)) {
    Serial.println("SD Card error");
    return;
  }
  Serial.println("card initialized");
  if (! rtc.begin()) {
    Serial.println("No RTC found");
  } else {
    Serial.println("RTC clock found");
  }
  if (! rtc.isrunning()) {
    Serial.println("RTC is not configured");
  }
}

void loop() {
  if ((timer + interval * 1000) < millis()) {
    timer = millis();
    get_logvalue(); //Get your value
    get_time(); //Get time from RTC
    write_data(); //Write value and Time to SD
  }
}

void get_logvalue() {
  mvalue = "My Value"; //mvalue is your log parameter eg. Temperature
}

void get_time(){ //Read Time from RTC
  DateTime now = rtc.now();
  timestring = now.day();
  timestring += "-";
  timestring += now.month();
  timestring += "-";
  timestring += now.year();
  timestring += " ";
  timestring += now.hour();
  timestring += ":";
  timestring += now.minute();
  timestring += ":";
  timestring += now.second();
  Serial.println(timestring);
}

void write_data() { //Write to SD card
  String dataString = mvalue + "," + timestring;
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    Serial.println(dataString);
  }
  else {
    Serial.println("error writing datalog.txt");
  }
}

Über Lösungen, Beispiele oder Tipps wäre ich sehr dankbar!

Hallo,
warum liest du dir nicht erst mal hier im Forum einige Beiträge durch, die dein Problem beschreiben.
Da wurden von uns in letzter Zeit mehrfach Tipps gegeben, wie man mehrere Sketch zusammen fügt.

Dann probierst du das mittels zahlreicher Tipps und kommst bei evtl. Fragen wieder.

Hi

Mindestens eine Unschönheit:
if ((timer + interval * 1000) < millis()) { //mache was nach Wartezeit, nicht überlauffest
-->
if (!(millis()-timer <= (interval * 1000))) { //mache was, wenn NICHT (!) während der Wartezeit
oder
if (millis()-timer>(interval*1000)){ //mache was, wenn die Wartezeit überschritten wurde
Die unteren Zwei sind überlauffest (erspart Fehlfunktionen nach (einem Vielfachen) von 49,x Tagen.

Dann sollten in Deinem Sketch keine delay() vorkommen - Das passt zu Nummer 2, aber bei Nummer 1 sieht's schon düster aus.
Schaue Dir, neben den Tipps hier im Forum, auch Deinen Sketch 2 an, Was Der anders macht, Wie Der die Wartezeit überbrückt.

MfG

mjanzen:
Über Lösungen, Beispiele oder Tipps wäre ich sehr dankbar!

Was auch immer Du machst: Mach' ein Backup.

Formatiere den ersten in etwa so wie den zweiten Sketch (mache ihn übersichtlicher) und kürze die Sachen auf das notwendige Minimum. Dann hast Du ungefähr die Hälfte des Problems erledigt.

Gruß

Gregor

Hallo mjansen,

also selber programmieren ist ein bißchen anspruchsvoller als "Luftballons zusmmenkleben".
Um ein gewisses Maß an Verständnis kommt man da einfach nicht herum.
Es gibt niemals ein "zusammenklebe-Rezept der Art
"von Sktech 1 nimmst du Zeile 1 bis 79 und dahinter fügst du vom Sketch 2 Zeile 254 bis 275 an."

Was vermutest du in welcher Zeile (= bei welchem Befehl ) wird in im Sketch Datalogger die Daten "erzeugt"?

In welcher Zeile (=bei welchem Befehl) wird im Temperatur-Sketch eine einzelne Temperatur ausgegeben?

viele Grüße

Stefan