Читаем данные с датчиков (DHT11, Blynk, Aimylogic)
Вступление
В данной статье рассмотрим вариант получения данных с датчиков посредством голосового запроса Алисе. Для примера будем использовать датчик DHT11 подключенный к NodeMCU и добавленный в проект Blynk.
Данная статья будет являться лишь примером получения данных с датчиков с помощью http get запроса. По данному примеру можно будет "пробросить" датчики, возвращающие ответ в различных форматах.
Собираем простейший датчик
В данном примеру будут использованы следующие компоненты:
Собираем простейшую схему, как на рис.1.

Внимание! Для работы с nodemcu в Arduino IDE требуется настройка с платой. Пример настройки можно найти здесь: https://robotclass.ru/articles/node-mcu-arduino-ide-setup/. Также потребуется установка библиотек Blynk - скачать можно здесь: http://help.blynk.cc/en/articles/512105-how-to-install-blynk-library-for-arduino-ide.
Подключаем плату к ПК и прошиваем следующей прошивкой:
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include "DHT.h"
int custT = 0;
int custH = 0;
char auth[] = "Токен_Blynk";
char ssid[] = "Имя_точки_доступа_Wifi";
char pass[] = "Пароль_Wifi";
#define DHTPIN D1
#define DHTTYPE DHT11 // DHT 11
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
dht.begin();
}
void loop()
{
Blynk.run();
int h = dht.readHumidity(); //получаем влажность
int t = dht.readTemperature(); //получаем температуру
if (h != custH){ //если показания отличаются от прошлых - отправляем их на виртуальный пин
Blynk.virtualWrite(V0, h);
custH = h;
}
if (t != custT){ //если показания отличаются от прошлых - отправляем их на виртуальный пин
Blynk.virtualWrite(V1, t);
custT = t;
}
}
Не забываем изменить параметры:
char auth[] = "Токен_Blynk";
char ssid[] = "Имя_точки_доступа_Wifi";
char pass[] = "Пароль_Wifi";
Подробнее о том, как создать проект в Blynk и получить токен можно узнать ЗДЕСЬ
Читаем данные в Blynk
Проверим, работает ли датчик. Для этого в нашем проекте Blynk добавим 2 виджета:
- Нажимаем кнопку со знаком "+" в заголовке проекта.
- Выбираем один из виджетов (можно использовать любой из этих: Value Display, Labeled Value, Gauge). Для примера выберу Gauge.
- Оба виджета настраиваем выбрав в Source устройство, к которому привязан наш токен, виртуальные пины: V0 - для значений влажности, V1 - для значений температуры.
- Запускаем проект и видим текущие показания температуры и влажности. Проверить работу датчика можно дыханием в сторону датчика - показания должны увеличиться.
-
1. Нажимаем кнопку со знаком "+".
-
2. Выбираем один из виджетов.
-
3. Настраиваем виджеты.
-
4. Запускаем проект и видим показания.
Создаем навык для Яндекс Диалогов
На данный момент УДЯ не поддерживает получение данных с датчиков, поэтому мы схитрим. Создадим обычный навык для Яндекс Диалогов наиболее простейшим образом, т.е. с помощью конструктора Aimylogic.
Для этого пройдем регистрацию ЗДЕСЬ.
- После регистрации мы попадаем на главную страницу, где будут располагаться наши боты. Для создания нового бота (для навыка Алисы) нажимаем кнопку "Создать бота или обзвон".
- В следующем окне зададим имя бота (любое), язык и категорию.
- Перед нами откроется рабочая область создания сценария, в которой будет предложено создать первый экран. Для начала создадим блок "Текст", чтобы поприветствовать входящего в навык пользователя.
- Рекомендую задать что-то похожее на текст, указанный на рисунке, т.к. по требованиям Яндекс приватный навык должен с первого экрана предупреждать о том, что он приватный, а также при запросе "Помощь" (об этом чуть ниже) должна появляться справка о функционале навыка. Без данных требований навык не сможет пройти модерацию.
- В этом же экране создадим новый блок "Интенты", где зададим шаблоны фраз, на которые будет откликаться Алиса. В данном случае будет 2 интента (* ~температура * ~балкон * - для того чтобы узнать температуру для примера балкона (предположим, что наш датчик находится на балконе) и * ~влажность * ~балкон * - для того, чтобы узнать влажность балкона).
- Чуть ниже создадим новый экран с двумя блоками: "Текст" - где укажем, что будет отвечать Алиса, если фраза не совпадает с шаблонами интентов и "Переход", чтобы вернуться на начальный экран.
- Соединим Пункт "Любая другая фраза" с экраном неизвестной фразы нажав на кружочек рядом с данным пунктом и протянув стрелку до соответствующего экрана. Тоже самое можно сделать от пункта "Переход" на экране неизвестной фразы до экрана приветствия. (Теперь если фраза не будет похожей на "температура балкона" или "влажность балкона", Алиса скажет, что такой команды нет и вернется к начальному экрану).
- Также в блоке "Интенты" стоит установить флажок "Сделать доступным из любой точки сценария", для того, чтобы наши шаблоны работали в любом месте. Для этого нажимаем кнопку с шестеренкой рядом с названием блока и устанавливаем соответствующий флажок в открывшемся окне.
- Осталось только прочитать данные с датчиков и вывести их пользователю. Для этого каждому интенту создадим экран с блоком HTTP-запрос, где создадим переменные, в которые "положим" данные с датчиков ($tempbal - для температуры, $humbal - для влажности). В данных блоках мы указываем ссылки на get-запрос вида http://blynk-cloud.com/токен_blynk/get/V1 - для температуры, http://blynk-cloud.com/токен_blynk/get/V0 - для влажности.
- К пунктам "Завершен с ошибкой" стоит добавить экран с текстом, в котормо будет указано, что получение данных не удалось (например датчики не в сети) и переходом на начальный экран.
- Все, что осталось - это вывести данные пользователю и завершить сценарий. Для этого создадим для каждого пункта "Завершен успешно" - экран с текстом, где укажем текст с нашими переменными (например - Температура балкона - $tempbal градусов.) и блоком "Завершение сценария".
- В конечном итоге получим готовый сценарий, который останется только сохранить соответствующей кнопкой.
-
1. Нажимаем кнопку "Создать бота или обзвон".
-
2. Зададим имя бота (любое), язык и категорию.
-
3. Рабочая область.
-
4. Задаем текст приветствия.
-
5. Блок "Интенты".
-
6. Экран неизвестной фразы.
-
7. Соединяем экрана.
-
8. Делаем интенты глобальными.
-
9. Http-запросы с переменными.
-
10. Экран с ошибкой запроса.
-
11. Экраны вывода данных.
-
12. Весь сценарий