Всем привет, сразу к делу. Вот делаю такой проект. Такая проблема, когда дышу на датчик - лампа выключается, нажимаю на кнопку - она включается НО сразу опять выключается, а у автора после нажатия кнопки остаётся включенной. Наверное датчик в это время ещё улавливает порог влажности ,при которой выключается лампа. Может какую-то задержку надо сделать? Вот код Код (C++): #include "DHT.h" #define DHTPIN A0 #define BUTTON 8 #define LIGHT 4 // Uncomment whatever type you're using! #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) // Connect pin 1 (on the left) of the sensor to +5V // Connect pin 2 of the sensor to whatever your DHTPIN is // Connect pin 4 (on the right) of the sensor to GROUND // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor DHT dht(DHTPIN, DHTTYPE); int threshold = 70; //выставляемая влажность в помещении. int state = 1; void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); pinMode(BUTTON, INPUT); pinMode(LIGHT, OUTPUT); dht.begin(); } void loop() { // 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(); // check if returns are valid, if they are NaN (not a number) then something went wrong! if (isnan(h)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); if(h>threshold){ digitalWrite(LIGHT, LOW); state = 0; } if(!digitalRead(BUTTON) && !state){ digitalWrite(LIGHT, HIGH); delay(50); state = 1; } } }
конечно! Выведи показания датчика в сериал порт и оттуда на комп и подыши на датчик и ты удивишься... Влажность снижается десятки секунд, а вот температура от выдоха заметно быстрее снижается, чем влажность.
А может просто мониторить показания датчика и "отваливать" реле только после достижения определенного низкого значения?
можно по подробнее? P.S С другого форума человек мне помог добавить пару строк, только я их чёт не понял, т.к не профессионал в ардуино. Я выделил эти строчки Код (C++): #include "DHT.h" #define DHTPIN A0 #define BUTTON 8 #define LIGHT 4 // Uncomment whatever type you're using! #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301) DHT dht(DHTPIN, DHTTYPE); int threshold = 62; int state = 1; добавлена 1 - unsigned long lastButtonPressedTime = 0; // сюда будем запоминать время (значение millis()) последнего нажатия кнопки. void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); pinMode(BUTTON, INPUT); pinMode(LIGHT, OUTPUT); dht.begin(); } void loop() { // 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(); // check if returns are valid, if they are NaN (not a number) then something went wrong! if (isnan(h)) { Serial.println("Failed to read from DHT"); } else { Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); if(h>threshold){ добавлена 2 if(millis() - lastButtonPressedTime > 5000){ // если после последнего нажатия кнопки прошло более пяти (или сколько захотите) секунд digitalWrite(LIGHT, LOW); state = 0; } } if(!digitalRead(BUTTON) && !state){ digitalWrite(LIGHT, HIGH); delay(1000); state = 1; добавлена 3 lastButtonPressedTime = millis(); // запоминаем время (значение millis()) последнего нажатия кнопки } } }
Спойлер: код Код (C++): /*to_Anton64.ino 1 лампа -> 4 2 кнопка -> 8 3 датчик -> A0 */ // 1 лампа class Cl_lamp { byte pin; public: Cl_lamp(byte _pin): pin(_pin) {}; setup() { pinMode(pin, OUTPUT); digitalWrite(pin, LOW); }; ON() { // вкл лампу digitalWrite(pin, HIGH); }; OFF() { // выкл лампу digitalWrite(pin, LOW); }; }; Cl_lamp Lamp(4);// подключить лампу на выв 4 // 2 кнопка class Cl_btn { byte pin; void (* Do)(); bool btn, btn_old; bool bounce = 0; // антидребезговый флаг uint32_t past = 0 ; public: Cl_btn(byte _pin, void (* _Do)()): pin(_pin), Do(_Do) {}; setup() { // вставить в setup() pinMode(pin, INPUT_PULLUP); btn = digitalRead(pin); }; loop() {// вставить в loop() if (! bounce && btn != digitalRead(pin)) { // если прошел фронт изм на выводн bounce = 1; // выставить флаг past = millis(); // сделать временую засветку } else if ( bounce && millis() - past >= 5 ) { // если прошло антидребезговое время bounce = 0; // то снять флаг btn_old = btn ; btn = digitalRead(pin) ; // прочитать реальное значение на выводе if (btn_old && ! btn) Do(); } }; }; void Do_btn() { Lamp.OFF(); } Cl_btn btn(8, Do_btn); // подключить кнопку на выв 8 // 3 датчик #include "DHT.h" class Cl_Sens { byte pin; DHT * dht; float h; const float h_ON ;//<--- напиши нужное число влажности для срабатывания датчика void (* Do)(); uint32_t past = 0 ; public: Cl_Sens(byte _pin, void (* _Do)()): pin(_pin), Do(_Do) {}; void setup() { dht = new DHT(pin, DHT11); dht->begin(); }; void loop() { if (millis() - past >= 2000) { past = millis(); h = dht->readHumidity(); if (h > h_ON) Do(); } }; }; void Do_Sens() { Lamp.ON(); } Cl_Sens Sens(A0, Do_Sens); // подключить датчик влажности на пин А0 void setup() { // 1 лампа Lamp.setup(); // 2 кнопка btn.setup(); // 3 датчик Sens.setup(); } void loop() { // 1 лампа // 2 кнопка btn.loop(); // 3 датчик Sens.loop(); } Компилируется, в работе не проверял