Pages: 1 [2]   Go Down
Author Topic: DS18B20 als defekt erkennen  (Read 1872 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 4
Posts: 127
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Es geht mir nicht darum die Daten auf jeden Fall zu erhalten sondern eine falsche Temperaturübermittlung und die daraus entstehenden fehlerhaften Programmschritte zu vermeiden.
Logged

Germany, BW
Offline Offline
Sr. Member
****
Karma: 3
Posts: 294
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wir drehen uns im Kreis.
Poste mal deinen Sketch und lass uns sehen was du bereits hast und was es kann.
Logged

Arduino 1.0.3|MEGA|UNO|MICRO|PRO MINI3.3
SSD1289 TFT Touch|DS18B20|DS1307
ADNS2610|RFM12|OOK|SSD1303|DHT22
SSD1306 Crius CO-16 OLED|UGUI|SD
SSD1352|

Offline Offline
Full Member
***
Karma: 4
Posts: 127
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi

jetzt komme ich endlich an den Sketch.

Code:
/*
  Differenztemperatursteuerung Sonnenkolektor mit 1XPT100 im Kollektor
                                                  1XDS18B20 im Speicher 1
                                                  1XDS18B20 im Speicher 2
*/

// Laden der Libary:
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// initialisieren der LCD Pins ( Für das Orginal Arduino-Pad )
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);


#define ONE_WIRE_BUS A3

///char buffer[20] = "";                                     // Speicherbereich für Datenkonvertierung

OneWire oneWire(ONE_WIRE_BUS);                            // Library für Datenleitung des Tempatursensors Dallas DS18xx
DallasTemperature sensors(&oneWire);


//die Variablen deklarieren

float tempK;
float tempS1;
float tempS2;
int tempPin1 = 1;
int Pumpe1 = 13;
int Pumpe2 = 12;
int SpeichertempPin1 = A3;        //Temperatur SpeichertempPin1 wird an Analogpin3 angeschlossen
int DifferenztemperaturS1 = 0;      //Hier nichts eingeben
int DifferenztemperaturS2 = 0;      //Hier nichts eingeben
int Schalttemperatur = 14;         //Hier die Schalttemperatur der Differenz Kolektor -> Speicher, bei der die Pumpe gestartet wird, eingeben
int SpeicherTempAusStufe1 = 50; //Hier schaltet die Ladund auf den anderen Speicher um
int SpeicherTempladebereit = 70;//Hier schaltet die Ladepumpe wieder ein
int SpeicherTempAusVoll = 75; //Hier schaltet die Ladung entgültig aus
int SpeicheTempVollwiederBereit =31; //Hier ist der Speiche wieder bereit für die Ladung Stufe 1
int SpeicherTempMax = 85;         //Hier die Maxtemperatur des Speichers, bei der die Pumpe ausgeschaltet wird und eine Fehlermeldung ausgegebeb wird ( muss quittiert werden ) eingeben
int KolektorTempMax = 130;        //Hier die Maxtemperatur des Kolektors, bei der die Pumpe ausgeschaltet wird  und eine Fehlermeldung ausgegebeb wird ( muss quittiert werden ) eingeben
int KolektorTempMaxHysterese = 2; //Hier die Hysterese der Ausschaltemperatur des Kolektors, bei der die Pumpe wieder eingeschaltet wird, eingeben
int SpeicherTempUnplausibel = 8; //Unter 8°C ist Meßwert im Speicher unplausibel
int FehlereldungSpeicher1MaxVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet
int FehlereldungSpeicher2MaxVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet
int FehlereldungSpeicher1UnplausibelVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet
int FehlereldungSpeicher2UnplausibelVariable = 0; //zum speichern des Fehlers auch wenn die Fehlerursache wieder verschwindet
// Datendraht an Pin A3
#define ONE_WIRE_BUS A3


DeviceAddress SensorS1 = { 0x28, 0xB2, 0x4B, 0xA1, 0x03, 0x00, 0x00, 0x2C };


DeviceAddress SensorS2 = { 0x28, 0xF2, 0x75, 0xA1, 0x03, 0x00, 0x00, 0x7F };


[font=Verdana]hier oben sind die Zwei Sensoren die an einem Eingang hängen sie werden durch die Adresse identifiziert . Es müßte doch möglich sein über diese Adressen azufragen ob die Sensoren vorhanden sind[/font]



void setup(){
  
  byte addr[8];  
  Serial.begin(9600);
  sensors.begin();
  sensors.setResolution(SensorS1, 10);
  sensors.setResolution(SensorS2, 10);
  
  
  
  
  
  

  pinMode (Pumpe1, OUTPUT);
  pinMode (Pumpe2, OUTPUT);
}

void loop(){
  
  //Start Abfrage DS18B20
  sensors.requestTemperatures();
  
  //Temperaturen DS18B20 in Variable ablegen
  float tempS1 = sensors.getTempC(SensorS1); //zwischenspeichern in Variable tempZ1
  float tempS2 = sensors.getTempC(SensorS2); //zwischenspeichern in Variable tempZ2
  
  
  sensors.requestTemperatures();  
  
 
   lcd.begin(20, 4);//LCD hat 20 Zeichen und 4 Spalten
  
  
  
 
  
  // das Ergebnis ans Display senden
 
 
 
 
  
  if(DifferenztemperaturS1  > ( Schalttemperatur + 2 ) && tempS1 < SpeicherTempladebereit && tempK < KolektorTempMax - KolektorTempMaxHysterese) // Pumpe einschalten für Stufe1
  digitalWrite(Pumpe1, HIGH); // Pumpe wird eingeschaltet Pin 13
 
 if(DifferenztemperaturS1  > ( Schalttemperatur + 2 ) && tempS1 < SpeicheTempVollwiederBereit && tempK < KolektorTempMax - KolektorTempMaxHysterese) // Pumpe einschalten für Stufe1
  digitalWrite(Pumpe1, HIGH); // Pumpe wird eingeschaltet Pin 13
 
  if(DifferenztemperaturS1 < ( Schalttemperatur - 2 )  || FehlereldungSpeicher1MaxVariable == 1 || tempK > KolektorTempMax || tempS1 < SpeicherTempUnplausibel || tempS1 > SpeicherTempAusStufe1) // Pumpe abschalten
  digitalWrite(Pumpe1, LOW); // Pumpe wird ausgeschaltet Pin 13
  
  if(DifferenztemperaturS1 < ( Schalttemperatur - 2 )  || FehlereldungSpeicher1MaxVariable == 1 || tempK > KolektorTempMax || tempS1 < SpeicherTempUnplausibel || tempS1 > SpeicherTempAusVoll) // Pumpe abschalten
  digitalWrite(Pumpe1, LOW); // Pumpe wird ausgeschaltet Pin 13
  
  //Betriebsmeldung in Zeile 4
 lcd.setCursor(13, 1);
 if(tempS1 < SpeicherTempMax & FehlereldungSpeicher1MaxVariable == 0){ //wenn diese zwei Störungsmeldungen nicht anstehen werden die Betriebsmeldungen geschrieben
 lcd.setCursor (3,2);
 lcd.print(digitalRead(Pumpe1) == HIGH? "laden":"warten"); // Anzeige Beladen oder Standby
 lcd.setCursor (0, 2);
 lcd.write ("S1-");}
 if (tempS1 > SpeicherTempAusStufe1){ //Die Betriebsmeldung Speicher Stufe1 wird geschrieben
 lcd.write("Stufe1   ");}
  
 
  
  (DifferenztemperaturS1 = tempK - tempS1);
  (DifferenztemperaturS2 = tempK - tempS2);
  
  lcd.setCursor(0, 3);
  lcd.print("Diff=") ;
  if (DifferenztemperaturS1 > 0){    // Der Differenztemperaturwert wird nur geschrieben wenn er positiv ist
  lcd.setCursor(5, 3);
  lcd.print(DifferenztemperaturS1,1); // Die Differenztemperatur wird geschrieben
  lcd.print("K   ");}
  else
  lcd.setCursor(6, 3);
  lcd.print("<0");     //Wenn die Differenztemperatur negativ ist wird dies geschrieben
  
  
// Anzeige der Speichertemperatur und der Speicher1 Fehlermeldungen

lcd.setCursor(0, 1);
  lcd.print("S1=");
  lcd.setCursor(3, 1);
  lcd.print(tempS1,1);// Ausgabe des Variablen S1 Inhalt, die 1 sind die Anzahl der Stellen nach Komma
  lcd.write(0xD0 + 15); // das ° Zeichen wird geschrieben
  lcd.write("C");
 
 
  
 
  
  if(tempS2 < SpeicherTempMax & FehlereldungSpeicher1MaxVariable == 0){ //wenn diese zwei Störungsmeldungen nicht anstehen werden die Betriebsmeldungen geschrieben
 lcd.setCursor (11,2);
 lcd.write ("S2-");
 lcd.print(digitalRead(Pumpe2) == HIGH? "laden":"warten"); // Anzeige Beladen oder Standby
  }
 
 
  lcd.setCursor(0, 2);
  lcd.write("S1-");
if (tempS1 > SpeicherTempAusStufe1){ //Die Betriebsmeldung Speicher Stufe1 wird geschrieben
lcd.write("Stufe1");}
if (tempS1 > SpeicherTempAusVoll){ //Die Betriebsmeldung Speicher Voll wird geschrieben
lcd.write("Voll  ");}  
 if(tempS1 > SpeicherTempMax)(  // Die Fehlermeldung UebtmpSp wird geschrieben
 FehlereldungSpeicher1MaxVariable = 1);
  
 if (FehlereldungSpeicher1MaxVariable == 1){
 lcd.setCursor(0, 3);
 lcd.write("UebertempSp1");}
 
  lcd.setCursor(11, 3);
  lcd.print("Diff=") ;
  if (DifferenztemperaturS2 > 0){    // Der Differenztemperaturwert wird nur geschrieben wenn er positiv ist
  lcd.setCursor(16, 3);
  lcd.print(DifferenztemperaturS2,1); // Die Differenztemperatur wird geschrieben
  lcd.print("K");}
  else
  lcd.setCursor(17, 3);
  lcd.print("<0");     //Wenn die Differenztemperatur negativ ist wird dies geschrieben
 
 
 // Anzeige der Speichertemperatur und der Speicher2 Fehlermeldungen
 
  lcd.setCursor(11, 1);
  lcd.print("S2=");
  lcd.setCursor(14, 1);
  lcd.print(tempS2,1);// Ausgabe des Variablen S2 Inhalt, die 1 sind die Anzahl der Stellen nach Komma
  lcd.write(0xD0 + 15); // das ° Zeichen wird geschrieben
  lcd.write("C");
  
  
  //  Stufe1 Speicher1 wird bis zu 35°C geladen
   if(DifferenztemperaturS2 > ( Schalttemperatur + 3 ) && tempS2 < SpeicherTempladebereit  && tempK < KolektorTempMax - KolektorTempMaxHysterese && digitalRead(Pumpe1) == LOW && tempS2 < 35 ) // Pumpe einschalten
  digitalWrite(Pumpe2, HIGH); // Pumpe2 wird eingeschaltet füe Stufe1Pin 12

 if(DifferenztemperaturS2 < ( Schalttemperatur -2 )  || FehlereldungSpeicher2MaxVariable == 1 || tempK > KolektorTempMax || tempS2 < SpeicherTempUnplausibel || tempS2 > SpeicherTempMax || tempS2 > SpeicherTempAusStufe1 || digitalRead(Pumpe1) == HIGH || tempS2 > 30 ) // Pumpe abschalten
  digitalWrite(Pumpe2, LOW); // Pumpe2 wird ausgeschaltet für Stufe1 Pin 12

  
   if(DifferenztemperaturS2 > ( Schalttemperatur + 3 ) && tempS2 < SpeicherTempladebereit  && tempK < KolektorTempMax - KolektorTempMaxHysterese && digitalRead(Pumpe1) == LOW && tempS1 > SpeicherTempladebereit ) // Pumpe einschalten
  digitalWrite(Pumpe2, HIGH); // Pumpe2 wird eingeschaltet füe Stufe1Pin 12
  
  if(DifferenztemperaturS2 < ( Schalttemperatur -2 )  || FehlereldungSpeicher2MaxVariable == 1 || tempK > KolektorTempMax || tempS2 < SpeicherTempUnplausibel || tempS2 > SpeicherTempMax || tempS2 > SpeicherTempAusStufe1 || digitalRead(Pumpe1) == HIGH ) // Pumpe abschalten
  digitalWrite(Pumpe2, LOW); // Pumpe2 wird ausgeschaltet für Stufe1 Pin 12
  
  

ich habe den letzten Teil des Sketches weggelassen da er sonst zu groß ist.
Er ist auch ziemlich unübersichtlich aber ich bin gerade am überarbeiten.

Logged

Germany, BW
Offline Offline
Sr. Member
****
Karma: 3
Posts: 294
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

In der loop könntest du zb folgendes machen:

Code:
const boolean SensorS1valid = sensors.validAddress(SensorS1);
const boolean SensorS1isConnected = sensors.isConnected(SensorS1);

Die Funktionen geben dir die Rückmeldung, ob die Sensoren vorhanden sind.
Normalerweise such man aber erst mal den ganzen Bus ab und schaut welche Sensoren dran hängen. Danach aktiviert man bekannte Sensoren und verwendet diese dann.

Du kannst es aber auch so lassen...
« Last Edit: February 12, 2013, 11:39:58 am by mde110 » Logged

Arduino 1.0.3|MEGA|UNO|MICRO|PRO MINI3.3
SSD1289 TFT Touch|DS18B20|DS1307
ADNS2610|RFM12|OOK|SSD1303|DHT22
SSD1306 Crius CO-16 OLED|UGUI|SD
SSD1352|

Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe mich heute nochmal näher mit der Thematik beschäftigt, da ich die DS18S20 library als DS18x20 auch für den Typ DS18B20 fitt gemacht habe.
Fehlerhafte Sensoren können verschiedene Werte liefern:
- ca. -0.06°C - das passiert, wenn der Sensor einfach weg ist und die OneWire-Lib alle Bits auf 1 setzt (dann kommt 0xFFFFFFFFFFFFFF) raus, je nachdem was man damit anstellt kommt ein Temperatur-Wert knapp unter 0 raus. Abhilfe: Prüfen, dass nicht alle Bits der Message 1 sind.
- +85.00°C - dieser Wert wird von der Original-Library gesendet, wenn der 1-Wire-Bus nicht antwortet.
- +85.00°C - auch wenn der Sensor noch nicht mit der 1. Messung fertig ist, sendet er 85°C. Dies ist der Power-On-Initialwert laut Datenblatt. Da der Wert "in echt" nicht dauerhaft exakt zu messen sein wird, sollte er als "Fehler" interpretiert werden
(Edit: Dieser Wert kommt auch, wenn zwischen 2 Messungen kurz der Strom des Sensors weg war).
- alle Werte <-55°C und >+125°C sollten als Fehler interpretiert werden, da diese außerhalb des Sensor Messbereiches liegen.
« Last Edit: February 15, 2013, 03:22:03 pm by mwyraz » Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 127
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo

Danke für die Antwort.
Das hört sich interessant an. Doch leider reichen meine bescheidenen Kenntnisse noch nicht aus diese Befehlsfolge zu verstehen.
Kannst Du mir die Befehle näher beschreiben?
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 66
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ach den Sketch hatte ich gar nicht gesehen - du verwendest eine andere Sensor-Lib als ich. Diese bietet die Funktion "isConnected()", um zu prüfen, ob ein Sensor verbunden ist. Diese Funktion liest die Temperatur und prüft, ob die Daten gültig sind - beim auslesen der Temperatur passiert aber Lib-Intern das selbe. Liefert der Sensor keine/fehlerhafte Daten, kommt der Wert "DEVICE_DISCONNECTED" zurück, welcher mit -127 definiert ist.

Du müsstest also im Code nur prüfen, ob einer der Sensoren -127°C liefert, dieser wäre dann defekt. Außerdem solltest Du prüfen, ob einer der Sensoren 85°C liefert - in dem Fall könnte es sich um eine echte Temperatur handeln oder um den Standard-Wert, den ein Sensor nach dem initialisieren liefert, wenn er noch keine Messung durchgeführt hat. Diesen Wert würde ich auch als ungültigen Wert behandeln.

Außerdem würde ich noch überlegen, welche Differenz zwischen beiden Sensoren plausibel ist - ist die gemessene Differenz deutlich größer, kannst Du ja gff. auch von einem Fehler ausgehen.
Logged

Offline Offline
Full Member
***
Karma: 4
Posts: 127
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo mwyraz

danke für die Antwort.
Die -127°C überprüfe ich schon in meinem Sketch und wenn ich dann noch die 85°C auswerte dann müssten eigentlich alle Fehler erschlagen sein.
Die Differenz zwischen den Sensoren kann ich leider nicht auswerten da sie sich in zwei verschiedenen Speichern sind und deshalb schon von Haus aus verschiedene Temperaturwerte haben können.

Vielen Dank Rudi
Logged

Pages: 1 [2]   Go Up
Jump to: