Документация Engee
Notebook

Генерация кода для ESP 8266 (Датчик звука в Telegram-боте)

В этом демонстрационном примере рассматривается разработка модели Engee для обработки сигнала от датчика звука с последующей генерацией кода из модели для микроконтроллера ESP 8266, управляемого через Telegram-бота.

Введение

Цель этого примера - реализовать в Engee моделирование с последующей генерацией кода простого алгоритма, применимого в домашней автоматизации и "интернете вещей". Целевое устройство - микроконтроллер со встроенным WiFi-модулем будет управляться через Telegram-бота, что также обеспечивается моделью Engee. Telegram-бот будет получать от контроллера уровень звука в месте расположения датчика, усредненный методом скользящего среднего.

Аппаратная часть

Целевым устройством, которое используется в этом примере, является отладочная плата NodeMCU v1.0 с WiFi-модулем ESP12E на микроконтроллере ESP8266. Аналоговый сигнал на вход устройства поступает от датчика звука, реализованного на микросхеме LM393. Питание датчик получает от микроконтроллера. Ниже представлена схема соединения устройств данного примера.

image.png

Микроконтроллер программируется через порт USB, программа загружается во Flash-память. Для дальнейшей эксплуатации контроллер с датчиком получают питание от блока питания.
Компиляция пользовательского скетча и программирование контроллера осуществляется через Arduino IDE 2.3.2. Для работы с NodeMCU v1.0 (ESP-12E) в Arduino IDE также установлена библиотека плат на базе чипа ESP 8266 от ESP8266 Community.

Telegram-бот

В качестве пользовательского интерфейса для управления контроллером был создан Telegram-бот "ESP_test" (@EngeeESPTestBot). Для дальнейшей работы с ботом понадобится его токен для доступа к HTTP API (формируется при создании бота) и пользовательский Chat ID.

В используемом боте сконфигурированы две команды: /hi - для вывода текстового сообщения, /sound - для вывода усредненного уровня звука.

Процессы по созданию Telegram-бота, а также получению Chat ID пользователя тривиальны, общедоступны и в данном примере не рассматриваются.

Следует заметить, что в пользовательском коде обработки входящих сообщений Telegram-бота для этого примера используется идентификатор только для одного заданного пользователя. Для доступа к обработке команд от любого пользователя следует изменить функцию обработки входящих сообщений бота.

Описание модели Engee

Управляющий алгоритм для контроллера воспроизводится в модели Engee. Её структура приводится на рисунке ниже.

image_2.png

Здесь блоки MovingAverage и AverageDiv производят расчёт скользящего среднего по 10 значениям сигнала. Взаимодействие с периферией контроллера осуществляется блоками C Function:

  • AnalogInput - получает сигнал уровня звука от аналогового входа;
  • ToSerial - инициализирует последовательный порт и передаёт в него значение усредненного уровня звука;
  • TelegramBot - инициализирует Telegram-бота, проверяет наличие входящих сообщений;
  • WiFiConnect - устанавливает WiFi-соединение.

На вход блока TelegramBot передаётся идентификатор пользовательского чата MyChatID, а на вход WiFiConnect - время ожидания подключения ResponseTime, которое следует увеличивать при слабом сигнале WiFi.

Для работы контроллера с Telegram-ботом можно воспользоваться любой доступной библиотекой. В этом примере используется библиотека C++ FastBot.

Для подключения к WiFi-сети в блоке WiFiConnect используются макросы WIFI_SSID, WIFI_PASS - значения SSID и пароля WiFi-сети, определяемые далее в пользовательском скетче.

Подробные описания алгоритмов работы кода в блоках C Function даны в комментариях блоков.

Результаты моделирования

Для моделирования алгоритма скользящего среднего на выходе блока AnalogInput также формируется случайное выходное значение в диапазоне от 8 до 10. Проверим работу алгоритма, загрузив и выполнив собранную модель.

In [ ]:
if "esp8266_tg_sound_detect" in [m.name for m in engee.get_all_models()]
    m = engee.open( "esp8266_tg_sound_detect" );
else
    m = engee.load( "$(@__DIR__)/esp8266_tg_sound_detect.engee" );
end

data = engee.run(m);

Построим графики аналогового сигнала (сгенерированных случайных значений) и результата расчёта скользящего среднего.

In [ ]:
using Plots
plotlyjs()
plot(data["SoundFromSens"].time, data["SoundFromSens"].value,
    label="Сигнал от датчика", size=(900,300), lw=2, st=:step)
plot!(data["SoundAvValue"].time, data["SoundAvValue"].value,
    label="Усредненный сигнал", size=(900,300), lw=2, st=:step,
    legend = :bottomright)
Out[0]:

Алгоритм производит корректный расчёт, далее перейдём к выполнению кода на целевом устройстве.

Загрузка кода в ESP 8266

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

In [ ]:
engee.generate_code( "$(@__DIR__)/esp8266_tg_sound_detect.engee",
                     "$(@__DIR__)/esp8266_tg_sound_detect_code")
[ Info: Generated code and artifacts: /user/start/examples/codegen/esp8266_tg_sound_detect/esp8266_tg_sound_detect_code

Сгенерированные в указанной директории файлы подключим в пользовательском скетче esp8266_tg_sound_detect.ino. Также в скетче определяются макросы, переменные и функция обработки входящих сообщений, подключаются библиотеки и инициализируется Telegram-бот. Скачаем эти файлы и загрузим в ESP8266 при помощи Arduino IDE.

Выполнение кода на ESP 8266

После успешной компиляции пользовательского скетча и загрузки кода в контроллер в мониторе порта Arduino IDE можно наблюдать следующий вывод:

sound_sens.gif

При отправке сообщений, содержащих заданные команды Telegram-боту, можно наблюдать следующие ответ бота:

sound_sens_t.gif

Как видно из результатов работы программы, на целевом устройстве воспроизводится заданный в модели Engee алгоритм.

Вывод

В этом демонстрационном примере был рассмотрен процесс создания модели Engee, которая поддерживает работу с периферий контроллера - аналоговым входом, последовательным портом и модулем WiFi. Также модель реализует: обработку снимаемого с датчика звука аналогового сигнала, конфигурацию и мониторинг Telegram-бота.

Блоки, использованные в примере