Комнатная метеостанция на Arduino

в 18:51, , рубрики: arduino, diy или сделай сам, метестанция, микроконтроллеры, сделай сам, Электроника для начинающих

Однажды, исследуя просторы интернета наткнулся я на интересную плату Arduino. Меня очень заинтересовала эта плата. С ее помощью можно сделать самому робота, метеостанцию, сигнализацию и даже что-то посерьезней, например — «Умный Дом».

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

Сегодня я хочу рассказать про свой небольшой домашний проект, а именно — о комнатной метеостанции на Arduino. Думаю, каждый бы хотел увидеть, например, какая у него температура в комнате или влажность, так вот, мой проект позволит вам сделать это.

Вот так метеостанция будет выглядеть в сборе:

image

Наверно, вам захотелось собрать такое же устройство, ну что же, не будем тянуть.

Возможности

Но для начала посмотрим, что наша метеостанция может делать:

1) Показывать текущую дату и время;
2) Показывать текущую температуру;
3) Показывать текущую влажность;
4) Показывать текущее атмосферное давление.

Состав

Что нам понадобится для реализации этой метеостанции:

1) Сам микроконтроллер Arduino (я использовал Arduino nano v3);
2) Датчик температуры и влажности Dht22 (маленькие погрешности в показаниях);
3) Барометр BMP085, он много чего может, например, измерение атмосферного давления, температуры, уровень над уровнем моря;
4) Часы реального времени DS3231 (он очень точный и легко настраивается);
5) Нам надо еще это выводить куда-то, мной был выбрал всем известный экран от Nokia 5110;
6) Прямые руки, без этого никак.

По необходимости:

7) Блок для батареек, для питания всей конструкции. Я питаю от Usb. От батареек не живет пару дней;
8) Переключатель, он тут для того, чтобы включать подсветку у экрана по мере необходимости;
9) Кусок фанеры и ножки.
10) Разъем для подключения блока питания.

Подключение

Теперь давайте рассмотрим, куда и как что подключать.

1) Первым будет наш экран:
pin 3 — Serial clock out (SCLK)
pin 4 — Serial data out (DIN)
pin 5 — Data/Command select (D/C)
pin 7 — LCD chip select (CS)
pin 6 — LCD reset (RST)
Питание 3.3V

2) Далее датчик температуры и властности Dht22:
pin 10 — DAT
Питание 5V

3) Третьим будет барометр:
pin 4 — SDA
pin 5 — SCL
Питание 5V

4) Далее часы реального времени:
pin 4 — SDA
pin 5 — SCL
Питание 5V

Не забываем подключать питание и землю.

Код

Ну что, теперь самое интересное, это наш код.
Я постарался его хорошо комментировать, чтобы было понятно, но тут будут вставки и на английском с библиотек. Я думаю, с переводом проблем не будет.

Код

#include <LCD5110_Graph.h>
#include «DHT.h»
#include <Wire.h>
#include <BMP085.h>
#include «RTClib.h»
#define DHTPIN 10 // 10 pin для датчика DHT22
#define DHTTYPE DHT22

RTC_DS1307 RTC;
BMP085 dps = BMP085();
DHT dht(DHTPIN, DHTTYPE);

long temp3 = 0, Pressure = 0, Altitude = 0;

// pin 3 — Serial clock out (SCLK)
// pin 4 — Serial data out (DIN)
// pin 5 — Data/Command select (D/C)
// pin 7 — LCD chip select (CS)
// pin 6 — LCD reset (RST)

LCD5110 myGLCD(3, 4, 5, 6, 7);

extern unsigned char SmallFont[];

void setup() {

myGLCD.InitLCD();
myGLCD.setFont(SmallFont);

Wire.begin();
RTC.begin();
dht.begin();
delay(2000);

dps.init(MODE_ULTRA_HIGHRES, 3200, true); // 3200 это 32 метра над уровнем моря (Питер на такой высоте располагается+ надо добавить несколько метров в зависимости от этажа на котором живете)

}

void loop() {

dps.getPressure(&Pressure);
dps.getAltitude(&Altitude);
dps.getTemperature(&temp3);
DateTime now = RTC.now();

// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius
float t = dht.readTemperature();

myGLCD.setFont(SmallFont); // задаем маленький размер шрифта на экране
myGLCD.clrScr(); // Очистка экрана

myGLCD.print(«Time=», LEFT, 0); //задаем время
myGLCD.printNumI(int(now.hour()), 32, 0); // 32,0 означет 32=номер пропуска в строке, те откуда будем печатать. 0=номер строки
myGLCD.print(":", 45, 0);
myGLCD.printNumI(int(now.minute()), 50, 0);
myGLCD.print(":", 62, 0);
myGLCD.printNumI(int(now.second()), 67, 0);

myGLCD.print(«Date=», LEFT, 10); //задаем дату
myGLCD.printNumI(int(now.day()), 32, 10);
myGLCD.print("/", 44, 10);
myGLCD.printNumI(int(now.month()), 50, 10);
myGLCD.print("/", 62, 10);
myGLCD.printNumI(int(now.year() — 2000), 68, 10);

myGLCD.print(«T=», LEFT, 20); //задаем температуру
myGLCD.printNumF(t, 2, 13, 20); //Это температура с DHT22
myGLCD.print("/", 45, 20);
myGLCD.printNumF(temp3 * 0.1, 2, 53, 20); //Это температура с барометра

myGLCD.print(«Hum=», LEFT, 30); // задаем влажность с DHT22
myGLCD.printNumF(h, 2, 28, 30);
myGLCD.print("%", 63, 30);

myGLCD.print(«Pres=», LEFT, 40); // задаем атмосферное давление
myGLCD.printNumF(Pressure / 133.3, 2, 31, 40); //рассчет атмосферного давления
myGLCD.print(«mm», 68, 40);

// Serial.print(" Alt(m):"); кому надо, это текущая высота над уровнем моря
// Serial.print(Altitude / 100);

myGLCD.update(); // Вывод вместимого буфера на дисплей
delay (1000); // Задержка 1 с

}

Пример работы метеостанции

Фотографии устройства

image

image

Видео

Исходники

Нужные библиотеки и сам код программы доступен по
ссылке.

Если есть какие-то вопросы или пожелания — пишите.

Автор: bvlad

Источник

Поделиться

* - обязательные к заполнению поля