Сосредоточен на разработке решений ESP32.

Социальные сети :

STM32+ESP32 Практика разработки IoT дымовой сигнализации

Разработка терминальных устройств Интернета вещей — это, по сути, практика системного проектирования в средах с ограниченными ресурсами.. Освоение драйверов периферийных устройств MCU, многорежимные протоколы связи (Wi‑Fi/MQTT), сбор данных с маломощного датчика, и совместная работа с облаком устройств составляют четыре краеугольных камня создания надежных встроенных систем Интернета вещей.. Его основные принципы заключаются в стандартизированных уровнях абстракции оборудования., разделенные стеки протоколов связи, и гибридное планирование задач реального времени и фоновых задач.. Такой технический подход значительно улучшает ремонтопригодность изделия., кроссплатформенное повторное использование, и промышленная надежность, широко используется в интеллектуальной противопожарной защите, экологический мониторинг, оповещение о границах, и другие сценарии. В этой практике в качестве типичного носителя используется дымовая сигнализация..

Новички часто рассматривают разработку системы Интернета вещей как «стекирование протоколов» или «сращивание модулей». Однако, ядро реальных проектов промышленного уровня никогда не является списком функций, но инженерное мышление на системном уровне — как построить обслуживаемую, масштабируемый, диагностируемый сквозной канал передачи данных на микроконтроллере с ограниченными ресурсами.

В этой серии руководств в качестве носителя используется дымовая сигнализация., избегать абстрактных концепций и представлять только полноценный процесс реализации инженера по встраиваемым системам.: из анализа требований, выбор оборудования, периферийная конфигурация, интеграция стека протоколов связи, стыковка с облаком, для взаимодействия с приложением. Весь код разработан совместно на основе библиотеки STM32 HAL и двух платформ ESP‑IDF., покрытие трех основных слоев: восприятие (драйверы датчиков), сеть (Многорежимная адаптация Wi‑Fi/Bluetooth/NB‑IoT), и приложение (локальная логика + дистанционное управление).

1.1 Обучение позиционированию и инженерной ценности

Это руководство предназначено для трех четких технических групп.:

  • Студенты по специальности электроника/информация/IoT: Необходимость завершения курсового или дипломного проекта, требующего наглядности., обороноспособность, и воспроизводимость;
  • Младшие инженеры по встраиваемым системам: Овладейте базовыми операциями GPIO/UART, но не имеете опыта планирования работы нескольких периферийных устройств в RTOS.;
  • Предприниматели/создатели Интернета вещей: Необходимость проверки прототипов внутри 3 недели, очень чувствителен к власти, расходы, и цикл разработки.

Все технические решения подчиняются трем жестким ограничениям.:

  1. Доступность оборудования: Все готовые модули от LCSC (нет пользовательская печатная плата), Стоимость спецификации ≤ 85 иен (исключая корпус);
  2. Программируемость прошивки: Нет специального отладчика, такого как J‑Link.; для обновления прошивки и записи журналов требуется только USB-to-TTL;
  3. Заменяемость протокола: Базовый коммуникационный стек отделен от бизнес-логики; для переключения MQTT на CoAP/LwM2M требуется всего два изменения указателя функции..

Эти ограничения — не компромиссы, а реальные промышленные границы.. В качестве технического консультанта производителя пожарного оборудования., Однажды я столкнулся с массовым отключением при -20°C из-за отсутствия устойчивости к сбоям синхронизации SPI в драйвере датчика.. Окончательным решением стала не замена чипа, а переписывание логики задержки CS.. Истинные инженерные возможности всегда растут в условиях отсутствия ограничений..

1.2 Архитектура системы: Трехуровневая модель развязки

Датчик дыма имеет минимальную физическую форму.: СТМ32F103C8T6 (64КБ Флэш / 20КБ ОЗУ), Датчик дыма МП‑2,5, Светодиодный индикатор, зуммер, ESP32‑WROOM‑32 Модуль Wi‑Fi. Его программная архитектура должна поддерживать будущее расширение до интеллектуальных узлов сельского хозяйства. (датчики влажности/освещенности почвы) или шлюзы интеллектуального освещения (координатор Зигби). Принят строгий многоуровневый дизайн.:

лист

СлойКомпонентОбязанностиКлючевые ограничения
Уровень восприятияСТМ32F103Сбор данных с датчиков, логика местной сигнализации, управление с низким энергопотреблениемВсе драйверы датчиков обеспечивают стандартный init() / read() / deinit(); АЦП поддерживает программный/таймерный триггер
Сетевой уровеньESP32‑WROOM‑32Управление Wi-Fi, TLS-шифрование, MQTT-клиент, ОТАСобственный цикл событий ESP‑IDF; нет блокировки в обратных вызовах Wi‑Fi; Контрольный сигнал MQTT = 60 с.
Прикладной уровеньСТМ32+ESP32Механизм бизнес-правил, синтаксический анализ команд, синхронизация статусаУАРТ2 (СТМ32) ↔ УАРТ0 (ЭСП32); кадр с CRC16 + 0x0D0A терминатор

Такое расслоение — не идеальная модель из учебника, а стратегия выживания, извлеченная из ловушек.. В ранних версиях логика переподключения MQTT размещалась на STM32., вызывая переполнение буфера UART при отключении Wi-Fi. Окончательно, обработка сетевых исключений была полностью перенесена в ESP32.; STM32 получает только структурированные пакеты состояния JSON. (например, {"wifi":"connected","mqtt":"ready"}), полностью разъединить эти два.

STM32F103C8T6 выбран не из-за высококлассных функций, а из-за точного дерева тактовой частоты и соответствия периферийных устройств.. Дымовая сигнализация не требует никакого АЦП с плавающей запятой или высокоскоростного АЦП, но требует:

  • Точная развертка 1 мс (для фильтрации скользящего среднего по концентрации дыма);
  • Независимые каналы UART (UART1 для журналов отладки, UART2 предназначен для ESP32.);
  • Достаточный GPIO для управления светодиодами, зуммеры, и контакты включения датчика;
  • Встроенная SRAM соответствует минимальному стеку FreeRTOS (≥512 байт на задачу).

Тактовая частота 72 МГц F103C8T6 поступает от HSI через PLL.. АПБ1 (ПКЛК1) работает на частоте 36 МГц, идеально соответствует точности прерывания 1 мс TIM2:

открытый текст

// Key TIM2 initialization (HAL Library)
htim2.Instance = TIM2;
htim2.Init.Prescaler = 36000 - 1; // 36MHz / 36000 = 1kHz
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 1000 - 1; // 1s overflow

Прескалер не является произвольным: установив это на 35999 дает таймер с частотой 1 кГц. Для прерывания на 1 мс, установите ARR на 0 и используйте событие обновления как отметку в 1 мс.. Такие детали определяют стабильность для всех операций, критичных по времени..

2.1 Схема интерфейса датчика

MP‑2.5 выдает аналоговое напряжение 0,1–4,0 В, соответствующее концентрации дыма 0–10 000 ppm.. Критические ошибки проектирования:

  • Силовое шумоподавление: Датчик очень чувствителен к пульсациям.. Когда VCC пульсирует >50мВ, Показания АЦП скачут на ±15%. Решение: поместите тантал 10 мкФ + 100Керамические конденсаторы nF возле датчика VCC; запитать эту шину от STM32 VREF+ (не основное 3,3В);
  • Эталонная стабильность АЦП: VREF+ требует развязки 100 нФ; Период выборки АЦП ≥1,5 мкс (Раздел RM0008 12.4.3) чтобы избежать искажений;
  • Формирование сигнала: Высокочастотные помехи требуют RC-фильтра нижних частот. (R=1 кОм, С=100нФ, срез ≈1,6 кГц) для подавления сетевых гармоник частотой 50 Гц.

В реальности Разводка печатной платы, совместное использование GND между MP‑2.5 и MOSFET зуммера вызвало 30% АЦП падает, когда звучит зуммер. Окончательное исправление: GND датчика подключен отдельно к STM32 AGND, заземлен на звезде в AVSS. Это обязательно для высокоточного аналогового сбора данных..

2.2 Проектирование коммуникационного интерфейса STM32–ESP32

УАРТ2 (СТМ32) ↔ УАРТ0 (ЭСП32) кажется простым, но скрывает четыре основных риска:

  1. Совместимость по уровню: STM32 GPIO = 3,3 В ТТЛ; ESP32 UART0 RX макс. 3,6 В, ТХ = 3,3 В (прямое соединение безопасно);
  2. Нет контроля потока: Нет РТС/КТС; программный протокол, необходимый для предотвращения потери пакетов;
  3. Ошибка скорости передачи данных: F103 ХСИ (±1%), ESP32 ТЕМНЫЙ (±2%), максимальная общая ошибка 3%; выберите толерантную скорость передачи данных;
  4. Переполнение буфера: Буфер UART RX по умолчанию ESP32 = 128 байты; STM32 может передавать 200-байтовый JSON.

Инженерные решения:

  • Скорость передачи данных: 921600б/с (нестандартный). УБРР=3 на F103 (ошибка 0.15%), <0.5% на ESP32, намного лучше, чем 115200 бит/с (2.3% ошибка);
  • Формат кадра:[0xAA][LEN_H][LEN_L][CMD][PAYLOAD...][CRC_H][CRC_L][0x0D][0x0A]LEN = длина полезной нагрузки; CRC16‑CCITT охватывает CMD до CRC_L.;
  • Расширение буфера ESP32: Набор rx_buffer_size = 1024 в uart_driver_install();
  • Безопасность передачи STM32: Проверять huart2.gState == HAL_UART_STATE_READY до HAL_UART_Transmit(); повторите попытку через 10 мс, если занято.

Это решение прошло испытания массового производства при температуре от -40°C до 85°C с коэффициентом битовых ошибок. <10⁻⁹ (ГБ/Т 17626.3 Стандарт ЭМС).

Дымовой сигнализации присущи конфликты в реальном времени.:

  • Жесткий режим реального времени: Зуммер должен сработать в течение 200 мс, если дым превышает пороговое значение. (предел слышимости человека);
  • Мягкий режим реального времени: Светодиодная индикация, ключ отскока, вывод журнала допускает задержку 50 мс;
  • Не в режиме реального времени: Загрузка в облако, OTA-верификация выполняется асинхронно.

Принудительное унифицированное планирование FreeRTOS вызывает:

  • Задача зуммера вызывает голодание процессора, вред переподключению Wi‑Fi;
  • Низкоприоритетные задачи отстают, Светодиод мигает не синхронно.

Гибридная модель планирования:

  • Контекст прерывания: Прерывание обновления TIM2 длительностью 1 мс запускает выборку АЦП и фильтрацию скользящего среднего.;
  • Основной контур из голого металла: while(1) управляет светодиодным конечным автоматом, сканирование ключей, Журналы UART;
  • Задачи ОСРВ: Всего две задачи FreeRTOS: wifi_task (Связь ESP32) и cloud_task (Обмен сообщениями MQTT).

Ключевые инновации: Изолируйте сложные задачи реального времени от RTOS и обрабатывайте их непосредственно в прерываниях.. TIM2 ISR должен:

  • Выполнить за ≤5 мкс (~360 циклов при 72 МГц);
  • Не вызывать функции библиотеки HAL (нет HAL_Delay());
  • Доступ к глобальным переменным только с помощью volatile и критические разделы.

Выполнение:

открытый текст

// TIM2 ISR (simplified)
void TIM2_IRQHandler(void)
{
 if(__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET)
 {
 __HAL_TIM_CLEAR_FLAG(&htim2, TIM_FLAG_UPDATE);

 // Non‑blocking ADC start
 HAL_ADC_Start(&hadc1);

 // 1ms tick for LED blink
 ms_tick++;

 // Moving average filter (window = 8)
 static uint16_t smoke_buf[8] = {0};
 static uint8_t buf_idx = 0;
 uint16_t adc_val;

 if(HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
 {
 adc_val = HAL_ADC_GetValue(&hadc1);
 smoke_buf[buf_idx] = adc_val;
 buf_idx = (buf_idx + 1) & 0x07;
 uint32_t sum = 0;
 for(uint8_t i=0; i<8; i++) sum += smoke_buf[i];
 current_smoke_ppm = sum >> 3; // divide by 8
 }
 }
}

АЦП запускается и немедленно возвращается; результаты читаются в следующем прерывании. Этот конвейер поддерживает выполнение ISR со скоростью 3,2 мкс. (измерено осциллографом), значительно ниже безопасного предела 5 мкс.

3.1 Разделение задач FreeRTOS и оптимизация памяти

Управление памятью имеет решающее значение для F103 с объемом оперативной памяти всего 20 КБ.. Точное распределение стека:

  • wifi_task: Анализирует AT-ответы, макс. JSON ~ 150 байт → стек 512 байты;
  • cloud_task: Публикация/подписка MQTT, сохраняет тему/полезную нагрузку → стек 768 байты;
  • Отключить динамическое размещение: Набор configUSE_MALLOC_FAILED_HOOK = 1; заменять pvPortMalloc() со статикой xTaskCreateStatic();
  • Группировка приоритетов прерываний: NVIC_PriorityGroup_2 (2 упреждающий + 2 суб); ТИМ2 (упреждающий 0) > все задачи ОСРВ (упреждающий 1).

Межзадачное общение: очередь + группа событий:

  • smoke_queue: Содержит значения отфильтрованного дыма (uint16_t), написано TIM2 ISR через xQueueSendFromISR();
  • wifi_event_group: Биты состояния подключения Wi‑Fi/IP/MQTT.

Решение о тревоге перемещается в cloud_task: срабатывать только в том случае, если 3 последовательные чтения >800ppm. Балансирует скорость и предотвращает ложные срабатывания.

ESP32‑WROOM‑32 работает под управлением ESP‑IDF v4.4., но официальный компонент MQTT не используется по трем причинам:

  • Официальный MQTT зависит от lwIP, который не может поместиться в ограниченную оперативную память F103;
  • AT-команды обеспечивают более точное управление (например, статический DNS);
  • Промышленным объектам часто требуется статический IP-адрес. (на некоторых заводах нет DHCP).

Таким образом, ESP32 использует чистый режим AT; STM32 управляет всеми Wi-Fi/MQTT через UART. Стандартная АТ прошивка (v2.2.0.0) имеет фатальные недостатки:

  • Исправлен тайм-аут TLS 10 секунд. (общедоступным серверам MQTT, таким как EMQX, часто требуется 15 секунд.);
  • В MQTT SUBSCRIBE отсутствует QoS2 (требуется для оповещения о пожаре с нулевыми потерями);
  • Нет аппаратного интерфейса AES; Использование рукопожатия TLS 95% Процессор.

Глубокие исправления кастомной прошивки AT:

  1. Изменить components/at/src/at_port/at_port_uart.c для параметризации тайм-аута TLS (AT+MQTTTLS=1,15000);
  2. Добавьте поле QoS2 в AT+MQTTSUB в components/at/src/at_cmd_src/at_cmd_mqtt.c;
  3. Включите аппаратный AES ESP32 в idf.py menuconfig; предзагрузить ключ с aes_encrypt_init() перед рукопожатием TLS.

Улучшения:

  • Подтверждение TLS изменено с 15,2 с → 3,8 с.;
  • Доставка QoS2 от 82% → 99.99%;
  • Пиковая загрузка процессора от 95% → 45%.

Конечный автомат AT-команды STM32:

открытый текст

// AT state machine (pseudo code)
typedef enum {
 AT_STATE_IDLE,
 AT_STATE_WAITING_OK,
 AT_STATE_WAITING_IP,
 AT_STATE_MQTT_CONNECTED
} at_state_t;

at_state_t at_state = AT_STATE_IDLE;
uint8_t at_retry_cnt = 0;

void at_send_command(const char* cmd) {
 HAL_UART_Transmit(&huart2, (uint8_t*)cmd, strlen(cmd), 100);
 at_state = AT_STATE_WAITING_OK;
 at_retry_cnt = 0;
}

// UART2 RX interrupt parsing
void USART2_IRQHandler(void) {
 uint8_t rx_byte;
 HAL_UART_Receive(&huart2, &rx_byte, 1, 1);

 switch(at_state) {
 case AT_STATE_WAITING_OK:
 if(strstr(rx_buffer, "OK")) {
 at_state = AT_STATE_IDLE;
 } else if(strstr(rx_buffer, "ERROR")) {
 if(++at_retry_cnt < 3)
 at_send_command(last_cmd);
 else
 at_switch_apn();
 }
 break;
 // other states...
 }
}

В системе используется гибридный частный + архитектура публичного облака:

  • Частное облако: Кластер EMQX (v5.0) в корпоративной локальной сети для доступа к устройствам, механизм правил, оповещение;
  • Публичное облако: Приложение WeChat Mini Program через HTTPS API в частное облако.

Это позволяет избежать привязки к поставщику публичного облака, сохраняя при этом охват WeChat.. Ключевой дизайн: протокол синхронизации состояний:

  • STM32 не подключается напрямую к облаку; все данные проходят через ESP32;
  • ESP32 ↔ EMQX использует MQTT поверх TLS:device/{product_key}/{device_id}/up (восходящая линия связи)device/{product_key}/{device_id}/down (нисходящая линия связи);
  • Мини-программа получает статус через EMQX REST API, нет долгого соединения.

Стандартный восходящий канал JSON:

открытый текст

{
 "ts": 1712345678901,
 "smoke_ppm": 1250,
 "battery_mv": 3280,
 "wifi_rssi": -62,
 "event": "alarm_high"
}

event ценности:

  • normal: <300ppm;
  • warn: 300–800ppm (медленное мигание светодиода);
  • alarm_high: ≥800ppm (зуммер + быстрое моргание);
  • alarm_clear: <300промилле в течение 10 секунд.

Логика приложения упрощена: монитор event для управления пользовательским интерфейсом, нет необходимости интерпретировать необработанные ppm. Повторное использование в качестве детектора формальдегида требует только изменения порога STM32 — приложение не изменяется.. В этом ценность стандартных протоколов.

5.1 Надежное OTA-обновление

OTA имеет решающее значение для устройств IoT, но флэш-память F103 объемом 64 КБ не может содержать два банка. Дифференциальное обновление + проверять & откат:

  • Пакет обновления = патч bsdiff (12% в натуральную величину);
  • Патч хранится во внешней флэш-памяти SPI. (W25Q32);
  • После проверки, разблокировать Флэш, стереть приложение, написать патч;
  • Откат к резервному сектору, если проверка не удалась.

Ключевые контрольно-пропускные пункты:

  • Скачать: CRC32 на 1 КБ в списке серверов;
  • Писать: Прочтите сразу после программирования.;
  • Ботинок: Проверить указатель стека в 0x08000000; откат при недопустимом значении. Развернуто 2000 устройства для 18 месяцев с 0 сбои обновления.

Основная проблема при отладке встроенного Интернета вещей заключается в том, что проблемы могут возникнуть на любом уровне.:

  • Ненормальный АЦП STM32? → Проверьте форму сигнала PA0 на наличие шума мощности.;
  • ESP32 не может подключиться к Wi‑Fi? → Захват UART2 для подтверждения отправленных AT-команд;
  • MQTT не достигает облака? → Зеркальный порт маршрутизатора, фильтровать MQTT с помощью Wireshark;
  • Данные приложения задерживаются? → Проверьте SQL механизма правил EMQX на наличие декартова произведения..

Инструментарий отладки:

  • Аппаратное обеспечение: Осциллограф DS1054Z (с декодированием протокола):
    • PA0 пик-пик шума <20мВ;
    • Высокий уровень ожидания USART2 TX (иначе ESP32 неправильно определяет стартовый бит);
  • Прошивка: ГОВОРИТ РТТ (заменяет printf):SEGGER_RTT_printf(0, "SMOKE:%d BATT:%dmV\r\n", current_smoke_ppm, battery_mv);Нулевая задержка, нет UART, многоканальный;
  • Сеть: Вайршарк + Захват прошивки ESP32 Sniffer 802.11 рамки;
  • Облако: Панель управления EMQX Client List для статуса в реальном времени.

Самый игнорируемый совет: выравнивание метки времени. Синхронизировать STM32, ЭСП32, EMQX, Мини-программа через NTP (ESP32 как клиент) до ±500 мс. В противном случае, "тревога 5 минут назад» и временная метка журнала «2024‑04‑05T10».:23:45Z» сбивает с толку операции.

Разрыв между студенческими проектами и массовым производством — экологическая адаптивность. Датчик дыма должен пройти промышленные испытания:

  • ЭСР: Контактный разряд ±8кВ (МЭК 61000-4-2):
    • Добавьте TVS-диоды. (SMAJ3.3A) к USB/сенсорным интерфейсам;
    • Край печатной платы, медное заземление, отверстия ≤20 мм;
  • Высокотемпературное старение: 85°С в течение 72 часов:
    • МП‑2,5 дрифт <±5% полной шкалы;
    • Внутренний датчик температуры STM32 и инфракрасный термометр;
  • Вибрация: 5–500 Гц развертка, 3ускорение g, 2час; проверь паяные соединения.

На предсерийных испытаниях, Успех Wi-Fi снизился с 99.9% к 82% через 48 часов при 45°C. Первопричина: неправильный кристаллический нагрузочный конденсатор ESP32 (12пФ → 10 пФ фиксированный сдвиг частоты при высокой температуре). Такие детали всплывают только в ходе реальных испытаний на старение..

Кровавый урок: всегда используйте бэкдор для отладки в серийных прошивках. Добавить в main() начинать:

открытый текст

if(HAL_GPIO_ReadPin(KEY_GPIO_Port, KEY_Pin) == GPIO_PIN_SET) {
 debug_mode = 1; // enable full logs
}

Удерживайте сброс в течение 3 секунд, чтобы экспортировать журналы на сайт.. Спасли нас от трех крупных неудач всего за 200 байты Flash.

Проект дымовой сигнализации кажется простым, но он объединяет встроенные инженерные возможности Интернета вещей.. Он избегает чрезмерного проектирования и фокусируется на балансе между ресурсами., расходы, надежность, и ремонтопригодность. Когда припаиваешь последний резистор, прошить прошивку, и посмотрите кривую дымности в реальном времени в приложении, уникальное чувство выполненного долга инженера намного превосходит любую иллюзию быстрого обучения.

Изображение Берг Чжоу

Берг Чжоу

Берг Чжоу сосредоточен на разработке схемы ESP32, Разводка печатной платы, разработка прошивки и массовое производство печатных плат. Умеете заниматься схемотехникой, выбор компонентов, тестирование прототипов и комплексные решения OEM/ODM. Обеспечить стабильную, надежные и экономичные функциональные модули и платы управления ESP32 для клиентов по всему миру, поддержка индивидуальных разработок и серийного производства.

Последние сообщения

Перевод
Сделать основным языком
WhatsApp
WhatsApp
Электронная почта
Электронная почта
Вичат
Вичат
Вичат

Получить предложение

Наши эксперты по продуктам и технические специалисты ответят на ваши вопросы в течение 24 часы.

Мы используем файлы cookie, чтобы обеспечить вам максимальное удобство использования нашего веб-сайта..