HTDIY.ART-Сделать своими руками

Сайт посвящен направлению DIY. Публикуем статьи для творчества, подсказываем идеи, дизайна квартиры или дома. Электроника, ардуино, схемы для сборки своими руками. И многое другое.

Простая метеостанция на Arduino.

Сегодня мы расскажем вам, как собрать датчик температуры и влажности своими руками и вывести показания на дисплей.

Для этого нам понадобятся:

  • Arduino Nano 1 шт.
  • OLED дисплей размером 128х64 (Или любой другой) 1 шт.
  • Датчик температуры и влажности DHT-22 1 шт.
  • Резистор 10 кОм 1 шт.

Платформа Arduino Nano выполнена на микроконтроллере ATmega328 и имеет небольшие размеры. За счет этого получится компактная сборка.

Распиновка Arduino Nano

Дисплей на органических светодиодах OLED 0.96 подключается по I2C и имеет разрешение 128×64.

Дисплей OLED 0.96

Мы будем использовать датчик DHT-22, он может измерять температуру и влажность в большом диапазоне. Для сравнения приводим таблицу с характеристиками подобных датчиков.

 

 

 

Характеристики DHT-11

DHT-22

DHT-21

Диапазон измеряемой влажности от 20 до 80% с точностью ±5% RH от 0 до 100% с точностью ±2% RH от 0 до 100% с точностью ±2% RH
Диапазон измеряемой температуры от 0°C до +50°C с точностью ±2°C  от -40°C до +125°C с точностью ±0.5℃  от -40°C до +80°C с точностью ±0.5°C
Частота опроса 1 раз в секунду 1 раз в 2 секунды

Подключение датчика

Питание датчика мы возьмем с самой платы микроконтроллера. Выход сигнала с датчика подключим к цифровому входу D2 Arduino. Так же необходим подтягивающий резистор на 10 кОм между питанием и сигнальным выходом. Схема для сборки:

Такая схема уже рабочая, подготовить прошивку и можно получать данные в монитор порта.

Вывод информации в серийный порт.

Это не очень удобно, компьютер должен быть постоянно включен. Наша задача собрать автономное устройство. Поэтому мы добавим дисплей.

Дисплей подключается по I2C, то есть всего двумя проводами. Это очень удобно по сравнению с дисплеями, подключаемыми по SPI.

I²C (IIC, англ. Inter-Integrated Circuit) — последовательная асимметричная шина которая используется для связи между интегральными схемами внутри электронных приборов. Она подразумевает использование двух линий связи (SDA и SCL), применяется для соединения на низкой скорости периферийных компонентов с процессорами и микроконтроллерами (например, на материнских платах, во встраиваемых системах, в мобильных телефонах).

Исходя из документации к плате ардуино, подключение дисплея мы производим таким образом:

  • SDA подключаем к A4
  • SCL подключаем к A5
  • VCC к питанию 3,3 вольт.
  • GND к земле.
    Дисплей может работать от напряжения 3,3 до 5 Вольт. Так как линия 5 В. уже занята, мы подключим на линию 3,3 В. И как показала практика он прекрасно работает от такого напряжения.

 

Теперь нужно подготовить прошивку для микроконтроллера. Будем использовать такой скетч:

#include "DHT.h"
#include <iarduino_OLED.h>
iarduino_OLED myOLEDdisp(0x3C);// Укажем адрес датчика
extern uint8_t MediumFontRus[]; // Подключим среднего размера
//#define DHTPIN 2 // номер пина, к которому подсоединен датчик
// Инициируем датчик
DHT dht(2, DHT22);
const uint8_t Temperature[] PROGMEM = { 24, 24, // Массив картинки знака температуры.
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x02, //
0x01, 0x01, 0x01, 0x02, 0xFC, 0x00, 0xA0, 0xA0, 0x20, 0x00, //
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
0x00, 0x00, 0xFF, 0x00, 0xFE, 0xFF, 0xFE, 0x00, 0xFF, 0x00, //
0x2A, 0x2A, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
0x00, 0x00, 0x00, 0x00, 0x1E, 0x21, 0x40, 0x8E, 0x9F, 0x9F, //
0x9F, 0x8E, 0x40, 0x21, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, //
0x00, 0x00
}; //
//
const uint8_t Humidity[] PROGMEM = { 24, 24, // Массив картинки знака влажности.
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0x30, 0x18, //
0x0C, 0x06, 0x0C, 0x18, 0x30, 0xC0, 0x80, 0x00, 0x00, 0x00, //
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x1C, 0x07, //
0x01, 0x30, 0x78, 0x4C, 0xF8, 0xE0, 0xF0, 0x58, 0xC0, 0x80, //
0x01, 0x06, 0x1C, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //
0x00, 0x03, 0x06, 0x08, 0x10, 0x20, 0x20, 0x63, 0x41, 0x40, //
0x43, 0x66, 0x23, 0x21, 0x10, 0x08, 0x06, 0x03, 0x00, 0x00, //
0x00, 0x00
};
void setup() {
dht.begin();
myOLEDdisp.begin(); // Инициализация работы с дисплеем.
myOLEDdisp.setFont(MediumFontRus); // Указываем размер шрифта который, будем использовать для цифр и текста.
myOLEDdisp.clrScr(); // Очистим экран от содержимого.
myOLEDdisp.print(F("Загрузка"), OLED_C, 30);
delay(1000);
myOLED.clrScr();
}
void loop() {
// Задержка 2 секунды между измерениями
delay(2000);
int h = dht.readHumidity(); //Считываем влажность
int t = dht.readTemperature(); // Считываем температуру
// Проверка удачно прошло ли считывание.
if ( h<=0 || t<=0) {
myOLEDdisp.clrScr(); // Очистим экран.
myOLEDdisp.print("ОШИБКА", OLED_C, 20);
return;
}
myOLEDdisp.drawImage(Temperature, 10, 25, IMG_ROM);
myOLEDdisp.print(String(t), 40, 25);
myOLEDdisp.print("*C", 95, 25);
myOLEDdisp.drawImage(Humidity, 10, 60, IMG_ROM);
myOLEDdisp.print(String(h), 40, 55);
myOLEDdisp.print("%", 100, 55);
}

 

Сборка получилась максимально компактная, но использовать ее в таком виде опять не очень удобно.

Поэтому мы изготовим корпус для метеостанции на 3D принтере, разместим компоненты внутри и зафиксируем клеевым пистолетом.

В итоге мы получили компактный прибор для измерения температуры и влажности в помещении, затратив на это минимум времени и средств. Основной особенностью которого является простота программирования и возможность расширения функционала за счет добавления различных датчиков и модулей.