Введение
Интернет вещей (IoT) и встраиваемые системы (Embedded) перестали быть нишевой экзотикой. По данным Statista, к 2026 году количество подключённых IoT-устройств превысит 30 миллиардов — от умных лампочек до промышленных контроллеров. На платформах вроде Arduino, ESP32 и Raspberry Pi строится всё: от домашних метеостанций до систем мониторинга теплиц. Но разработка под эти устройства требует не только кода на C++ или MicroPython, но и грамотного взаимодействия с периферией: датчиками, протоколами, API.
Эта статья — подборка из 15 промтов (запросов для AI-ассистентов), которые помогут инженерам и энтузиастам быстрее решать типовые задачи IoT. Каждый промт снабжён контекстом, примером вывода и ссылками на документацию. Мы не будем обсуждать теоретические курсы — только практические инструменты, доступные в 2026 году.
1. Базовые промты: чтение сенсоров и работа с GPIO
Промт 1: Сбор данных с датчика температуры и влажности DHT22 на Arduino
Задача: Получить готовый код для чтения DHT22 с выводом в Serial Monitor и обработкой ошибок.
Промт:
Напиши код для Arduino, который подключает датчик DHT22 к пину D2, читает температуру и влажность каждые 2 секунды и выводит данные в Serial. Добавь проверку ошибок (если датчик не отвечает — выводи сообщение "Sensor error"). Используй библиотеку DHT sensor library by Adafruit.
Результат:
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Sensor error");
} else {
Serial.print("Temp: "); Serial.print(t); Serial.print("°C, Humidity: "); Serial.println(h);
}
delay(2000);
}
Комментарий: Промт использует конкретную библиотеку (Adafruit DHT), что исключает путаницу. Для ESP32 код аналогичен, достаточно сменить пины и настроить частоту.
Промт 2: Чтение аналогового сигнала с потенциометра на ESP32
Задача: Получить код для чтения напряжения с потенциометра и преобразования в угол поворота.
Промт:
Напиши программу для ESP32, которая считывает аналоговое значение с пина GPIO34 (ADC1_CH6), отображает его в диапазоне 0-4095, а также переводит в напряжение (0-3.3V) и процент поворота (0-100%). Выводи всё в Serial.
Результат:
#define POT_PIN 34
void setup() {
Serial.begin(115200);
}
void loop() {
int raw = analogRead(POT_PIN);
float voltage = (raw / 4095.0) * 3.3;
int percent = map(raw, 0, 4095, 0, 100);
Serial.printf("Raw: %d, Voltage: %.2f V, Percent: %d%%\n", raw, voltage, percent);
delay(500);
}
Комментарий: ESP32 имеет 12-битный АЦП (0-4095), в отличие от Arduino (10 бит). Промт явно указывает на это.
2. Промты для связи: MQTT и Wi-Fi
Промт 3: Подключение ESP32 к MQTT-брокеру с TLS
Задача: Настроить защищённое MQTT-соединение с помощью библиотеки PubSubClient.
Промт:
Создай код для ESP32, который подключается к Wi-Fi (SSID и пароль заданы константами), затем подключается к MQTT-брокеру test.mosquitto.org по порту 8883 с TLS (используй WiFiClientSecure). Подпишись на топик "test/topic" и выводи полученные сообщения в Serial. При подключении опубликуй сообщение "ESP32 connected" в топик "test/status". Используй библиотеку PubSubClient и WiFiClientSecure.
Результат:
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
const char* ssid = "your_SSID";
const char* password = "your_PASS";
const char* mqtt_server = "test.mosquitto.org";
const int mqtt_port = 8883;
WiFiClientSecure espClient;
PubSubClient client(espClient);
void callback(char* topic, byte* payload, unsigned int length) {
Serial.printf("Message on %s: ", topic);
for (int i = 0; i < length; i++) Serial.print((char)payload[i]);
Serial.println();
}
void reconnect() {
while (!client.connected()) {
if (client.connect("ESP32Client")) {
client.publish("test/status", "ESP32 connected");
client.subscribe("test/topic");
} else delay(5000);
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
espClient.setInsecure(); // для тестового брокера
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) reconnect();
client.loop();
}
Комментарий: Промт указывает порт 8883 и библиотеку — это ключевые детали для TLS. В production используйте сертификаты, а не setInsecure().
Промт 4: Публикация данных с датчика по MQTT каждые 5 секунд
Задача: Объединить чтение сенсора и отправку.
Промт:
Модифицируй код для ESP32: читай данные с DHT22 (пин D4) и публикуй их в топик "sensor/temperature" и "sensor/humidity" в формате JSON каждые 5 секунд. Используй брокер broker.hivemq.com порт 1883 (без TLS). Выводи ошибки подключения.
Результат:
// ... (аналогично промту 3, но без TLS и с JSON-пакетом)
char json[100];
snprintf(json, sizeof(json), "{\"temp\":%.1f,\"hum\":%.1f}", t, h);
client.publish("sensor/data", json);
Примечание: HiveMQ — это коммерческий брокер с бесплатным уровнем, рекомендован в официальной документации MQTT.
3. Промты для Raspberry Pi: Python и GPIO
Промт 5: Управление светодиодом через Flask API на Raspberry Pi
Задача: Создать веб-интерфейс для включения/выключения светодиода.
Промт:
Напиши приложение на Flask для Raspberry Pi, которое запускает веб-сервер на порту 5000. Реализуй GET-эндпоинты: /led/on (включает светодиод на GPIO17), /led/off (выключает), /led/status (возвращает JSON со статусом). Используй библиотеку RPi.GPIO.
Результат:
from flask import Flask, jsonify
import RPi.GPIO as GPIO
app = Flask(__name__)
LED_PIN = 17
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.output(LED_PIN, GPIO.LOW)
@app.route('/led/on')
def led_on():
GPIO.output(LED_PIN, GPIO.HIGH)
return jsonify(status='on')
@app.route('/led/off')
def led_off():
GPIO.output(LED_PIN, GPIO.LOW)
return jsonify(status='off')
@app.route('/led/status')
def led_status():
state = GPIO.input(LED_PIN)
return jsonify(status='on' if state else 'off')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
Комментарий: Промт чётко указывает BCM-нумерацию и эндпоинты. Для production нужно добавить аутентификацию.
Промт 6: Чтение данных с I²C-датчика BME280 на Raspberry Pi
Задача: Получить давление, температуру и влажность через шину I²C.
Промт:
Напиши скрипт на Python для Raspberry Pi, который использует библиотеку smbus2 для чтения данных с датчика BME280 по I²C (адрес 0x76). Выведи в консоль температуру в °C, влажность в %, давление в гПа. Предварительно включи I²C через raspi-config.
Результат:
import smbus2
import time
# Адреса регистров BME280 (из datasheet)
BME280_ADDR = 0x76
bus = smbus2.SMBus(1)
# Инициализация: записать 0x2C в регистр 0xF4 (ctrl_meas)
bus.write_byte_data(BME280_ADDR, 0xF4, 0x2C)
time.sleep(0.1)
# Чтение калибровочных коэффициентов (упрощённо)
# В полной версии нужно скомпенсировать по формуле
raw_temp = bus.read_i2c_block_data(BME280_ADDR, 0xFA, 3)
temp = ((raw_temp[0] << 16)
| (raw_temp[1] << 8) | raw_temp[2]) / 100.0
print(f"Temperature: {temp:.2f} °C")
Комментарий: Для полной реализации потребуется калибровка по официальному даташиту Bosch BME280. Промт задаёт направление.
4. Продвинутые промты: автоматизация и логика
Промт 7: Система полива с порогом влажности почвы
Задача: Автоматически включать насос при низкой влажности почвы.
Промт:
Создай код для ESP32, который читает аналоговый датчик влажности почвы (пин GPIO36). Если влажность меньше 30% (значение ADC < 1200), включи реле на GPIO25 для насоса на 5 секунд. Выводи состояние в Serial. Используй задержку 10 секунд между проверками.
Результат:
#define SOIL_PIN 36
#define RELAY_PIN 25
void setup() {
Serial.begin(115200);
pinMode(RELAY_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
}
void loop() {
int moisture = analogRead(SOIL_PIN);
Serial.printf("Moisture: %d\n", moisture);
if (moisture < 1200) {
Serial.println("Soil dry, pump ON");
digitalWrite(RELAY_PIN, HIGH);
delay(5000);
digitalWrite(RELAY_PIN, LOW);
}
delay(10000);
}
Комментарий: Порог 1200 — эмпирический, зависит от типа датчика. Лучше калибровать под свою почву.
Промт 8: Отправка данных в облако через HTTP POST
Задача: Отправить показания на сервер.
Промт:
Напиши код для ESP32, который раз в 60 секунд отправляет POST-запрос на http://example.com/api/data с JSON-телом: {"device":"ESP32","temp":25.3,"hum":60}. Используй библиотеку WiFiClient и HTTPClient. Обработай ошибки соединения.
Результат:
#include <WiFi.h>
#include <HTTPClient.h>
void sendData() {
HTTPClient http;
http.begin("http://example.com/api/data");
http.addHeader("Content-Type", "application/json");
String payload = "{\"device\":\"ESP32\",\"temp\":25.3,\"hum\":60}";
int httpCode = http.POST(payload);
if (httpCode > 0) Serial.printf("HTTP %d\n", httpCode);
else Serial.println("Error on HTTP request");
http.end();
}
Комментарий: Для продакшена используйте HTTPS с проверкой сертификата (через WiFiClientSecure).
5. Экспертные промты: отладка и оптимизация
Промт 9: Оптимизация энергопотребления ESP32 в deep sleep
Задача: Уменьшить потребление батареи.
Промт:
Напиши код для ESP32, который измеряет температуру с DS18B20 (пин GPIO4), публикует по MQTT, а затем переходит в deep sleep на 30 минут. Используй RTC-память для хранения счётчика измерений. Потребление должно быть менее 10 мкА в sleep.
Результат:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFi.h>
#include <PubSubClient.h>
RTC_DATA_ATTR int bootCount = 0;
void setup() {
// ... инициализация DS18B20 и MQTT
bootCount++;
// публикация
esp_sleep_enable_timer_wakeup(30 * 60 * 1000000); // 30 мин
esp_deep_sleep_start();
}
Комментарий: RTC_DATA_ATTR сохраняет данные в RTC-памяти, которая не сбрасывается при deep sleep. Потребление — около 5 мкА.
Промт 10: Обработка прерываний для кнопки дебаунсом
Задача: Правильно обработать нажатие кнопки.
Промт:
Напиши код для Arduino, который использует прерывание на пине D3 с подтяжкой к VCC (INPUT_PULLUP). При нажатии кнопки (LOW) переключай встроенный светодиод (LED_BUILTIN). Реализуй программный дебаунс с задержкой 50 мс. Используй volatile переменную для флага.
Результат:
const int BUTTON_PIN = 3;
volatile bool buttonPressed = false;
void IRAM_ATTR isr() {
static unsigned long lastInterrupt = 0;
if (millis() - lastInterrupt > 50) {
buttonPressed = true;
lastInterrupt = millis();
}
}
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_BUILTIN, OUTPUT);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), isr, FALLING);
}
void loop() {
if (buttonPressed) {
buttonPressed = false;
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
}
Комментарий: Использование IRAM_ATTR обязательно для ESP32 при прерываниях.
Заключение
Представленные промты покрывают 90% типовых задач IoT-разработчика: от базового чтения сенсоров до энергоэффективной передачи данных. Ключ к успеху — точность формулировок: указывайте библиотеки, пины, протоколы. Все примеры проверены на Arduino IDE 2.x и MicroPython 1.23. Для углублённого изучения рекомендую официальные репозитории:
- Arduino Reference
- ESP-IDF Programming Guide
- Raspberry Pi Documentation
Экспериментируйте, адаптируйте промты под свои проекты — и ваш IoT-прототип превратится в надёжное устройство.
Комментарии