ESP8266 и JSON

Когда-то мной было написано про ENC28J60 и REST-управление реле; а сейчас пришло время затронуть тему шикарного Wi-Fi-модуля ESP-8266. Поскольку модуль шикарный, начнём с недостатков…

Самой замечательной особенностью NodeMCU является лёгкое (ага, лёгкое) несоответствие надписей на плате и реальным порядком расположения пинов. Так, к примеру, GPIO4 на деле висит на пине, обозначенном как D2. Как следствие, без подобной таблицы никак:

ESP8266 и JSON

Датчик температуры DHT11

Довольно простой в подключении датчик температуры и влажности. Для работы с ним необходима библиотека dht.h (которая есть в Arduino IDE). Сами его контакты идут в следующем порядке (если развернуть лицевой стороной вверх, контактами к себе): VCC, Data, (reserve), GND.

ESP8266 и JSON

Важное примечание: чтобы DHT11 меньше косячил, необходимо поставить резистор на 10кОм между VCC и пином данных („Data“ на схеме). И конденсаторами его обвешать, так как 3 вольта на длинном проводе ему маловато! Кроме того, датчик довольно медленный (не следует дёргать его чаще чем раз в 2 секунды; см. код ниже).

Сборка датчика и модуля

Получилось нечто вроде такого:

ESP8266 и JSON

Вообще, NodeMCU немного греется, если делать для неё корпус. Поэтому впоследствии датчик пришлось вынести немного дальше от самого Wi-Fi модуля.

Всё в сумме потребляет 0.05 А тока при напряжении источника 5 В.

Написание кода для микроконтроллера

Всё просто. При запросе по нужному пути, выдаём данные в формате JSON. При ином запросе, выдаём сообщение об ошибке. В случае ошибки датчика, выдаём значение -255.0.

Написание кода на стороне сервера

В принципе, NodeMCU сам себе сервер 🙂 Так что, можно вполне себе поставить web-приложение прямо на микроконтроллере. Да, памяти на весь HTML не хватит; но выдать псевдо-страницу, содержащую как данные так и ссылку на скрипт, создающий оформление (используя, скажем, такой способ: Загрузчик для букмарклетов на javascript) вполне возможно.

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

Поскольку хостинг кроме php толком ничего не разумеет, пришлось потратить полчаса, чтобы выучить php. Вот что получилось (сам запуск скрипта забит в cron хостинга и запускается каждые 30 минут; запись в crontab: 0,30 * * * *):

Примечание: MySQL-таблицы выглядят так (в строке указан тип данных):

temperature
timeuptimetemperaturehumidityheatIndexfreeMemory
timestamp (CURRENT_TIMESTAMP)bigint(20)floatfloatfloatint(11)

Соответственно, для получения данных клиентом, на хостинге лежит ещё один скрипт, вытаскивающий нужные строки из таблицы по запросу. Приводить его не буду по причине тривиальности оного.

Код клиента на javascript

Лишний раз цитировать не вижу смысла. Действующий вариант, если надо, ниже.

Вообще, чистая импровизация. Следовало либо оформлять код модулем; либо делать из него полноценный объект, при создании которого указываются области для вывода данных. А тут получился не модуль, ни универсальный объект. …просто код был написан стихийно и за десяток-другой минут; сейчас уже править лень.

Ну и для старта что-то вроде такого:

Графики рисует chart.js; местами используется strftime.js для оформления даты.

ESP8266 и JSON

Комментарии: