Go Down

Topic: DS18B20 85 bzw-127 erkennen (Read 1 time) previous topic - next topic

gerd-wolfgang

Hallo,
dieses Thema ist hier im Forum nicht neu. Die bisherigen Informationen helfen mir aber nicht richtig weiter.
Ich habe ca. 30 Sensoren an vier One-Wire-Bussen. Am Sketch-Anfang werden alle überprüft, ob die Anzahl stimmt, ob alle bekannten vorhanden sind und ob neue vorhanden sind. Dies funktioniert alles  einwandfrei.
Die Temperaturen lese ich jede Minute aus. Die 750ms zwischen requestTemperatures und getTempC werden eingehalten. ca. 20 mal am Tag erhalte ich als Messwert 85 oder -127. Gut, ich weiß, das dass Messfehler sind. Ich vermute, das dass an der Verkabelung liegt. Bei der Menge an Daten kann ich die Anzahl an Fehlern verknusen. Nur möchte ich sie ausfiltern. Und dies gelingt mir nicht.
Folgender Code sollte das tun
Code: [Select]
for (i = 0; i < AnzahlSensoren; i++) {
                if (sensors[sensorList[i].busnr].getTempC(sensorList[i].address) != (-127.00 || 85.00)) {
                    sensorList[i].isttemp = sensors[sensorList[i].busnr].getTempC(sensorList[i].address);
                } // wenn -127 oder 85 dann vorheriger Wert
                  // kein Wert wäre mir lieber, aber ein float als "kein Wert" kenne ich nicht

sensorList ist ein Array, in dem die Adresse und die Busnummer gespeichert sind. Auch der Temperaturwert wird dort als float abgelegt.
Meine Überlegung ist, wenn 85 oder -127 ermittelt wird, soll einfach der vorherige Wert im Array bestehen bleiben. Aber das funktioniert nicht. Die Werte werden anschließend vom Array auf die SD geschrieben und dort erscheinen die fehlerhaften Werten. Und ich bin ziemlich ratlos und freue mich über jede Hilfe.
Gruß Gerd

Serenifly

#1
Mar 02, 2015, 06:08 pm Last Edit: Mar 02, 2015, 06:24 pm by Serenifly
Das ist schon mal ein grundlegender Fehler:
Code: [Select]

(-127.00 || 85.00)

Das ist immer 1. Du musst da schon zweimal auf (Un)gleichheit abfragen und das dann per || verknüpfen. Oder eher mit && in diesem Fall. (... != ...) && (... != ...)


Für ungültige Werte gibt es bei float NAN (not a number). Das kann man dann mit isnan() abfragen

ElEspanol

Stell mal den ganzen Sketch rein,  so kann man nichts konkretes sagen,  da man nicht weiss, wie du die Daten verarbeitest.

Aber ich würde das aktuelle Array mit den letzten Daten vorbelegen und dann einfach die Temperatur nicht reinschreiben,  wenn sie 85 oder -127 beträgt

Serenifly

Stell mal den ganzen Sketch rein,  so kann man nichts konkretes sagen
Mindestens ein elementarer Fehler ist klar ersichtlich :)

Ob darüber hinaus noch was falsch ist, ist was anderes

maverick1509

Hallo Wolfgang,
der Fehler ist ja schon erkannt, aber 20 mal am Tage -127 oder 85 würde mir absolut keine Ruhe lassen.
Ich habe auch ca. 25 Sensoren an meiner Steuerung, aber ich würde alles über den Haufen schmeißen und neu verkabeln, wenn ich das hätte.
Habe auch am Anfang Probleme gehabt, und wenn man das erste Mal 140° in der Solaranlage hat, und die Sensoren hin sind dann fängt man neu an.
Gruß
 

gerd-wolfgang

Das habe ich gleich umgesetzt:
Quote
(... != ...) && (... != ...)
Die if-Anweisung wird dabei aber sehr lang. gibt es die Möglichkeit eines Zeilenumbruchs innerhalb einer Anweisung? Oder lässt C das nicht zu.

Quote
ich würde das aktuelle Array mit den letzten Daten vorbelegen und dann einfach die Temperatur nicht reinschreiben
Das habe ich gemeint, als ich schrieb:
Quote
soll einfach der vorherige Wert im Array bestehen bleiben
Wenn die obige Änderung der Logik funktioniert, woran ich keine Zweifel habe, werde ich Zähler einbauen für die Fehlerwerte, um ihrem Ursprung näher zu kommen. Da die Sensoren aber alle beim Sketchstart antworten, sind sie am Bus vorhanden und der Bus funktioniert prinzipiell. Die Verkabelung ist sicherlich nicht ideal, aber bisher optimal. Wenn ich die Fehlstellen besser kenne, kann ich vermutlich damit leben. Zumal die so realisierte Heizungsregelung gut funktioniert.

Ein wirkliches Problem habe ich, die Daten ins Internet zu senden. Siehe Forumsbeitrag "Daten in die Wolke".

Gruß Gerd

Serenifly

Ja, Zeilenumbrüche sind erlaubt. Im Zweifelsfall einfach ausprobieren.

Du kannst du Temperatur auch einfach zwischenspeichern und dann den Vergleich mit der Variable machen.

gerd-wolfgang

Welche Temperatur soll ich speichern? Ich bekomme doch gerade von getTempC die Werte 85 bzw. -127 als Temperaturwerte. Und aus Erfahrung weiß ich, dass das Fehler sind.

Serenifly

Code: [Select]

float temp = sensors[sensorList[i].busnr].getTempC(sensorList[i].address);
if(temp != 85.0 && temp != -127.0)
{
}

gerd-wolfgang

OK. Da habe ich dich völlig missverstanden. Sorry.
Ja. Ich glaube, dadurch wird es übersichtlicher.
Danke.

gerd-wolfgang

zum Abschluss hier eine kurze Erfolgsmeldung:

Ich habe den code ein wenig geändert:


Code: [Select]
            for (i = 0; i < AnzahlSensoren; i++) {
                if (sensors[sensorList[i].busnr].getTempC(sensorList[i].address) == -127.00) {
                    sensorList[i].falsch = 'L';
                }
                else if (sensors[sensorList[i].busnr].getTempC(sensorList[i].address) == 85.00) {
                    sensorList[i].falsch = 'H';
                }
                else {
                    sensorList[i].isttemp = sensors[sensorList[i].busnr].getTempC(sensorList[i].address);
                    sensorList[i].falsch = ' ';
                }
            }


Das funktioniert gut und ich bekomme damit die notwendigen Hinweise, um die Ursache einzugrenzen, ohne die Wertebereiche zu verfälschen und damit eine grafische Darstellung zu beeinflussen.

Gruß Gerd

Go Up