проверка исправности 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) Просто непонятно, зачем? Почему сразу не положить в конечную переменную.. А для хранения температуры "без запятых" и одного байта хватит. Мелочь всё это конечно, но чем короче, тем визуально красивее) Вот в укороченном виде:
спасибо!