Метеостанция своими руками.
Дело было вечером, делать было нечего - на улице идет дождь и скользко
Потому хочется занять голову да и руки тоже чем-нибудь полезным, творческим. Вот решил сделать метеостанцию своими руками.
Почему метеостанция???
Да просто пришел датчик давления из поднебесной, вот и зачесались руки его опробовать...
Все остальные компоненты закупались и собирал давно и подбирались из того что было дома по сусеках

Программирование делал по ходу подключения датчиков. (
ниже будут приведены программы и результаты).
Сейчас для ARDUINO существует куча датчиков измеряющих все и вся. Естественно точность измерений некоторых оставляет желать лучшего, но для бытовых/любительских нужд этого вполне достаточно.
Сначала пробегусь по компонентам, ссылки давать не буду, Все можно купить у китайцев или по спецмагазинам электроники. Многие компоненты покупал неспеша на алиэкспресе.
Arduino Pro Mini
Датчик давления ВМР180
Это основной датчик. Когда я увидел его китайцев, то понял, что хочу собрать именно домашнюю метеостанцию.
Часы реального времени DS1307
Ещё один компонент для моей метеостанции. На данном шилде реализованы часы реального времени.
Датчик температуры и влажности DHT11
Про данный датчик рассказывать нечего. Я бы его даже не стал использовать, если бы не нужна была влажность.
Минусы у датчика есть – данные с датчика идут только в целых числах, да и диапазон слабенький.
SD шилд для карточки (будем писать туда данные с датчиков)
KIS3R33SУниверсальный импульсный DC-DC преобразователь. Вход 7...24 В. Выход 5 В. 2,5 А.
Инфракрасный приемник VS1838 и безымянный пульт
Так как руки чесались поскорее опробовать было решено собрать для теста "навесным монтажом"
***
После сборки решил сравнить показания датчика давления с образцовым прибором (поверенным)
наша метеостанция
Калибратор
Как видите показания довольно точные

Немного поигравшись

и постоянно путаясь в куче проводов, а они начали расти с ужасающей скоростью
Было принято решение сделать переходную плату (кросплата).
Для этого будем использовать такие вещи:
Час работы с паяльником и получаем такую плату.
Попивши чая и отдохнувший собрал все модули в одно целое:
При запуске не обошлось без казусов

перепутал пару проводков от дисплея и он гордо отказался что либо показывать.
Еще полчаса ушло на выяснение причины и в итоге имеем такие данные на дисплее.
1. Время и дата (с модуля часы реального времени DS1307)
2. Температура и давление в мм ртутного столба с датчика ВМР180
3. Температура и давление в паскалях (Р) с датчика ВМР180
4. Влажность и температура с датчика DHT11
5. Высота над уворнем моря (нужна доработка программного кода - врет немного)
6. Напряжение питания и время работы от момента включения питания (тестовый блок, для отладки)
 | Все надписи на английском из за того что индикатор не поддерживает кирилицу.
Использовал тот что был под рукой. Если поставить рускоязычный индикатор 16 символов и 2 строки то можно вывести намного больше информации. |
Ну и напоследок одна из версий кода для ARDUINO
Метеостанция - программа
/*
Нумерация выводов LCD :
LCD RS pin to digital pin 12
LCD Enable pin to digital pin 11
LCD D4 pin to digital pin 5
LCD D5 pin to digital pin 4
LCD D6 pin to digital pin 3
LCD D7 pin to digital pin 2
LCD R/W pin to ground
10K resistor:
ends to +5V and ground
wiper to LCD VO pin (pin 3)
------------------------------------
BMP180 цифровой модуль атмосферного давления Arduino
I2C интерфейс
Напряжение питания 1.8В - 6В
Макс I2C скорость: 3.5 мГц
Низкое энергопотребление-0.5uA на 1 Гц
Очень низкий уровень шума-до 0.02hPa
Диапазон давления: 300hPa до 1100hPa
Температура -40 - +85 С
Any Arduino pins labeled: SDA SCL
Uno, Redboard, Pro: A4 A5
Mega2560, Due: 20 21
-----------------------------------
*/
// подключаемые библиотеки
#include <LiquidCrystal.h>
#include <Adafruit_BMP085.h>
#include <dht11.h>
#include <Wire.h>
#include <RTC.h>
RTC time;
//создаём объект-сенсор bmp180 i2c
//SFE_BMP180 pressure;
Adafruit_BMP085 bmp;
//DHT sensor = DHT();
dht11 sensor;
#define DHT11PIN A1
// инициализировать библиотеку с номерами выводов интерфейса
LiquidCrystal lcd(9, 8, 5, 6, 3, 2);
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int kkl, tim;
//Место объявления ваших переменных
void setup() {
//Место инициализации ваших переменных
// методом attach объявляем к какому контакту подключен // сенсор. В нашем примере это нулевой аналоговый контакт
lcd.begin(8, 2);// задаем размерность дисплея
//Serial.begin(9600);
time.begin(RTC_DS1307);
if (!bmp.begin()) {
lcd.print("BMP180");
delay(1000);
lcd.clear(); //очистка экрана
while (1) {}
}
// индикация загрузки :)
for (kkl = 0; kkl < 2; kkl++)
{
lcd.print("."); delay(150); // ждем 0.25 секунды
lcd.print("."); delay(150);
lcd.print("."); delay(150);
lcd.print("."); delay(150);
lcd.print("."); delay(150);
lcd.print("."); delay(150);
lcd.print("."); delay(150);
lcd.print(".");
delay(500); // ждем 1 секунду
lcd.clear(); //очистка экрана
}
}
void loop() {
// Serial.println(time.gettime("d-m-y, H:i:s, D")); // выводим время
for (tim = 0; tim < 10; tim++)
{
lcd.setCursor(0, 0);
lcd.println(time.gettime("d-m-y")); // выводим дату
lcd.setCursor(0, 1);
lcd.println(time.gettime("H:i:s")); // выводим время
delay(500); // ждем 50С
lcd.clear(); //очистка экрана
}
lcd.setCursor(0, 0);
lcd.println(time.gettime(" D ")); // выводим день
lcd.setCursor(0, 1);
lcd.println(time.gettime("M")); // выводим месяц
delay(3000); // ждем 50С
lcd.clear(); //очистка экрана
lcd.setCursor(0, 0);
lcd.print("t "); lcd.print(bmp.readTemperature()); lcd.print("C");
lcd.setCursor(0, 1);
lcd.print(bmp.readPressure() * 0.0075006375541921); lcd.print("mm");
delay(5000); // ждем 3 С
lcd.clear(); //очистка экрана
lcd.setCursor(0, 0);
lcd.print("t "); lcd.print(bmp.readTemperature()); lcd.print("C");
lcd.setCursor(0, 1);
lcd.print(bmp.readPressure()); lcd.print(" Pa");
delay(3000); // ждем 3С
lcd.clear(); //очистка экрана
lcd.setCursor(0, 0);
lcd.print("Altimetr");
lcd.setCursor(0, 1);
lcd.print(bmp.readAltitude()); lcd.print("m");
delay(3000); // ждем 3С
lcd.clear(); //очистка экрана
/* Выводим влажность и температуру */
int chk = sensor.read(DHT11PIN);
lcd.setCursor(0, 0); lcd.print("H = ");
lcd.print(sensor.humidity); lcd.print("%");
lcd.setCursor(0, 1); lcd.print("T = ");
lcd.print(sensor.temperature); lcd.print(" C");
delay(3000); // ждем 50С
lcd.clear();
}