Введение
Разработка встраиваемых систем (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.
Комментарии