[Из песочницы] Комнатная метеостанция на Arduino
Однажды, исследуя просторы интернета наткнулся я на интересную плату Arduino. Меня очень заинтересовала эта плата. С ее помощью можно сделать самому робота, метеостанцию, сигнализацию и даже что-то посерьезней, например — «Умный Дом».Прикупив сей девайс, начал изучать его особенности. Наигравшись со светодиодами, датчиком температуры и LCD дисплеем, решил сделать что-то такое интересное и то что может пригодиться мне дома.И вот что получилось из этого…
Сегодня я хочу рассказать про свой небольшой домашний проект, а именно — о комнатной метеостанции на Arduino. Думаю, каждый бы хотел увидеть, например, какая у него температура в комнате или влажность, так вот, мой проект позволит вам сделать это.
Вот так метеостанция будет выглядеть в сборе:
Наверно, вам захотелось собрать такое же устройство, ну что же, не будем тянуть.
ВозможностиНо для начала посмотрим, что наша метеостанция может делать: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 — SDApin 5 — SCLПитание 5V
4) Далее часы реального времени: pin 4 — SDApin 5 — SCLПитание 5V
Не забываем подключать питание и землю.
Код
Ну что, теперь самое интересное, это наш код.Я постарался его хорошо комментировать, чтобы было понятно, но тут будут вставки и на английском с библиотек. Я думаю, с переводом проблем не будет.Код
#include
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 с
} Пример работы метеостанции Фотографии устройства
Видео [embedded content]
Исходники Нужные библиотеки и сам код программы доступен поссылке.Если есть какие-то вопросы или пожелания — пишите.