Привет! пробовал с разных мест и примеров брать куски скетчей с использованием 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 сек. Для того чтобы работало "параллельно", надо разобраться в принципе как использовать таймер без вот этого: Код (C++): delay (20000);
так я это понимаю! для этого и попросил знатоков, что бы помогли... по идее это делается при помощи mills если ниже посмотреть код, то дам будет продолжение...
Напишите свои хотелки. Так проще что то посоветовать чем вникать в чужой и минимум дважды штопаный код.
Так вы изначально не в ту степь поехали. Где у вас Реле времени на 7 минут. Я его обычно оформляю классом. Опять же нет класса кроткого и длиного нажатия на кнопку (короткой и длиной подсветки). Вот у вас и получается, что тачанка ехала на Одессу, а оказалась в степях Херсона.
Головной файл ну и адрес для скачки всего скетча 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 ); }
ОК суть вот в чем.... очень смешной проект =) есть вытяжка датчик света цифровой 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
Заводите переменную для контроля времени. В нужный момент по сработке датчика присваиваете ей millis()+180000L, что значит от текущего момента 180 секунд. В главном цикле пока эта переменная не равна 0 постоянно сравниваете ее с millis(). Как только millis станет больше нее, время прошло, можно выполнять задачу и обязательно обнуляем переменную до следующей сработки датчика.
Код (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 ; // сам код } }
здрово! вот только я совсем новичок и как правильно его применить совсем не пойму, но любопытство раздирает! сколько будет стоить, если попросить написать законченный вариант? я уже все перепробывал и теперь каша в голове... просто это мне потом пригодится для изготовления других проектов... просто один человек пишет один способ, другой пишет совсем по другому
Ну может этот скетч поможет 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 ); }