2 Sensoren DS18B20 upload auf Thingspeak

Hallo erstmals, bin ein Neuling in Sachen Arduino habe aber sehr gefallen daran gefunden aber stehe nun vor einen Problem und hoffe Ihr könnt mir dabei weiterhelfen :slight_smile:

Ich habe 2 Stk DS18B20 Sensoren auf einen Arduino Uno samt Ethernet Shield,
Im Seriellen Monitor funktioniert die Richtige Temperatur Ausgabe,
lade ich jedoch die beiden Senordaten auf Thingspeak rauf kommen ganz andere Werte drauf,
denke es jat mit:

int sensor1Value = (Temp1);
int sensor2Value = (Temp2);

zu tun, hab mehrere Varianten bis jz durchprobiert komme aber nicht auf die Lösung.

Z.b Anzeige auf den Seriellen Monitor : 21,75
Anzeige auf Thingspeak 265

Hier noch der ProgrammCode:

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Ethernet.h>
#include "secrets.h"
#include "ThingSpeak.h"

byte mac[] = SECRET_MAC;

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 188, 53);
IPAddress myDns(192, 168, 188, 1);

EthernetClient client;

unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey = SECRET_WRITE_APIKEY;

// Data wire is plugged into port 5 on the Arduino
#define ONE_WIRE_BUS 5

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

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

// Addresses of 2 DS18B20s
DeviceAddress Temp1 = { 0x28, 0xC5, 0xB0, 0x99, 0x53, 0x22, 0x08, 0x5A };
DeviceAddress Temp2 = { 0x28, 0x9B, 0xF8, 0x82, 0x54, 0x22, 0x09, 0x38 };


void setup(void){

  Serial.begin(115200);  //Initialize serial
  Ethernet.init(10);    // Most Arduino Ethernet hardware
  
  sensors.begin();
  sensors.setResolution(Temp1, 10);
  sensors.setResolution(Temp2, 10);
  
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo native USB port only
  }
      
  // start the Ethernet connection:
  Serial.println("Initialize Ethernet with DHCP:");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // Check for Ethernet hardware present
    if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
      while (true) {
        delay(1); // do nothing, no point running without Ethernet hardware
      }
    }
    if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
    }
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip, myDns);
  } else {
    Serial.print("  DHCP assigned IP ");
    Serial.println(Ethernet.localIP());
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  
  ThingSpeak.begin(client);  // Initialize ThingSpeak
}

void printTemperature(DeviceAddress deviceAddress)
{

float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) {
Serial.print("Error getting temperature");
} else {
Serial.print("   C: ");
Serial.print(tempC);
}
}

void loop(){

sensors.requestTemperatures();
// delay(100);

Serial.print("\Temp 1 ist");
printTemperature(Temp1);
Serial.println("");
Serial.print("\Temp 2 ist");
printTemperature(Temp2);
Serial.println("");

//And Update the ThingSpeak Channel
int sensor1Value = (Temp1);
int sensor2Value = (Temp2);
long timeRead = millis();

ThingSpeak.setField(1, sensor1Value);
ThingSpeak.setField(2, sensor2Value);
ThingSpeak.setField(3, timeRead);
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);

Serial.print("Data Uploaded to Cloud...\n\r");
Serial.print("\n\r");
delay(60000);
}

Danke fürs drüber schauen :slight_smile:

Was sollen wir mit dem Fragment anfangen?
Du sendest ja nirgendwo und initialisierst auch das Ethernet nicht.
Den kompilierbaren Sketch bitte in Codetags. Wie das geht, steht hier.

Gruß Tommy

Hallo Tommy,

das obere Fragmet was ich gesendet habe ist ein Schnippsel aus den unteren Code der gut ersichtlich in einen Codetag gesendet wurde :slight_smile:

Lg Felix

Temp1 und Temp2 sind Adressen. Auch wenn Du diese sinnloserweise in Klammern setzt, bekommst Du keine Temperatur.
Die bekommst Du, wenn Du sie wie in der Printfunktion abrufst.

sensors.getTempC(deviceAddress);

Hast Du da Sachen zusammen kopiert, die Du nicht verstanden hast?

Probiere mal

float sensor1Value = sensors.getTempC(Temp1);
float sensor2Value = sensors.getTempC(Temp2);

Falls das ThingSpeak kein float kann, dann nimm int

Gruß Tommy

Tommy danke dir, funktioniert nun tadelos :slight_smile:

Jap hast recht hab mir das aus diversen Beispielen zusammen geschnipselt,
bin grad am lernen von ganz am Anfang und man will natürlich immer gleich was probieren von den man keine Ahnung hat^^

Das führt zu einem Überlauf und negativen Zahlen.

Solltest Du das als Auswahlkriterium benutzen wollen, ist nach 1,5 Monaten spätestens Schluß.
Für den Fall, das Du da irgendwie eine Zeit drin haben möchtest, die Du auch auswerten kannst, wäre UNIXTime das Stichwort. Reicht dann von der Variablengröße und gibt Dir die echten Zeitdaten.
Dazu brauchts aber wenigstens einen Sync mit einem NTP. Intern kannst Du dann mit millis() weiterrechnen und dann vor der Übertragung wieder syncen.

Hier bleibt Dein Code für 60Sekunden ohne jede Funktion stehen. Dann einen Umlauf und wieder 60Sekunden nix....

Grüstich, den oben erwähnten Code hab ich mir stehen lassen da ich diesen noch umschreiben will für den upload für Feld 3, wird noch ein Relais hinzugefügt das mir ab einer gewissen Temperatur eine Begleitheizung aktiviert.

Das mit den 60 sek ist Absicht, 1 min Timeout für eine Temperatur Messung und übertragung an Thingspeak finde ich ausreichend für mein Projekt :wink:

Danke Trotzdem für die Info :slight_smile:

Egal auch wie, es ist Unsinn mit dem delay, dafür sind mllis da.
Hier ist alles schön beschrieben.
Nicht jetzt aber bei kleiner Änderung am Sketch fallt dir das delay so auf die Füße das dir kein Arzt helfen kann

Danke dir für die Info werd mir das heute noch einprägen

@fony hab mich mal versucht mit den millis,
wäre nett wenn man da nochmals drüber sehen könnte und mir ev noch tips geben könnte :slight_smile:
Kurz gefasst alle 30 sec serial Print von den Sensoren,
alle Minute upload auf Thingspeak
und alle 5 min überprüfen ob die Temperaturgrenzen erreicht werden

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Ethernet.h>
#include "secrets.h"
#include "ThingSpeak.h"

byte mac[] = SECRET_MAC;

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 188, 53);
IPAddress myDns(192, 168, 188, 1);

EthernetClient client;

unsigned long myChannelNumber = SECRET_CH_ID;
const char * myWriteAPIKey = SECRET_WRITE_APIKEY;

const int Heizung = 6;      //Anschlusspin Relais Begleitheizung
//const int Heizung2 = 7;   //Anschlusspin Relais Bierlager Heizung
int SollTemp1 = -1;         //Außen Temperatur Grenze
//int SollTemp2 = 2;        //Bierlager Temperatur Grenze

int sensor4Value;
//int sensor5Value;

#define ONE_WIRE_BUS 5

//Timer
unsigned long lastUpdate;
#define UPDATERATE 30000        //30 sec

unsigned long lastThingSpeak;
#define THINGRATE 60000         //1 min  

unsigned long lastHeatLevel;
#define HEATTIME 300000         //5 min


// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

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

// Adressen von 3 DS18B20s
DeviceAddress Temp1 = { 0x28, 0xC5, 0xB0, 0x99, 0x53, 0x22, 0x08, 0x5A };
DeviceAddress Temp2 = { 0x28, 0x9B, 0xF8, 0x82, 0x54, 0x22, 0x09, 0x38 };
DeviceAddress Temp3 = { 0x28, 0xCE, 0x80, 0x3C, 0x60, 0x22, 0x06, 0x2B };

void setup(void) {

  Serial.begin(115200); 
  Ethernet.init(10);    
  
  pinMode(Heizung, OUTPUT);
  //pinMode(Heizung2, OUTPUT);

  sensors.begin();
  sensors.setResolution(Temp1, 10);
  sensors.setResolution(Temp2, 10);
  sensors.setResolution(Temp3, 10);
  
  while (!Serial) {
    ; 
  }
      
  // Ethernet Verbindung Starten
  Serial.println("Initialize Ethernet with DHCP:");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // Check for Ethernet hardware present
    if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
      while (true) {
        delay(1); // do nothing, no point running without Ethernet hardware
      }
    }
    if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
    }
    Ethernet.begin(mac, ip, myDns);
  } else {
    Serial.print("  DHCP assigned IP ");
    Serial.println(Ethernet.localIP());
  }
  // Ethernet Shield 1 sec Zeit geben:
  delay(1000);
  
  ThingSpeak.begin(client);  // Initialisere ThingSpeak
}

void printTemperature(DeviceAddress deviceAddress) {

float tempC = sensors.getTempC(deviceAddress);

  if (tempC == -127.00) {
  Serial.print("  Error getting temperature");
  } else {
  Serial.print("   C: ");
  Serial.print(tempC);
  }
}

void loop() {

if(millis() - lastHeatLevel > HEATTIME) {

  if (sensors.getTempC(Temp2) < SollTemp1) {
  digitalWrite(Heizung,LOW);
  Serial.println("Begleitheizung Eingeschaltet");
  }else{digitalWrite(Heizung,HIGH);
  Serial.println("Begleitheizung Aus");
  }

  /*if (sensors.getTempC(Temp3) < SollTemp2) {
  digitalWrite(Heizung2,LOW);
  Serial.println("Bierlagerheizung Eingeschaltet");
  }else{digitalWrite(Heizung2,HIGH);
  Serial.println("Bierlagerheizung Aus");
  }*/

lastHeatLevel = millis();

}


if(millis() - lastUpdate > UPDATERATE) {

  sensors.requestTemperatures();

  Serial.print("\Alm-Temperatur");
  printTemperature(Temp1);
  Serial.println("");
  Serial.print("\Außen-Temperatur");
  printTemperature(Temp2);
  Serial.println("");
  Serial.print("\Bierlager-Temperatur");
  printTemperature(Temp3);
  Serial.println("");

lastUpdate = millis();

}


if(millis() - lastThingSpeak > THINGRATE) {
  
  // Update Thingspeak Chanel
 
  float sensor1Value = sensors.getTempC(Temp1);
  float sensor2Value = sensors.getTempC(Temp2);
  float sensor3Value = sensors.getTempC(Temp3);
  int sensor4Value =  digitalRead(Heizung);
  //int sensor5Value =  digitalRead(Heizung2);

  ThingSpeak.setField(1, sensor1Value);
  ThingSpeak.setField(2, sensor2Value);
  ThingSpeak.setField(3, sensor3Value);
  ThingSpeak.setField(4, sensor4Value);
  //ThingSpeak.setField(5, sensor5Value);
  ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);

  Serial.print("Daten Hochgeladen...\n\r");
  Serial.print("\n\r");
  
  lastThingSpeak = millis();

  } 
}





Dann will ich mal kurz...

Das "" kannst Du Dir sparen.
Und: Wenn Du sowieso printTemperature aufrufst, kannst Du auch die Ausgabe dort mit einem Zeilenumbruch beenden.
Apropos print...

Das \ leitet eigentlich einen Steuercode ein. Wenn Du das \ angezeigt bekommen möchtest, brauchst Du zwei davon: \\.
Wenn Du schon für Thinkspeak Variablen anlegst, dann nutze die auch komplett im Code und verzichte darauf mehrfach den Sensor direkt zu lesen. Letzteres ist viel zu langsam.

Da digitalRead nur 2 Zustände zurück gibt, mach ein bool da draus.

Und dann nutze das F()-Makro für die Ausgaben:

neu:
Serial.println(F("Begleitheizung Eingeschaltet"));
etc.

Warum nicht alles in eine Zeile?
Serial.println(F("Daten Hochgeladen...\n\r"));

2 Likes

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.