Проблема при реализации ИЛИ для четырех датчиков температуры
- Войдите на сайт для отправки комментариев
Сб, 19/11/2016 - 14:49
Здравствуйте! Есть 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);
}
/* //#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 ); } }Можно попробовать, но я пошел другим путем, у меня конфликт был
Так работает
Так работает
Нет, не работает. Невнимательно тестировали.
Вы считаете, что вот это условие
else if ((Temp1 < 24) || (Temp2 < 24) || (Temp3 < 24) || (Temp4 < 24) || (Temp1 > 19) || (Temp2 > 19) ||(Temp3 > 19) || (Temp4 > 19))digitalWrite(8, LOW);
проверяетс. что никто никауда не выходит? Таки нет. Если нужно убедиться. что ни один датчик не вывалислся за пределы нужно либо взять первое условие и приставить ему НЕ в начале, либо можно и так. как здесь, только все ИЛИ надо менять на И.
Протестировал еще раз, таки работает.
Работает еще и так: