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

Одного разу, досліджуючи просторами інтернету я натрапив на цікаву плату 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)
// 6 pin — 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

Відео

Джерело
Потрібні бібліотеки і сам код програми доступний з
посилання.

Якщо є якісь запитання чи побажання — пишіть.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.