mills (условие выполнения программы если прошло времени больше чем надо

Тема в разделе "Arduino & Shields", создана пользователем freebie, 23 янв 2017.

  1. freebie

    freebie Нуб

    Привет! пробовал с разных мест и примеров брать куски скетчей с использованием mills, но все время-что не работает

    данный скетч сейчас работает, но тупо по двум датчикам!
    А хотелось бы добавить условие:
    если датчик света (svet или val) ==1 больше чем 3 минуты, то выполнить условие относящееся к датчику Влажности
    а если время работы датчика света было меньше 3 минут, то включить (rele) на 7 минут
    или если датчик света ==0 то просто анализировать датчик влажности

    Код (C++):

    #include "DHT.h"

    #define DHTPIN 2     // what pin we're connected to


    //#define DHTTYPE DHT11   // DHT 11
    #define DHTTYPE DHT22   // DHT 22  (AM2302)
    //#define DHTTYPE DHT21   // DHT 21 (AM2301)

    int svet = 4;
    int val = 0;


    DHT dht(DHTPIN, DHTTYPE);
    int rele = 3;
    int x = 0;
    int y = 0;
    long time;
    void setup() {
      Serial.begin(9600);
      Serial.println("DHTxx test!");
      pinMode (rele, OUTPUT);
      pinMode (svet, INPUT);
      dht.begin();
    }

    void loop() {
      //pinMode (rele, OUTPUT);
      //pinMode (svet, INPUT);
      val = digitalRead(svet);
      time = millis();
     
      // Reading temperature or humidity takes about 250 milliseconds!
      // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
      float h = dht.readHumidity();
      float t = dht.readTemperature();

      // check if returns are valid, if they are NaN (not a number) then something went wrong!
      if (isnan(t) || isnan(h)) {
        Serial.println("Failed to read from DHT");
      } else {
        x=x+1;
        Serial.print("  SVET: ");
        Serial.print(val);
        Serial.print("  Humidity: ");
        Serial.print(h);
        Serial.print(" %\t");
        Serial.print("  Temperature: ");
        Serial.print(t);
        Serial.println(" *C");
        Serial.print("Time  ");
        Serial.println(time/1000);
        delay (20000);

             if ((h < 70) && (val == 1))
               {
                digitalWrite(rele, HIGH);
               
               }
            else digitalWrite(rele, LOW);
             

       
      }

    }
     
  2. ostrov

    ostrov Гуру

    Он у вас просто выдает показания датчиков раз в 2 сек. Для того чтобы работало "параллельно", надо разобраться в принципе как использовать таймер без вот этого:
    Код (C++):
        delay (20000);
     
  3. freebie

    freebie Нуб

    так я это понимаю! для этого и попросил знатоков, что бы помогли... по идее это делается при помощи mills

    если ниже посмотреть код, то дам будет продолжение...
     
  4. ostrov

    ostrov Гуру

    Напишите свои хотелки. Так проще что то посоветовать чем вникать в чужой и минимум дважды штопаный код.
     
  5. qwone

    qwone Гик

    Так вы изначально не в ту степь поехали. Где у вас Реле времени на 7 минут. Я его обычно оформляю классом. Опять же нет класса кроткого и длиного нажатия на кнопку (короткой и длиной подсветки). Вот у вас и получается, что тачанка ехала на Одессу, а оказалась в степях Херсона.
     
  6. qwone

    qwone Гик

    Головной файл ну и адрес для скачки всего скетча https://yadi.sk/d/WKaKvxrX3APTwN
    /
    Код (C++):
    /* class_Do_btn_deBounce.ino  https://yadi.sk/d/WKaKvxrX3APTwN
      #1 реле ->13
      #2 кнопка ->2
      Принцип кода:нажал 1 раз реле вкл на опред веремя. Замечение: вкл можно только когда выкл, иначе вкл будут не учтены.
    */

    //#1 светодиод
    #include "Cl_time_relay.h"
    #define RELAY_PIN 13
    Cl_time_relay T_Relay1(RELAY_PIN, 0, 1000); // (пин,логика,время relay ON) /создать по времени отключ реле на пине 13
    void func() {
      T_Relay1.ON();
    }
    //#2 кнопка
    #include "Cl_press_btn.h"
    #define BTN_PIN 2
    Cl_press_btn Btn(BTN_PIN); // создать кнопку на пине 2
    void setup() {
      Serial.begin(9600);
      //#1 реле
      T_Relay1.setup();
      //#2 кнопка
      Btn.setup();
    }
    void loop() {
      //#1 реле
      T_Relay1.loop();
      //#2 кнопка
      Btn.loop(& func  );
    }
     
  7. freebie

    freebie Нуб


    ОК суть вот в чем....

    очень смешной проект =)

    есть вытяжка
    датчик света цифровой pin4
    реле на 220 pin3
    датчик влажности DHT22 (цифровой) pin2
    ардуино нано

    суть алгоритма:
    при появлении света начинается отчет времени... и если свет погас раньше чем через 3 минуты, то выполнять код сравнения влажности

    Код (C++):
    if (h<55)
    {
    digitalWrite(rele, HIGH);
    }
    //включить реле, если влажность больше 55

    это как бы намек для вытяжки, что в ванну зашли по маленькой нужде и включать вытяжку не надо...
    но если свет горел от больше трех минут, но меньше 7 минут, то это значит, что в туалет не просто так зашли, а хорошенько посидели и тогда надо влючить вытяжку например на 10 минут....

    и после этих 10 минут продолжить сравнивать уровень влажности (это если кто-то пошел в душ, то влажность поднялась и вытяжка работает до тех пор пока влажность не упадет ниже 55 процентов


    в идеале еще сделать условие для дозатора аирвик... при помощи дополнительного реле 220
    если свет горел в диапазоне от 3 до 7 минут (что опять же нам говорит о том, что в ванну зашли не помыться и не помаленькому, то при отключении света включить дополнительное реле на 15 сек (такого времени достаточно чтобы аервик при замыкании цепи электричества прыснул) но при этом он не должен в остальное время работать...

    тем самым мы сильно экономим на балончиках и этот долбанный аервик не будет брызгать каждые 36 минут (минимальное значение которое можно установить на этом аервике)
    дополнительное реле можно поставить на pin 5
     
  8. freebie

    freebie Нуб

    написал хотелку и все затихли....
     
  9. sslobodyan

    sslobodyan Гик

    Заводите переменную для контроля времени. В нужный момент по сработке датчика присваиваете ей millis()+180000L, что значит от текущего момента 180 секунд. В главном цикле пока эта переменная не равна 0 постоянно сравниваете ее с millis(). Как только millis станет больше нее, время прошло, можно выполнять задачу и обязательно обнуляем переменную до следующей сработки датчика.
     
  10. qwone

    qwone Гик

    Код (C++):
    /*
    #1
    #2
    #3
    */

    //#1
    //#2
    //#3
    void setup() {
      //#1
      //#2
      //#3
    }
    void loop() {
      static uint32_t MILLIS ;
      MILLIS = millis() ;
      //#1 1000 миллисекунд вычислит. поток 1
      static uint32_t past_1 = 0 ;
      if (MILLIS - past_1 >= 1000) { // если прошло 1000 миллисек
        past_1 = MILLIS ;
        // сам код
        MILLIS = millis() ;
      }
      //#2  200 миллисекунд вычислит. поток 2
      static uint32_t past_2 = 0 ;
      if (MILLIS - past_2 >= 200) { // если прошло 200 миллисек
        past_2 = MILLIS ;
        // сам код
        MILLIS = millis() ;
      }
      //#3  100 миллисекунд вычислит. поток 3
      static uint32_t past_3 = 0 ;
      if (MILLIS - past_3 >= 100) { // если прошло 100 миллисек
        past_3 = MILLIS ;
        // сам код
      }
    }
     
  11. freebie

    freebie Нуб

    здрово! вот только я совсем новичок и как правильно его применить совсем не пойму, но любопытство раздирает!

    сколько будет стоить, если попросить написать законченный вариант? я уже все перепробывал и теперь каша в голове...

    просто это мне потом пригодится для изготовления других проектов...

    просто один человек пишет один способ, другой пишет совсем по другому
     
  12. qwone

    qwone Гик

    Ну может этот скетч поможет https://yadi.sk/d/tre4OltE3AjXKn
    Для обзора главный файл оттуда выложу сюда
    Код (C++):
    /* Class_do_btn3.ino https://yadi.sk/d/tre4OltE3AjXKn
      #1 кнопка ->2
      Принцип кода:нажал-отжал кнопку
          короткое нажатие - одно сообщение в сериал
          среднее - другое сообщение в сериал
          длиное третье сообщение
    */

    //#1 кнопка 1
    #include "Cl_do_btn3.h"
    const byte btn1_pin = 2;
    Cl_do_btn3 Do_btm1; // создать
    void func_1() {
      Serial.println("Press Short Bottom");
    }
    void func_2() {
      Serial.println("Press Middle Bottom");
    }
    void func_3() {
      Serial.println("Press Long Bottom");
    }
    void setup() {
      Serial.begin(9600);
      //#1 кнопка 1
      Do_btm1.setup(btn1_pin, 500, 2000,0); // (нога, время короткого нажатия, время среднего нажатия,логика) логика 0 когда нажатая кнопка 0/ 1 если наж кнопка 1
    }
    void loop() {
      //#1 кнопка 1
      Do_btm1.loop(& func_1, & func_2, & func_3  );
    }