Управление Arduino через Google Assistant — пошаговое руководство
Компоненты и расходники
| Arduino UNO | × | 1 |
| ESP8266 ESP-01 | × | 1 |
Приложения и сервисы
- Arduino IDE
- Microsoft Visual Studio 2017 (для серверной части)
О проекте
В этом проекте мы научимся соединять интернет-сервисы с Arduino. В итоге вы:
- поймёте, как получать данные от Google Assistant;
- научитесь использовать IFTTT;
- разберётесь в вебхуках и HTTP-запросах;
- сможете управлять Arduino голосом.

Google Assistant и IFTTT
Google Assistant — ИИ-ассистент Google для мобильных и умных устройств. Поддерживает диалоги, распознаёт речь лучше аналогов, умеет искать в интернете, ставить напоминания, управлять устройствами, показывать данные из аккаунта Google. Анонсированы функции: распознавание объектов камерой, покупки, переводы, поиск песен.
IFTTT (If This Then That) — бесплатный веб-сервис для создания цепочек «если это, то то» (апплеты). Триггеры: Gmail, Facebook, Telegram, Instagram, Pinterest и др. Пример: если твит с хэштегом — отправить email. Есть приложения для iOS/Android. В 2015 г. пользователи создавали ~20 млн рецептов в день.

Вебхуки и JSON
Вебхук — метод изменения поведения веб-страницы через пользовательские колбэки. Термин ввёл Джефф Линдсей (2007).
JSON — открытый формат обмена данными (пары ключ-значение, массивы). Стандарт для асинхронного браузер-сервер обмена, замена XML в AJAX.

От Google Assistant к Arduino
Цель: управлять пинами Arduino (I/O, PWM, Serial) строкой от Google Assistant. План:
- Определить фразы для Google Assistant.
- Создать апплет IFTTT: связать Assistant с базой данных.
- ESP8266 опрашивает базу, отправляет команду в Serial Arduino.
Схема

Реализация
1. Устройство с Google Assistant — телефон на Android. Зайдите на assistant.google.com для списка поддерживаемых устройств.
2. IFTTT: зарегистрируйтесь на ifttt.com. My Applets → New Applet.
- THIS: Google Assistant → «Say a phrase with a number ingredient». Фраза: «Set PWM of pin 9 to #» (символ
#= число). Добавьте синонимы: «PWM 9 to #». Ответ ассистента: «The PWM is updated». Create Trigger. - THAT: Webhooks → Make a web request. URL вашего сервера. Method: POST. Content Type: application/json. Body:
{"Number":"{{NumberField}}"}. Create Action.

Сервер и база данных
Пример серверного кода (C# / ASP.NET) для приёма вебхука от IFTTT и записи в БД. Скачайте здесь (ссылка в оригинале). Модели можно адаптировать под свои данные.
Код для ESP8266 и Arduino
Сначала код для ESP-01: опрашивает сервер, парсит JSON, шлёт в Serial Arduino. Затем код Arduino: читает Serial, выполняет команду (например, меняет PWM).
Понадобится библиотека ArduinoJson. Установите через Library Manager (Sketch → Include Library → Manage Libraries → поиск «ArduinoJson» → Install).

Код для ESP-01
#include "ESP8266WiFi.h"
#include "ESP8266HTTPClient.h"
#include "ArduinoJson.h"
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting...");
}
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
HTTPClient http;
http.begin("https://yourip/api/Home/GetAllApp"); // ваш endpoint
int httpCode = http.GET();
if (httpCode > 0) {
String payload = http.getString();
// TODO: парсинг JSON с ArduinoJson
Serial.println(payload); // пока просто пробрасываем в Serial
}
http.end();
}
delay(3000);
}
Код для Arduino
String inputString = "";
String buff;
bool stringComplete = false;
bool id;
int f, buf;
char x;
void setup() {
Serial.begin(9600);
inputString.reserve(200);
}
void loop() {
if (stringComplete) {
// Ищем "id" в строке
f = 0;
while (f < 100) {
if (inputString.substring(f) == "id") {
id = true;
break;
}
f++;
}
if (id) {
x = inputString.charAt(f + 4); // символ после "id"
}
if (x == '4') { // пример: команда для пина 9
f = 0;
while (f < 100) {
if (inputString.substring(f) == "number") {
f += 9; // пропуск "number\":"
buff = "";
for (int i = 0; i < 3; i++) {
char c = inputString.charAt(f + i);
if (c == '"') break;
buff += c;
}
buf = buff.toInt();
analogWrite(9, buf); // PWM на пине 9
break;
}
f++;
}
}
inputString = "";
stringComplete = false;
}
}
void serialEvent() {
while (Serial.available()) {
char inChar = (char)Serial.read();
inputString += inChar;
if (inChar == '\n') stringComplete = true;
}
}

Куда двигаться дальше
- Добавьте свои команды: управление выходами, реле для света и т.д.
- Реализуйте обратную связь: отправка данных из Arduino в Google Assistant.
Производственный процесс
- Интегрированная система контроля доступа с QR, RFID и верификацией температуры
- Универсальный Android-пульт на Arduino, 1Sheeld и ИК-управлении
- Умная копилка: управление монетоприёмником на Arduino Nano
- Управление светодиодом по Bluetooth с Arduino: простой DIY-гид
- Управление двумя шаговыми двигателями через джойстик на Arduino Nano — простой урок (Visuino)
- Точное управление сервоприводом через MPU6050 (Arduino, SG90, MG996R)
- Голосовое управление бытовыми приборами: Bluetooth-управление через Google Assistant
- Модуль GPS u-blox LEA-6H 02: Интеграция с Arduino и Python
- Освоение распознавания и синтеза речи на Arduino Due
- ThimbleKrox: управление мышью с пальца на Arduino Micro и MPU-6050