GS32SensorHub — неблокирующая, отказоустойчивая библиотека для ESP32 (Arduino IDE), предназначенная для динамического управления группой датчиков температуры и влажности семейства DHT (DHT11, DHT22, AM2301, AM2302).
Главный приоритет библиотеки — надежность и стабильность работы всей системы. При обрыве провода, физическом отсоединении датчика или коротком замыкании линии библиотека не блокирует ядро ESP32 и не провоцирует перезагрузку по WDT (Watchdog Timer).
- Защита от зависаний (WDT-Safe): Использование микросекундных таймаутов на каждом этапе считывания сигналов.
- Неблокирующий алгоритм (
tick()): Опрос датчиков производится по интервальному таймеруmillis()без вызова задерживающей функцииdelay(). - Гибкая инициализация в
setup(): Возможность динамически регистрировать любое количество датчиков на любые доступные GPIO-пины. - Удобный API сбора данных:
- Получение состояния конкретного датчика по его ID.
- Получение единого массива состояний всех зарегистрированных датчиков.
- Полная автономность: Библиотека не требует установки никаких внешних зависимостей (Adafruit Unified Sensor и др.).
| Модель датчика | Диапазон темп. | Диапазон влажн. | Константа в коде |
|---|---|---|---|
| DHT11 | 0...50 °C (±2 °C) | 20...90 % (±5 %) | DHT_11 |
| DHT21 / AM2301 | -40...80 °C (±0.5 °C) | 0...100 % (±3 %) | DHT_21 / AM2301 |
| DHT22 / AM2302 | -40...80 °C (±0.5 °C) | 0...100 % (±2 %) | DHT_22 / AM2302 |
- Скачайте репозиторий в виде
.zipархива (или скопируйте папку проекта). - В Arduino IDE перейдите в меню:
Скетч->Подключить библиотеку->Добавить .ZIP библиотеку... - Выберите скачанный файл архива.
#include <Arduino.h>
#include "GS32SensorHub.h"
// Создаем экземпляр хаба
GS32SensorHub hub;
// Переменные для хранения уникальных ID датчиков
int8_t dht11_inside_id;
int8_t dht22_outside_id;
void setup() {
Serial.begin(115200);
// 1. Регистрируем датчики: addDHT(Тип_Датчика, GPIO_Пин)
dht11_inside_id = hub.addDHT(DHT_11, 4); // DHT11 на GPIO 4
dht22_outside_id = hub.addDHT(DHT_22, 16); // DHT22 на GPIO 16
// 2. Инициализируем пины и хаб
hub.begin();
// 3. Задаем интервал опроса в миллисекундах (по умолчанию 2000 мс)
hub.setUpdateInterval(2500);
}
void loop() {
// Вызываем tick() в каждом цикле loop. Функция неблокирующая!
hub.tick();
// Выводим данные раз в 3 секунды
static uint32_t timer = 0;
if (millis() - timer >= 3000) {
timer = millis();
Serial.println("=============================================");
// Вариант 1: Запрос конкретного датчика по ID
GS32_SensorData sensorData;
if (hub.getSensorData(dht11_inside_id, sensorData)) {
Serial.printf("DHT11 (ID %d): T = %.1f °C, H = %.1f %%\n",
sensorData.id, sensorData.temperature, sensorData.humidity);
} else {
Serial.printf("DHT11 (ID %d) не отвечает / ошибка чтения\n", dht11_inside_id);
}
// Вариант 2: Массовый обход всех зарегистрированных датчиков
const auto& allSensors = hub.getAllSensorsData();
for (const auto& sensor : allSensors) {
if (sensor.isValid) {
Serial.printf("Датчик [ID %d | PIN %d]: T = %.1f °C, H = %.1f %%\n",
sensor.id, sensor.pin, sensor.temperature, sensor.humidity);
} else {
Serial.printf("Датчик [ID %d | PIN %d]: НЕДОСТУПЕН\n",
sensor.id, sensor.pin);
}
}
}
}struct GS32_SensorData {
uint8_t id; // Назначенный уникальный ID (начиная с 0)
uint8_t pin; // Назначенный GPIO пин
DHTType type; // Тип датчика (DHT_11, DHT_21, DHT_22 и т.д.)
float temperature; // Температура в °C (NAN при ошибке)
float humidity; // Влажность в % (NAN при ошибке)
bool isValid; // true, если последние прочитанные данные корректны
uint32_t lastReadTime; // Время последнего успешного опроса (millis)
};Регистрирует новый датчик в реестре хаба.
- Параметры:
type: Модель датчика (DHT_11,DHT_21,DHT_22,AM2301,AM2302).pin: Номер GPIO пина ESP32.
- Возвращает: Назначенный ID датчика (
int8_t) или-1в случае ошибки.
Настраивает зарегистрированные GPIO-пины в режим INPUT_PULLUP. Вызывается в блоке setup().
Проверяет таймер интервала и при необходимости производит опрос датчиков. Вызывается в каждом цикле loop().
Получает последние считанные данные по конкретному ID датчика.
- Возвращает:
true, если данные валидны, иначеfalse.
Возвращает ссылку на массив с текущим состоянием всех зарегистрированных датчиков.
Задает интервал обновления данных в миллисекундах (минимально: 1000 мс).
Возвращает общее количество зарегистрированных датчиков.
Классические библиотеки работы с DHT часто вызывают падение или перезагрузку ESP32 (ошибка Guru Meditation Error / Interrupt wdt timeout), если датчик физически отключен или оборван провод, так как циклы ожидания while(digitalRead(pin) == HIGH) становятся бесконечными.
В GS32SensorHub каждый импульс считывается функцией с жестко ограниченным таймаутом (до 100 мкс). В случае отсутствия ответа опрос отменяется за доли миллисекунды, а статус датчика устанавливается в isValid = false, что полностью исключает блокировку системы.
Этот проект является частью экосистемы GS32Bios и распространяется под лицензией MIT. Вы можете свободно использовать, модифицировать и распространять данный код в своих некоммерческих и коммерческих проектах.