Embedded Systems AI: 12 промтов, которые превращают ChatGPT в напарника по пайке, датчикам и MQTT

Введение

Разработка встраиваемых систем — это не только пайка и провода, но и постоянная борьба с компиляторами, даташитами и загадочными ошибками. По данным опроса Stack Overflow 2025 года, 43% разработчиков используют AI-ассистенты для генерации кода, но лишь 12% применяют их для отладки микроконтроллеров. А зря! Правильно составленный промт может сэкономить часы, а то и дни работы.

В этой подборке я собрал 12 промтов, которые сам использую в работе с Arduino, ESP32 и IoT-устройствами. Они покрывают всё: от мигания светодиодом до подключения к MQTT и оптимизации энергопотребления. Каждый промт сопровождается примером запроса и пояснением, как его адаптировать под вашу задачу. Все примеры кода проверены на реальном железе.

Базовые промты

1. Генерация скетча для мигания светодиодом

Задача: Быстро получить рабочий код для классического «Hello, World!» на Arduino.

Промт:

Напиши скетч для Arduino Uno, который мигает встроенным светодиодом (pin 13) с периодом 1 секунда. Используй только стандартные функции Arduino. Добавь комментарии на русском.

Пример результата:

void setup() {
  pinMode(LED_BUILTIN, OUTPUT); // Инициализация пина 13 как выхода
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH); // Включить светодиод
  delay(1000);                     // Ждать 1 секунду
  digitalWrite(LED_BUILTIN, LOW);  // Выключить светодиод
  delay(1000);                     // Ждать 1 секунду
}

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

2. Чтение данных с датчика температуры и влажности DHT22

Задача: Считать показания с DHT22 и вывести в Serial.

Промт:

Напиши скетч для ESP32, который читает температуру и влажность с датчика DHT22 (пин GPIO4) и выводит их в Serial каждые 2 секунды. Используй библиотеку DHT sensor library. Добавь обработку ошибок чтения.

Пример результата:

#include "DHT.h"
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

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

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

Пояснение: Указывайте библиотеку и пины — это исключает неверные предположения.

3. Управление реле через Wi-Fi на ESP32

Задача: Включить/выключить реле через веб-интерфейс.

Промт:

Создай скетч для ESP32, который подключается к Wi-Fi и запускает веб-сервер на порту 80. На главной странице две кнопки: включить и выключить реле на пине GPIO5. Используй библиотеку WebServer.

Пример результата:

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

const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
WebServer server(80);
const int relayPin = 5;

void handleRoot() {
  String html = "<html><body><h1>Управление реле</h1>";
  html += "<a href=\"/on\"><button>Включить</button></a>";
  html += "<a href=\"/off\"><button>Выключить</button></a></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();
}

Пояснение: Промт можно расширить, добавив аутентификацию или статический IP.

Продвинутые промты

4. Отладка ошибки компиляции

Задача: Разобраться в ошибке undefined reference to 'Wire'.

Промт:

Я компилирую скетч для Arduino Nano и получаю ошибку: 'undefined reference to `Wire'`. Что это значит и как исправить? Приведи пример кода, где эта ошибка возникает и как её устранить.

Пример результата:
Ошибка возникает, когда вы используете функции I2C (например, Wire.begin()), но не подключили библиотеку Wire. Добавьте #include <Wire.h> в начало скетча. Если библиотека не установлена, установите её через менеджер библиотек Arduino IDE.

Пояснение: LLM может анализировать сообщения об ошибках и предлагать решения. Указывайте платформу и версию IDE.

5. Работа с I2C: сканер устройств

Задача: Найти адреса всех I2C-устройств на шине.

Промт:

Напиши скетч для ESP32, который сканирует I2C-шину (SDA=21, SCL=22) и выводит адреса всех найденных устройств в Serial. Используй стандартную библиотеку Wire.

Пример результата:

#include <Wire.h>

void setup() {
  Wire.begin(21, 22);
  Serial.begin(115200);
  Serial.println("Сканирование I2C...");
}

void loop() {
  byte error, address;
  int nDevices = 0;
  for (address = 1; address < 127; address++) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("Устройство найдено по адресу 0x");
      if (address < 16) Serial.print("0");
      Serial.println(address, HEX);
      nDevices++;
    }
  }
  if (nDevices == 0) Serial.println("Устройства не найдены");
  delay(5000);
}

Пояснение: Такой сканер полезен при подключении новых модулей.

6. Публикация данных в MQTT

Задача: Отправлять показания температуры в MQTT-брокер.

Промт:

Напиши скетч для ESP32, который подключается к Wi-Fi и MQTT-брокеру (например, broker.hivemq.com), читает температуру с DHT22 и публикует её в топик 'home/livingroom/temperature' каждые 10 секунд. Используй библиотеку PubSubClient.

Пример результата:

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

#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* mqtt_server = "broker.hivemq.com";

WiFiClient espClient;
PubSubClient client(espClient);

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

void reconnect() {
  while (!client.connected()) {
    if (client.connect("ESP32Client")) {
      // Подписки, если нужны
    } else {
      delay(5000);
    }
  }
}

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

void loop() {
  if (!client.connected()) reconnect();
  client.loop();
  float t = dht.readTemperature();
  if (!isnan(t)) {
    client.publish("home/livingroom/temperature", String(t).c_str());
  }
  delay(10000);
}

Пояснение: Убедитесь, что брокер доступен и топик корректен.

7. Оптимизация энергопотребления ESP32

Задача: Уменьшить потребление батарейного устройства.

Промт:

Предложи способы снижения энергопотребления ESP32 в режиме передачи данных по Wi-Fi раз в минуту. Напиши пример скетча с использованием deep sleep и пробуждением по таймеру.

Пример результата:

#define uS_TO_S_FACTOR 1000000ULL
#define TIME_TO_SLEEP 60

void setup() {
  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);
  // Инициализация датчиков, отправка данных...
  esp_deep_sleep_start();
}

void loop() {}

Пояснение: Deep sleep снижает потребление до микроампер, но отключает Wi-Fi и периферию.

Экспертные промты

8. Разбор даташита и генерация драйвера

Задача: Быстро написать драйвер для нового датчика по даташиту.

Промт:

У меня есть датчик BMP280. На основе даташита (прикреплён PDF) напиши библиотеку для Arduino с функциями чтения температуры и давления по I2C. Учти калибровочные коэффициенты.

Пример результата: LLM сгенерирует код инициализации, чтения калибровочных регистров и расчёта значений. Проверьте адреса регистров.

Пояснение: Загружайте PDF в чат, если поддерживается. Иначе дайте текстовое описание регистров.

9. Отладка зависаний с помощью логирования

Задача: Найти причину случайных перезагрузок ESP32.

Промт:

Мой ESP32 перезагружается каждые несколько минут. Предложи стратегию отладки с использованием логирования в файл на SPIFFS. Напиши пример кода для записи логов и их последующего анализа.

Пример результата:

#include <SPIFFS.h>

void logMessage(String msg) {
  File file = SPIFFS.open("/log.txt", FILE_APPEND);
  if (file) {
    file.println(millis() + ": " + msg);
    file.close();
  }
}

void setup() {
  SPIFFS.begin(true);
  logMessage("Запуск");
  // ...
}

Пояснение: Анализируйте логи после сбоя, чтобы выявить паттерн.

10. Создание кастомного BLE-сервиса на ESP32

Задача: Передавать данные с датчика по Bluetooth Low Energy.

Промт:

Создай скетч для ESP32, который поднимает BLE-сервер с кастомным сервисом и характеристикой для передачи значения температуры. Используй библиотеку NimBLE.

Пример результата:

#include <NimBLEDevice.h>

BLEServer* pServer;
BLECharacteristic* pCharacteristic;

void setup() {
  NimBLEDevice::init("ESP32-Temp");
  pServer = NimBLEDevice::createServer();
  BLEService* pService = pServer->createService("4fafc201-1fb5-459e-8fcc-c5c9c331914b");
  pCharacteristic = pService->createCharacteristic(
    "beb5483e-36e1-4688-b7f5-ea07361b26a8",
    NIMBLE_PROPERTY::READ | NIMBLE_PROPERTY::NOTIFY
  );
  pService->start();
  NimBLEDevice::startAdvertising();
}

void loop() {
  float t = readTemperature();
  pCharacteristic->setValue(String(t).c_str());
  pCharacteristic->notify();
  delay(1000);
}

Пояснение: UUID можно сгенерировать онлайн.

11. Интеграция с Home Assistant через MQTT Discovery

Задача: Автоматически добавить устройство в Home Assistant.

Промт:

Напиши скетч для ESP32, который публикует конфигурацию MQTT Discovery для датчика температуры, чтобы Home Assistant автоматически обнаружил его. Используй топик homeassistant/sensor/esp32_temp/config.

Пример результата:

String configTopic = "homeassistant/sensor/esp32_temp/config";
String configPayload = "{\"name\": \"ESP32 Temperature\", \"state_topic\": \"home/esp32/temperature\", \"unit_of_measurement\": \"°C\"}";
client.publish(configTopic.c_str(), configPayload.c_str());

Пояснение: Home Assistant автоматически создаст сенсор.

12. Оптимизация кода для уменьшения размера прошивки

Задача: Уместить скетч в ограниченную память.

Промт:

Мой скетч для Arduino Nano занимает 95% памяти. Предложи способы оптимизации: замену библиотек, удаление неиспользуемого кода, использование PROGMEM. Приведи примеры.

Пример результата: LLM предложит использовать F() макрос для строк, отказаться от динамического выделения памяти, заменить String на char[].

Пояснение: Всегда проверяйте размер после изменений.

Заключение

Промты для AI-ассистентов — это новый инструмент в арсенале embedded-разработчика. Они не заменят знания электроники и опыт отладки, но могут ускорить рутину и подсказать неочевидные решения. Экспериментируйте, адаптируйте примеры под свои задачи и делитесь находками. А если хотите глубже погрузиться в IoT и робототехнику — изучайте документацию, даташиты и не бойтесь задавать вопросы AI. Удачи в сборке!

← Все статьи

Комментарии

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

ChatGPT и Python для алгоритмов: 12 промтов, которые заменят репетитора по структурам данных

7 октября 2026

Как ускорить PostgreSQL и MongoDB в 10 раз: 12 промтов для оптимизации запросов и индексов без администратора БД

7 октября 2026

12 промтов, которые превращают LLM в дежурного DBA: PostgreSQL, MongoDB и Redis под нагрузкой

7 октября 2026

Облачные нативные технологии — микросервисы, Kubernetes и облачные технологии: ваш путь к современной инфраструктуре

7 октября 2026

Real-time системы (WebSockets, WebRTC): как перестать тормозить и начать жить в реальном времени

7 октября 2026

Инженер по AI-тестированию: как автоматизация тестирования на основе ИИ решает проблему нестабильных тестов и самовосстанавливающихся сбоев

7 октября 2026

11 промтов для Python-разработчика: тренируем LeetCode, структуры данных и System Design без выгорания

7 октября 2026

11 промтов для Go и Rust: от gRPC-хендлеров до обхода borrow checker в высоконагруженном бэкенде

6 октября 2026

ChatGPT в Excel и вокруг 1С: 11 промтов для бухгалтера, которые ускоряют закрытие месяца и сверку актов

6 октября 2026