Введение
Интернет вещей (IoT) и встраиваемые системы (Embedded) — это не просто тренд, а основа современной автоматизации. Миллионы устройств ежедневно обмениваются данными, управляют освещением, собирают метеоданные и контролируют промышленные процессы. Разработчики на Arduino, ESP32 и Raspberry Pi сталкиваются с рутиной: написание однотипного кода для сенсоров, настройка MQTT, отладка прошивок. Как ускорить работу? Ответ — промты. В этой подборке — 10 проверенных промтов, которые я сам использую в проектах. Они экономят часы и помогают избежать типичных ошибок. Никакой воды — только практика.
1. Генерация базовой прошивки для считывания данных с сенсора
Начинающие часто тратят время на написание кода для простого считывания. Используйте этот промт для быстрого старта.
Промт: «Напиши код на C++ для Arduino, который считывает температуру и влажность с датчика DHT22 и выводит данные в Serial Monitor каждые 5 секунд. Добавь обработку ошибок при подключении датчика.»
Пример вывода (сокращённо):
#include <DHT.h>
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Ошибка DHT22");
return;
}
Serial.print("Влажность: "); Serial.print(h);
Serial.print("%, Температура: "); Serial.print(t); Serial.println("°C");
delay(5000);
}
Совет: Всегда проверяйте пины в даташите. Для DHT22 используйте библиотеку DHT sensor library от Adafruit — она стабильна и обновляется. Подробнее о библиотеках на asibiont.com/courses.
2. Настройка MQTT на ESP32 для облачной передачи данных
MQTT — стандарт для IoT. Промт ниже генерирует готовый код с подключением к брокеру.
Промт: «Создай код для ESP32 на Arduino IDE, который подключается к Wi-Fi (SSID: MyWiFi, пароль: pass123), затем к MQTT-брокеру broker.hivemq.com на порту 1883. Публикуй топик "sensor/temperature" со случайным значением от 20 до 30 каждые 10 секунд. Используй библиотеку PubSubClient.»
Пример вывода:
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "MyWiFi";
const char* password = "pass123";
const char* mqtt_server = "broker.hivemq.com";
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
client.setServer(mqtt_server, 1883);
}
void loop() {
if (!client.connected()) {
client.connect("ESP32Client");
}
client.loop();
float temp = random(200, 300) / 10.0;
char msg[8];
dtostrf(temp, 1, 1, msg);
client.publish("sensor/temperature", msg);
delay(10000);
}
Важно: В реальных проектах используйте локальный брокер (например, Mosquitto) для снижения задержек. HiveMQ — отличный выбор для тестов, но для продакшена рассмотрите AWS IoT Core или VerneMQ.
3. Автоматизация управления реле на Raspberry Pi с веб-интерфейсом
Raspberry Pi часто используется как хаб. Промт создаёт Flask-приложение для управления GPIO.
Промт: «Напиши Python-скрипт для Raspberry Pi с использованием Flask, который включает и выключает светодиод на GPIO 17 через веб-интерфейс. Добавь две кнопки: "Вкл" и "Выкл". Используй библиотеку RPi.GPIO.»
Пример вывода:
from flask import Flask, render_template_string
import RPi.GPIO as GPIO
app = Flask(__name__)
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
HTML = """
<html>
<body>
<h1>Управление светодиодом</h1>
<a href="/on"><button>Вкл</button></a>
<a href="/off"><button>Выкл</button></a>
</body>
</html>
"""
@app.route("/")
def index():
return render_template_string(HTML)
@app.route("/on")
def turn_on():
GPIO.output(17, GPIO.HIGH)
return "Включено"
@app.route("/off")
def turn_off():
GPIO.output(17, GPIO.LOW)
return "Выключено"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
Примечание: Запускайте скрипт с sudo, если используете RPi.GPIO. Для продакшена добавьте аутентификацию — хотя бы базовую HTTP Basic Auth.
4. Интеграция датчика движения (PIR) с отправкой уведомлений в Telegram
Автоматизация безопасности — частая задача. Промт генерирует код для ESP8266.
Промт: «Напиши код для ESP8266, который при срабатывании датчика движения HC-SR501 отправляет сообщение в Telegram через Bot API. Токен бота: 123456:ABCdef, chat ID: 987654321. Подключайся к Wi-Fi: SSID HomeNet, пароль qwerty.»
Пример вывода (сокращённо):
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
const char* ssid = "HomeNet";
const char* password = "qwerty";
const char* botToken = "123456:ABCdef";
const char* chatId = "987654321";
const int pirPin = D1;
void setup() {
Serial.begin(115200);
pinMode(pirPin, INPUT);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
}
void loop() {
if (digitalRead(pirPin) == HIGH) {
sendMessage("Движение обнаружено!");
delay(30000); // защита от ложных срабатываний
}
}
void sendMessage(String msg) {
WiFiClientSecure client;
client.setInsecure();
if (client.connect("api.telegram.org", 443)) {
String url = "/bot" + String(botToken) + "/sendMessage?chat_id=" + String(chatId) + "&text=" + msg;
client.print(String("GET ") + url + " HTTP/1.1\r\nHost: api.telegram.org\r\nConnection: close\r\n\r\n");
}
}
Важно: В production используйте HTTPS с сертификатами. Telegram Bot API поддерживает только SSL. ASI Biont поддерживает подключение к Telegram через API — подробнее на asibiont.com/courses.
5. Логирование данных с SD-карты на Arduino
Для офлайн-сбора данных полезно хранить показания на карте памяти.
Промт: «Напиши скетч для Arduino Uno, который считывает аналоговое значение с A0 (потенциометр) каждую минуту и записывает его в файл data.csv на SD-карту. Используй библиотеку SD.h.»
Пример вывода:
#include <SD.h>
#include <SPI.h>
const int chipSelect = 10;
void setup() {
Serial.begin(9600);
if (!SD.begin(chipSelect)) {
Serial.println("SD-карта не найдена");
return;
}
Serial.println("SD готова");
}
void loop() {
int value = analogRead(A0);
File dataFile = SD.open("data.csv", FILE_WRITE);
if (dataFile) {
dataFile.print(millis());
dataFile.print(",");
dataFile.println(value);
dataFile.close();
}
delay(60000);
}
Совет: Форматируйте SD-карту в FAT32. Для больших объёмов данных используйте циклический буфер.
6. OTA-обновление прошивки на ESP32
Обновлять прошивку по воздуху — удобно, когда устройство уже смонтировано.
Промт: «Добавь поддержку OTA (Over-the-Air) в существующий код для ESP32. Используй библиотеку ArduinoOTA. Установи пароль "ota123" и хостнейм "esp32-sensor".»
Пример вывода:
#include <WiFi.h>
#include <ArduinoOTA.h>
const char* ssid = "MyWiFi";
const char* password = "pass123";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
ArduinoOTA.setHostname("esp32-sensor");
ArduinoOTA.setPassword("ota123");
ArduinoOTA.begin();
}
void loop() {
ArduinoOTA.handle();
// ваш основной код
}
Важно: Используйте OTA только в доверенной сети. Для промышленных систем добавьте подтверждение обновления.
7. Парсинг JSON с погодного API на Raspberry Pi
Многие IoT-проекты требуют получения данных из интернета.
Промт: «Напиши Python-скрипт для Raspberry Pi, который делает GET-запрос к OpenWeatherMap API (ключ: test_key, город: Moscow) и выводит текущую температуру и описание погоды. Используй библиотеку requests.»
Пример вывода:
import requests
api_key = "test_key"
city = "Moscow"
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric"
response = requests.get(url)
if response.status_code == 200:
data = response.json()
temp = data["main"]["temp"]
desc = data["weather"][0]["description"]
print(f"Температура: {temp}°C, {desc}")
else:
print("Ошибка API")
Совет: Для продакшена кешируйте ответы, чтобы не превышать лимиты API (обычно 60 запросов в минуту).
8. Энергосбережение с deep sleep на ESP32
Для автономных датчиков на батарейках критично снижать энергопотребление.
Промт: «Модифицируй код для ESP32, чтобы он просыпался из deep sleep каждые 30 минут, считывал температуру с DS18B20 на GPIO 4, отправлял по MQTT и снова засыпал. Используй библиотеку OneWire.»
Пример вывода (сокращённо):
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(115200);
sensors.begin();
sensors.requestTemperatures();
float temp = sensors.getTempCByIndex(0);
// отправка MQTT
esp_sleep_enable_timer_wakeup(30 * 60 * 1000000); // 30 минут
esp_deep_sleep_start();
}
void loop() {}
Важно: В deep sleep ESP32 потребляет около 10 мкА, что даёт месяцы работы от батареи 18650.
9. Управление сервоприводом через веб-интерфейс на ESP8266
Дистанционное управление механизмами — частая задача умного дома.
Промт: «Создай веб-сервер на ESP8266, который через HTTP-запросы управляет сервоприводом SG90 на GPIO 2. URL: /servo?angle=90. Используй библиотеку Servo.h.»
Пример вывода:
#include <ESP8266WiFi.h>
#include <Servo.h>
Servo myservo;
const char* ssid = "...";
const char* password = "...";
WiFiServer server(80);
void setup() {
myservo.attach(2);
WiFi.begin(ssid, password);
server.begin();
}
void loop() {
WiFiClient client = server.available();
if (client) {
String request = client.readStringUntil('\r');
if (request.indexOf("/servo?angle=") != -1) {
int angle = request.substring(request.indexOf("=") + 1).toInt();
myservo.write(angle);
}
client.println("OK");
}
}
Совет: Добавьте ограничение угла (0–180) для защиты сервопривода.
10. Шифрование данных перед отправкой на сервер
Безопасность в IoT — не опция, а необходимость.
Промт: «Напиши код для ESP32, который шифрует строку "sensor_data" алгоритмом AES-128 в режиме CBC перед отправкой на сервер. Используй библиотеку mbedtls. Ключ: 0123456789abcdef, IV: fedcba9876543210. Выведи зашифрованные данные в hex.»
Пример вывода:
#include <mbedtls/aes.h>
void encrypt() {
unsigned char key[16] = "0123456789abcdef";
unsigned char iv[16] = "fedcba9876543210";
unsigned char input[16] = "sensor_data";
unsigned char output[16];
mbedtls_aes_context aes;
mbedtls_aes_init(&aes);
mbedtls_aes_setkey_enc(&aes, key, 128);
mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_ENCRYPT, 16, iv, input, output);
for (int i = 0; i < 16; i++) {
Serial.print(output[i], HEX);
}
mbedtls_aes_free(&aes);
}
Важно: Никогда не храните ключи в коде. Используйте аппаратный secure element или внешний менеджер секретов.
Заключение
Эти 10 промтов покрывают 80% типовых задач в IoT и Embedded: от считывания сенсоров до безопасной передачи данных. Они экономят время и снижают количество ошибок. Адаптируйте их под свои проекты: меняйте пины, SSID, топики MQTT. Главное — понимать, что делает каждый блок кода. Промты — это трамплин, а не финиш. Экспериментируйте, комбинируйте и автоматизируйте. Удачных прошивок!
Комментарии