проверка исправности ds18b20

romiras
Offline
Зарегистрирован: 12.07.2015

Подскажите, как осуществить проверку исправности или неисправности датчика 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();
  }
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

romiras, лучше просто устранить причину зависания. Нормальный датчик видится всегда, и может работать годами без зависаний. По теме же:  у библы oneWare есть возможность отследить наличие устройства, вместо команды в строке 33 подайте команду

boolean status=ds.reset();  и в переменной status будет лежать 0 или 1 , соответственно есть датчик или нет.

 

 

romiras
Offline
Зарегистрирован: 12.07.2015

Спасибо большое! 

Radjah
Offline
Зарегистрирован: 06.08.2014

Зачем отдельно реле и индикатор? Повесь их на один пин. В идеале у реле должен быть свой индикатор встроенный.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Radjah пишет:

Зачем отдельно реле и индикатор? Повесь их на один пин. В идеале у реле должен быть свой индикатор встроенный.

Да, ладно, кому это это так задолжал? В одних реле - есть, в других - нет. Да, даже если есть - часто нужно индикатор не на реле иметь, а на панель девайса вывести. Не всегда же девайс только на макетке собирают, иногда и в корпусе собрать надо.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

romiras, кстати ещё заметил, все зачем-то выделяют два байта для хранения промежуточных  считанных данных (строки 32, 40,41) Просто непонятно, зачем? Почему сразу не положить в конечную переменную.. А для хранения температуры "без запятых" и одного байта хватит. Мелочь всё это конечно, но чем короче, тем визуально красивее) Вот в укороченном виде:

ds.write(0xCC);
ds.write(0xBE);
int8_t Temp =  ds.read()>>4 | (ds.read()<<4); // взять по полбайта с первого и второго чтения
Serial.println(Temp);// выводим температуру в сериал монитор

 

romiras
Offline
Зарегистрирован: 12.07.2015

спасибо!