Віримо в перемогу ЗСУ!
Магазин у відпустці до 03.07.2022

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



Обязательно подпишитесь на наш канал 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хAA

Держатель для батареек 3хAA

Бокс для трёх пальчиковых батареек типа ААОбщее напряжение на проводах бокса получится 4,5 В..

25.80грн.

Винт М2х20мм оцинкованный

Винт М2х20мм оцинкованный

Винт оцинкованный с резьбой М2 для крепления элементов любительских проектовДлина резьбы 20 мм..

3.06грн.

Оптопара EL817 SMD

Оптопара EL817 SMD

Оптопара с транзистором на выходеПрименяется для гальванической развязки дискретного сигнала, а так ..

3.57грн.

Расширитель PWM выходов 16-канальный I2C

Расширитель PWM выходов 16-канальный I2C

Модуль внешних 16-ти выходов PWM с управлением по сети I2C на основе специализированной микросхемы&n..

118.27грн.

Осциллограф на ардуино

Осциллограф на ардуино

Простой осциллограф своими руками без паяльникаОсциллографы бывают дорогие или очень дорогие. Как же..