Подскажите с условием

Тема в разделе "Arduino & Shields", создана пользователем ArtemIlin, 17 окт 2017.

  1. ArtemIlin

    ArtemIlin Нерд

    Всем привет.
    Друзья,так как, познания в области программирования даются очень сложно,прошу у вас помощи. Подскажите пожалуйста, как правильно написать условие.
    Речь пойдет о вытяжке в ваной.
    В ванной стоит датчик №1 dht22(назовем его vanna) и в туалете стоит датчик №2 dht22(назовем его tualet)
    При замере влажности с двух датчиков в равных условиях,выявлено,что датчик №2 завышает показания на 2%.
    Собственно вопрос у меня такой,как написать условие ,чтобы был такой алгоритм:
    if(vanna меньше на 2 tualet || vanna < 30) { //если влажность в ванной меньше на 2% влажности туалета или <30%
    digitalWrite( rele, HIGH ); //вентиляция выключена
    }
    ни как не могу понять,как реализовать и вообще можно так написать вот этот(vanna меньше на 2 tualet ) кусок кода
     
  2. DIYMan

    DIYMan Guest

    Код (C++):
    //если влажность в ванной меньше на 2% влажности туалета или <30%

    int humidityVanna = ...;
    int humidityTualet = ....;

    if((humidityVanna <= humidityTualet - 2) || humidityVanna < 30)
    {
    тут код
    }
     
  3. ORLENOK

    ORLENOK Гик

    Код (C++):
    if( (vanna < tualet * 0.98) || vanna < 30)
    {
    ....
    }
    Тут проблема с пониманием процентов, а не с программированием))

    Жестокие и двусмысленные проценты..

    Или так:

    Код (C++):
    if( (vanna < tualet - 2) || vanna < 30)
    {
    ....
    }
    Вообще, если планируете использовать if..else, то я бы сделал не четкую границу, в ванной влажность меньше, чем в туалете, а с запасом процентов 5-10. С учётом погрешности 5%. А то может быть так, что реле будет постоянно включаться-выключаться.
     
    Последнее редактирование: 17 окт 2017
  4. ИгорьК

    ИгорьК Гуру

    Но работать это не будет как задумано. По причине высокой точности определения влажности этими датчиками.
     
  5. b707

    b707 Гуру

    Погодите программировать. В вашей логике есть ошибка, не имеющая отношения к программированию.
    Итак, при замере в равных условиях вы выяснили, что датчик №2 завышает на 2%. Но это В РАВНЫХ УСЛОВИЯХ! А сейчас то у вас один датчик стоит в туалете, а другой в ванной - и потому их показания вообще никак не связаны. Так к чему вам сравнивать показания датчиков в ванной и туалете - вместо этого надо просто вычитать из показаний датчика #2 два процента.
    А вообще, забота о двух процентах выглядит смешно. У них только по паспорту точность 2%, а если судить по отзывам, у людей они врут на 20-30%
     
  6. ArtemIlin

    ArtemIlin Нерд

    Спасибо,но это немножко не то.Хочется чтобы вытяжка выключалась по условию : как я это пытаюсь сформулировать.
    При замере в одинаковых условиях датчик №2 показывает 30% , а датчик №1 показывает 28%,так вот как написать условие чтобы датчик №1 выключал реле не сразу ,по условию || humidityVanna < 30,а по достижению влажности на 2% меньше датчика №2.
    Извиняюсь если не ясно выражаю свою мысли.
     
    Последнее редактирование: 18 окт 2017
  7. DIYMan

    DIYMan Guest

    Зачем выключать датчик? Пусть работает :) Вам вытяжку надо выключать, не правда ли? Выключать тогда, когда влажность на втором датчике меньше 30%? Так и пишите это условие, при чём тут ваши пресловутые два процента?

    Действие 1: включить вытяжку, когда на датчике 1 (который показывает меньше на 2%) больше 40%;
    Действие 2: если вытяжка включена - то выключить вытяжку, когда на датчике 2 влажность меньше 30%.

    Зачем здесь сравнивать показания датчиков и плясать с двумя процентами, в упор не вижу. Попробуйте обрисовать задачу попонятнее, а то, если честно, пока я ничего не понял - выключаете датчики зачем-то :)
     
  8. ArtemIlin

    ArtemIlin Нерд

    Хорошо,попытаюсь по подробнее описАть.
    1.Просыпаюсь утром, смотрю на данные датчика ванны(данные передаются по 433mhz), датчик ванны показывает 32%, а датчик туалета показывает 34% вытяжка выключена.
    2.После приема ванны датчик показывает 90% включается вытяжка(по условию в коде это выглядит так if(vanna > 25 && vanna > tualet) digitalWrite( rele, LOW ); ) влажность туалета 34% вытяжка включается.
    3.Через некоторое время влажность ванны доходит до 33% влажность туалета 34% вытяжка выключается.
    4.Но через несколько минут влажность ванны,естественно опять поднимается выше влажности туалета и включается вытяжка.
    Происходят кратковременные включения и выключения вытяжки,некоторое время из за этих как мне кажется 2%.
    5.Когда влажность в ванной устаканивается,датчик влажности в ванной показывает 32%,а в туалете 34% и не происходит кратковременных включений и выключений вытяжки.
    6.Вот собственно от этих кратковременных включений и выключений вытяжки я и хочу избавиться.
     
    Последнее редактирование: 19 окт 2017
  9. ArtemIlin

    ArtemIlin Нерд

    Датчики не выключаю,выключается реле.
     
  10. Airbus

    Airbus Радиохулиган Модератор

    Сделайте гистерезис.Включение при влажности 40 выключение при 30.И немного не понял у Вас санузел совместный?Если связываете влажность в ванной и туалете?А вытяжек тоже две?Или Вы хотите управлять двумя вытяжками по данным от двух датчиков но одной Ардуиной?
     
  11. ORLENOK

    ORLENOK Гик

    Чтобы от них избавиться сделайте включение и выключение при разных фактических значениях.
    Или сделайте саму проверку раз в несколько секунд, например. Вообще, без кода всё не очень понятно.
    Насколько я понял должно быть примерно так:
    if(vanna > 25 && vanna > tualet) - вытяжка в ванной выключается, если влажность в туалете больше, чем в ванной, при любой влажности в ванной, хоть 90 процентов.

    if(vanna < tualet + 5) - тут, +5 это ваш буфер, защита от кратковременных выключений. Нужно менять это значение и в большую сторону, если они будут. Вообщем, при этом условии вытяжка выключается.
     
  12. ArtemIlin

    ArtemIlin Нерд

    Вот код
    Код (C++):
    #include <VirtualWire.h>
    #include <EasyTransferVirtualWire.h>
    #include <Wire.h>
    #include "DHT.h"
    #define DHTPINa 11
    #define DHTPINb 5
    #define DHTTYPE DHT22
    DHT dhta(DHTPINa, DHTTYPE);
    DHT dhtb(DHTPINb, DHTTYPE);
    //HTU21D myHumidity;
    #define  INTERVAL 5000UL
    int pinPhoto = A0;
    int rele = 2; //светодиод вместо реле
    int raw = 0;

    EasyTransferVirtualWire ET;
    struct SEND_DATA_STRUCTURE {
     
      byte ID;
      int Humyditetubzik;
      int humidityvanna;
      int sensorsvet;
      byte relestatus;
     
      };

    SEND_DATA_STRUCTURE mydata;

    void setup()
    {
     
      dhta.begin();
      dhtb.begin();
      pinMode( pinPhoto, INPUT );
      pinMode( rele, OUTPUT );
      ET.begin(details(mydata));
      mydata.ID = 1;
      // Initialise the IO and ISR
      vw_set_ptt_inverted(true); // Required for DR3100
      vw_set_tx_pin(9);
      vw_setup(2000);  // Bits per sec
     
      }

    void loop(){
     
      raw = analogRead( pinPhoto );
      int vanna = dhta.readHumidity();
      int tualet = dhtb.readHumidity();
      mydata.humidityvanna = dhta.readHumidity();
      mydata.Humyditetubzik =dhtb.readHumidity();
      mydata.sensorsvet = analogRead( pinPhoto );
      mydata. relestatus = digitalRead(rele);

    if(vanna == 0 || tualet == 0)         //если влажность в ванной =0 или влажность туалета=0
        {      
        digitalWrite( rele, HIGH );         //вент выключен(значит сломан один из датчиков влажности)
        }
     
     
    static unsigned long previousMillis = 0;      
     
      if(millis() - previousMillis > INTERVAL) {  
       
        previousMillis = millis();                  
       
          ET.sendData();
          if(raw > 380){                         //если свет включен
          digitalWrite( rele, HIGH );           //вент выключен
        }
          if(raw < 400){                       //если свет выключен
           if(vanna > 25 &&  vanna > tualet){  //если влажность в ванной > 25 и >влажности туалета
          digitalWrite( rele, LOW );         //вент включен
        }
           if(vanna < tualet || vanna < 30){    //если влажность в ванной < влажности туалета или <=30%
            digitalWrite( rele, HIGH );         //вент выключен
            }
           }
          }
         }
     
  13. ArtemIlin

    ArtemIlin Нерд

    раздельный
     
  14. b707

    b707 Гуру

    санузел раздельный, а вытяжка - одна общая на ванну и туалет?
     
  15. ArtemIlin

    ArtemIlin Нерд

    да общая.
     
  16. DIYMan

    DIYMan Guest

    Решение вашей надуманной проблемы - гистерезис.
     
  17. Airbus

    Airbus Радиохулиган Модератор

    И
    Зачем тогда вообще влажность в туалете?Сделайте включение по другому условию в туалете например датчик движения,Уз дальномер,Концевик двери или как у Вас датчик света-и сделайте всё отдельным блоком if.Зачем влажность?Она если и меняется там то очень незначительно и данные от датчика тем более от такого глючного Вам только дадут головную боль.Ну а в Ванне всё как я и сказал выше
    Только не 2-3% а 10% потому как датчик очень неточный.А что в Вашем коде делает millis?
     
  18. ORLENOK

    ORLENOK Гик

    Очевидно, записывает время предыдущего входа в условие.
    И задается интервал в 5 секунд. Входил в условие раз в 5 секунд. Можно было бы сделать ещё так:
    Код (C++):
    if(millis()%5000 == 0)
     
  19. b707

    b707 Гуру

    Не надо так делать никогда.
    Не будет работать если это условие проверяется реже. чем раз в миллисекунду
     
    DIYMan и Tomasina нравится это.
  20. ostrov

    ostrov Гуру

    Даже в новых механических клапанах для унитаза есть гистерезис! Не до конца понял механизм, но он работает!