Когда вы играете с новым микроконтроллером, первое, что вы обычно делаете, это управляете светодиодом. Это классическое Hello World! проект для микроконтроллеров. Я так и сделал, когда впервые играл с ESP8266 и MicroPython. Идем дальше и реализуем еще один классический проект — измерение температуры и влажности датчиком DHT22. Но мы не хотим молчать, поэтому собираемся поделиться этой столь важной информацией в Интернете. В этом нам поможет ThingSpeak. Добавим в армию Интернета Дерьма нового воина!

Аппаратное обеспечение и схема: ESP8266 (ESP-07) и DHT22

Этот проект основан на моем предыдущем посте — Начало работы с ESP8266 и MicroPython. Все, что там описано, применимо и здесь.

Также обратите внимание, что может быть лучше использовать ESP8266 с более чем 512 КБ флэш-памяти. Похоже, что ограниченные версии MicroPython могут работать некорректно (см. Проблемы с запуском MicroPython на ESP8266 с 512K).

Для этого проекта мы будем использовать версию ESP8266 ESP-07. Вы также можете использовать ESP-12 без каких-либо изменений для схемы ниже. Но если вы используете другие модификации ESP8266, то вам может понадобиться немного доработать приведенную ниже схему.

Вот схема, которую я использовал:

Схема аналогична той, что была в моем предыдущем посте. Вот что я добавил:

  • Датчик DHT22 и резистор R6.
  • Переключатель на GPIO5, который используется для включения configuration mode, о чем я объясню ниже.
  • Переключатель на GPIO4, который не используется. Я добавил его на всякий случай, потому что у меня был блок с двумя переключателями.

Мы используем датчик DHT22 для измерения температуры и влажности. Вы также можете использовать DHT11. Это, вероятно, самый популярный датчик для проектов «сделай сам», поэтому команда MicroPython любезно добавила поддержку этого датчика «из коробки». Если вы никогда не видели этот датчик, DHT22 выглядит так:

Вот как выглядит устройство:

Запускаем точку доступа Wi-Fi на ESP8266

Мы закончили с оборудованием, давайте поговорим о программном обеспечении. Выкладываю исходники в репо на https://github.com/artem-smotrakov/yellow-duck

$ git clone https://github.com/artem-smotrakov/yellow-duck

Поскольку мы собираемся отправлять температуру и влажность в ThingSpeak, нам нужно подключить нашу плату ESP8266 к Wi-Fi. Для этого ESP8266 нужен SSID и пароль. Самый очевидный способ — жестко закодировать SSID и пароль. Вот как вы можете подключиться к Wi-Fi с помощью MicroPython:

Но не удобно иметь хардкодные настройки Wi-Fi. Если SSID/пароль изменится, нам нужно будет изменить источники и снова загрузить его на плату. Вместо жесткого кодирования SSID/пароля мы можем сделать следующее:

  • Добавьте переключатель config mode на GPIO5 (см. схему выше), который включает режим конфигурации.
  • Когда плата запускается, она проверяет, включен ли переключатель config mode (см. функцию is_config_mode).
  • Если включен режим конфигурации, плата устанавливает точку доступа Wi-Fi и запускает локальный веб-сервер (см. функции start_access_point и start_local_server).
  • Когда пользователь подключается к этой точке доступа Wi-Fi, веб-сервер предлагает установить SSID и пароль для сети Wi-Fi, которые затем следует использовать.
  • Когда пользователь вводит SSID/пароль, веб-сервер сохраняет его в файле конфигурации на ESP8266 и перезагружает плату (см. функции write_wifi_config и reboot).
  • На этом этапе пользователь также должен отключить config mode.
  • После перезагрузки плата подключается к указанной сети Wi-Fi (см. функцию connect_to_wifi).
  • В случае успешного соединения включает LD1 (см. функцию turn_on_wifi_led).

Итак, если мы хотим использовать устройство в другой сети Wi-Fi, или мы просто изменили пароль Wi-Fi, нам не нужно снова прошивать устройство.

После того, как устройство успешно подключилось к Wi-Fi, оно начинает измерять температуру и влажность с заданным интервалом. Как я упоминал ранее, MicroPython по умолчанию поддерживает датчики DHT11 и DHT22. Мы просто используем функцию dht.DHT22, см. mesure_temperature_and_humidity:

Вот как мы отправляем данные в ThingSpeak:

У нас здесь та же проблема, что и с SSID/паролем — нам нужно предоставить ключ API, но мы не хотим его жестко запрограммировать. Решение то же — устройство предлагает пользователю указать API-ключ в config mode.

Как вы могли заметить, здесь мы используем TLS — см. вызов ssl.wrap_socket выше, который оборачивает обычный сокет в сокет TLS. Честно говоря, я немного удивился, когда узнал, что MicroPython для ESP8266 поддерживает TLS. Но есть одна вещь. Даже если здесь используется TLS, MicroPython для ESP8266 не поддерживает проверку сертификата сервера (по крайней мере, версия 1.8.7 этого не поддерживает). Таким образом, мы в относительной безопасности, если злоумышленник может просто перехватить соединение, потому что все данные будут зашифрованы. Но если злоумышленник может изменить трафик, то у нас проблемы, потому что сертификат сервера может быть заменен вредоносным, чтобы злоумышленник мог расшифровать и изменить данные.

Вы можете заметить в коде несколько вызовов print. Это просто для отладки. Вы можете подключиться к ESP8266 через адаптер USB-Serial и просмотреть эти отладочные сообщения.

Визуализации на ThingSpeak

Эти графики показывают температуру и влажность в моей комнате. Вот общедоступный канал для этого:

https://thingspeak.com/channels/230189

Ссылки

Первоначально опубликовано на https://blog.gypsyengineer.com 3 марта 2017 года.