Мониторинг ошибок датчика DS18B20

ArduinoUser
Offline
Зарегистрирован: 05.12.2016

Доброго времени суток. Подскажите, пожалуйста, как сделать мониторинг ошибок 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;
     }
}

 

ArduinoUser
Offline
Зарегистрирован: 05.12.2016

забыл дописать код вначале

#include <Wire.h>   
#include <OneWire.h>
#include <DallasTemperature.h>
   #define ONE_WIRE_BUS 5         
   OneWire ourWire(ONE_WIRE_BUS);
   DallasTemperature sensors(&ourWire);

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Чтобы мониторить ошьибки DS18B20, нужьно сначала что-то получить с DS18B20. Где в скетче работа с DS18B20?

ArduinoUser
Offline
Зарегистрирован: 05.12.2016
сначала 
 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);                        //виводим показания датчика

задача стоит в том что при невозможности считывания показаний отключалось реле нагревателя и выводился условный код(номер) ошыбки.

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Можно открыть исходники "далласовской" библы и посмотреть -

// 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.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

ArduinoUser пишет:

задача стоит в том что при невозможности считывания показаний отключалось реле нагревателя и выводился условный код(номер) ошыбки.

Если с DS18B20 не считывается температура, библиотека вроде выдает -127 градусов. Можно добавить условие if, в котором сравнивать выдаваемую температуру с этим значением.

ArduinoUser
Offline
Зарегистрирован: 05.12.2016

Спасибо вмем! Изменил код так:

#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;
                                                    
                  }
}

 

 
Присвоил переменной  chkTemp целое значение температуры. Потом через оператор swich добавил оторажение библиотечных ошибок и алгоритм управления нагревательным елементом.
 
Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

вот это

digitalWrite(RelayTemp, LOW); 
lcd.setCursor(0, 1);
lcd.print("Te\7-pa =      \1C ");
lcd.setCursor(9, 1);

можно спокойно вынести перед switch, ибо нефиг повторяться, плюс читаемость кода выше.

Команду digitalWrite(RelayTemp, HIGH); можно оставить как есть, идущая перед ней команда digitalWrite(RelayTemp, LOW); для медленного реле не преграда.