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

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

Программирование делал по ходу подключения датчиков. (ниже будут приведены программы и результаты).
Сейчас для 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(); }