Когда узнал о
народном мониторинге, о возможности быть частью этой системы мониторинга погоды, меня охватил азарт, и была сделана простенькая метеостанция на ардуино нано и ethernet модуле.
Передавала она на сайт температуру, давление и влажность. Работала худо бедно, иногда подвисала, необходимо было перезагружать. Потом сдох датчик влажности, и я занялся поиском альтернативного устройства. Долго поглядывал на esp8266, но знал о ней очень немного. Останавливало то, что код для нее надо было писать в незнакомой мне среде esplorer на незнакомом мне языке. Здесь уже публиковался
обзор подобного устройства, устройство работало с условно бесплатной прошивкой от Homes Smart, такое решение меня не устроило. Позднее я узнал, что esp8266 можно вполне успешно подружить с arduinoIDE. Я начал усиленно гуглить, и в результате догуглился до устраивающих меня результатов.
Надеюсь, статья окажется полезной. Думаю, ее можно расценивать как обзор-руководство по сборке.
NodeMcu это своего рода отладочная плата для esp8266 (в моем понимании). С помощью нее удобно делать прототипы устройств на макетных платах. Удобно заливать прошивку из ArduinoIDE, все происходит автоматически. Естественно, необходимо
подготовить ArduinoIDE к работе с esp8266. Подготовив рабочую среду сразу набросал схему, это было не сложно.
Датчик давления и температуры bmp180 подключен по i2c к SCL(gpio05) и SDA(gpio04).
Датчик влажности и температуры dht22 подключен к gpio02
Дисплей 1602 с припаянным i2c адаптером так же посажен на scl и cda, параллельно с датчиком давления.
Питание датчиков 3.3в, питание дисплея 5в.
фоторезистор подключен к пину А0, он управляет яркостью дисплея, чтобы в ночи дисплей не светился слишком ярко. Питанием подсветки заведует gpio14, на котором реализован программный ШИМ. После транзисторного каскада питание подсветки подходит непосредственно к пятачку А (анод) на дисплее. он находится рядом со светодиодом. Со spi адаптера дисплея необходимо снять перемычку, которая отвечает за подсветку.
Схему и печатку приложу в конце.
Сложнее было с кодом.
код
//ардуино 181, либы схоронил
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#define debug true // вывод отладочных сообщений
#define postingInterval 300000 // интервал между отправками данных в миллисекундах (5 минут)
#define DHTPIN 2 // dht на gpio02
// Uncomment the type of sensor in use:
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Lib instantiate
DHT dht(DHTPIN, DHTTYPE);
Adafruit_BMP085 bmp;
/**/unsigned long lastConnectionTime = 0; // время последней передачи данных
/**/String Hostname; //имя железки - выглядит как ESPAABBCCDDEEFF т.е. ESP+mac адрес.
float dhttemp; // буферная переменная для хранения температуры от dht22
int dhthum; // буферная переменная для хранения влажности от dht22
int topwm; // хранит значение для шима яркости дисплея
void wifimanstart() { // Волшебная процедура начального подключения к Wifi.
// Если не знает к чему подцепить - создает точку доступа ESP8266 и настроечную таблицу http://192.168.4.1
// Подробнее: https://github.com/tzapu/WiFiManager
WiFiManager wifiManager;
wifiManager.setDebugOutput(debug);
wifiManager.setMinimumSignalQuality();
if (!wifiManager.autoConnect("ESP8266")) {
if (debug) Serial.println("failed to connect and hit timeout");
delay(3000);
//reset and try again, or maybe put it to deep sleep
ESP.reset();
delay(5000); }
if (debug) Serial.println("connected...");
}
void setup()
{
//
pinMode(14, OUTPUT); // gpio14 будет шимить подсветку дисплея
Hostname = "ESP"+WiFi.macAddress();
Hostname.replace(":","");
Serial.begin(115200);
// инициализация экрана
lcd.begin(4, 5); // sda=gpio04, scl=gpio05
lcd.backlight();
// инициализация датчика температуры и давления bmp180
dht.begin();
if (!bmp.begin()) // если датчик не обнаружен, сообщаем об этом в компорт и на дисплей
{
Serial.println("Could not find BMP180 or BMP085 sensor at 0x77");
lcd.clear();
lcd.print("BMP180 FAILED");
while (1) {}
}
WiFi.hostname(Hostname);
wifimanstart();
Serial.println(WiFi.localIP()); Serial.println(WiFi.macAddress()); Serial.print("Narodmon ID: "); Serial.println(Hostname); // выдаем в компорт мак и айпишник железки, так же выводим на дисплей
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(WiFi.localIP());
lcd.setCursor(0, 1);
lcd.print(Hostname);
lastConnectionTime = millis() - postingInterval + 15000; //первая передача на народный мониторинг через 15 сек.
}
void WriteLcdTemp (void){ // заполнение дисплея. происходит каждые 5 минут после получения данных с датчиков
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("T1 ");
lcd.setCursor(4, 0);
lcd.print(bmp.readTemperature());
lcd.setCursor(8,0);
lcd.print(" P ");
lcd.setCursor(11,0);
lcd.print(bmp.readPressure()/133.3);
lcd.setCursor(1, 1);
lcd.print("T2 ");
lcd.setCursor(4, 1);
lcd.print(dhttemp);
lcd.setCursor(8,1);
lcd.print(" H ");
lcd.setCursor(11,1);
lcd.print(dhthum);
lcd.setCursor(13,1);
lcd.print("%");
}
bool SendToNarodmon() { // Собственно формирование пакета и отправка.
WiFiClient client;
String buf;
buf = "#" + Hostname + "#ESP_YOBA" + "\r\n"; // заголовок И ИМЯ, которое будет отображаться в народном мониторинге, чтоб не палить мак адрес
dhttemp=dht.readTemperature(); // сохравняем в буферные переменные данные с dht22, чтобы удобно было оперировать
dhthum=dht.readHumidity();
buf = buf + "#T1#" + String(bmp.readTemperature()) + "\r\n"; //температура bmp180
buf = buf + "#T2#" + String(dhttemp) + "\r\n"; //температура dht22
buf = buf + "#H1#" + String(dhthum) + "\r\n"; //влажность
buf = buf + "#P1#" + String(bmp.readPressure()) + "\r\n"; //давление
buf = buf + "##\r\n"; // закрываем пакет
if (!client.connect("narodmon.ru", 8283)) { // попытка подключения
Serial.println("connection failed");
lcd.clear();
lcd.print("connect failed");
return false; // не удалось;
} else
{
WriteLcdTemp();
client.print(buf); // и отправляем данные
if (debug) Serial.print(buf);
while (client.available()) {
String line = client.readStringUntil('\r'); // если что-то в ответ будет - все в Serial
Serial.print(line);
}
}
return true; //ушло
}
void loop()
{
//автояркость
topwm=map(analogRead(A0), 0, 1023, 10, 950);
analogWrite(14, topwm);
delay(100);// нужна, беж делея у меня не подключался к вайфаю
if (millis() - lastConnectionTime > postingInterval) {// ждем 5 минут и отправляем
if (WiFi.status() == WL_CONNECTED) { // ну конечно если подключены
if (SendToNarodmon()) {
lastConnectionTime = millis();
}else{ lastConnectionTime = millis() - postingInterval + 15000; }//следующая попытка через 15 сек
}else{ lastConnectionTime = millis() - postingInterval + 15000; Serial.println("Not connected to WiFi"); lcd.clear(); lcd.print("No WiFi");}//следующая попытка через 15 сек
} yield(); // что за команда - фиг знает, но ESP работает с ней стабильно и не глючит.
}
Что умеет устройство?
Устройство производит измерение температуры, давления (датчик bmp180) и влажности (датчик dht22), отображает показания на дисплее, и отправляет на сайт народного мониторинга.
При первом после прошивки включении, или при отсутствии знакомых wifi сетей устройство прикидывается точкой доступа открытого типа с именем ESP8266.
В com порт устройство шлет это:
Необходимо подключиться с телефона, ноутбука или планшета к точке с именем ESP8266, и пройти по адресу 192.168.4.1
Откроется такая страничка:
Нажимаем кнопку Configure Wifi, и попадаем на такую страничку
Далее выбираем свою сеть, вводим пароль, жмем Save. Готово, устройство само перезагружается, и начинает работать. Сначала на дисплей и в com порт выводится ip адрес и mac адрес устройства с префиксом ESP, его надо использовать в качестве id датчика при регистрации на сайте народного мониторинга, а через 15 секунд на дисплей, в com порт, и на сайт народного мониторинга выводятся первые показания с датчиков.
T1 — температура с bmp180
T2 — температура с dht22
P — атмосферное давление. На дисплей выводится в мм. рт. ст., на народный мониторинг идет в не помню каких единицах, преобразуется в мм. рт. ст. автоматически.
Н — влажность в процентах.
В строчках Т2 и Н ересь, потому что не подключен датчик dht22
В таком виде конструкция проработала пару недель, пока я потихоньку продумывал готовое устройство.
Готовое устройство решил собирать на модуле
esp8266 12e (такой же стоит на nodemcu)
Быстренько развел и вытравил плату.
Код менять не пришлось вообще. Номера портов для датчиков те же, необходимо только подключить голую esp8266 по типовой схеме, чтобы она могла работать, и можно было заливать прошивку. 3.3 вольта получил с помощью стабилизатора ams 1117 3.3v.
Питается устройство от телефонной зарядки 5в. 2А. Но и одного ампера, думаю, будет достаточно.
Для прошивки вывел отдельный 3-pin разъем с контактами RX, TX и GND.
Прошивал готовое устройство с помощью
такого адаптера usb — uart. Плюс его в том, что на нем имеется переключатель 5v-3.3v, хотя знающие ребята говорят, что этот переключатель работает только для питания, а уровень rx и tx не меняется. Но у меня все работало без преобразования уровней, наверное потому, что esp8266 толерантна к 5v на rx tx, хоть и работает от 3.3.
Так же на готовой плате был предусмотрен переключатель для ввода в режим прошивки (красный ползунковый, нижний ползунок для ввода в режим прошивки. Верхний ползунок я подключил на gpio12, на всякий случай, возможно для переключения режимов индикации на будущее, а пока он не задействован. Можно не мудрить, и просто поставить перемычку между gpio0 и GND)
Для прошивки нужно подключить usb-uart преобразователь таким образом:
esp rx — uart tx
esp tx — uart rx
esp gnd — uart gnd
Затем подключить gpio0 к земле с помощью нижнего ползунка на переключателе, нажать кнопку «Reset» на плате (находится сверху), в arduinoIDE выбрать нужный com port, скорость загрузки (115200 для большинства плат esp8266), и нажать кнопку «Загрузка».
После окончания загрузки устройство начнет работать, переключатель прошивки нужно возвратить в положение OFF, иначе при следующей перезагрузке или отключении питания устройство опять войдет в режим прошивки.
Вспомним сдохший датчик dht22. Симптомы — постоянно показывает влажность 99.9, в сухую погоду может показывать меньше. Сдох он осенью 2016 года, исправно проработав всю весну и лето. Была неделя постоянных дождей, и мне на электропочту свалилось письмо от народного мониторинга, что, мол, ваш датчик несколько дней подряд показывает одно и то же. Я не стал менять датчик, а просто спрятал его из общего доступа до недавнего момента.
Возможной причиной помирания считаю тесный корпус. В качестве его основы было использовано яйцо от киндерсюрприза. Был разработан новый, более технологичный и просторный корпус из подрозетника и заглушки канализационной трубы. Вот оба корпуса рядом:
Плату датчиков не переделывал, просто заменил дохлый dht22 на живой, покрыл цапонлаком и закрепил термосоплями в верхней части уличного корпуса.
Вот так выглядит схема платы датчиков. Нарисовать можно даже маркером
Закрепил датчики на окне, шлейф завел в комнату. Вынос можно было сделать и побольше, да и от внешнего блока кондиционера убрать, но это проблематично.
Упихал кишочки в мегатехнологичный корпус из распределительной коробки для проводки. С креплением не заморачивался, использовал термосопли.
В собранном виде
Испытание влажностью пройдено успешно. Датчик жив.
Это был полезный опыт для меня, я наконец то пощупал esp8266, и получил стабильно работающее полезное мне устройство.
Надеюсь кому то пригодится эта статья. Если возникнут трудности или вопросы, пишите в личку, отвечу.
нашел на али такую йобу
Я делаю так
Можно готовую найти, можно самому сделать, инструкции есть в сети, не сложно.
Это стоимость по курсу доллара, что был вчера до 15:00 или после 17:00? Или по такой цене покупалось месяц назад?
BTW скриншоты уменьшать следует. Не нужно в обзоры вставлять FullHD скриншоты-портянки, которые потом скролить приходится.
Им никогда не приходил в голову вопрос: «а почему это в 99% обзоров цена на товар указана в долларах?»
Автор, ответьте, пожалуйста. У вас ардуина зависала, а ESP не зависает?
Я без сарказма…
У меня 2 месяца как полёт нормальный:
У меня по 5в и по 3,3в стоят обыкновенные электролиты по 470мф, воткнуты прямо в макетку. На самом модуле только керамика блокировочная после стабилизатора 0,1мф.
Второй год работает — зависаний не было (бывают сбросы, когда я в тот же многопортовый БП втыкаю телефон на зарядку)
<spoiler/>
elchupanibrei.livejournal.com/23293.html
но примерно через год лежания в подвале датчик влажности дал дуба.
Для ванной симпатично и недорого выглядит вот такой ebay.com/itm/351645178898
Как всегда, на али может быть дешевле. Поиск по «Logger Humidity».
В одном из обзоров ( а может и в комментах к этому :) ) Проскакивала ссылка на сервис thingspeak.com/. Кажется, он как раз для этого. И он такой не единственный, естественно.
По уму для мониторинга постоянный конект не нужен.
Нужно по старту
— подать напругу на датчик,
— собрать данные,
— подключить сеть,
— отправить данные,
— уйти в глубокий сон на 5 мин
(esp просыпается резетом)
есть вариант накапливать данные в памяти и отправлять пачками
А эта фиговина лучше или наоборот? Там CP2102 вместо CH340 стоит. Я понятия не имею что это, просто та фигня у меня заказана.
И к нему база за $2.33 с доставкой: aliexpress.com/item/NodeMcu-base-ESP8266-testing-DIY-Breadboard/32452003527.html
www.radioscanner.ru/files/miscsoftware/file18946/
Замена простая и как провод использую простой пачкорд.
В максимуме ESP12 потребляет 70мА. С индикатором 1602 потребление 100 мА.
А дохнуть стал, когда похолодало до минусовых температур.
А dht есть в уличном исполнении — надо было сразу их ставить (я когда 99% было заказал, но пока датчик ехал — старый «вылечился»).
Ну и датчик давления я бы не стал лепить на улицу. Давление в комнате от уличного не отличается, а датчику в комнате жить гораздо легче. Заодно можно и комнатную температуру с него выводить.
если хочется смотреть на телефоне у Виктора(https://esp8266.ru/esplorer/) есть интересный проект iotmanager.ru/
сам он использует platformio
много примеров автомаизации github.com/4refr0nt/iot-manager-demo
Ватчдог использовал?
А лучше сделать логический конвертер на мосфетах 1n7002 их как грязи на материнках. Часть схемы конвертора уже разведена на вашей плате (резисторы 10к).
Как uart через конвертер, так и i2c, тем более dht22 рекомендуется кормить 5 вольтами, реле и тп, тоже требуют 5 воль. Да и многие китайские uart-usb выдают 5вольт а не 3.3.
Датчики внешние тоже на 5 вольт, тогда не страшно если пара вольт потеряется по дороге к этому датчику :)
В непосредственной близости от антенны ESP8266 модуля вижу большой полигон. Это сильно влияет на КСВН печатной антенны, а => и на излучаемую мощность и как следствие — на качества связи.
Обратите внимание как установлен этот модуль на оригинальной плате NodeMCU.
narodmon.ru/3306
Вемос компактнее, nodemcu имеет больше пинов.
По сути дело вкуса какую платку использовать.
У меня есть и вемосы (штук 5) и 2 nodemcu и 1 witty cloud (бутерброд).
Вемос нравится больше всех своей компактность. Но столкнулся с тем что на нем криво работает INT ADC с хоум смартовской прошивкой. Пока не понял почему.
и датчик ebay.com/itm/112206549256
Пришли с Али два модуля Wemos D1, точнее, как выяснилось, копии.
При подключении к компу идёт постоянный реконнект. На питание реагируют. Сеть создают.
Один из модулей мне удалось прошить, подключив его под конец компиляции скетча.
Witty Cloud и NodeMcu Lua подключаются и шьются без вопросов.
Куда копнуть?
я так сделал
float e;
e = (6.112 * pow(10, (7.5 * temperature / (237.7 + temperature))) * humidity / 100);
float humidex = temperature + 0.55555555 * (e — 10.0);
return humidex;
}
код такой, сам подсчёт взял готовый у кого то из программы :)
весь код тут arduino.ru/forum/programmirovanie/18-tft-128160-i-bmp180#comment-248522
github.com/enjoyneering/HTU21D
А я вот задумался, почему сразу два BME280 не поставить? На улицу и дома. Зато полный набор показаний.
Зачем выводить разъем для прошивки? Посмотрите в сторону ArduinoOTA. У Вас же есть wi-fi, вот и прошивайте по воздуху. Да, согласен, в первый раз нужны провода, чтоб зашить OTA, это нужно сделать только один раз при первом включении, так сказать «извлечении модуля из заводской упаковки», можно даже просто проводками «на коленке». Потом здравствуй wi-fi.
Вот мой вариант. Начинка вся та-же, только OLED 0,96" дисплейчик. Установлен в коробочку от RJ-45 розетки, на застекленный балкон, без утепления.
Показывает:
Уровень сигнала Wi-Fi;
Динамика температуры (рядом со значком «температура» стрелочки в нужную сторону или знак "=" при отсутствии изм. темп. );
Время по NTP;
Сброс показаний раз в 10 минут на сервер (домашний)
Обновление показаний на экране раз в секунду (часы идут) опрос датчиков раз в 5 секунд. Динамика вычисляется раз в 10 минут, в момент отправки показаний. OLED пережил холода вполне достойно, а вот DHT врет не по детски, буду переделывать на другой датчик. Зависаний пока не было, т.к. использованы танталы по питанию, блок питания китайская зарядка для телефона.
Да простят меня модераторы, но не нашел кнопки Споллера.
будут вопросы, спрашивайте, но заранее прошу прощения если сразу не отвечаю, на работе аврал такой, что врагу не пожелаешь.
Подскажите, пожалуйста, что они дают?
Это нужно только ESP или для Ардуино тоже?
Технология OTA предполагает сокращение доступного объёма памяти под программу — например, половину, а то и меньше, из имеющегося. В одной половине памяти находится рабочая программа, во вторую будет загружаться обновление, при удачной загрузке будет переключение на новую программу, а прежняя часть памяти будет использоваться при очередном OTA-обновлении.
Многие модули, построенные на ESP8266, имеют на борту, как пишут продавцы, «4 М» или даже «4 М байт», что часто означает всего лишь 4 мегабита или 512 килобайт. (На сколько я могу судить, модуль из статьи именно с 512 кБ.) Для использования OTA с таким модулем программа должна умещаться в 256 килобайт. При программировании в ArduinoIDE это может стать ограничением, когда захочется добавить функциональности в проект. В результате программа может просто перестать работать, а в com-порт будут приходить лишь сообщения от WDT.
Но модули встречаются и с 1 мегабайтом (8 мегабит), и даже с 4 мегабайтами (32 мегабита) памяти. Я приобрёл такой aliexpress.com/item/NodeMCU-V3-Lua-WIFI-module-integration-of-ESP8266-extra-memory-32M-flash-USB-serial-CH340G/32739832131.html ещё до введения платной доставки, отчего цена получилась ниже, чем итоговая у обозреваемого в статье. (Кстати, эта плата уже обычных NodeMCU и на беспаячной макетной плате остаётся по одному ряду с боков для подключения.)
Сейчас поиск на Али выдал, среди прочих, такое: $2.88 (+$1.02 доставка в РФ) aliexpress.com/item/NodeMCU-V3-Lua-WIFI-module-integration-of-ESP8266-extra-memory-32M-flash-USB-serial-CH340G/32789696232.html, за $3.15 с бесплатной доставкой в РФ: aliexpress.com/item/V3-4M-bytes-32Mbits-FLASH-NodeMcu-Lua-WIFI-Networking-development-board-Based-ESP8266-with-firmware/32565317233.html — но эти варианты плат я не проверял.
мне больше нравится OLED, как в проекте выше, или например, минимализм:
learn.adafruit.com/huzzah-weather-display/circuit-assembly
Перед выходом из дома глянул за окно, нет ли дождя. Посмотрел температуру «за бортом». Можно ещё в смартфоне глянуть прогноз погоды на день. Всё.
А зачем эта метеостанция? Не понимаю. Тем более зачем собирать метеоисторию и передавать её куда-то?
Или тут все поголовно синоптики и архивные данные о погоде им позарез нужны в работе?
Иначе полезность подобных устройств равняется нулю. Впрочем. занудам, которые ещё в койке планируют, что же надеть, выходя из дома, какая-то польза от метеостанции на прикроватной тумбочке будет.
Из шести моих самоделок, которые я делаю/буду, температура используется в двух — контроллер паяльного фена(встроенный датчик) и ламинатор для ПП(датчик LM35). Никакой температуры окружающей среды, она нужна разве что в каком-нибудь контроллере отопления/кондиционирования дома. В квартире температуру вообще не контролирую, без устройств её регулирования это идиотизм.
В наших широтах такое не прокатывает! У нас в народе ходит такая пословица-поговорка «Даже в самый жаркий и солнечный день не забудь взять с собой теплый свитер и зонтик» :-) Динамика изменений позволяет немного прикинуть — а что нас ждет дальше. Сутра, с просоней, чисто на автопилоте, глянув на обычные цифры на дисплее можно прикинуть, как одеть ребенка в детский сад. Поверьте, лезть в смартфон чтобы ознакомиться с прогнозом совсем влом (ну по крайней мере у меня). Да Вы и сами знаете поговорку «каждый… так, как хочет» :-) В большинстве случаев все (на мой взгляд) такие поделки это не более чем красивый локальный показометр, у одних это может быть «пробой пера» в программировании, так сказать «Hello World», у других что то новое в железках, у третих интересная самоделка с пользой «только для меня».
exit status 1
Ошибка компиляции для платы NodeMCU 1.0 (ESP-12E Module).
Подскажите пожалуйста…
exit status 1
Ошибка компиляции для платы Generic ESP8266 Module.