Мой первый проект на ардуино. Включаем вентилятор от фоторезистора и DTH11 (по влажности). Сподвигло меня "создать" сее устройство не совершенство вентиляции в моей ванной (которая работала с точностью до наоборот). Спустя полгода работы моего устройства могу сказать что я доволен его работой. Видео о "устройстве" Код: Спойлер: код Код (C++): // Контроллер вентилятора на Arduino // #include <dht11.h> dht11 DHT; #define DHT11_PIN 2 int Fan_PIN =3; int sense_PIN =0; void setup(){ Serial.begin(9600); pinMode(Fan_PIN,OUTPUT); digitalWrite(Fan_PIN, LOW); } void loop(){ int valsense = analogRead(sense_PIN); DHT.read(DHT11_PIN); Serial.println("sense");// вывод в монитор порта АЦП фоторезистора Serial.println(valsense); Serial.println("humidity");// вывод в монитор порта влажности в % Serial.println(DHT.humidity); Serial.println("temperature");// вывод в монитор порта температуры гр. Serial.println(DHT.temperature); int a = DHT.humidity;// присваиваем переменной "а" значение влажности с DHT11 delay(2000);// задержка для опроса DHT11 if(valsense>350){// проверяем если включен свет то переходим дальше иначе пропускаем до проверки влажности if(digitalRead(Fan_PIN)==LOW){// проверяем включен ли вентелятор если нет то включаем задержку на 2 минуты иначе пропускаем Serial.println("time1");// вывод в монитор порта о вкл. задержки uint32_t start_time = millis();// делаем задержку на 2(60000) мин. while ((millis() - start_time) < 60000);// } int valsense1 = analogRead(sense_PIN);// повторно считываем АЦП с фотодатчика if(valsense1>350){// проверяем...если болшьше то вкл. вентелятор иначе пропускаем digitalWrite(Fan_PIN, HIGH);// вкл. вентелятор } if(valsense1<350){// проверяем если меньше то переходим дальше иначе пропускаем if(digitalRead(Fan_PIN)==HIGH){// проверяем включен ли вентилятор если да то включаем задержку иначе пропускаем Serial.println("time2");// вывод в монитор порта о вкл. задержки uint32_t start_time = millis();//Время работы вентилятора после выключения света 3(180000) мин. while ((millis() - start_time) < 180000);// digitalWrite(Fan_PIN,LOW );//выкл. вентилятор } } } else{// проверка влажности if(a>60){// проверяем если влажность больше то digitalWrite(Fan_PIN, HIGH);// вкл. вентелятор } else digitalWrite(Fan_PIN,LOW );// иначе выкл. } } } Плата: https://www.dropbox.com/s/bbpx5ig85s4igyz/Контроллер вентилятора.lay6?dl=0
во время выполнения этого кода: Код (C++): while ((millis() - start_time) < 180000);// вся система не реагирует ни на что, это не очень удобно. Плюс потом вентилятор безусловно выключается. Есть ли ситуация, когда он снова тут же включается? Ну там свет еще горит, или влажность недостаточно понизилась. все "магические числа" лучше вынести из кода в самое начало. P.S. Использовать int для задания номеров пинов - не слишком рационально. Лучше const byte или #define
Я так понимаю Вы про этот участок кода ? Код (C++): if(valsense1<350){// проверяем если меньше то переходим дальше иначе пропускаем if(digitalRead(Fan_PIN)==HIGH){// проверяем включен ли вентилятор если да то включаем задержку иначе пропускаем Serial.println("time2");// вывод в монитор порта о вкл. задержки uint32_t start_time = millis();//Время работы вентилятора после выключения света 3(180000) мин. while ((millis() - start_time) < 180000);// digitalWrite(Fan_PIN,LOW );//выкл. вентилятор }
Под редактированный код Спойлер: Редакция 2 Код (C++): // Контроллер вентилятора на Arduino // #include <dht11.h> dht11 DHT; #define DHT11_PIN 2// пин 2 для подключения датчика DHT11 #define Fan_PIN 3// пин 3 для подключения реле #define sense_PIN 0// пин А0 для подключения фоторезистора int time1 = 60000; //Задержка перед повторной проверкой на включение света int time2 = 180000;//Время работы вентилятора после выключения света int hum;// Переменная для хранящая значение влажности int humMax = 60;// Максимальное значение влажности при которой включится вентелятор void setup(){ Serial.begin(9600); pinMode(Fan_PIN,OUTPUT); digitalWrite(Fan_PIN, LOW); } void loop(){ int valsense = analogRead(sense_PIN); DHT.read(DHT11_PIN); Serial.println("sense");// вывод в монитор порта АЦП фоторезистора Serial.println(valsense); Serial.println("humidity");// вывод в монитор порта влажности в % Serial.println(DHT.humidity); Serial.println("temperature");// вывод в монитор порта температуры гр. Serial.println(DHT.temperature); int hum = DHT.humidity;// присваиваем переменной "hum" значение влажности с DHT11 delay(2000);// задержка для опроса DHT11 if(valsense>350){// проверяем если включен свет то переходим дальше иначе пропускаем до проверки влажности if(digitalRead(Fan_PIN)==LOW){// проверяем включен ли вентелятор если нет то включаем задержку на 2 минуты иначе пропускаем Serial.println("time1");// вывод в монитор порта о вкл. задержки uint32_t start_time = millis();// делаем задержку на 2(60000) мин. while ((millis() - start_time) < time1);// } int valsense1 = analogRead(sense_PIN);// повторно считываем АЦП с фотодатчика if(valsense1>350){// проверяем...если болшьше то вкл. вентелятор иначе пропускаем digitalWrite(Fan_PIN, HIGH);// вкл. вентелятор } if(valsense1<350){// проверяем если меньше то переходим дальше иначе пропускаем if(digitalRead(Fan_PIN)==HIGH){// проверяем включен ли вентилятор если да то включаем задержку иначе пропускаем Serial.println("time2");// вывод в монитор порта о вкл. задержки uint32_t start_time = millis();//Время работы вентилятора после выключения света 3(180000) мин. while ((millis() - start_time) < time2);// digitalWrite(Fan_PIN,LOW );//выкл. вентилятор } } } else{// проверка влажности if(hum>humMax){// проверяем если влажность больше то digitalWrite(Fan_PIN, HIGH);// вкл. вентелятор } else digitalWrite(Fan_PIN,LOW );// иначе выкл. } }
Код (C++): int time1 = 60000; //Задержка перед повторной проверкой на включение света int time2 = 180000;//Время работы вентилятора после выключения света int не может быть больше 65535, поэтому вторая переменная равна 48930, а первая - на грани, захочется чуть увеличить - и произойдет переполнение. лучше так: Код (C++): const unsigned long time1 = 60000UL; //Задержка перед повторной проверкой на включение света const unsigned long time2 = 180000UL;//Время работы вентилятора после выключения света или так: Код (C++): #define time1 60000UL //Задержка перед повторной проверкой на включение света #define time2 180000UL //Время работы вентилятора после выключения света
Редакция кода Спойлер: Редакция 3 Код (C++): // Контроллер вентилятора на Arduino // #include <dht11.h> dht11 DHT; #define DHT11_PIN 2// пин 2 для подключения датчика DHT11 #define Fan_PIN 3// пин 3 для подключения реле #define sense_PIN 0// пин А0 для подключения фоторезистора const unsigned long time1 = 3; //Задержка перед повторной проверкой на включение света в минутах const unsigned long time2 = 5;//Время работы вентилятора после выключения света в минутах byte hum;// Переменная для хранящая значение влажности byte humMax = 60;// Максимальное значение влажности при которой включится вентелятор 0-256 int sensWork = 350;// свет включен void setup() { Serial.begin(9600); pinMode(Fan_PIN, OUTPUT); digitalWrite(Fan_PIN, LOW); } void loop() { int valsense = analogRead(sense_PIN); DHT.read(DHT11_PIN); Serial.println("sense");// вывод в монитор порта АЦП фоторезистора Serial.println(valsense); Serial.println("humidity");// вывод в монитор порта влажности в % Serial.println(DHT.humidity); Serial.println("temperature");// вывод в монитор порта температуры гр. Serial.println(DHT.temperature); hum = DHT.humidity;// присваиваем переменной "hum" значение влажности с DHT11 delay(2000);// задержка для опроса DHT11 if (valsense > sensWork) { // проверяем если включен свет то переходим дальше иначе пропускаем до проверки влажности if (digitalRead(Fan_PIN) == LOW) { // проверяем включен ли вентелятор если нет то включаем задержку на 2 минуты иначе пропускаем Serial.println("time1");// вывод в монитор порта о вкл. задержки uint32_t start_time = millis();// делаем задержку на time1 мин. while ((millis() - start_time) < (time1 * 60000)); // } int valsense1 = analogRead(sense_PIN);// повторно считываем АЦП с фотодатчика if (valsense1 > sensWork) { // проверяем...если болшьше то вкл. вентелятор иначе пропускаем digitalWrite(Fan_PIN, HIGH);// вкл. вентелятор } if (valsense1 < sensWork) { // проверяем если меньше то переходим дальше иначе пропускаем if (digitalRead(Fan_PIN) == HIGH) { // проверяем включен ли вентилятор если да то включаем задержку иначе пропускаем Serial.println("time2");// вывод в монитор порта о вкл. задержки uint32_t start_time = millis();//Время работы вентилятора после выключения света time2 мин. while ((millis() - start_time) < (time2 * 60000)); // digitalWrite(Fan_PIN, LOW ); //выкл. вентилятор } } } else { // проверка влажности if (hum > humMax) { // проверяем если влажность больше то digitalWrite(Fan_PIN, HIGH);// вкл. вентелятор } else digitalWrite(Fan_PIN, LOW ); // иначе выкл. } } }