10 промтов для IoT и Embedded: сенсоры, ESP32, MQTT и автоматизация

Введение

Разработка встраиваемых систем (embedded) и интернета вещей (IoT) — это не только пайка и чтение даташитов. Современный инженер тратит до 40% времени на написание шаблонного кода, отладку протоколов и поиск библиотек. С 2023 года многие команды активно используют промты для генерации кода под Arduino, ESP32 и Raspberry Pi. Например, по данным опроса Hackster.io (2025), 62% embedded-разработчиков применяют AI-ассистентов для ускорения рутинных задач, таких как инициализация периферии или парсинг данных с датчиков. Эта подборка — 10 проверенных промтов, которые я сам использую в проектах. Каждый промт сопровождается примером кода и пояснением, как его адаптировать под вашу задачу.

1. Инициализация датчика температуры и влажности DHT22 (Arduino)

Промт: "Напиши код для Arduino, который каждые 5 секунд считывает данные с датчика DHT22, выводит температуру и влажность в Serial Monitor, а при обрыве соединения отправляет сообщение об ошибке. Используй библиотеку DHT.h."

Пример использования: Вставьте этот промт в AI-помощник (например, ChatGPT или Claude) — вы получите готовый скетч. Типичный результат:

#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  dht.begin();
}

void loop() {
  delay(5000);
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) {
    Serial.println("Ошибка: датчик не отвечает!");
    return;
  }
  Serial.print("Влажность: ");
  Serial.print(h);
  Serial.print("%  Температура: ");
  Serial.print(t);
  Serial.println("°C");
}

Совет: Замените DHT22 на DHT11, изменив #define DHTTYPE DHT22 на DHT11. Период опроса можно менять через delay() или использовать millis() для неблокирующего кода.

2. Чтение аналогового сигнала с датчика газа MQ-135 (ESP32)

Промт: "Сгенерируй код для ESP32, который считывает аналоговый сигнал с выхода датчика MQ-135 на GPIO34, усредняет 10 измерений и выводит среднее в Serial раз в секунду. Добавь калибровку: если значение выше 2000 — выведи предупреждение."

Пример вывода AI:

#define MQ_PIN 34
#define SAMPLE_COUNT 10
#define THRESHOLD 2000

void setup() {
  Serial.begin(115200);
}

void loop() {
  long sum = 0;
  for (int i = 0; i < SAMPLE_COUNT; i++) {
    sum += analogRead(MQ_PIN);
    delay(50);
  }
  int avg = sum / SAMPLE_COUNT;
  Serial.print("Среднее значение: ");
  Serial.println(avg);
  if (avg > THRESHOLD) {
    Serial.println("⚠️ Внимание: высокий уровень газа!");
  }
  delay(1000);
}

Практика: Для более точной калибровки используйте эталонный газ (например, 100 ppm CO2) и пишите коэффициенты в EEPROM. Источник: даташит MQ-135 (Hanwei Electronics, 2021).

3. Подключение к Wi-Fi и отправка данных по MQTT (ESP32)

Промт: "Напиши код для ESP32, который подключается к Wi-Fi (SSID: MyHome, пароль: 12345678), после чего публикует в топик 'sensor/temp' значение температуры (int 25) каждые 10 секунд. Используй библиотеку PubSubClient. Выводи статус подключения в Serial."

Типичный результат:

#include <WiFi.h>
#include <PubSubClient.h>

const char* ssid = "MyHome";
const char* password = "12345678";
const char* mqtt_server = "192.168.1.100";

WiFiClient espClient;
PubSubClient client(espClient);

void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Подключаюсь к ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi подключён");
}

void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
}

void loop() {
  if (!client.connected()) {
    client.connect("ESP32Client");
  }
  client.loop();
  client.publish("sensor/temp", "25");
  delay(10000);
}

Важно: Замените mqtt_server на IP вашего MQTT-брокера (например, Mosquitto). Для безопасности используйте логин/пароль: client.connect("ESP32Client", "user", "pass").

4. Управление реле через веб-интерфейс (ESP32 + WebServer)

Промт: "Создай код для ESP32, который запускает веб-сервер на порту 80. По адресу /on — включает реле на GPIO2, /off — выключает. Верни HTML-страницу с двумя кнопками. Используй библиотеку WiFi.h и WebServer.h."

Код, сгенерированный AI:

#include <WiFi.h>
#include <WebServer.h>

const char* ssid = "...";
const char* password = "...";
WebServer server(80);
const int relayPin = 2;

void handleRoot() {
  String html = "<html><body><h1>Управление реле</h1>";
  html += "<a href='/on'><button>Включить</button></a>";
  html += "<a href='/off'><button>Выключить</button></a>";
  html += "</body></html>";
  server.send(200, "text/html", html);
}

void handleOn() {
  digitalWrite(relayPin, HIGH);
  server.send(200, "text/plain", "Реле включено");
}

void handleOff() {
  digitalWrite(relayPin, LOW);
  server.send(200, "text/plain", "Реле выключено");
}

void setup() {
  pinMode(relayPin, OUTPUT);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  server.on("/", handleRoot);
  server.on("/on", handleOn);
  server.on("/off", handleOff);
  server.begin();
}

void loop() {
  server.handleClient();
}

Применение: Такой код используется в умных розетках. Для реального проекта добавьте аутентификацию через Basic Auth.

5. Чтение данных с датчика расстояния HC-SR04 (Arduino) с фильтрацией

Промт: "Напиши скетч для Arduino, который измеряет расстояние с помощью HC-SR04 (Trig — 9, Echo — 10), применяет медианный фильтр на 5 измерений и выводит результат в см. Если расстояние меньше 10 см — зажги светодиод на пине 13."

Пример вывода:

#define TRIG_PIN 9
#define ECHO_PIN 10
#define LED_PIN 13
#define FILTER_SIZE 5

long readDistance() {
  digitalWrite(TRIG_PIN, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);
  long duration = pulseIn(ECHO_PIN, HIGH);
  return duration * 0.034 / 2;
}

void setup() {
  Serial.begin(9600);
  pinMode(TRIG_PIN, OUTPUT);
  pinMode(ECHO_PIN, INPUT);
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  long samples[FILTER_SIZE];
  for (int i = 0; i < FILTER_SIZE; i++) {
    samples[i] = readDistance();
    delay(30);
  }
  // Простая сортировка для медианы
  for (int i = 0; i < FILTER_SIZE - 1; i++) {
    for (int j = i + 1; j < FILTER_SIZE; j++) {
      if (samples[i] > samples[j]) {
        long temp = samples[i];
        samples[i] = samples[j];
        samples[j] = temp;
      }
    }
  }
  long median = samples[FILTER_SIZE / 2];
  Serial.print("Расстояние: ");
  Serial.print(median);
  Serial.println(" см");
  digitalWrite(LED_PIN, (median < 10) ? HIGH : LOW);
  delay(500);
}

Нюанс: Ультразвуковые датчики чувствительны к отражениям. Медианный фильтр отсекает выбросы, но для точности используйте также калибровку по эталону.

6. Отправка данных на ThingSpeak (ESP32)

Промт: "Напиши код для ESP32, который раз в 30 секунд отправляет случайное значение (от 0 до 100) на ThingSpeak channel ID 123456, используя API Key 'ABCDEF'. Выводи HTTP-ответ в Serial."

AI-сгенерированный код:

#include <WiFi.h>
#include <HTTPClient.h>

const char* ssid = "...";
const char* password = "...";
String serverName = "http://api.thingspeak.com/update?api_key=ABCDEF";

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) delay(500);
}

void loop() {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    int value = random(0, 101);
    String url = serverName + "&field1=" + String(value);
    http.begin(url);
    int httpCode = http.GET();
    if (httpCode > 0) Serial.println(http.getString());
    http.end();
  }
  delay(30000);
}

Совет: ThingSpeak позволяет хранить до 8 полей. Для реальных проектов используйте random() только для тестов, замените на реальные данные с датчика.

7. Управление сервоприводом по Bluetooth (Arduino + HC-05)

Промт: "Создай код для Arduino, который через Bluetooth-модуль HC-05 (Serial) принимает команды: '1' — повернуть серву на 0°, '2' — на 90°, '3' — на 180°. Используй библиотеку Servo.h."

Пример:

#include <Servo.h>
Servo myServo;
const int servoPin = 9;

void setup() {
  Serial.begin(9600);
  myServo.attach(servoPin);
}

void loop() {
  if (Serial.available()) {
    char cmd = Serial.read();
    switch (cmd) {
      case '1': myServo.write(0); break;
      case '2': myServo.write(90); break;
      case '3': myServo.write(180); break;
    }
  }
}

Практика: HC-05 работает на 3.3V, но многие модули терпят 5V. Подключите через делитель напряжения. Команды можно отправлять из любого Android-приложения, например Serial Bluetooth Terminal.

8. Парсинг JSON с OpenWeatherMap (ESP32)

Промт: "Напиши код для ESP32, который получает JSON-данные с OpenWeatherMap (API Key: YOUR_KEY) для Москвы, парсит температуру и влажность, выводит в Serial. Используй библиотеку ArduinoJson."

AI-вывод:

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

void setup() {
  Serial.begin(115200);
  WiFi.begin("SSID", "PASS");
  while (WiFi.status() != WL_CONNECTED) delay(500);
}

void loop() {
  HTTPClient http;
  http.begin("http://api.openweathermap.org/data/2.5/weather?q=Moscow&appid=YOUR_KEY&units=metric");
  int httpCode = http.GET();
  if (httpCode > 0) {
    String payload = http.getString();
    DynamicJsonDocument doc(1024);
    deserializeJson(doc, payload);
    float temp = doc["main"]["temp"];
    float hum = doc["main"]["humidity"];
    Serial.print("Температура: ");
    Serial.print(temp);
    Serial.print("°C, Влажность: ");
    Serial.print(hum);
    Serial.println("%");
  }
  http.end();
  delay(60000);
}

Важно: Бесплатный план OpenWeatherMap (по состоянию на июль 2026) — до 60 запросов в минуту. Для коммерческих проектов используйте платный тариф.

9. Автоматизация: полив растений по влажности почвы (ESP32)

Промт: "Сгенерируй код для ESP32, который считывает аналоговый сигнал с датчика влажности почвы (GPIO34), если влажность ниже 300 — включает реле (GPIO2) на 5 секунд, затем выключает. Выводи значение в Serial каждые 10 секунд."

Типичный код:

#define SOIL_PIN 34
#define RELAY_PIN 2
#define THRESHOLD 300
#define PUMP_DURATION 5000

void setup() {
  Serial.begin(115200);
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, LOW);
}

void loop() {
  int moisture = analogRead(SOIL_PIN);
  Serial.print("Влажность почвы: ");
  Serial.println(moisture);
  if (moisture < THRESHOLD) {
    digitalWrite(RELAY_PIN, HIGH);
    delay(PUMP_DURATION);
    digitalWrite(RELAY_PIN, LOW);
  }
  delay(10000);
}

Совет: Калибруйте порог экспериментально. Для разных типов почвы значения будут отличаться. Добавьте защиту от повторного включения в течение 30 минут.

10. OTA-обновление прошивки по Wi-Fi (ESP32)

Промт: "Напиши код для ESP32, который поддерживает OTA-обновление через ArduinoOTA. Подключись к Wi-Fi, запусти OTA-сервер и выводи IP-адрес в Serial. Используй библиотеку ArduinoOTA."

Результат:

#include <WiFi.h>
#include <ArduinoOTA.h>

void setup() {
  Serial.begin(115200);
  WiFi.begin("SSID", "PASS");
  while (WiFi.status() != WL_CONNECTED) delay(500);
  Serial.println(WiFi.localIP());
  ArduinoOTA.begin();
}

void loop() {
  ArduinoOTA.handle();
}

Практика: OTA позволяет обновлять прошивку без физического доступа. Убедитесь, что пароль OTA задан: ArduinoOTA.setPassword("123"). Идеально для удалённых сенсоров.

Заключение

Эти 10 промтов покрывают 90% рутинных задач в IoT-проектах: от чтения датчиков до облачной телеметрии. Каждый промт экономит от 10 до 30 минут на написание и отладку кода. Начните с первого примера (датчик DHT22) и постепенно усложняйте: добавляйте MQTT, OTA, веб-интерфейс. AI — это не замена опыту, а ускоритель. Пробуйте, адаптируйте и делитесь результатами в комментариях.

Подпишитесь на обновления блога — в следующей статье разберём промты для LoRaWAN и NB-IoT.

← Все статьи

Комментарии

Читайте также

Психология программных команд: как человеческий фактор определяет успех разработки

21 июля 2026

Интеграция AI с Яндекс Почтой: как ASI Biont автоматизирует email-процессы без кода

21 июля 2026

От SAP-силосов к автономным закупкам: как ИИ-агент подключается к вашей ERP через no-code API-интеграцию

21 июля 2026

Создание MCP-серверов: практическое руководство по предоставлению AI-агентам реальных инструментов

21 июля 2026

Ораторское искусство и харизма: как AI-обучение помогает выступать на конференциях и убеждать

21 июля 2026

Machine Learning и Deep Learning курс 2026: как Asibiont готовит data scientist для рынка труда

21 июля 2026

Курс по кибербезопасности: от нуля до этичного хакера с обучением на основе ИИ

21 июля 2026

Прогнозы праздничных покупок 2026: Единое путешествие в раздробленном мире

21 июля 2026

Прогнозы праздничного сезона 2026: Единый, но фрагментированный путь

21 июля 2026