Віримо в перемогу ЗСУ!
Працюємо з 09:00 до 18:00 Пн-Пт

Привет, увлеченным электроникой читателям. В этой статье и видео нам предстоит разработать, смонтировать и отладить проект под названием регулятор влажности воздуха на Ардуино. Это реальный заказанный мне проект, выполнение которого хочу показать вам. Мы вместе с вами подберем компоненты, начертим схему их электрического соединения. Смонтируем прибор в корпусе. Напишем и отладим программу. И в конце пути получим готовое устройство – регулятор влажности воздуха для передачи заказчику.



Обязательно подпишитесь на наш канал 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); // ждем немного перед отправкой следующего "числа"
  }  
}
Загружаем скетч в контроллер Ардуино - загорается индикатор, который отображает текущую влажность воздуха. Чтобы ввести новое задание, нужно клацнуть ручку енкодера на 1 секунду, отпустить и накрутить нужную цифру. Потом снова клацнуть на 1 секунду до появления текущей влажности. Все, задание введено и записано в постоянную память. Теперь если похекать на датчик влажности, будет расти значение на индикаторе и при достаточном значении даже срабатывать реле, которое должно управлять вентилятором. Теперь, если установить регулятор с датчиком в нужном помещении, и подключить вентилятор, то он будет включаться каждый раз при увеличении влажности и выключаться при опускании на 2% меньше заданной.

01.02.2021
<< Проекты << Все товары >> Статьи, уроки >>

Написать отзыв

Примечание: HTML разметка не поддерживается! Используйте обычный текст.
    Плохо           Хорошо
Регулятор оборотов двигателя 3А 6-28В

Регулятор оборотов двигателя 3А 6-28В

Регулятор оборотов двигателя постоянного тока. Скорость задается переменным резистором.  Принц..

145.02грн.

Ниодимовый магнит 10mm x 2mm N50

Ниодимовый магнит 10mm x 2mm N50

Цилиндрический ниодимовый магнит N50Размеры 10мм x 2ммИдеально подходит для работы в связке с магнит..

11.60грн.

Спортивное табло таймер своими руками

Спортивное табло таймер своими руками

Постановка задачи Задачей проекта является изготовление спортивного таймера для мини-футбольног..

УЗ датчик расстояния с герметичным излучателем

УЗ датчик расстояния с герметичным излучателем

Ультразвуковой датчик расстояния с герметичным двунаправленным излучателемХорошо подходит для среды ..

250.14грн.

Аккумулятор 3300mAh 3,7В Li-ion

Аккумулятор 3300mAh 3,7В Li-ion

Литий-ионный аккумулятор LG на 3,7В с огромной ёмкостью 3300 мАчТип аккумулятора 18650ЭДС (напряжени..

252.78грн.