Hallo Gemeinde,
In der suche bin ich nicht Fündig geworden was die Abfrage der OneWire (DS18B20) Sensoren angeht. Daher wende ich mich hier an die Forum Mittglieder die sicherlich mehr erfahrung haben in diesem Tehma.
Ich scanne die Sensoren ein was auch funktioniert
OneWire oneWire(oneWireBus);
DallasTemperature sensors(&oneWire);
DeviceAddress tempDeviceAddress; // Variable für die Sensor-ID
void scanOneWireSensors() {
int deviceCount = sensors.getDeviceCount();
Serial.printf("Gefundene OneWire-Sensoren: %d\n", deviceCount);
// Begrenze die Anzahl auf maximal 5 Sensoren
int sensorLimit = (deviceCount < 5) ? deviceCount : 5;
// Falls du nur einen Sensor anzeigen willst (oder mehrere, dann ggf. zusammenfügen):
for (int i = 0; i < sensorLimit; i++){
DeviceAddress deviceAddress;
String sensorID = "";
if (sensors.getAddress(deviceAddress, i)){
for (uint8_t j = 0; j < 8; j++){
if (deviceAddress[j] < 0x10) sensorID += "0";
sensorID += String(deviceAddress[j], HEX);
}
sensorID.toUpperCase();
}
else {
sensorID = "NotFound";
}
// Setze das .txt-Feld auf einen festen Text, z.B. "Sensor ID"
sendToNextion("cb_owID", "Sensor ID");
// Aktualisiere das .path-Feld direkt – analog zum WLAN-Beispiel:
String cmd = "cb_owID.path=\"" + sensorID + "\"" + END_CHAR;
Serial1.print(cmd);
Serial.println("Gesendete Sensor-ID: " + sensorID);
}
}
// Konvertiert die Sensoradresse in eine lesbare ID
String getSensorID(DeviceAddress deviceAddress) {
String id = "";
for (uint8_t i = 0; i < 8; i++) {
if (deviceAddress[i] < 16) id += "0";
id += String(deviceAddress[i], HEX);
}
return id;
}
danach frage ich am Nextion nach die ID der Sensoren, was auch soweit klappt
Aber da scheitert es dann an der zuordnung der Temp. zu dem jeweiligen Sensor. Da er immer nur den ersten Sensor abfragt.
void getTemperatureForID(String sensorID) {
Serial.println("Starte Temperaturabfrage...");
// Temperaturabfrage durch die neue Funktion
float tempC = getTemperature(0); // Temperatur des ersten Sensors holen
// Debug-Ausgabe vor der Bedingung
Serial.println("Abfrage abgeschlossen, Wert erhalten: ");
Serial.println(tempC); // Ausgabe des gemessenen Temperaturwerts
if (tempC != DEVICE_DISCONNECTED_C) {
// Wenn der Sensor verbunden ist, den Wert ausgeben und ans Nextion senden "When the sensor is connected, output the value and send it to the Nextion"
Serial.print("Sensor ID: ");
Serial.print(sensorID);
Serial.print(" - Temperatur: ");
Serial.println(tempC);
sendToNextion("t_temp", tempC); // Temperatur an Nextion senden
} else {
// Fehlerbehandlung, falls der Sensor nicht verbunden ist "Error handling if the sensor is not connected"
Serial.println("Fehler: Sensor nicht verbunden oder Temperaturabfrage fehlgeschlagen");
}
}
nun meine Frage wie kann ich das ganze Dynamisch machen, das er zu den gefundenen Sensoren auch die Temperatur abfragt.
21:40:43.571 -> Gefundene OneWire-Sensoren: 2
21:40:43.571 -> Gesendete Sensor-ID: 28EEBE5D2716017A
21:40:43.619 -> Gesendete Sensor-ID: 2869C87B0000006B
21:41:09.353 -> Empfangen: p2869C87B0000006B
21:41:09.353 -> Sensor ID: 2869C87B0000006B
21:41:09.353 -> Starte Temperaturabfrage...
21:41:09.432 -> Abfrage abgeschlossen, Wert erhalten:
21:41:09.432 -> -1.50
21:41:09.432 -> Sensor ID: 2869C87B0000006B - Temperatur: -1.50
weil das ist die 2 te ID die er ausgibt, aber die Temperatur von Sensor 1. Richtig wäre Sensor-ID: 28EEBE5D2716017A - Temp: -1.50
kann mir da jemand vieleicht weiterhelfen das ich die Zuordnung hinbekomme?
Vielen Dank schon einmal
P.S.
Die zuornung soll dann so erfolgen und die werte an das ensprechende Feld auf dem Nextion gesendet werden
void temperatur() {
// Beispiel: Temperaturabfragen für die Sensoren "Example: Temperature queries for the sensors"
tempID1 = getTemperature(0); // Temperatur des ersten Sensors
tempID2 = getTemperature(1); // Temperatur des zweiten Sensors
tempID3 = getTemperature(2); // Temperatur des dritten Sensors
tempID4 = getTemperature(3); // Temperatur des vierten Sensors
tempID5 = getTemperature(4); // Temperatur des fünften Sensors
// Umwandlung der Temperaturen in Strings
String tempAStr = String(tempID1, 1); // 1 Dezimalstelle
String tempBStr = String(tempID2, 1);
String tempSStr = String(tempID3, 1);
String tempWTStr = String(tempID4, 1);
String tempPStr = String(tempID5, 1);
// Vergleichen, ob sich die Temperaturen geändert haben
if (tempAStr != lastTempID1) {
sendToNextion("t_atemp", tempAStr); // Sendet als String
lastTempID1 = tempAStr; // Speichern der aktuellen Temperatur
}
if (tempBStr != lastTempID2) {
sendToNextion("t_btemp", tempBStr);
lastTempID2 = tempBStr;
}
if (tempSStr != lastTempID3) {
sendToNextion("t_stemp", tempSStr);
lastTempID3 = tempSStr;
}
if (tempWTStr != lastTempID4) {
sendToNextion("t_wtemp", tempWTStr);
lastTempID4 = tempWTStr;
}
if (tempPStr != lastTempID5) {
sendToNextion("t_ptemp", tempPStr);
lastTempID5 = tempPStr;
}
}
