Мониторинг ошибок датчика DS18B20
- Войдите на сайт для отправки комментариев
Вс, 07/05/2017 - 20:05
Доброго времени суток. Подскажите, пожалуйста, как сделать мониторинг ошибок DS18B20 с выводом на lcd16x2.
в коде есть мониторинг ошибок датчика DHT11. Задача стоит такая же: при неисправности датчика(отсутствие питания или сигнала) реле отключает от сети нагреватель и виводиться код ошибки на дисплей.
include <dht11.h>
#define DHT11_PIN 6
dht11 DHT;
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3f,16,2);
int RelayTemp = 7;
int RelayHum = 8;
float t = 0;
int h = 0;
int Hum = 50;
int chk;
void setup() {
sensors.begin();
pinMode(RelayTemp, OUTPUT);
pinMode(RelayHum, OUTPUT);
lcd.init();
lcd.backlight();
}
void loop() {
delay(1000);
sensors.requestTemperatures();
t = sensors.getTempCByIndex(0);
if (t < Temp){digitalWrite(RelayTemp, LOW);}
else {digitalWrite(RelayTemp, HIGH);}
chk = DHT.read(DHT11_PIN);
h = DHT.humidity,1 ;
switch (chk){
case DHTLIB_OK:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bo\2o\3i\4\5\6 = %");
lcd.setCursor(12, 0);
lcd.print(h);
if (h < Hum){digitalWrite(RelayHum, LOW);}
else {digitalWrite(RelayHum, HIGH);}
break;
case DHTLIB_ERROR_CHECKSUM:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bo\2o\3i\4\5\6 = %");
lcd.setCursor(12, 0);
lcd.print("err1");
digitalWrite(RelayHum, HIGH);
break;
case DHTLIB_ERROR_TIMEOUT:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bo\2o\3i\4\5\6 = %");
lcd.setCursor(12, 0);
lcd.print("err2");
digitalWrite(RelayHum, HIGH);
break;
default:
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Bo\2o\3i\4\5\6 = %");
lcd.setCursor(12, 0);
lcd.print("err3");
digitalWrite(RelayHum, HIGH);
break;
}
}
забыл дописать код вначале
Чтобы мониторить ошьибки DS18B20, нужьно сначала что-то получить с DS18B20. Где в скетче работа с DS18B20?
сначала sensors.requestTemperatures(); //опрос самого датчика t = sensors.getTempCByIndex(0); //переменной T присваиеться значения температуры датчика if (t < Temp){digitalWrite(RelayTemp, LOW);} //сравнениє текущей температуры с номинальной else {digitalWrite(RelayTemp, HIGH);}lcd.setCursor(0, 1); lcd.print("Te\7-pa = \1C "); //виводим натпись температура lcd.setCursor(9, 1); lcd.print(t,1); //виводим показания датчиказадача стоит в том что при невозможности считывания показаний отключалось реле нагревателя и выводился условный код(номер) ошыбки.
Можно открыть исходники "далласовской" библы и посмотреть -
// Fetch temperature for device index float DallasTemperature::getTempCByIndex(uint8_t deviceIndex){ DeviceAddress deviceAddress; if (!getAddress(deviceAddress, deviceIndex)){ return DEVICE_DISCONNECTED_C; } return getTempC((uint8_t*)deviceAddress); }Функция вернёт или температуру или константу DEVICE_DISCONNECTED_C, которая имеет значение минус 127.
задача стоит в том что при невозможности считывания показаний отключалось реле нагревателя и выводился условный код(номер) ошыбки.
Если с DS18B20 не считывается температура, библиотека вроде выдает -127 градусов. Можно добавить условие if, в котором сравнивать выдаваемую температуру с этим значением.
Спасибо вмем! Изменил код так:
#include <Wire.h> #include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 5 OneWire ourWire(ONE_WIRE_BUS); DallasTemperature sensors(&ourWire); #include <dht11.h> #define DHT11_PIN 6 dht11 DHT; #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3f,16,2); byte degree[8] = { B00111, B00101, B00111, B00000, B00000, B00000, B00000, }; byte L[8] = { B00000, B00000, B00111, B01001, B01001, B01001, B11001, }; byte G[8] = { B00000, B00000, B11110, B10000, B10000, B10000, B10000, }; byte T[8] = { B00000, B00000, B01110, B00100, B00100, B00100, B00100, }; byte c[8] = { B00000, B00000, B01110, B10001, B10000, B10001, B01110, }; byte j[8] = { B00000, B00000, B10000, B10000, B11100, B10010, B11100, }; byte m[8] = { B00000, B00000, B01010, B10101, B10101, B10101, B10001, }; int RelayTemp = 7; int RelayHum = 8; float t = 0; float Temp = 37.8; float onetenths = 0.1; int h = 0; int Hum = 50; int chkHum; int chkTemp; void setup() { sensors.begin(); sensors.setResolution(12); pinMode(RelayTemp, OUTPUT); pinMode(RelayHum, OUTPUT); lcd.init(); lcd.backlight(); lcd.createChar(1, degree); lcd.createChar(2, L); lcd.createChar(3, G); lcd.createChar(4, c); lcd.createChar(5, T); lcd.createChar(6, j); lcd.createChar(7, m); } void loop() { delay(1000); lcd.clear(); // запит вологості chkHum = DHT.read(DHT11_PIN); h = DHT.humidity,1 ; switch (chkHum){ case DHTLIB_OK: lcd.setCursor(0, 0); lcd.print("Bo\2o\3i\4\5\6 = %"); lcd.setCursor(12, 0); lcd.print(h); if (h < Hum){digitalWrite(RelayHum, LOW);} else {digitalWrite(RelayHum, HIGH);} break; case DHTLIB_ERROR_CHECKSUM: lcd.clear(); lcd.setCursor(0, 0); lcd.print("Bo\2o\3i\4\5\6 = %"); lcd.setCursor(12, 0); lcd.print("err1"); digitalWrite(RelayHum, HIGH); break; case DHTLIB_ERROR_TIMEOUT: lcd.clear(); lcd.setCursor(0, 0); lcd.print("Bo\2o\3i\4\5\6 = %"); lcd.setCursor(12, 0); lcd.print("err2"); digitalWrite(RelayHum, HIGH); break; default: lcd.clear(); lcd.setCursor(0, 0); lcd.print("Bo\2o\3i\4\5\6 = %"); lcd.setCursor(12, 0); lcd.print("err3"); digitalWrite(RelayHum, HIGH); break; } sensors.requestTemperatures(); t = sensors.getTempCByIndex(0); chkTemp = sensors.getTempCByIndex(0); switch (chkTemp){ case DEVICE_DISCONNECTED_RAW: digitalWrite(RelayTemp, LOW); lcd.setCursor(0, 1); lcd.print("Te\7-pa = \1C "); lcd.setCursor(9, 1); lcd.print("err4"); break; case DEVICE_DISCONNECTED_C: digitalWrite(RelayTemp, LOW); lcd.setCursor(0, 1); lcd.print("Te\7-pa = \1C "); lcd.setCursor(9, 1); lcd.print("err5"); break; default: if(t < Temp && t > -127){ digitalWrite(RelayTemp, LOW); lcd.setCursor(0, 1); lcd.print("Te\7-pa = \1C "); lcd.setCursor(9, 1); lcd.print(t,2);} if(t > Temp){ digitalWrite(RelayTemp, HIGH); lcd.setCursor(0, 1); lcd.print("Te\7-pa = \1C "); lcd.setCursor(9, 1); lcd.print(t,2);} break; } }вот это
digitalWrite(RelayTemp, LOW); lcd.setCursor(0, 1); lcd.print("Te\7-pa = \1C "); lcd.setCursor(9, 1);можно спокойно вынести перед switch, ибо нефиг повторяться, плюс читаемость кода выше.
Команду digitalWrite(RelayTemp, HIGH); можно оставить как есть, идущая перед ней команда digitalWrite(RelayTemp, LOW); для медленного реле не преграда.