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

Тема в разделе "Arduino & Shields", создана пользователем Grek1130, 19 ноя 2016.

  1. Grek1130

    Grek1130 Нуб

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

    }
     
  2. Igor68

    Igor68 Гуру

    Обратите внимание:
    Код (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?
    Переделайте условие
     
  3. Grek1130

    Grek1130 Нуб

  4. Grek1130

    Grek1130 Нуб

    Подождите...
     
  5. Grek1130

    Grek1130 Нуб

    Убрал = , не работает
     
  6. Igor68

    Igor68 Гуру

    Для начала исключите "конфликт"
    Код (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);
     
  7. Grek1130

    Grek1130 Нуб

    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
     
  8. Igor68

    Igor68 Гуру

    Лучше конечно так:
    Код (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);
    Правда опять не понять зависимости выхода от значения нескольких датчиков... причём с разной зависимостью. Понимаю так: Нагреватель один на несколько зон контроля. Боюсь нужно как-то по приоритетам и одним ИЛИ не оптимально.
     
    Последнее редактирование: 19 ноя 2016
  9. Grek1130

    Grek1130 Нуб

    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);
    Так вообще не работает.
     
  10. Igor68

    Igor68 Гуру

    Уберите "МЁРТВУЮ" зону = 24.... хотя может это и будет ваш гистерезис.
     
  11. Igor68

    Igor68 Гуру

    Посмотрите:
    Код (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 непонятно.... вроде как "мёртвая зона". Это взято из первого поста. Общая задача мне не понятна.
     
  12. Grek1130

    Grek1130 Нуб

    Получилось! Огромное Вам спасибо! По датчикам гораздо прозаичнее. Мне нужно отслеживать температуру 4 приточных вентиляционных установок и 2 чиллеров. Общая авария температуры важна (все равно бежать смотреть, что случилось), а так все пины на NANO будут задействованы авариями этого оборудования. Еще раз огромное спасибо! Дай Вам Бог здоровья.
     
  13. Grek1130

    Grek1130 Нуб

    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);
    Так работает.
     
  14. Igor68

    Igor68 Гуру

    Удачи Вам во всём!
     
  15. Grek1130

    Grek1130 Нуб

    На <19 тоже работает, набрал снега, приложил)))
     
  16. Igor68

    Igor68 Гуру

    Если у вас просто сигнализация то:
    Код (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);
    этого вполне достаточно
     
  17. Grek1130

    Grek1130 Нуб

    Согласен.