#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); }
Обратите внимание: Код (C++): //границы температуры приточек 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); Допустим Temp1 = 23..... что должно быть на выходе HIGH или LOW? Переделайте условие
Для начала исключите "конфликт" Код (C++): //границы температуры приточек 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);
if ((Temp1 > 24) || (Temp2 > 24) || (Temp3 > 24) || (Temp4 > 24)) digitalWrite(8, HIGH); if ((Temp1 < 24) || (Temp2 < 24) || (Temp3 < 24) || (Temp4 < 24))digitalWrite(8, LOW); Теперь срабатывает, когда все 4 HIGH
Лучше конечно так: Код (C++): //границы температуры приточек 19<T<23 if ((Temp1 >= 23) || (Temp2 >= 23) || (Temp3 >= 23) || (Temp4 >= 23) || (Temp1 <= 19) || (Temp2 <= 19) ||(Temp3 <= 19) || (Temp4 <= 19)) digitalWrite(8, HIGH); else if ((Temp1 < 23) || (Temp2 < 23) || (Temp3 < 23) || (Temp4 < 23) || (Temp1 > 19) || (Temp2 > 19) ||(Temp3 > 19) || (Temp4 > 19))digitalWrite(8, LOW); Правда опять не понять зависимости выхода от значения нескольких датчиков... причём с разной зависимостью. Понимаю так: Нагреватель один на несколько зон контроля. Боюсь нужно как-то по приоритетам и одним ИЛИ не оптимально.
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); Так вообще не работает.
Посмотрите: Код (C++): if ((Temp1 >= 23) || (Temp2 >= 23) || (Temp3 >= 23) || (Temp4 >= 23) || (Temp1 <= 19) || (Temp2 <= 19) ||(Temp3 <= 19) || (Temp4 <= 19)) digitalWrite(8, HIGH); У вас в одном IF уже.... Temp1 >= 23 и Temp1 <= 19 непонятно.... вроде как "мёртвая зона". Это взято из первого поста. Общая задача мне не понятна.
Получилось! Огромное Вам спасибо! По датчикам гораздо прозаичнее. Мне нужно отслеживать температуру 4 приточных вентиляционных установок и 2 чиллеров. Общая авария температуры важна (все равно бежать смотреть, что случилось), а так все пины на NANO будут задействованы авариями этого оборудования. Еще раз огромное спасибо! Дай Вам Бог здоровья.
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); Так работает.
Если у вас просто сигнализация то: Код (C++): if ((Temp1 >= 24) || (Temp2 >= 24) || (Temp3 >= 24) || (Temp4 >= 24) || (Temp1 <= 19) || (Temp2 <= 19) ||(Temp3 <= 19) || (Temp4 <= 19)) digitalWrite(8, HIGH); else digitalWrite(8, LOW); этого вполне достаточно