Недавно я начал изучать программирование микроконтроллера Arduino. После того, как я выполнил несколько базовых упражнений (мигание светодиодом, работа с дискретными и аналоговыми входами, вывод информации на ЖК дисплей и т.д.) мне захотелось сделать какое нибудь полезное устройство для дома.
Я решил сделать измеритель температуры и влажности в комнате, с индикацией параметров на ЖК дисплее. Также я сделал адаптивную подсветку дисплея, которая меняет яркость в зависимости от уровня освещенности в комнате. Это позволяет уменьшить энергопотребление устройства, и тем самым увеличить срок службы батарейки.
В проекте я использовал следующие комплектующие:
1. Плата Arduino Uno
2. Дисплей LCD1602 c модулем поддержки протокола I2C. Для того чтобы уменьшить число проводов и упростить подключение дисплея, я решил подключать его через протокол I2C, для этого я к LCD дисплею припаял специальный модуль преобразователь.
"
3. Датчик температуры и влажности DHT11. Он позволяет определять влажность от 20-80% и температуру от 0-50˚С. Датчик имеет 4 вывода, но используется только 3. Между выводом питания и выводом данных должен быть установлен резистор 10кОм. Я использовал уже готовый датчик, смонтированный на плате, с подключенным резистором, поэтому можно смело подключать его к плате Arduino.
"
4. Фоторезистор. Подключается к плате Arduino с подтяжкой к GND, через резистор 10кОм.
Схема подключения следующая:
Фоторезистор подключается к аналоговому входу А0 платы Arduino. Линия данных датчика DHT11 подключается к дискретному выводу 2, вывод питания подключается к +5В Arduino, соответственно вывод GND подключаем в земле платы Arduino. LCD дисплей подключается к питанию платы, вывод SDA подключается к А4, вывод SCL к А5. Линия управления яркостью подсветки подключается к выводу 9, на котором формируется ШИМ сигнал.
Ниже представлен исходный код:
#include "DHT.h" //Подключаем библиотеку для работы с датчиком DHT11
#include "Wire.h"
#include "LiquidCrystal_I2C.h" //Подключаем библиотеки для работы с LCD дисплеем
int LD; //Объявляем вспомогательную переменную
#define DHTPIN 2 //Задаем PIN для подключения датчика DHT11
#define LED 9 //Задаем PIN который выдает ШИМ-сигнал
#define FOTO 0 //Задаем PIN для подключения фоторезистора
DHT dht(DHTPIN, DHT11); //Инициализируем датчик DHT11
LiquidCrystal_I2C lcd(0x27,16,2); //Инициализируем дисплей
void setup() {
pinMode(LED, OUTPUT); //Настраиваем PIN LED как выход
dht.begin(); //Включаем датчик температуры и влажности
lcd.init(); //Включаем LCD дисплей
lcd.backlight();
}
int light(int svet) //Функция преобразования
{ //значения с датчика освещенности
if (svet<25) //в значение ШИМ-сигнала
{
return 255;
}
if(svet>1020)
{
return 2;
}
else
{
int L=(int)(-0.2*svet+261.262);
return L;
}
}
void loop() {
int f = analogRead(FOTO); //Считываем значение с датчика освещенности
LD=light(f);
delay(2000);
analogWrite(LED, LD); //Устанавливаем значение ШИМ
float h=dht.readHumidity(); //Считываем значение влажности
float t=dht.readTemperature(); //Считываем значение температуры
lcd.setCursor(0,0); //Устанавливаем курсор в нулевую позицию верхней строки
lcd.print("Temp "); //Отображаем значение температуры
lcd.print(t);
lcd.setCursor(0,1); //Помещаем курсор в нулевую позицию нижней строки
lcd.print("Hum "); //Отображаем значение влажности
lcd.print(h);
}
Скомпилировав данный код, получаем вот такое работающее устройство:
В дальнейшем планирую сделать еще какие-нибудь интересные и более сложные устройства на Arduino.
Также я сделал видеоролик, где показал как работает устройство:
Автор: VladNewt