проверка исправности ds18b20
- Войдите на сайт для отправки комментариев
Пт, 20/11/2015 - 06:11
Подскажите, как осуществить проверку исправности или неисправности датчика ds1820? При физическом отключении датчика - температура в этом коде показывает 0градусов, а предел работы кода завязан на интервале температуры от 0 до 3 градусов. Нужно как то периодически проверять наличие и исправность датчика. С ардуино ( и в программировании в целом) я недавно. Подскажите, пожалуйста!
вот код:
#include <OneWire.h> #include <avr/wdt.h> #define high1 18 #define GND1 19 OneWire ds(3);//датчик температуры unsigned long currentTime; unsigned long loopTime; void setup() { pinMode(high1, OUTPUT); // Делаем его плюсом 5 вольт (для запитки доп устройства) digitalWrite(high1, HIGH); pinMode(GND1, OUTPUT); // Делаем его минусом (GND) digitalWrite(GND1, LOW); wdt_disable(); Serial.begin(9600); pinMode(2, OUTPUT);// твердотельное реле pinMode(5, OUTPUT);// индикация сети pinMode(4, OUTPUT);// индикация работы реле pinMode(15, OUTPUT);// индикация заданного температурного промежутка pinMode(16, OUTPUT);// пищалка digitalWrite(16, HIGH); delay(500); digitalWrite(16, LOW); delay(500); digitalWrite(16, HIGH); delay(1000); digitalWrite(16, LOW); pinMode(17, OUTPUT);// вентилятор wdt_enable (WDTO_8S); } void loop() { digitalWrite(5, HIGH); byte data[2]; ds.reset(); ds.write(0xCC); ds.write(0x44); delay(750); ds.reset(); ds.write(0xCC); ds.write(0xBE); data[0] = ds.read(); data[1] = ds.read(); int Temp = (data[1] << 8) + data[0]; Temp = Temp >> 4; int TempOld = Temp;// получаем температуру wdt_reset(); Serial.println(Temp);// выводим температуру в сериал монитор if (Temp < -55 || Temp > 55) { digitalWrite(2, LOW); // выключаем реле и ... while (1) { digitalWrite(5, HIGH); digitalWrite(16, HIGH);// бесконечный цикл писка сигнала неисправности delay(1000); digitalWrite(16, LOW); digitalWrite(5, LOW); delay(1000); } } if (Temp <= 0) { // если температура <= 0, то включаем реле и индикатор его работы digitalWrite(2, HIGH); digitalWrite(4, HIGH); digitalWrite(17, HIGH); wdt_reset(); } if (Temp >= 3) { // если температура >= 3, то выключаем реле и индикатор его работы digitalWrite(2, LOW); digitalWrite(4, LOW); digitalWrite(17, LOW); wdt_reset(); } if (Temp >= 0 && Temp <= 3) { // если температура >= 0 и <= 3, то включается индикация заданного режима, включаем вентилятор digitalWrite(15, HIGH); wdt_reset(); } else { // иначе... digitalWrite(15, LOW);// выключается индикация заданного режима, выключаем вентилятор wdt_reset(); } }
romiras, лучше просто устранить причину зависания. Нормальный датчик видится всегда, и может работать годами без зависаний. По теме же: у библы oneWare есть возможность отследить наличие устройства, вместо команды в строке 33 подайте команду
boolean status=ds.reset(); и в переменной status будет лежать 0 или 1 , соответственно есть датчик или нет.
Спасибо большое!
Зачем отдельно реле и индикатор? Повесь их на один пин. В идеале у реле должен быть свой индикатор встроенный.
Зачем отдельно реле и индикатор? Повесь их на один пин. В идеале у реле должен быть свой индикатор встроенный.
romiras, кстати ещё заметил, все зачем-то выделяют два байта для хранения промежуточных считанных данных (строки 32, 40,41) Просто непонятно, зачем? Почему сразу не положить в конечную переменную.. А для хранения температуры "без запятых" и одного байта хватит. Мелочь всё это конечно, но чем короче, тем визуально красивее) Вот в укороченном виде:
спасибо!