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