Привет, увлеченным электроникой читателям. В этой статье и видео нам предстоит разработать, смонтировать и отладить проект под названием регулятор влажности воздуха на Ардуино. Это реальный заказанный мне проект, выполнение которого хочу показать вам. Мы вместе с вами подберем компоненты, начертим схему их электрического соединения. Смонтируем прибор в корпусе. Напишем и отладим программу. И в конце пути получим готовое устройство – регулятор влажности воздуха для передачи заказчику.
Обязательно подпишитесь на наш канал Youtube
Звучит задание просто: необходимо измерять влажность в помещении, склонном к её увеличению и включать вентилятор при влажности, выше заданной. Вентилятор питается от сети 220В. Так же в задании четко указано, что должна быть возможность изменения величины заданной влажности воздуха. И самое сложное я в этом проекте выделю реализацию интерфейса для ввода задания на регулирование влажности, что потянет за собой индикатор для отображения цифр, а так же инструмент ввода данных.
По описанию заказчика, помещение с датчиком склонно к конденсации влаги. Поэтому устройство регулирования будет находиться в сухом рядом стоящем помещении, а датчик будет вынесен на проводах. Сам датчик я выберу BME280 – он, если хорошо плату загерметизировать лаком или термоклеем, меньше других боится конденсата. Он может также замерять и температуру и давление воздуха, но в этом проекте эти данные будут не задействованы. Индикатор будет четырехзначный на светодиодах с дробными точками между цифрами. Корпус с прозрачной крышкой для безпроблемного монтажа индикатора.
Блок питания возьмем на 9В, подключим на вход VIN контроллера Arduino и все модули запитаем от стабилизатора напряжения 5В 800мА на его борту.
Модуль реле будет самый дешевый одноканальный на 5В. С одним недостатком – логика обратная и при подаче питания реле может проклацывать кратковременно.
Разработанная схема упрощает монтаж, а так же разработку программы. Поэтому я вам советую не пренебрегать схемой при реализации своих проектов. Я разработаю схему в любимой бесплатной программе KiCad. Результирующая схема регулятора влажности перед вами.
Теперь монтируем все компоненты в корпус согласно принципиальной схеме. Вывод проводов на вентилятор сделаем через гермоввод. И так же поступим с отводом кабеля для датчика влажности BME280. Сверлим отверстия в корпусе для енкодера, ввода питания и двух гермовводов. Монтируем провода, приклеиваем модули на свое место. Железо для регулятора на Ардуино готово.
Теперь набрасываем скетч для загрузки в контроллер. В нем нужно предусмотреть считывание текущего значения влажности воздуха с датчика по сети I2C, обработку енкодера и кнопки енкодера, управление релешкой, отображение на индикаторе двух режимов: текущего и ввода задания. Так же необходимо программно предусмотреть запись последнего значения заданной влажности в постоянную енергонезависимую память контроллера, чтобы при выключении питания задание не сбрасывалось на ноль.
Программа под Arduino IDE получилась следующей
#include <Wire.h> #include <BME280.h> #include <EEPROM.h> BME280 bme; #define SCLK 10 #define RCLK 9 #define DIO 8 #define button 4 #define relay 5 byte digitBuffer[4]; unsigned long previousMillis = 0; const long interval = 1000; int pinA = 2; // номер вывода, подключенный к CLK енкодера int pinB = 3; // номер вывода контроллера, подключенный к DT енкодера int encoderPosCount = 0; int pinALast; byte mode; float h_set, humidity; void setup(){ pinMode(RCLK, OUTPUT); pinMode(SCLK, OUTPUT); pinMode(DIO, OUTPUT); pinMode(relay, OUTPUT); digitalWrite(relay, HIGH); EEPROM.get(0, h_set); bme.begin(); Serial.begin(9600); pinMode (button,INPUT_PULLUP); pinMode (pinA,INPUT); pinMode (pinB,INPUT); pinALast = digitalRead(pinA); attachInterrupt(0, doEncoderA, CHANGE); //прерывание по изменению пина №2(для Arduino UNO) } void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; if(digitalRead(button) == LOW) {if (mode==1) {mode=0; EEPROM.put(0, h_set);} else {mode=1; encoderPosCount=h_set;}} Serial.print("h_set="); Serial.println(h_set); humidity = bme.readHumidity(); unsigned int intvar; if(mode==0) intvar = humidity * 10.0; else intvar = h_set * 10.0; digitBuffer[0] = intvar / 1000; digitBuffer[1] = intvar % 1000 / 100; digitBuffer[2] = intvar % 1000 % 100 / 10; digitBuffer[3] = intvar % 1000 % 100 % 10; out_func(); } // заполняем массив // однократно выводим данные из массива на 7сигмент // тоесть функция должна постоянно крутится. showDisplay(); }
void doEncoderA() { // следим за переходом low-to-high на контакте A if (pinALast != digitalRead(pinA)){ if (digitalRead(pinA) == HIGH) { // проверяем контакт B для определения направления вращения if ((digitalRead(pinB) == LOW)&&(encoderPosCount<100)) { encoderPosCount ++; // CW } else if(encoderPosCount>0){ encoderPosCount--; // CCW } } Serial.println (encoderPosCount); } pinALast = digitalRead(pinA); if (mode==1) h_set=encoderPosCount; }
void out_func(){ if (humidity > h_set) digitalWrite(relay, LOW); if (humidity < h_set-2.0) digitalWrite(relay, HIGH); }
void showDisplay(){ const byte digit[10] = { // маска для 7 сигментного индикатора 0b11000000, // 0 0b11111001, // 1 0b10100100, // 2 0b10110000, // 3 0b10011001, // 4 0b10010010, // 5 0b10000010, // 6 0b11111000, // 7 0b10000000, // 8 0b10010000, // 9 }; const byte chr[4] = { // маска для разряда 0b00001000, 0b00000100, 0b00000010, 0b00000001 }; // отправляем в цикле по два байта в сдвиговые регистры for(byte i = 0; i <= 3; i++){ digitalWrite(RCLK, LOW); // открываем защелку byte chislo = digit[digitBuffer[i]]; if(i==2) chislo &=~(1<<7); shiftOut(DIO, SCLK, MSBFIRST, chislo); // отправляем байт с "числом" shiftOut(DIO, SCLK, MSBFIRST, chr[i]); // включаем разряд digitalWrite(RCLK, HIGH); // защелкиваем регистры delay(1); // ждем немного перед отправкой следующего "числа" } }
Регулятор оборотов двигателя 3А 6-28В
Регулятор оборотов двигателя постоянного тока. Скорость задается переменным резистором. Принц..
145.02грн.
Ниодимовый магнит 10mm x 2mm N50
Цилиндрический ниодимовый магнит N50Размеры 10мм x 2ммИдеально подходит для работы в связке с магнит..
11.60грн.
Спортивное табло таймер своими руками
Постановка задачи Задачей проекта является изготовление спортивного таймера для мини-футбольног..
УЗ датчик расстояния с герметичным излучателем
Ультразвуковой датчик расстояния с герметичным двунаправленным излучателемХорошо подходит для среды ..
250.14грн.
Аккумулятор 3300mAh 3,7В Li-ion
Литий-ионный аккумулятор LG на 3,7В с огромной ёмкостью 3300 мАчТип аккумулятора 18650ЭДС (напряжени..
252.78грн.