Странности с digitalWrite()
- Войдите на сайт для отправки комментариев
Сделал гигростат для увлажнителя влажности, с часами, двумя датчиками температуры\влажности, дисплеем 1602 и кнопкой для переключения целевой влажности
Реле встроил сразу в розетку удлиннителя, используемого для увлажнителя и подцепил 220В на средний контакт,а контакт от розетки на нормально замкнутый, чтобы удлиннителем, в случае чего, можно было нормально пользоваться и отключив его от ардуины.
По логике должно быть так - 5В на управляющем контакте реле нет - увлажнитель работает, 5В есть - увлажнитель отключается.
Все работает, но один нюанс мне взрывает мозг. Почему-то когда digitalWrite(RELAY, HIGH) - то на управляющем контакте реле 0В, а когда digitalWrite(RELAY, LOW) - то на нем уже 5В.
Может я чего не понимаю, почему вдруг выход инвентированным стал? %)
Код прилагаю.
// подключаем все библиотеки #include "DHT.h" #include <Time.h> #include <Wire.h> #include <DS1307RTC.h> #include <LiquidCrystal.h> #define RELAY 3 //пин управляющего контакта реле #define BUTTONPIN 2 // пин кнопки #define DHTPINa 8 // номер пина первого dht22 #define DHTPINb 9 // номер пина второго dht22 DHT dhta(DHTPINa, DHT22); // и для dht22 DHT dhtb(DHTPINb, DHT22); LiquidCrystal lcd(12, 11, 10, 5, 4, 6, 7); //подключаем экран boolean counter_temp = true; // переменная- счетчик для чередования вывода данных с датчиков float prevhumydity; // переменная предыдущего значения влажности float targethumydity; // переменная целевой влажности boolean relay_state; // переменная состояния реле : true - увлажнитель включен byte L_kr_lit[8] = //рисуем нужную кириллицу, буква л { B00000, B00000, B01111, B00101, B00101, B10101, B01001, B00000, }; byte Ts_kr_lit[8] = //рисуем нужную кириллицу, буква л { B10001, B10001, B10001, B10001, B10001, B10001, B11111, B00001, }; byte Arrow_Up[8] = //рисуем значок градуса и С { B00100, B01110, B11111, B10101, B00100, B00100, B00100, B00000, }; byte Arrow_Down[8] = //рисуем значок градуса и С { B00100, B00100, B00100, B10101, B11111, B01110, B00100, B00000, }; byte Cels_kr_lit[8] = //рисуем значок градуса и С { B11000, B11000, B00010, B00101, B00101, B00100, B00101, B00010, }; void setup() { pinMode(BUTTONPIN, OUTPUT); // Кнопка и прерывание для нее attachInterrupt(0, blink, RISING); lcd.createChar(2, L_kr_lit); // создаем чары для наших нарисованных букв и символов lcd.createChar(7, Cels_kr_lit); lcd.createChar(3, Arrow_Up); lcd.createChar(4, Arrow_Down); lcd.createChar(5,Ts_kr_lit); lcd.begin(16, 2); // инициализируем экран // при включении обнуляем счетчик записи dhta.begin(); // запускаем оба DHT dhtb.begin(); setSyncProvider(RTC.get); // и модуль часов pinMode(RELAY, OUTPUT); // Управление реле, дефолтом реле включаем digitalWrite(RELAY, HIGH); relay_state = true; prevhumydity = 0.0; targethumydity = 30.0; } void blink() { targethumydity = targethumydity + 5.0; if (targethumydity >= 80.0) targethumydity = 30.0; //функция кнопки, можно задать влажность от 30 до 75 с шагом в 5% } void loop() { float h1 = dhta.readHumidity(); float h2 = dhtb.readHumidity(); float t1 = dhta.readTemperature(); float t2 = dhtb.readTemperature(); if (isnan(h1) || isnan(t1) || isnan(h2) || isnan(t2) ) // на случай если не удалось считать данные с датчика - выдадим моргающее 10 раз сообщение о ошибке { for (int i=0; i < 10; i++) { lcd.clear(); lcd.setCursor(0, 0); lcd.print( "Sensor Error" ); delay(200); lcd.clear(); delay(200); } return; } float humydity; // переменная для средней влажности humydity = ((h1+h2)/2.0); // получаем и записываем среднюю влажность int temp; // переменная для средней температуры temp = ((t1+t2)/2); lcd.clear(); // очистим для начала экран lcd.setCursor(0, 0); // зададим координаты lcd.print( "B:" ); // пишем выводим влажность lcd.print((int)humydity); lcd.print("%"); if (prevhumydity > humydity) lcd.print("\4"); // сравниваем, выросла влажность или упала, выводим стрелки или ничего if (prevhumydity < humydity) lcd.print("\3"); if (prevhumydity == humydity) lcd.print(" "); lcd.print( "T:" ); // пишем температуру и значок температуры lcd.print(temp); lcd.print("\7"); lcd.setCursor(11, 0); // переходим на вторую строку if (hour() < 10) // для красивого отображения часов и минут меньше 10 (например, не 2:5, а 02:05) {lcd.print("0");} lcd.print( hour() ); // пишем часы и минуты lcd.print( ":" ); if (minute() < 10) {lcd.print("0");} lcd.print( minute() ); lcd.setCursor(0, 1); // сразу переходим на вторую строку if (counter_temp) // в зависимости от счетчика показываем либо влажность первого датчика и меняем счетчик, либо второго и опять меняем счетчик { counter_temp = false; lcd.print( "B1:" ); lcd.print((int)h1); lcd.print( "% " ); } else { counter_temp = true; lcd.print( "B2:" ); // пишем "Темп.:" lcd.print((int)h2); lcd.print( "% " ); // и наш значок градусов } lcd.print( "\5e\2bB:" ); // пишем целевую влажность lcd.print((int)targethumydity); lcd.print( "%" ); prevhumydity = humydity; //обновляем предыдущее значение влажности if (humydity >= (targethumydity + 2.5)) // если влажность выше целевой на 2.5% - подаем питание на управляющий контакт реле, увлажнитель отключается { digitalWrite(RELAY, LOW); relay_state = false; } if ( humydity <= (targethumydity - 2.5) && relay_state == false ) // Если ниже целевой на 2.5% и увлажнитель не работает(реле включено) - включаем его { digitalWrite(RELAY, HIGH); relay_state = true; } }
P.S. На самом деле зимой в квартире гигростат нафиг не нужен - один увлажнитель (Mystery MAH-2603) - даже если работает сутками в небольшой комнате(16 кв.м.) однокомнатой квартиры, то при открытой двери держит около 40%, при закрытой - около 55%.
А Вы реле напрямую к ардуинке вцепили или транзистор какой имеется?
А Вы реле напрямую к ардуинке вцепили или транзистор какой имеется?
С транзистором конечно, такой модуль:
Если модуль синего цвета - то у него обратная логика. Прямая у красного.