Датчик температуры и влажности с использованием модуля wi-fi esp8266

Датчик температуры и влажности с использованием модуля Wi-Fi ESP8266

В данном проекте мы соберем регистрирующее устройство для измерения температуры и уровня влажности с использованием Arduino Mini и Wi-Fi модуля ESP8266. Данные будут храниться на сервере EasyIoT, и отображаться в веб-браузере на удаленном компьютере или мобильном телефоне. Благодаря библиотеке ESP8266 EasyIoT Arduino вы сможете собрать датчик с несколькими строчками программного кода. Кроме того, вы можете добавить до 65535 узлов датчика к одному серверу EasyIoT.

Сервер EasyIoT поддерживает безопасное SSL соединение, а модуль ESP8266 его не поддерживает.

Шаг 1: Используемые компоненты

  • Модуль ESP8266 Wi-Fi
  • Модуль Arduino Pro Mini 8МГц 3.3В
  • Датчик температуры и влажности DHT22
  • Источник питания 5В
  • Стабилизатор AMS1117 3.3
  • Конденсатор 1000 мкФ
  • Сервер EasyIoT (Машина Windows или Raspberry Pi)
  • Wi-Fi сеть (Wi-Fi роутер)

Шаг 2: Создание узла датчика

Соедините вместе Arduino pro mini, ESP8266, источник питания и датчик температуры и влажности DHT22.

VCC 3.3 В к Arduino pro mini

VCC 3.3В к VCC датчика DHT22

VCC 3.3В к VCC модуля ESP8266

VCC 3.3В к выводу CH_PHD на модуле ESP8266

Соедините GND на Arduino, DHT22, ESP8266 и GND источника питания вместе

Подключите вывод 3 на Arduino к выводу RST на ESP8266

Подключите вывод 10 на Arduino к выводу UTXD на ESP8266

Подключите вывод 11 на Arduino к выводу URXD на ESP8266

Подключите вывод 2 на Arduino к выводу DATA на DHT22

После подключения всех проводов загрузите программный код в узел датчика Arduino. Перед началом использования Wi-Fi модуля ESP8266 необходимо обновить микропрограммный код в ESP8266. Мы используем версию прошивки V0.9.2.2. Подробная информация об обновлении микропрограммного кода указана здесь.

Программный код для датчика температуры и влажности ESP8266 располагается на ресурсе GitHub. Не забудьте установить правильное имя пользователя и пароль для точки доступа, и адрес сервера EasyIoT serverIP в файле конфигурации Esp8266 EasyIoTConfig.h

Шаг 3: Настройка сервера EasyIoT

Сервер EasyIoT отвечает за сбор данных от датчика. Вы можете добавить до 65535 узлов датчика ESP8266 Wi-Fi к серверу EasyIoT.

При использовании машины на базе Windows: загрузите последнюю версию EasyIoT server win и разархивируйте на машине Windows. Запустите файл EasyIoT.exe от имени администратора.

При использовании Raspberry Pi: загрузите последнюю версию образа диска EasyIoT server на SD-карту. Пользователи Windows могут записать образ EasyIoT на SD-карту с помощью программы Win32 Disk Imager.

Вставьте SD-карту в Raspberry Pi и включите Raspberry Pi. При этом микрокомпьютер Raspberry Pi должен находиться в одной сети вместе с модулем ESP8266.

Шаг 4: Добавление узла датчика к серверу EasyIoT

В веб-браузере на компьютере введите IP адрес Raspberry Pi. Используйте административный профиль с паролем для тестирования системы.

Перейдите в Configure->Drivers->ESP8266 EasyIoT driver и активируйте драйвер. Нажмите кнопку Add Node (Добавить узел) и включите ESP8266 Arduino. Через несколько секунд вы увидите два добавленных модуля датчика (без таймаута). Далее вернитесь и добавьте новые модули в группу, после чего активируйте регистрацию данных (смотрите прикрепленные изображения).

Шаг 5: Отображение данных

Запустите веб-браузере на компьютере и введите IP адрес вашего Raspberry Pi. На заглавной странице вы увидите текущую температуру и уровень влажности, а также диаграммы этих параметров.

Вы можете просмотреть собранные данные на удаленном компьютере или мобильном телефоне.

Сообщества › Arduino для автомобиля › Блог › WIFI датчик температуры на базе WIFI модуля ESP8266 и датчика температуры DS18B20

Предисловие: Содержание данного поста на первый взгляд может не подходить для форума «ARDUINO для автомобиля», но если внимательно посмотреть, я думаю найдется, что то полезное…
1. Введение.
По случаю попали ко мне в руки WIFI модуль ESP8266 (ESP-01) и датчик температуры DS18B20. Задача – построить автономный датчик температуры, данные с которого можно посмотреть на компьютере/планшете. В будущем эти данные должны использоваться для контроля в «умном доме»…
Чип ESP8266 очень подходит для этого, так как обладает небольшими размерами, ценой, а самое главное, что его контроллер может заменить Arduino – он может сам выполнять все необходимые действия.
Вариантов модулей на чипе ESP8266 множество — все о ESP8266 можно прочесть тут — esp8266.ru/ больше чем здесь, я думаю вы на русском языке не найдете.

У меня ESP-01 – у которого только два управляемых выхода – GPIO 0 и GPIO 2:

Что касается датчика температуры DS18B20 – тоже достаточно популярное устройство, а главное он цифровой – значит, выдает готовые значения и работает по протоколу 1-Wire – можно будет использовать библиотеку OneWire. Кроме того специально для температурных датчиков Dallas DS18B20 есть Arduino-библиотека DallasTemperature. milesburton.com/Main_Page…mperature_Control_Library

Что касается построения такого WIFI датчика температуры – устройство ни уникальное – в интернете есть описания подобных схем на тех же компонентах, но программируются на языке Lua – вариант geektimes.ru/post/255594/. Но судя по описанию – там тоже все не просто так. Да и не хотелось «учить» еще один язык…
Я к Arduino уже как то привык.
Поэтому решено искать варианты Arduino скетчей. Тем более что и тут есть наработки:
— датчик температуры для проекта «Народный мониторинг» —
arduinolab.pw/index.php/2…o-monitoringa-na-esp8266/ — его я тоже попробовал.
А вот тут от того же автора скетч который позволяет выводить параметры температуры через браузер – именно его я использовал. vk.com/doc148062645_43703…630&dl=4f5f570366aac0e93a
Но оказалось, что бы его загрузить предстоит кое-что сделать.

2. Нужно:
1. Модуль ESP8266 (ESP-01);
2. Датчик температуры DS18B20;
3. USB-UART-TTL адаптер – например CР2102 (+драйвер);
4. Резистор 4,7 кОм;
5. Провода мама – мама/папа;
6. Изолента/термоусадка;

3. Настройка ADRUINO IDE для работы с WIFI ESP8266.
Для того, что бы загружать скетчи через ADRUINO IDE непосредственно на модуль ESP8266 необходимо провести апгрейд ADRUINO IDE – загрузить в него программу «ESP8266» для поддержки модуля (см. ссылку github.com/esp8266/arduino).
Как сказано на одном из сайтов:
«Программа ESP8266 поставляется с библиотеками, которые позволяют через интерфейс WiFi с помощью протоколов IP, TCP, UDP обмениваться данными с WEB, SSDP, mDNS и DNS серверами, использовать flash память для создания файловой системы, обеспечить работу с SD картами, сервоприводами, работать с периферийными устройствами по шинам SPI и I2C.»

Для этого нужно:
1. Зайти в меню «Файл» — выбрать «Настройки».

2. В ячейку «Дополнительные ссылки для Менеджера плат» внести ссылку arduino.esp8266.com/stabl…age_esp8266com_index.json

3. Зайти в меню «Инструменты» в «Плата:…» — выбрать «Менеджер плат…».

4. В закладке «Менеджер плат» нужно найти нужную прошивку — в поле указать например esp8266 – в окне высветится нужная прошивка.

5. Установить выбранную прошивку «esp8266» – щелкнуть на поле с прошивкой – появится кнопка «Установить» — нажать. Установка займет некоторое время – будет скачивать около 153 Мб.
6. После завершения установки в меню «Инструменты» в закладке «Плата:…» ниже перечня плат Arduino появится новые платы – «ESP8266 Modules».

7. Выбрать нужный модуль – в общем случае это «Generic ESP8266 Module».

4. Подключение ESP8266 к компьютеру для перепрошивки.
Как правильно подключить модуль много и хорошо написано – например тут:
esp8266.ru/esp8266-podklu…bnovlenie-proshivki/#full
Я для подключения ESP8266 к компьютеру для перепрошивки использовал USB-UART-TTL адаптер CР2102.

Схема подключения обычная да UART, за исключением двух особенностей:
1. Для включения модуля нужно подать +3,3В на вывод модуля CH_PD. Я припаял перемычку с VCC.
2. На время загрузки скетча необходимо подать «минус» на вывод модуля GPIO 0.

Если речь идет о настройке/отладки нескольких модулей имеет смысл сделать специальный комплект проводов для подключения.

Так же есть особенность с питанием модуля.
Во первых, он должен питаться от 3,3 В.
Во вторых, он очень прожорливый – мощности питания от USB-UART-TTL адаптера ему не хватало – компьютер постоянно сообщал, что к нему «подключено неизвестное устройство, при установке которого возникли проблемы».

Поэтому для питания модуля нужно организовать отдельное питание.
Если предполагается использовать более высокое напряжение — нужно использовать понижающий стабилизатор.
В моем случае я использовал две батареи АА 1,5В соединенные последовательно – но испытания показали хватает не на долго (возможно батареи были севшие).
ВНИМАНИЕ! При подключении внешнего источника питания при прошивке нужно соединить его с минусом USB-UART-TTL адаптера.

5. Загрузка скетча.
Если все сделали – можно начинать загрузку скетча:
vk.com/doc148062645_43703…630&dl=4f5f570366aac0e93a
Но для начала нужно в строчках с именем сети и пароля указать имя и пароль вашей сети:
const char *ssid = «…»;
const char *password = «…»;
Процесс загрузки визуально отличается от привычной загрузки – он будет сопровождаться рядом точек в окне статуса загрузки (см. фото).

Если этого не происходит и появилось сообщение об ошибке – включите и выключите питание модуля WIFI.
Если загрузка прошла успешно, уберите перемычку с GPIO 0 и «массы».
Откройте Serial порт в Arduino IDE и убедитесь, что модуль начал работать и самое важно – запишите IP адрес вашего модуля:
Connected to «Название вашей сети»
IP address: 192.168.ХХ.ХХ
MDNS responder started
HTTP server started Теперь можно отключать USB-UART-TTL адаптер и подключать датчик температуры.

Читайте также  6.2.2. принципиальная схема

6. Подключение датчика температуры.
Схема подключения датчика температуры типовая (см. рисунок).

Потребуется правда поработать паяльником – припаять сопротивление 4,7 кОм и датчик температуры, а так же перемычку включения питания (см. ранее).

Есть еще один вывод который может пригодится — вывод RST – «Сброс» — для этого нужно подать на него «минус». Пару раз пригодилась эта «кнопка» — возможно потому, что схема собрана на весу…

7. Работа датчика.
Если все прошло правильно датчик начнет помаргивать синим светодиодом и излучать в WIFI эфир температуру. А вот что бы эта температура стала «видима» нужно в браузере указать IP адрес вашего модуля (мы его знаем из пункта 5) и на экране появится вот такая картинка:

Вемос D1R2 ESP8266 от RobotDyn + датчик температуры и влажности Si 7021 = telegrambot

  • Цена: 214,65 руб
  • Перейти в магазин

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

Давно витает у меня мысль, сделать свой дом немного умнее, приобретено немало уже всяких поделий китайских братьев. И вот буквально на днях на коленке собрал для проверки следующее :esp8266, датчик температуры и влажности Si7021, подключена библиотека TelegramBot для Arduino IDE.

«Вемос» D1R2 аналоговый, wi-fi D1 R2 интеграция ESP8266 + 32 МБ flash, форм-фактор для Ard. Uno R3 — , это обычный и всем известный модуль ESP 8266 распаянный на плате форм фактора arduino uno r3.
Характеристики:
Power DC:7

23V
Memory:32Mb flash (т.е 4 MB)
MCU:ESP8266
USB-TTL:CH340
I/O:11 digital + 1 analog

Меня он заинтересовал впрочем не этим, а в первую очередь разъемом для подключения внешней антенны. Заказ и доставка ничем не примечательны. Шло долго порядка 4 недель в г. Курган. Упаковано как обычно, в этом магазине, в антистатичный пакетик с указанием, что находится в этом пакетике.

В посылке было еще несколько модулей, во все залил стандартный блинк для проверки. Все работали нормально — кроме обозреваемого! Он работал довольно странно, какую бы прошивку я туда не заливал, он начинал очень сильно греться в районе распаянной на плате антенны. Выдавал в serial не то что хотелось видеть, тормозил и т.д… Так как заказ уже был закрыт, спор открывать не стал, но продавцу написал об непонятном поведении модуля. В ответ тишина и посей день. В итоге дополнил свой отзыв на али этой информацией. Почитав попутно, что пишут люди про этот модуль. Оказалось, что не я первый кто с этим сталкивался! Модуль работает вполне себе отлично, если — подключить внешнюю антенну! На самом деле я и покупал то его, чтобы подключить внешнюю антенну и поставить в дальний угол участка. Собственно на этом проблемы кончились, наверняка чтобы задействовать внутреннюю антенну надо какую нибудь перемычку перепаять или еще какие нибудь подобные манипуляции совершить. У продавца это никак не описано и искать было не охото.

Второй участник обзора, не менее всем известный датчик температуры и влажности Si7021, он уже тоже по праву становится народным! Покупался тут aliexpress.com/item/Humidity-Sensor-with-I2C-Interface-Si7021-for-Arduino-Industrial-High-Precision/32683233516.html
Шёл он тоже долго, в итоге все равно пришел и слава богу, больше тут сказать нечего, упакован был хорошо.

Далее, в поисках различных способов управления “умным” домом или его частью 🙂 был найден подходящий мне и моим домочадцам способ. Это — месенджер Телеграм, и его отличная особенность — простое создание ботов. Наверняка, найдется кто скинет кучу ссылок на другие способы, типа Можордомо и т.д. Все это я посмотрел и пришел к выводу что месенджер есть у всех моих родных, навыки работы с ними сейчас наверное даже дети впитывают с молоком матери 🙂 Учитывая сколько матери проводят время со смартфонами! В общем выбор сделан и активно ищутся ( и находятся) пути реализации этой большой цели — “умный дом”. Ну, а на пути к этой цели иногда и получаются такие вот простенькие поделки для тестов!
Дак вот блуждая по просторам сети я обнаружил, что esp8266 уже сами без посредников, вроде raspbery pi, могут слать в Телеграм — телеграммы 🙂
Ссылка на гитхаб github.com/Gianbacchio/ESP8266-TelegramBot
Устанавливаем в Arduino IDE эту библиотеку. С ней есть два простых примера на их то основе и сделаем свой скетч.

#include
#include
#include
#include

const char* ssid = «your ssid»;
const char* password = «your password»;

// Initialize Telegram BOT
#define BOTtoken «xxxxxxxxxxxxxxxxxxxxxxxxxx» //тут должен быть ваш токен
#define BOTname «NameBot» // имя бота
#define BOTusername «@Name_bot» //username бота

#define SDA 4 // GPIO4 on ESP module
#define SCL 5 // GPIO5 on ESP module
TelegramBOT bot(BOTtoken, BOTname, BOTusername);

int Bot_mtbs = 1000; //mean time between scan messages
long Bot_lasttime; //last time messages’ scan has been done
bool Start = false;

void Bot_ExecMessages() <
for (int i = 1; i Bot_lasttime + Bot_mtbs) <
bot.getUpdates(bot.message[0][1]); // launch API GetUpdates up to xxx message
Bot_ExecMessages(); // reply to message with Echo
Bot_lasttime = millis();
>
>

Подключение Si 7021 к ESP8266 очень простое:
SCL датчика в D1 esp
SDA датчика в D2 esp

Для того чтобы бот заработал? нужно конечно в скетче ввести название WiFi сети, пароль, Токен бота (который получите при регистрации бота в Telegram) а так же name и user_name этого бота. Как зарегистрировать бота можно почитать тут tlgrm.ru/docs/bots

И в конце — результат работы бота: написав команду /temp получаем в ответ температуру в градусах, а команда /hum показывает влажность. Получившийся прибор автономный — можно запитать от любого powerbank либо USB порта (например, для того чтобы померить влажность во всех комнатах ).

Как самостоятельная единица — такой прибор использоваться не будет, и собран только для проверки библиотеки TelegramBot для ArduinoIDE, а также для тестирования платы от RobotDyn. На этом — всё.

Как сделать дешевые WiFi датчики температуры/влажности

О чем этот текст

Тут я рассказываю как я собрал датчик температуры и влажности с WiFi. Вставляешь это устройство в розетку, оно подключается к WiFi сети и два раза в минуту отправляет данные на сервер.

Если все делать самому, то стоимость устройства получается меньше 400 рублей (без учета usb провода и блока питания).

В этом тексте я описываю как аппаратную часть устройства, так и программную.

В итоге у меня получилось работающее решение. Данные собираются и можно посмотреть на график с историей, но все можно сильно улучшить.

История

У меня есть несколько YouTube каналов которые я иногда смотрю. Один из них — это Chillichump. Человек живет недалеко от Лондона и у себя в садике в парнике выращивает острые перцы, а потом из них делает соусы. Канал отличный, автор явно фанатеет от всего этого, рассказывает он интересно, видео хорошего качества.

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

В начале 2019 года он выпустил видео о том как просто собрать датчик температуры и влажности который может отправлять данные на сервер. У него достаточно технологическая теплица: есть датчики, камеры, система автоматического полива. Всем этим он может управлять удаленно.

Вот его видео как собрать датчик температуры/влажности — https://www.youtube.com/watch?v=yqmOp7m4szA («Easy web-enabled Temperature and Humidity monitoring for your greenhouse»).

Судя по видео — все очень просто. Берется несколько деталей, все они спаиваются и получается работающая конструкция которая умеет отправлять данные на сервер по WiFi.

И у меня как раз есть задача зачем мне это нужно. На даче есть проблема — влажность. Там очень сыро. То что там есть проблема это ясно и без датчиков, но мне бы хотелось получить числа и графики влажности, чтобы понять насколько помогают различные решения.

Так что я решил повторить то что описано в видео, спаять датчики и собирать с них данные.

Покупка устройств

Автор Chillichump в своем видео использует датчик AM2302 и Arduino совместимое устройство Wemos D1 Mini.

Я заказал на AliExpress штуки которые очень похожи на то что использовал автор:

  • Датчик — https://s.click.aliexpress.com/e/_d8Cfw2F (покупал за $2.44 за штуку)
  • Компьютер на базе ESP8266 со встроенным WiFi — https://s.click.aliexpress.com/e/_dVV7rc5 (покупал за $2.35 за штуку)

Заказал и оплатил на сайте 13 августа, а 2 сентября я забрал посылку с почты (вообще пришло чуть раньше). Буду считать что пришло за 20 дней.

Я не заказывал, но вообще для сборки датчика нужны еще компоненты:

  • Резистор на 10 кОм
  • Провод Micro USB
  • USB блок питания

И еще нужны расходники — монтажные провода, припой. Из инструментов нужен как минимум паяльник и кусачки.

Читайте также  Устройство контроля излучения высокочастотных колебаний бытовыми приборами

Схема подключения

У датчики AM2302 4 ноги, из которых нужно 3:

У D1 Mini куча разъемов , в это проекте используются 3:

Все подключается очень просто — питание к питанию, земля к земле, данные к GPIO5, но еще дополнительно между pin1 и pin2 датчика нужно подключить резистор на 10 кОм.

Для начала я все это быстро подключил на макетной плате:

Первая версия софта

На устройстве Wemos D1 Mini есть разъем Micro USB. Через него он получает питание.

Если этот USB подключить к ноутбуку, то можно заливать код на устройство, а устройство, в свою очередь, сможет отправлять данные на ноутбук.

Для написания кода и его заливки на устройство используется бесплатная программа. Arduino IDE.

В Arduino IDE нужно выбрать плату «LOLIN(WEMOS) D1 R2 & mini».

Tools -> Board» />

А чтобы эта плата там появилась нужно в настройках указать «Additional Boards Manager URLs»:

А еще нужно добавить в Arduino IDE библиотеку для работы с датчиком «DHT sensor library». Вот ссылка на гитхаб https://github.com/adafruit/DHT-sensor-library.

После того как в Arduino IDE добавлена плата и подключена библиотека — можно написать код который будет читать данные с датчика и отображать его. Тут еще нет никакого взаимодействия по WiFi, данные отправляются на компьютер по USB.

Компилируем и загружаем код на устройство, включаем Serial Monitor в Arduino IDE и видим что каждые 1.5 секунды на экране появляется числа с температурой и влажностью.

Сборка устройств

Сборка на монтажной плате и первая версия софта показываю что все работает. Следующий этап — нужно спаять устройства.

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

Я снимал видео как я паял, потом ускорил это видео и выложил на YouTube. Час пайки за одну минуту — https://www.youtube.com/watch?v=w4MWFH6uB1g

Когда я все спаял и стал проверять я понял что я забыл заказать usb провода и блоки питания. Но мне повезло, в своем ящике со всяким компьютерным барахлом я нашел все что мне нужно. Правда, все USB провода и все блоки питания разные.

Отправка данных по WiFi на сервер

Итак, есть спаянные устройства. Есть код который умеет читать данные с датчика и выводить его на компьютере через USB.

Но идея заключается в том чтобы датчик был автономным. Чтобы не нужно было его подключать к компьютеру по USB. Нужно чтобы USB провод от датчика вставляется в USB блок питания, блок питания — в розетку. А датчик подключался к WiFi и отправлял данные на сервер.

Через некоторое время чтения разной документации и примеров с кодом я написал программу в Arduino IDE чтобы этот датчик подключался к WiFi и отправлял данные на сервер с помощью метода POST протокола HTTP.

B теле запроса отправляется json вида

В теле запроса отправляются не только данные о температуре и влажности, но еще и MAC адрес устройства. Этот адрес должен быть разным для разных устройств и по нему можно понять с какого датчика пришли показания.

Код работает, но в этом коде мне не нравится что я собираю json руками с помощью конкатенации строк, а не используют какую-нибудь хорошо отлаженную библиотеку.

В коде нужно заменить строки «my_wifi_name», «my_wifi_password», «http://example.com/endpoint», нужно указать реальные данные.

Я проверил работу этого кода в трех ситуациях:

  • Если устройство выключится а потом включится, (например, выключали электричество), то после включения данные опять пойдут.
  • Если сервер стал недоступен, а потом все починилось, то устройство продолжит отправлять данные
  • Если WiFi стал недоступен, а потом вернулся, то устройство само переподключится

Все эти 3 нештатные ситуации устройство отрабатывает нормально. Как только проблема пропадает, то все само начинает дальше работать. Устройство не нужно перегружать или еще что-то с ним делать.

Серверная часть

Итак, есть датчики которые умеют отправлять данные с помощью метода POST протокола HTTP.

Нужен сервер который умеет принимать такие данные, сохранять их и визуализировать.

Для этих целей я написал маленький сервер, и завернул его в docker.

Вот пример отправки данных на сервер с помощью «curl»:

Датчик отправляет только MAC адрес, значение температуры и значение влажности. Сервер принимает эти значения, дописывает к ним текущую дату и время и сохраняет эти данные в файл, а еще записывает все это в sqlite базу данных.

Так же в этом репозитории есть еще и микросервис который визуализирует данные с помощью библиотеки Cubism.js.

Вот небольшое видео как меняются данные если нагревать датчик зажигалкой. Для этого видео я поправил код на датчике чтобы он отправлял данные не каждые 30 секунд, а каждые 2 секунды. https://twitter.com/bessarabov/status/1177932537601183752.

Если включить и положить все датчики рядом то видно что данные с них различаются:

Запуск в работу

Итого. У меня есть железки — датчики. На них залита программа которая читает значения и отправляет их на сервер. И есть сервер который получает данные и сохраняет их.

Осталось только установить эти датчики:

Сервер сохраняет данные в файлы. Я взял Jupyter и написал код чтобы нарисовать графики температуры влажности:

Сначала этот датчик собирал данные в квартире, а потом я его отвез на дачу. Видно насколько эти два помещения отличаются.

В качестве эксперимента я поднял у себя Home Assistant и настроил его чтобы он получал данные с этих сенсоров. Это оказалось очень несложно сделать. Вот пример настроек для файла configuration.yaml:

Резюме

Получилось отлично. Сенсор очень просто сделать. Компоненты дешевые, работает отлично. Код программы доступен. Сенсор можно заинтегрировать куда угодно.

Но мое решение больше похоже на прототип чем на настоящий продукт. Вот несколько вещей что хотелось бы сделать иначе:

  • Устройство — это микросхема из которой торчат провода. Нужно все это облагородить. Запихнуть все это в красивый корпус.
  • Для того чтобы настроить подключение к WiFi нужно подключить устройство по USB к ноутбуку, в код программы вставить название точки доступа и пароль, скомпилировать и залить программу на устройство. Хотелось бы иметь возможность настраивать устройство без необходимости подключать к ноутбуку со специальным софтом. Например, устройство могло бы работать так. Дополнительно на устройстве есть кнопка. Зажимаешь ее на 5 секунд, устройство переходит в режим настройки. Оно становится WiFi точкой доступа к которой можно подключиться. Имя точки доступа — это ее MAC адрес (написан на устройстве). Пароль — серийный номер (тоже написан на устройстве). Подключился к этой точке, заходишь на адрес 192.168.1.1 — там простой веб интерфейс, где выставляешь настройки. Сохраняешь — устройство переходит в рабочий режим, подключается к указанной точке и два раза в минуту отправляет данные. Возможно еще было бы неплохо иметь на устройстве светодиод, разные цвета и разные паттерны моргания означают разные ошибки/состояния.
  • Работа устройства зависит от доступности сервера на которое устройство отправляет данные. Если к этому серверу нельзя подключиться (например, нет интернета), то замеры теряются. Возможно если нет доступа до сервера, то имеет смысл сохранять замеры в специальный буфер, а когда доступ к серверу возобновляется, то отправятся все сохраненные замеры.
  • Протокол взаимодействия с сервером — HTTP и все работает без необходимости указывать логин/пароль или токен. Возможно что стоит использовать специальный протокол MQTT, но если продолжать использовать HTTP, то нужно переходить на https с авторизацией по токену. Так что тут очень актуальна шутка что в слове IoT буква S означает Security.

Многофункциональный датчик температуры/влажности на ESP8266 или еще один шаг к «интернету вещей»

Дисклеймер: данная статья может содержать ошибки, поскольку я не так давно работаю с модулем ESP8266 и еще не до конца понимаю многие архитектурных аспекты данного устройства.

Сегодня практически в любом доме есть Wi-Fi роутер и было бы недальновидно не воспользоваться этим устройством для домашней автоматизации, тем более что сегодня на рынке есть все доступное оборудование для реализации любых идей. Ниже будет представлен вариант создания небольшого электронного устройства, являющегося платформой для построения различных датчиков/исполнительных механизмов на основе Wi-Fi модуля — ESP8266.

Данный модуль хорошо описан здесь, здесь, а на этом сайте вы найдете вообще все, что знает человечество о модуле ESP8266.

Итак, что должно «уметь» устройство:

  • Получать данные с датчика влажности/температуры DHT22;
  • Управлять твердотельным реле (например SSR-25 DA);
  • Подключаться к Wi-Fi роутеру с заданным логином и паролем;
  • Передавать и получать данные через MQTT брокер;
  • Подключаться по USB для отладки и прошивки.

Модифкаций модуля ESP8266 очень много (варианты здесь), но, в принципе, отличаются они только размерами, типом антенны и количеством доступных портов ввода-вывода. Я использовал модуль ESP8266 ESP-01:

Читайте также  Stm32. порты ввода/вывода

У него всего два порта (не считая USART) — GPIO0, GPIO2, но для моих целей достаточно, один порт — для датчика и второй — для управления нагрузкой.

Интерфейс USB реализуется USB-USART преобразователем CH340G.

Здесь описанно его подключение к 3.3 и 5В логике. Микросхема очень дешевая и удобная в использовании. Из обвязки только кварцевый генератор на 12MHz и пара конденсаторов. В итоге у вас с одной стороны USART, а с другой — USB. На PC устройство отображается как виртуальный последовательный порт.

Для управления нагрузкой я использовал пару транзисторных ключей. Почему так — спросит прожженный электронщик внимательный читатель. Все дело в том, что напряжение питания может быть разным, а мне хотелось, чтобы реле управлялось напряжением=напряжению питания. При использовании pnp транзистора, ток эмиттера (при напряжении питания > напряжения модуля ESP8266) пойдет в модуль, что совсем не хорошо. Использовать только npn транзистор я не мог, так как тогда порт GPIO0 все время будет подтянут к минусу, а в этом случае модуль будет входить в режим программирования каждый раз, когда мы рестартим модуль. Таким образом, подключив pnp + npn транзисторы, я управляю минусом реле.

Не требует никакой дополнительной обвязки и подключается прямо к модулю ESP. Ему нужен только один порт для обмена данными(интерфейс подобный 1-wire).

Так же на схеме:

  • Перемычка JP2 — для прошивки модуля. Перемычка подтягивает GPIO0 к минусу. В рабочем режиме — разомкнута, во время прошивки — замкнута);
  • Кнопка S1 — reset модуля;
  • Разъем SV1 — подключение реле;
  • Разъем J1 — гнездо питания;
  • Разъем JP1 — micro USB мама.

Питается устройство 5 — 12В.

Теперь поговорим о программном обеспечении.

Есть такой проект NodeMCU. На мой взгляд, очень крутая штука. Небольшая ОС, которая может выполнять ваши lua-скрипты прямо на ESP8266. NodeMCU умеет работать с кучей протоколов из коробки, может поднять web сервер, создать TCP соединение…

В начале прошиваем в наш модуль NodeMCU. Инструкция по прошивке.

После того, как модуль прошит, можно загружать наши скрипты. Способов множество, но лично мне нравится утилита ESPlorer — очень удобная софтина не только для загрузки скриптов, но и для разработки, дебага скриптов.

Теперь более подробно. Нам нужно залить три скрипта:

local moduleName =…
local M = <>
_G[moduleName] = M

local humidity
local temperature

function M.read(pin)
local checksum
local checksumTest
humidity = 0
temperature = 0
checksum = 0

— Use Markus Gritsch trick to speed up read/write on GPIO
local gpio_read = gpio.read

local bitStream = <>
for j = 1, 40, 1 do
bitStream[j] = 0
end
local bitlength = 0
— Step 1: send out start signal to DHT22
gpio.mode(pin, gpio.OUTPUT)
gpio.write(pin, gpio.HIGH)
tmr.delay(100)
gpio.write(pin, gpio.LOW)
tmr.delay(20000)
gpio.write(pin, gpio.HIGH)
gpio.mode(pin, gpio.INPUT)

— Step 2: DHT22 send response signal
— bus will always let up eventually, don’t bother with timeout
while (gpio_read(pin) == 0 ) do end
local c=0
while (gpio_read(pin) == 1 and c 3) then
humidity = humidity + 2 ^ (16 — i)
end
end
for i = 1, 16, 1 do
if (bitStream[i + 16] > 3) then
temperature = temperature + 2 ^ (16 — i)
end
end
for i = 1, 8, 1 do
if (bitStream[i + 32] > 3) then
checksum = checksum + 2 ^ (8 — i)
end
end

checksumTest = (bit.band(humidity, 0xFF) + bit.rshift(humidity, 8) + bit.band(temperature, 0xFF) + bit.rshift(temperature, 8))
checksumTest = bit.band(checksumTest, 0xFF)

if temperature > 0x8000 then
— convert to negative format
temperature = -(temperature — 0x8000)
end

— conditions compatible con float point and integer
if (checksumTest — checksum >= 1) or (checksum — checksumTest >= 1) then
humidity = nil
end
end

function M.getTemperature()
return temperature
end

function M.getHumidity()
return humidity
end

function subscribe()
m:subscribe(«/myhome/»..id..»/light»,0,function(conn)print(«Subscribe success»)end)
m:on(«message»,function(conn,topic,data)
print(topic… «: «..data )
if data==«ON»then gpio.write(3, gpio.LOW)end
if data==«OFF»then gpio.write(3, gpio.HIGH)end
end)
end

function dht22_get_data()
dht22=require(«dht22»)
dht22.read(4)
local t=dht22.getTemperature()
local h=dht22.getHumidity()
if t

=nil then
t=((t-(t % 10))/10)..».»..string.format(«%.i»,(t % 10))
else t=nil
end
if h

=nil then
h=((h-(h % 10))/10)..».»..string.format(«%.i»,(h % 10))
else h=nil
end
dht22=nil
package.loaded[«dht22»]=nil
collectgarbage()
return t, h
end
function post_data()
t, h = dht22_get_data()
if t

= nil then
m:publish(«/myhome/»..id..»/temperature»,t,0,0, function()
print(«Temperature »..t)
if h

= nil then
m:publish(«/myhome/»..id..»/humidity»,h,0,0, function()print(«Humidity »..h)end)
end
end)
end
end

function init_network()
collectgarbage()
print(id)
if wifi.sta.status()

= 5 then
print(«Reconnecting WIFI»)
wifi.setmode(wifi.STATION)
wifi.sta.config(«Login»,«password»)
wifi.sta.connect()
tmr.alarm(0,5000,0,function()init_network()end)
else
print(«IP: »..wifi.sta.getip())
print(«Connecting to MQTT server»)
tmr.alarm(0,7000,0,function()init_network()end)
if m

=nil then
m:close()
end
m = mqtt.Client(id, 120)
m:connect(«192.168.0.x»,1883,0,function(conn)
tmr.stop(0)
print(«Connected»)
subscribe()
tmr.alarm(0, 60000, 1, function() post_data() end)
m:on(«offline»,function(con)
print(«offline.Reconnecting»)
init_network()
end)
end)
end
end

gpio.mode(3, gpio.OUTPUT)
id=«esp_»..wifi.sta.getmac()
init_network()

Здесь есть нюанс. К сожалению, внешней флэш памяти модуля не достаточно для загрузки NodeMCU и моих скриптов, поэтому я использую следующее «костыльное» решение: загружаю один скрипт, выполняю команду node.compile(«dht22.lua») — данная команда компилирует скрипт в «dht22.lc», в результате он занимает меньше места и во флэш памяти и в оперативной памяти, та как потом NodeMCU будет загружать его в память во время выполнения основного скрипта. Потом удаляем нескомпилированный скрипт командой file.remove («dht22.lua»). Проделываем те же манипуляции с main.lua. Последним загружаем init.lua скрипт, его уже не компилируем. Рестартим модуль.

На старте NodeMCU выполнит «init.lua» скрипт, который в свою очередь запустит «main.lua». «main.lua» скрипт будет коннектится к сети, отправлять данные в COM порт и в сеть на заданный mqtt брокер.

Более подробно по скриптам отвечу в комментариях.

Ну, вроде бы все. Если тема интересна, в следующей статье расскажу про mqtt брокер и подключение всего этого дела к Openhab.

Начало работы с датчиками температуры и влажности на ESP8266 с использованием комплекта ANAVI термометра

Плата ANAVI с термометром была запущена на CrowdSupply в январе 2019 года. Это WiFi плата ESP8266 со встроенным датчиком температуры и влажности DHT22, которая поддерживает внешний водонепроницаемый датчик температуры DS18B20, а так же другие датчики, благодаря трем I2C разъемам.

Для обзора был получен стартовый комплект ANAVI термометр. Для начала начнем с распаковки, руководства по сборке, а также будет настроен его интерфейс с Home Assistant через MQTT, прежде чем он будет проверен в действии.

Распаковка стартового комплекта
ANAVI термометра

В комплект входит плата ANAVI с термометром, пластиковая подставка, отладочная плата USB — TTL, I2C OLED-дисплей, несколько гаек и болтов, а также пара наклеек KiCad и ANAVI. Также компания ANAVI положила дополнительно в коробку плату для светодиодов и сами светодиоды, но обычно это не входит в комплект.

Плата ANAVI с термометром включает в себя модуль ESP8266, датчик температуры и влажности AM2302 (проводной DHT 22), клеммную колодку для водонепроницаемого датчика температуры DS18B20, четыре I2C разъема, один из которых предназначен для дисплея, 3-контактный разъем UART для программирования, микро USB порт для питания и кнопку сброса.

На другой стороне платы ничего нет.

Сборка стартового комплекта
ANAVI термометра

Первое, что нужно сделать, это снять защитную пленку с подставки, поскольку она будет затруднять видимость OLED дисплея.

Однако подставка не перенесла транспортировку и пришла уже поломанной, но обычный клей помог решить данную проблему.

Дальше нужно прикрепить плату к основанию корпуса с помощью прилагаемых гаек и болтов, но болты для OLED дисплея очень большие, поэтому в данном случае он был прикреплен двухстороннем скотчем к верхней части подставки.

Также был взят датчик освещенности BH1750 из стартового комплекта ANAVI Light pHat, чтобы продемонстрировать, что можно добавить дополнительные датчики на данную подставку. Там достаточно много места для двух дополнительных датчиков I2C.

Первоначальная настройка для ANAVI термометра

Документацию для комплекта и платы можно найти на Github. Дальше в обзоре постараемся придерживаться данной документации.

Нужно подключить плату к источнику питания USB 5 В (рекомендуется 1 А или выше), также плату можно запитать от обычного USB-порта ноутбука.

OLED-дисплей показывает только “соединение…” что означает, что сперва вы должны подключить плату к вашей сети Wi-Fi для дальнейшей настройки. В списке точек доступа плата будет определяться как “ANAVI Thermometer Controller”.

После подключения вам будет предложено войти в настройки точки доступа и вы будете перенаправлены на веб-интерфейс как у “Sonoff-Tasmota” для настройки WiFi, там же будет отображаться некоторая системная информации (справа на скриншоте выше). Далее нужно перейти в “Configure WiFi“.

Плата будет автоматически сканировать точки доступа 2.4 ГГц и вы можете выбрать одну из них и ввести пароль от нее, а также настроить MQTT, если это необходимо. Machine ID здесь на самом деле не нужен, так что вы можете не использовать его. Пользовательский интерфейс на самом деле точно такой же, как и у ANAVI Light Controller, которым можно управлять из веб-интерфейса. После нужно нажать кнопку «Save» и ваша плата подключится к WiFi маршрутизатору, и уже через несколько секунд после этого должна появиться информация с данными на OLED дисплее.

Чуть выше показаны данные температуры и влажности от датчика DHT22, но значения для температуры воды были 0.0°C, поскольку датчик DS18B20 не был подключен.

Также комплект был подключен к компьютеру через последовательную плату, чтобы проверить вывод данных с помощью minicom с конфигурацией 115200 8N1 /dev/ttyUSB0: