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