Метеостанция подключение к компьютеру
Было написано множество статей на тему вариаций погодных станций на платформе Arduino. Вывод данных везде был различен. Позвольте представить мою вариацию, с выводом данных через Ethernet.
Итоговое фото сборки:
Компонетны:
Датчики DHT-22 бывают в различных исполнениях, мне попался датчик уже готовый к подключению, с подтягивающим резистором:
Данный датчик встречается в различных исполнениях, необходимо смотреть распиновку и наличие подтягивающих резисторов для подключения:
Итоговые компоненты схемы:
Задачи:
Основной задачей была реализация вывода данных о температуре, влажности и давлении в домашнюю сеть, так же в ходе разработки и прототипирования была реализована побочная задача управления нагрузкой через сеть.
Реализована возможность управления любой нагрузкой через WEB-интерфейс.
Образно алгоритм работы устройства выглядит так:
- Задаем на Ethernet Shield MAC-адрес, ip-адрес и маску под сети;
- Задаем PIN для управления нагрузкой;
- Получаем данные с датчиков;
- Производим необходимые преобразования ( в данном случае имеется ввиду преобразование давления);
- Формируем WEB-страницу;
- Выводим значения с датчиков и состояние PIN нагрузки на страницу.
Далее привожу код, он содержит множество комментариев и думаю внесет ясность в то что делаем.
Код скетча:
Web-интерфейс выглядит следующим образом:
Интерфейс был сделан пока что только для получения данных и отладки, но в дальнейшем он будет модернизирован.
Вывод данных о давлении был целенаправленно сделан в двух значениях, таких как мм.рт.ст. и дюймы рт.ст…
По причине наличия, как эталонного датчика, часов с барометром в дюймах рт.столба.
Схема устройства:
Стоимость устройства:
- Arduino Compatible UNO Rev3 = USD$ 15.20
- Ethernet W5100 Shield Network Expansion Board w/ Micro SD Card Slot for Arduino = USD$ 25.30
- DHT22 2302 Digital Temperature Humidity Sensor = USD$ 10.90
- BMP085 Barometric Pressure / Height Sensor Module for Arduino – Blue = USD$ 10.30
- NT-R02BM 250~450MHz OOK/ASK Receiver Module (DC 5.0V) = USD$ 4.20
Предвижу сразу, что многие скажут что это дорого, но для меня роль играл сам факт реализации, а не цена.
Скетч и схема устройства:
Дальнейшие планы:
- В дальнейшем планируется доработка данной схемы RF-приемником и стандартным датчиком для измерения температуры и влажности Oregon THGN132N. Такие эксперименты уже описывались.
- Так же в наличии имеется роутер типа ASUS RT-N16, на котором есть утилита RRDTool. Планируется получение данных со станции и построение графиков при помощи данной утилиты.
Приемник на 433 МГц, можно использовать любой совместимый.
Радиодатчик температуры и влажности Oregon THGN132N на 433 Мгц
Радиодатчик температуры и влажности Oregon THGN132N на 433 Мгц
Сегодня представляю подборку из цифровых термометров и метеостанций с Aliexpress для дома.
Удобство подобных устройств состоит в то, что не выходя из своей квартиры или дома можно точно узнать какая сейчас температура, влажность или давление на улице.
Некоторые метеостанции на основе простых вычислений способны строить ожидаемый прогноз погоды с учётом всё тех же данных, давления, влажности, силы ветра и температуры.
Существует огромное количество вариантов термометров и метеостанций, с проводными и беспроводными датчиками, механические и электронные, автономные и с питанием от сети, одноканальные и многоканальные.
В подборке укажу 10 простых термометров и метеостанций для домашнего использования, которые имеют большое количество продаж на Aliexpress.
Бюджетный, знакомый многим вариант цифрового термометра.
Наружный датчик подключается к основному блоку проводом.
На основном блоке отображаются: время, дата, температура и влажность внутри помещения, температура с наружного датчика. У термометра также есть функция будильника.
- Диапазон измерения температуры: -10 °C ∼ +50 °C (-14 °F ∼ +122 °F );
- Погрешность измерения температуры: ±1°C (1.8°F)
- Шаг измерения температуры: ±0.1°C (0.2°F)
- Диапазон измерения влажности: 10 % ∼ 99 % RH
- Погрешность измерения влажности: ±5%RH
- Шаг измерения влажности: 1%
- Питание: 1 элемент AAA 1.5V
Недорогой простой цифровой термометр, но уже с беспроводным датчиком.
На экране просто отображается температура внутри помещения и на выносном датчике.
Характеристики термометра:
- Диапазон измерения температуры внутри помещения: 0~60°C;
- Диапазон измерения температуры выносного датчика: -40~60°C;
- Точность измерения: ±1°C;
- Расстояние до датчика: 100 м в прямой видимости, 30 м с преградами;
- Рабочая частота датчика: 433 MHz;
- Интервал обновления данных: 60 с;
- Питание датчика: 2 x 1.5V AAA;
- Питание приёмника: 2 x 1.5V AAA.
Цифровой термометр/гигрометр с беспроводным выносным датчиком, простейшим прогнозом погоды. и автоматической синхронизацией времени (DCF)
На экране отображаются время, температура/влажность внутри и снаружи помещения, простейший прогноз погоды и активность DCF/ В устройстве есть подсветка и будильник.
Краткие характеристики:
- Диапазон измерения наружного датчика -25°C (-13 F) ~ 50°C (122 F);
- Точность измерения температуры — 1°C;
- Шаг измерения температуры — 0,1°C;
- Расстояние работы датчика — до 60 м;
- Питание — 2 АА станция, 2 ААА датчик.
Метеостанция с цветным экраном и беспроводным датчиком и отображением атмосферного давления.
На экране отображаются: время, дата, фаза луны, температура и влажность внутри и снаружи помещения, атмосферное давления, прогноз погоды, индикатор заряда батареи датчика. В устройстве можно установить два будильника и есть функции автоматической корректировки времени по радиосигналу и памяти максимума и минимума измеряемых значений на 12-24 часа. В комплект входит блок питания станции.
Краткие характеристики:
- Рабочее расстояние датчика: до 80 м;
- Диапазон измерения температуры в помещении: -10℃~50℃;
- Диапазон измерения температуры на выносном датчике: -40℃~60℃;
- Диапазон измерения влажности: 1%~99%;
- Питание: Станция — комплектный блок питания или 3 элемента ААА, датчик — 2 элемента ААА
Метеостанция с WiFi подключением использует для прогноза погоды данные из интернет. Управление станцией возможно при помощи Android приложения.
На экране с подсветкой отображаются: дата, время, температура, влажность, давление, прогноз погоды на 4 дня. Индикатор заряда батареи датчика.
Интерфейс экрана можно переключить на один из восьми поддерживаемых языков.
Станция питается от встроенного аккумулятора. В комплект входит зарядное устройство. На корпусе станции есть USB разъём для зарядки гаджетов.
На выносном датчике имеется небольшой экран с показаниями температуры и влажности. Питание предусмотрено от двух элементов ААА.
Краткие характеристики:
- Диапазон измерения температуры вне помещения: -40℃ ~ 70℃;
- Диапазон измерения влажности вне помещения: 20%RH ~ 95%RH;
- Частота работы датчика: 433 MHz;
- Расстояние работы датчика: до 60 м (на открытом пространстве);
- Класс защиты датчика: IPX4.
Недорогой трёхканальный цифровой термометр/гигрометр, к которому можно подключить три комплектных быспроводных датчика.
На сенсорном экране с подсветкой отображаются температура и влажность измеренные внутренним блоком и тремя выносными датчиками, заряд батареи термометра.
Краткие характеристики:
- Рабочее расстояние датчика: до 60 м;
- Диапазон измерения температуры в помещении: -4℃~30℃;
- Диапазон измерения температуры на выносном датчике: -40℃~40℃;
- Диапазон измерения влажности: 20%~95%;
- Питание: Станция — 2 элемента ААА, датчик — 2 элемента ААА
Термометр/гигрометр с тремя выносными беспроводными датчиками и будильником.
На экране с подсветкой отображаются: время, дата, день недели, температура и влажность на датчиках и внутри помещения, также есть указатель низкого заряда батарей в каждом датчике.
На каждом датчике есть экран, на котором отображается температура и влажность.
Питание основного блока предусмотрено от 2 элементов ААА, датчиков — от двух элементов АА.
Краткие характеристики:
0~50°C, 32~122°F (внутренний блок)
-40~70°C, -40~158°F (датчики)
Шаг измерения: 1°C, 1°F
Точность измерения: ±4°C (при -40 ~ -20°C); ±2°C (при -20 ~ 0°C); ±1°C (при -0 ~ 50°C);
20~95%rH (внутренний блок, при 0~50°C, 32~120°F)
Шаг измерения: 1%rH
Точность измерения: ± 5% (при 25°C, 30~80%rH); ± 8% (при 25°C, 20~29%rH и 80~95%rH)
Цифровой термометр/гигрометр с пятью беспроводными датчиками, сохранением данных на карту памяти, подключением к компьютеру и ведением графика-лога температур/влажности.
На цветном экране отображается: время, дата, температура/влажность от каждого из пяти датчиков.
На каждом датчике отображаются температура и влажность.
Устройство можно подключить к ПК, на котором нужно установить входящее в комплект программное обеспечение. В программе есть возможность калибровки датчиков, установки и синхронизации даты и времени, установка будильников, экспорт истории данных с карты памяти.
Прошивка и первый запуск
Qr-коды сделаны для настройки с мобильных устройств. Для активации режима настройки необходимо нажать и удержать самую правую кнопку на модуле. Станция перезагрузиться, и войдёт в режим настройки.
Нам понадобится платка Wemos D1 Mini (клоник за 2$), платка с датчиком BME280 (2.55$), какой-нибудь корпус и wi-fi-роутер с интернетом.
Схема простая до безобразия.
Главное выполнить всё на пайке, а не на штырьках, а то от дребезга контактов у BME280 иногда сносит крышу и он начинает выдавать полный бред, пока ему питание не передернешь.
Вот так выглядит функционально полностью рабочий полуфабрикат метеостанции.
Далее нужно упаковать это в корпус и повесить за окно. Если есть возможность разместить метеостанцию на западной стороне — никаких проблем. Но у меня такой возможности нет и примерно 4ч в день метеостанция будет на солнце, поэтому я пока еще в раздумьях — как-бы снизить погрешность без громоздкой жалюзийной защиты датчика? Если знаете хорошие варианты — предлагайте в каментах. Питается вся конструкция от USB-порта wifi-роутера — это позволяет, при необходимости, удаленно перезагрузить метеостанцию вместе с роутером.
Adafruit_BME280 bme; // I2C
//MQTT Narodmon
char server[] = SRV;
char authMethod[] = USERNAME;
char token[] = PASS;
char clientId[] = MAC;
char conntopic[] = TOPIC «status»;
WiFiClient nmClient;
WiFiClient wuClient;
PubSubClient clientMQ(server, 1883, nmClient);
// only runs once on boot
void setup() // Initializing serial port for debugging purposes
Serial.begin(115200);
delay(10);
// Connecting to WiFi network
Serial.println();
Serial.print(«Connecting to „);
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.print(“.»);
>
Serial.println("");
Serial.println(«WiFi connected»);
// Printing the ESP IP address
Serial.println(WiFi.localIP());
Serial.println(F(«BME280 start»));
if (!bme.begin()) Serial.println(«Could not find a valid BME280 sensor, check wiring!»);
while (1);
>
>
// runs over and over again
void loop()
getWeather();
doPublishNM(«humidity», String(h, 2));
doPublishNM(«temperature», String(t, 2));
doPublishNM(«pressure», String(p, 2));
doPublishWU(temperatureFString, pressureInString, humidityString, dpFString);
delay(600000);
>
h = 0;
float valh;
for (int i=0; i delay (random(50,500));
valh = bme.readHumidity();
Serial.print(valh);
Serial.print("\n");
h = h+valh;
>
h=h/30;
Serial.print("\n");
t = 0;
float valt;
for (int i=0; i delay (random(50,500));
valt = bme.readTemperature();
Serial.print(valt);
Serial.print("\n");
t = t+valt;
>
t=t/30;
tF=(t*1.8)+32;
Serial.print(tF);
p = 0;
float valp;
for (int i=0; i delay (random(50,500));
valp = bme.readPressure();
Serial.print(valp);
Serial.print("\n");
p = p+valp;
>
p=p/30/100.0F;
dp = t-((1-(h/100))/0.05);
dpF = (dp*1.8)+32;
pb = p/pow(2.718281828, -0.029*9.81*150/(8.31*(t+273.15))); // приводим абсолютное давление к уровню Балтийского моря (высота 150м)
pin = p*0.0296133971008484;
dtostrf(t, 5, 2, temperatureString);
dtostrf(tF, 4, 2, temperatureFString);
dtostrf(h, 5, 2, humidityString);
dtostrf(p, 6, 2, pressureString);
dtostrf(pin, 4, 2, pressureInString);
dtostrf(dpF, 5, 2, dpFString);
// MQTT публикация Narodmon.ru
void doPublishNM(String id, String value) // если не подключен, то подключаемся. Висит пока не подключится.
if (. clientMQ.connected()) Serial.print(«Reconnecting client to „); Serial.println(server);
while (. clientMQ.connect(clientId, authMethod, token, conntopic,0,0,“online»)) Serial.print(".");
delay(500);
>
Serial.print(«connected with: „); Serial.print(clientId); Serial.print(authMethod); Serial.print(token);
Serial.println();
>
String topic = TOPIC;
String payload = value;
// String topic += id;
topic.concat(id);
Serial.print(“Publishing on: „); Serial.println(topic);
Serial.print(“Publishing payload: „); Serial.println(payload);
if (clientMQ.publish(topic.c_str(), (char*) payload.c_str())) Serial.println(“Publish ok»);
> else Serial.println(«Publish failed»);
>
>
if (wuClient.connect(server2, 80)) Serial.print(F("… Connected to server: "));
Serial.print(server2);
char c = wuClient.read();
Serial.print(F(", Server response: "));
Serial.write©;
Serial.println(F(""));
Serial.println(F("… Sending DATA "));
Serial.println(F(""));
wuClient.print(webpage);
Serial.print(webpage);
wuClient.print(«ID=»);
Serial.print(«ID=»);
wuClient.print(authMethod2);
Serial.print(authMethod2);
wuClient.print("&PASSWORD=");
Serial.print("&PASSWORD=");
wuClient.print(token2);
Serial.print(token2);
wuClient.print("&dateutc=");
Serial.print("&dateutc=");
wuClient.print(«now»);
Serial.print(«now»);
wuClient.print("&tempf=");
Serial.print("&tempf=");
wuClient.print(temperatureFString);
Serial.print(temperatureFString);
wuClient.print("&baromin=");
Serial.print("&baromin=");
wuClient.print(pressureInString);
Serial.print(pressureInString);
wuClient.print("&humidity=");
Serial.print("&humidity=");
wuClient.print(humidityString);
Serial.print(humidityString);
//Finishing the communication
wuClient.println("/ HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n");
Serial.println(F("… Server Response:"));
while(wuClient.connected()) while (wuClient.available()) char c = wuClient.read();
Serial.print©;
>
>
wuClient.flush();
wuClient.stop();
>
else Serial.println(F(«Connection failed»));
char c = wuClient.read();
Serial.write©;
wuClient.flush();
wuClient.stop();>
На этом, пожалуй, всё. Думаю, тут всё просто и каждый, при желании, сможет модифицировать этот полуфабрикат под себя — добавить датчик освещенности или дождя, например. Можно подумать над deep sleep и автономным питанием на 4хАА или 5хАА и т.п…
Эту простейшую самоделку сможет повторить каждый, кто в состоянии соединить три провода. С помощью этой штуки можно дистанционно контролировать температуру, например, на даче.
Ещё понадобится резистор 4.7К, провода, любая зарядка от телефона с разъёмом MicroUSB. В качестве корпуса удобно использовать электрическую распаечную коробку.
Скорее всего можно использовать и совсем малюсенький контроллер Wemos D1 Mini, но я не пробовал.
В базовом варианте достаточно припаять датчик температуры к контроллеру (красный провод к 3V, чёрный к GND, жёлтый к D4), между жёлтым и красным проводам датчика ставится резистор (на фото датчик припаян к D1, не обращайте внимания).
Это необязательно, но можно подключить экран. Термометр поддерживает четыре вида экранов (цветной TFT 240x320 точек, OLED 128x64 точки, ЖК двух- или четрырёхстрочный, семисегментный светодиодный). На мой взгляд лучше всего поставить самый дешёвый четырёхсимвольный индикатор. У индикатора четыре контакта, подключаем их к контроллеру (VCC к 3V, GND к G, DIO к TX, CLK к RX).
Я пробовал подключать к термометру OLED-экран, но цифры на нём малюсенькие и выводится много лишней информации, включая неотключаемый адрес сайта разработчика прошивки.
Этот термометр можно подключить к Народному мониторингу и сделать его публичным, если его датчик будет расположен на улице. Если же термометр расположен в помещении (например, на той же даче), сервис позволяет использовать его, как непубличный. Вот так отображаются данные с двух таких термометров на сайте (замечу, что бесплатно можно подключить к сервису лишь один термометр).
А так в приложении (разумеется, датчики можно переименовать).
Как вы уже наверное догадались, для того, чтобы превратить контроллер в облачный термометр в него нужно загрузить прошивку и настроить её. Но сделать это гораздо проще, чем многие из вас подумали. :)
Когда заливка прошивки завершится, отключите контроллер и подключите его снова (можно к компьютеру, можно к любой зарядке). Нажмите три раза кнопку Reset с паузой не менее полсекунды. Контроллер создаст временную точку доступа Wi-Fi под названием WiFi-IoT без пароля. Подключитесь к этой точке смартфоном, и нажмите «подключение к сети». Откроется веб-страница настройки термометра.
Можно всё настроить сразу, можно настроить только подключение к Wi-Fi и продолжить настройку на компьютере. Покажу, как настроить всё сразу на телефоне:
1. Нажимаем «Hardware», ставим галку «Enable DS18B20» и меняем его GPIO на «2». Нажимаем «Set». Нажимаем «Main».
2. Заходим в «1-Wire», там «Clear & Scan List». Должен появиться адрес датчика. Снова «Main».
3. Если подключили экран, заходим в «7SEGM», ставим галку «Enable», вводим в поле «GPIO Clk» 3, в «GPIO Data» 1. Нажимаем верхний «Set». Пункт «1» меняем на DS18B20 1, нажимаем нижний «Set». Жмём «Main».
Отключаем контроллер от питания и включаем снова. Теперь он подключится к домашнему Wi-Fi. Можно зайти в его веб-интерфейс из браузера по адресу, который можно посмотреть в веб-интерфейсе домашнего роутера или с помощью повторного подключения к временной точке доступа контроллера: ещё раз три раза нажимаем на контроллере RST, снова подключаемся к нему телефоном, заходим в «Main» и видим внизу адрес. В данном случае 192.168.1.212.
На Народном мониторинге заходим в «Профиль — Мои датчики».
Нажимаем «Добавить» и вводим ID нашего термометра (его мы сохранили на этапе 4).
На самом деле всё очень просто и эту самоделку действительно можно сделать и настроить за десять минут. Что касается цен, то конечно не может не впечатлять то, насколько это всё дёшево.
Мой выбор
Ладно, подумал я. Не беда, на openweathermap клин светом не сошелся. Будем искать. И я искал…
Критериев было всего два: рейтинг (что народ любит) и удобство использования. Конечно, народ любит openweathermap, а я его невзлюбил. Перепробовал еще парочку сервисов, в конце концов, мой выбор пал на Yandex. Как-то он роднее, в большинстве случаев очень близко к погоде за окном. Решено, будем использовать Yandex. Но и тут не всё шоколадно. Да, Yandex даёт прогноз погоды на период, очень подробный, но за деньги! Есть тестовый период – 30 дней. Не подходит. Но у Yandex также есть и бесплатный тариф. В бесплатно тарифе доступно:
• фактические погодные значения
• прогноз на два ближайших периода (ночь, утро, день или вечер)
Лимит обращений — 50 запросов в сутки. Ну что ж, два периода так два периода. Я подумал – мне хватит. Будем брать!
Реализация
Раз набор данных другой, то и интерфейс будет другим. Да, с графиками придется распрощаться. Да фиг с ними, достоверность важнее.
Поехали!
От старой прошивки я оставил:
• Отображение направления ветра
• Время захода и восхода солнца
• Строку статуса
• Реализацию пробуждения и сна
Интерфейс
Дисплей поделён на четыре зоны:
• Зона статуса – узкая полоска сверху дисплея, на которой отображаются: название населённого пункта; время и дата последнего обновления данных; уровень заряда; мощность Wi-Fi сигнала
• Зона фактической погоды – занимает бОльшую часть дисплея, на которой отображаются: иконка погоды; расшифровка погодной иконки; время года; температура; температура ощущения; влажность; давление; время восхода и захода солнца; фаза луны; секция направления ветра, где отображается направление, скорость и скорость порывов ветра.
• Зона для прогноза погоды – зона поделена на две части (два периода). В зонах отображаются: название периода; иконка погоды; расшифровка погодной иконки; уровень осадков и вероятность; температура; температура ощущения; минимальная и максимальная температура за период; влажность; давление; секция направления ветра.
Последнее и, пожалуй, самое главное отличие моей программы от оригинала – это отображение иконок погоды.
В оригинале, все иконки рисуются кодом, то есть программно! Сначала я подумал: кодом так кодом! Можно было бы реализовать соответствие погодного описания соответствующей функции рисования иконки, но я это делать не стал, потому, что не все иконки в лоб соответствовали описаниям Yandex. И что-то еще было, я уж не вспомню.
Yandex, присылает код погодной иконки, по которому можно скачать иконку в формате SVG. Но этот способ не подходит, библиотека дисплея не позволяет отображать SVG. Она даже растр в чистом виде не отображает, хотя в библиотеке есть функция вывода растрового изображения — epd_draw_grayscale_image. Функция в качестве параметров принимает: area (описание прямоугольной области для вывода картинки) и указатель на массив данных картинки. Сама же картинка хранится в специальном заголовочном файле, в котором содержатся: константы размеров и массив картинки. Этот заголовочный файл получается при помощи утилиты на python imgconvert.py. Скармливаем этой утилите JPEG или PNG и на выходе получаем заголовочный файл. Это я всё к тому, что я придумал все погодные иконки хранить в прошивке в растре, и вызывать их по коду иконки, а не программно рисовать. Красиво? Нет! Хранить такое количество иконок в коде, а их сейчас аж 44, в заголовочных файлах – так себе затея.
Сделаем мы вот что! Преобразуем заголовочный файл с картинкой в бинарный файл, на первом этапе руками. Запишем этот файл в SPIFFS. Далее в программе считываем его в память и выводим на дисплей. Разумеется, что в качестве имени файла иконки лучше использовать код иконки, так проще искать. Красиво? Ну, почти. В один из дней, я обнаружил, что на месте иконки пусто! Дело в том, что в моем наборе не оказалось соответствующей иконки. Видимо источник, из которого я взял имена иконок был не полным. На это случай я реализовал следующий алгоритм: если на файловой системе отсутствует нужная иконка, то я скачиваю её с Yandex и сохраняю на SPIFFS в формате SVG, а вместо иконки я вывожу код, что бы видеть что есть новая иконка, требующая добавления в коллекцию. Вот так как-то…
Разумеется, делать эти картинки вручную, поштучно – то еще развлечение. Я написал две маленькие программки на Qt. Первая, используя скрипт на python, преобразовывает в пакетном режиме растровые иконки(преобразованные из SVG) в заголовочные файлы, а вторая программка, преобразовывает заголовочные файлы в бинарные. Таким образом, я очень быстро получил два набора иконок – маленькие(100x100) и большие(250x250). Бинарники получились меньше заголовочников по объёму, меньше места на SPIFFS занимают. Вот теперь красиво!
Фишка
Собственно фишек три. Все они в совокупности приближают нашу поделку к «продукту». В своей прошивке я сделал WEB-интерфейс для настройки станции, FTP-сервер для частичного изменения содержимого SPIFFS и библиотека Elegant-OTA для обновления прошивки по воздуху.
FTP-сервер нужен для частичного изменения содержимого SPIFFS или для скачивания новой иконки. FTP-сервер активен в режиме настройки. В качестве FTP-клиента я использую Total Commander.
Настройка FTP в Total Commander:
Читайте также: