Проблема при реализации ИЛИ для четырех датчиков температуры

Grek1130
Grek1130 аватар
Offline
Зарегистрирован: 19.11.2016


Здравствуйте! Есть 4 датчика температуры на DS18B28. Температура известна. Нужно, чтобы при выходе любого из 4 датчиков за предел 19<Temp<23 включался, скажем, светодиод.

#include <U8glib.h>
 
#include <OneWire.h>
#include <DallasTemperature.h>
#define POWER_MODE  0 //внешнее питание датчиков
 
OneWire oneWire(9);//вход датчиков 18b20
DallasTemperature ds(&oneWire);
 
DeviceAddress sensor1 = {0x28, 0xFF, 0x25, 0xC9, 0x70, 0x16, 0x04, 0x00};
DeviceAddress sensor2 = {0x28, 0xFF, 0x1E, 0x18, 0x71, 0x16, 0x03, 0x52};
DeviceAddress sensor3 = {0x28, 0xFF, 0x99, 0x40, 0x72, 0x16, 0x03, 0xE8};
DeviceAddress sensor4 = {0x28, 0xCD, 0xB3, 0x1E, 0x00, 0x00, 0x80, 0x6B};
DeviceAddress sensor5 = {0x28, 0xFF, 0xF6, 0x24, 0x72, 0x16, 0x03, 0x08};
DeviceAddress sensor6 = {0x28, 0xFF, 0xBF, 0xE6, 0x71, 0x16, 0x04, 0x4B};
float Temp1;
float Temp2;
float Temp3;
float Temp4;
float Temp5;
float Temp6;   
U8GLIB_ST7920_128X64 u8g(10, 11, 12, U8G_PIN_NONE); // настройка пинов дисплея
 
 
void setup() 
{
Serial.begin(9600);
  ds.begin();
  u8g.setFont(u8g_font_6x10); // Выбор шрифта
 
  pinMode (8,OUTPUT); //8 пин-выход авария тмпературы приточек
  pinMode (13,OUTPUT); //13 пин-выход авария тмпературы Чиллеров
}
 
void loop()
{
  ds.requestTemperatures(); // считываем температуру с датчиков
  Temp1=ds.getTempC(sensor1);
  Temp2=ds.getTempC(sensor2);
  Temp3=ds.getTempC(sensor3);
  Temp4=ds.getTempC(sensor4);
  Temp5=ds.getTempC(sensor5)+1;
  Temp6=ds.getTempC(sensor6)+1; 
  
  //границы температуры приточек 19<T<23
  
  if ((Temp1 >= 23) || (Temp2 >= 23) || (Temp3 >= 23) || (Temp4 >= 23) || (Temp1 <= 19) || (Temp2 <= 19) ||(Temp3 <= 19) || (Temp4 <= 19)) digitalWrite(8, HIGH);
  if ((Temp1 <= 23) || (Temp2 <= 23) || (Temp3 <= 23) || (Temp4 <= 23) || (Temp1 >= 19) || (Temp2 >= 19) ||(Temp3 >= 19) || (Temp4 >= 19))digitalWrite(8, LOW);
 
  
 
  u8g.firstPage();
  do
  {
    u8g.drawStr(0, 7, "P1-"); // приточка 1
    u8g.drawStr(0, 16, "P2-"); // приточка 2
    u8g.drawStr(0, 25, "P3-"); // приточка 3
    u8g.drawStr(0, 34, "P4-"); // приточка 4
    u8g.drawStr(43, 7, "T="); // температура приточки 1
    u8g.drawStr(43, 16, "T="); // температура приточки 2
    u8g.drawStr(43, 25, "T="); // температура приточки 3
    u8g.drawStr(43, 34, "T="); // температура приточки 4
    u8g.drawStr(92, 7, "B1-"); // вытяжка 1
    u8g.drawStr(92, 16, "B2-"); // вытяжка 2
    u8g.drawStr(92, 25, "B3-"); // вытяжка 3
    u8g.drawStr(92, 34, "B4-"); // вытяжка 4
    u8g.drawStr(0, 50, "YORK1-"); // чиллер 1
    u8g.drawStr(0, 61, "YORK2-"); // чиллер 2
    u8g.drawStr(70, 50, "T="); //  чиллер 1
    u8g.drawStr(70, 61, "T="); //  чиллер 2
 
    u8g.setPrintPos(56, 7);
    u8g.print(ds.getTempC(sensor1));//отправляем температуру Р1
 
    u8g.setPrintPos(56, 16);
    u8g.print(ds.getTempC(sensor2)); // отправляем температуру Р2
 
    u8g.setPrintPos(56, 25);
    u8g.print(ds.getTempC(sensor3)); // отправляем температуру Р3
 
    u8g.setPrintPos(56, 34);
    u8g.print(ds.getTempC(sensor4));//отправляем температуру Р4
 
    u8g.setPrintPos(83, 50);
    u8g.print(ds.getTempC(sensor5)+1);//отправляем температуру YORK1
 
    u8g.setPrintPos(83, 61);
    u8g.print(ds.getTempC(sensor6)+1);//отправлям температуру YORK2
  }
 
  while (u8g.nextPage());
  
 
 
 
 
 
 
  delay (2000);
 
}
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/*
 //#1
DS18B20                   -> 2    (TEMP_WIRE_BUS)
  1 датчик (Thermometer_1) {0x28, 0xFF, 0x25, 0xC9, 0x70, 0x16, 0x04, 0x00};
  2 датчик (Thermometer_2) {0x28, 0xFF, 0x1E, 0x18, 0x71, 0x16, 0x03, 0x52};
  3 датчик (Thermometer_3) {0x28, 0xFF, 0x99, 0x40, 0x72, 0x16, 0x03, 0xE8};
  4 датчик (Thermometer_4) {0x28, 0xCD, 0xB3, 0x1E, 0x00, 0x00, 0x80, 0x6B};
  5 датчик (Thermometer_5) {0x28, 0xFF, 0xF6, 0x24, 0x72, 0x16, 0x03, 0x08};
  6 датчик (Thermometer_6) {0x28, 0xFF, 0xBF, 0xE6, 0x71, 0x16, 0x04, 0x4B};
//#2
  светодиод  -> 3 (led_pin) 0 горит / 1 нет
             ->Ucc
*/
//#1
#include <Wire.h>
#include <DallasTemperature.h>
#include <OneWire.h>
const int WIRE_BUS_pin = 2;
OneWire tempWire(WIRE_BUS_pin); //объявили переменную датчиков
DallasTemperature TempSensors(&tempWire); //объявили структуру типа Даллас термометр
DeviceAddress Thermometer_1 = {0x28, 0xFF, 0x25, 0xC9, 0x70, 0x16, 0x04, 0x00};
DeviceAddress Thermometer_2 = {0x28, 0xFF, 0x1E, 0x18, 0x71, 0x16, 0x03, 0x52};
DeviceAddress Thermometer_3 = {0x28, 0xFF, 0x99, 0x40, 0x72, 0x16, 0x03, 0xE8};
DeviceAddress Thermometer_4 = {0x28, 0xCD, 0xB3, 0x1E, 0x00, 0x00, 0x80, 0x6B};
DeviceAddress Thermometer_5 = {0x28, 0xFF, 0xF6, 0x24, 0x72, 0x16, 0x03, 0x08};
DeviceAddress Thermometer_6 = {0x28, 0xFF, 0xBF, 0xE6, 0x71, 0x16, 0x04, 0x4B};
float tempSensor[6]; // массив куда читается температура c датчиков.
void getTemp() {    // читаем температуру и заполняем массив
  TempSensors.requestTemperatures(); //команда сенсорам заполнить свою память новыми данными
  tempSensor[0] = TempSensors.getTempC(Thermometer_1);
  tempSensor[1] = TempSensors.getTempC(Thermometer_2);
  tempSensor[2] = TempSensors.getTempC(Thermometer_3);
  tempSensor[3] = TempSensors.getTempC(Thermometer_4);
  tempSensor[4] = TempSensors.getTempC(Thermometer_5);
  tempSensor[5] = TempSensors.getTempC(Thermometer_6);
}
//#2
const int led_pin = 3; // светодиода
uint8_t led ; // сoстояние светодиода
const uint8_t temp_Led_ON_high = 23 ;
const uint8_t temp_Led_ON_low = 19 ;
void setup() {
  //#1
  TempSensors.begin(); //инициализируем сенсоры
  //#2
  pinMode(led_pin, OUTPUT);   // инициализировать светодиод
  digitalWrite(led_pin, led = 1); // и погасить
}
void loop() {
  //#1
  //#2
  static uint32_t past_2 = 0 ;
  if (millis() - past_2 >= 200) { // если прошло 200 миллисек
    past_2 = millis() ;
    getTemp(); // читаем температуру с датчиков
    led = !((tempSensor[0] > temp_Led_ON_high) + (tempSensor[0] < temp_Led_ON_low) +
            (tempSensor[1] > temp_Led_ON_high) + (tempSensor[1] < temp_Led_ON_low) +
            (tempSensor[2] > temp_Led_ON_high) + (tempSensor[2] < temp_Led_ON_low) +
            (tempSensor[3] > temp_Led_ON_high) + (tempSensor[3] < temp_Led_ON_low) +
            (tempSensor[4] > temp_Led_ON_high) + (tempSensor[4] < temp_Led_ON_low) +
            (tempSensor[5] > temp_Led_ON_high) + (tempSensor[5] < temp_Led_ON_low) );
    digitalWrite(led_pin, led );
  }
}

 

Grek1130
Grek1130 аватар
Offline
Зарегистрирован: 19.11.2016

Можно попробовать, но я пошел другим путем, у меня конфликт был

if ((Temp1 >= 24) || (Temp2 >= 24) || (Temp3 >= 24) || (Temp4 >= 24) || (Temp1 <= 19) || (Temp2 <= 19) ||(Temp3 <= 19) || (Temp4 <= 19)) digitalWrite(8, HIGH);
else if ((Temp1 < 24) || (Temp2 < 24) || (Temp3 < 24) || (Temp4 < 24) || (Temp1 > 19) || (Temp2 > 19) ||(Temp3 > 19) || (Temp4 > 19))digitalWrite(8, LOW);
 
Grek1130
Grek1130 аватар
Offline
Зарегистрирован: 19.11.2016

Так работает

 

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

Grek1130 пишет:

Так работает

Нет, не работает. Невнимательно тестировали.

Вы считаете, что вот это условие

else if ((Temp1 < 24) || (Temp2 < 24) || (Temp3 < 24) || (Temp4 < 24) || (Temp1 > 19) || (Temp2 > 19) ||(Temp3 > 19) || (Temp4 > 19))digitalWrite(8, LOW);

проверяетс. что никто никауда не выходит? Таки нет. Если нужно убедиться. что ни один датчик не вывалислся за пределы нужно либо взять первое условие и приставить ему НЕ в начале, либо можно и так. как здесь, только все ИЛИ надо менять на И.

Grek1130
Grek1130 аватар
Offline
Зарегистрирован: 19.11.2016

Протестировал еще раз, таки работает.

Работает еще и так:

 if ((Temp1 >= 25) || (Temp2 >= 25) || (Temp3 >= 25) || (Temp4 >= 25) || (Temp1 <= 19) || (Temp2 <= 19) ||(Temp3 <= 19) || (Temp4 <= 19)) digitalWrite(8, HIGH);
else digitalWrite(8, LOW);