Здравствуйте! Всем! Долго мучился... пытался... но нет, мне не поддалось. И вот обращаюсь к ВАМ. Написал скетч по управлению рэле по сравнению двух датчиков влажности. Но есть необходимость прикрутить кнопку вкл/выкл... Вот вопрос: Как прописать кнопку включения данного в скетче сравнения показаний датчиков на 5 дней (но без delay), с возможностью отключения этого кнопкой... пытался поместить в case'ы, возникла проблема с delay в чтении датчиков... Код (C++): #include "stDHT.h" DHT sens(DHT22); const int relPin1 = 3; //реле 1 const int relPin2 = 5; //реле 2 void setup() { Serial.begin(57600); pinMode(2, INPUT); digitalWrite(2, HIGH); pinMode(4, INPUT); digitalWrite(4, HIGH); pinMode(relPin1, OUTPUT); pinMode(relPin2, OUTPUT); pinMode(11, INPUT); } void loop() { int t = sens.readTemperature(2); // чтение датчика на пине 2 int h = sens.readHumidity(2); // чтение датчика на пине 2 delay(2000); int t2 = sens.readTemperature(4); // чтение датчика на пине 4 int h2 = sens.readHumidity(4); // чтение датчика на пине 4 delay(2000); if( t >= (t2+5)){ digitalWrite(relPin1, LOW); // при достижении температуры датчика 1 более 5 градусов включаем реле 2, отключаем реле 1 digitalWrite(relPin2, HIGH); // } else if( h >= (h2+5)){ digitalWrite(relPin1, LOW); //при влажности датчика 1 более 5 градусов включаем реле 2, реле 1 выключен digitalWrite(relPin2, HIGH); // } else { digitalWrite(relPin1, HIGH); // в других случаях реле 1 включено, реле 2 выключено digitalWrite(relPin2, LOW); } Serial.print("Влага датчика №1: "); Serial.print(h); Serial.print(" %"); Serial.print("Темпер датчика №1: "); Serial.print(t); Serial.println(" C "); Serial.print("Влага датчика №2: "); Serial.print(h2); Serial.print(" %"); Serial.print("Темпер датчика №2: "); Serial.print(t2); Serial.println(" C "); } За любую помощь БОЛЬШАЯ БЛАГОДАРНОСТЬ)))
Заведите переменную Код (C++): uint32_t t = 432000; Каждую секунду отнимайте от нее 1; Код (C++): t--; Когда станет равно 0 прошло 5 дней Код (C++): if (t == 0) { ... }
Код (C++): if (digitalRead(pin)) { //Нажата кнопка if (t > 0) t = 0 ; // Если таймер идет - останавливаем else t = 432000; // если таймер остановлен - запускаем } if (t == 0) { // Здесь выключаете, то что нужно было выключить через пять дней } И где - то надо повесить функцию которая будет уменьшать t каждую секунду (если оно больше 0). Еще конечно нужна защита от дребезга, но это другой вопрос, и может быть решен аппаратно.
ААааааааааааааааааааа... блин что не так? Код (C++): #include <uTimerList.h> #include "stDHT.h" DHT sens(DHT22); #define MAXTIMERSCOUNT 8 //const int relPin1 = 3; //реле нагрева //const int relPin2 = 5; //реле продувки extern TTimerList TimerList; THandle hnd_dht1; // хэндл для DHT 1 THandle hnd_dht2; // хэндл для DHT 2 byte dht1 = 2; //пины датчиков byte dht2 = 4; void setup() { Serial.begin(57600); pinMode(dht1, INPUT); digitalWrite(dht1, HIGH); pinMode(dht2, INPUT); digitalWrite(dht2, HIGH); // pinMode(relPin1, OUTPUT); // pinMode(relPin2, OUTPUT); // pinMode(11, INPUT); THandle hnd_dht1 = TimerList.AddSeconds(readDHT1,3); // добавляем таймер, задержка между морганиями 3сек THandle hnd_dht2 = TimerList.AddSeconds(readDHT2,3); // } void readDHT1(void) // функция вызывается раз в секунду { int t = sens.readTemperature(dht1); // чтение датчика на пине 2 int h = sens.readHumidity(dht1); // чтение датчика на пине 2 Serial.print("Влага датчика №1: "); Serial.print(h); Serial.print(" %"); Serial.print("Темпер датчика №1: "); Serial.print(t); Serial.println(" C "); } void readDHT2(void) // функция вызывается раз в секунду { int t2 = sens.readTemperature(dht2); // чтение датчика на пине 4 int h2 = sens.readHumidity(dht2); // чтение датчика на пине 4 Serial.print("Влага датчика №2: "); Serial.print(h2); Serial.print(" %"); Serial.print("Темпер датчика №2: "); Serial.print(t2); Serial.println(" C "); } void loop() { }
Есть вариант, что проблема с датчиком. Или плохой контакт. Но на самом деле не самая удачная компоновка программы. Нельзя внутри таймера выполнять длинный код. Можно в таймере выставить флажок, а функцию вызвать в loop после выставления флажка. Читаются ведь оба датчика - просто неустойчиво.
я в этом ноль..честно... но с контактами норм... в другом скетче через delay читает буду изучать flag
Чтение DHT НЕ работает внутри функции таймера, она выполняется при запрещенных прерываниях. А чтение DHT внутри использует функцию micros(), которая при запрещенных прерываниях врёть. Нужно, да, в функции таймера взводить флаг чтения, а в loop его проверять и читать DHT.
Флажок имеется ввиду переменная Код (C++): uint8_t fl1 = 0; void readDHT1(void) // функция вызывается раз в секунду { fl1 = 1; } void loop() { if (fl1 == 1) { fl1 = 0; int t = sens.readTemperature(dht1); // чтение датчика на пине 2 int h = sens.readHumidity(dht1); // чтение датчика на пине 2 Serial.print("Влага датчика №1: "); Serial.print(h); Serial.print(" %"); Serial.print("Темпер датчика №1: "); Serial.print(t); Serial.println(" C "); } } Конечно содержимое loop тоже желательно разбивать на процедуры. Тогда читать легче.
у меня значения были вапще 200 C и 136% влажность. И само чтение DHT не очень устойчиво, нужно проверять возвращаемое значение. Примерно так int state = dht.read(2); if (state == DHTLIB_OK) {
у меня, правда, библиотека dht11.h Примерно так читается: Код (C++): void ReadTemp(void) { int state = dht.read(2); if (state == DHTLIB_OK) { int t = dht.temperature; int h = dht.humidity; if ((tem != t) OR (hum != h)) { hum = h; tem = t; lcdOut(); } } else Serial << hour << ':' << min << ' ' << "Error\n"; }
Такое ощущение что в порт пишется среднее значение))) Код (C++): #include <uTimerList.h> #include "stDHT.h" DHT sens(DHT22); #define MAXTIMERSCOUNT 8 //const int relPin1 = 3; //реле нагрева //const int relPin2 = 5; //реле продувки extern TTimerList TimerList; THandle hnd_dht1; // хэндл для DHT 1 THandle hnd_dht2; // хэндл для DHT 2 byte dht1 = 2; //пины датчиков byte dht2 = 4; uint8_t flag1=0; uint8_t flag2=0; void setup() { Serial.begin(57600); pinMode(dht1, INPUT); digitalWrite(dht1, HIGH); pinMode(dht2, INPUT); digitalWrite(dht2, HIGH); // pinMode(relPin1, OUTPUT); // pinMode(relPin2, OUTPUT); // pinMode(11, INPUT); THandle hnd_dht1 = TimerList.AddSeconds(readDHT1,3); // добавляем таймер, задержка между морганиями 3сек THandle hnd_dht2 = TimerList.AddSeconds(readDHT2,3); // } void readDHT1(void) // функция вызывается раз в секунду { flag1 = 1; } void readDHT2(void) // функция вызывается раз в секунду { flag2 = 1; } void loop() { if (flag1 == 1) { flag1 = 0; int t = sens.readTemperature(dht1); // чтение датчика на пине 2 int h = sens.readHumidity(dht1); // чтение датчика на пине 2 Serial.print("Влага датчика №1: "); Serial.print(h); Serial.print(" %"); Serial.print("Темпер датчика №1: "); Serial.print(t); Serial.println(" C "); } if (flag2 == 1) { flag2 = 0; int t2 = sens.readTemperature(dht2); // чтение датчика на пине 4 int h2 = sens.readHumidity(dht2); // чтение датчика на пине 4 Serial.print("Влага датчика №2: "); Serial.print(h2); Serial.print(" %"); Serial.print("Темпер датчика №2: "); Serial.print(t2); Serial.println(" C "); } }
Вот что происходит при работе другого скетча... здесь видно, что показания разные у датчиков... например если на него просто подуть)