Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GS32SensorHub

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

Установка

  1. Скачайте репозиторий в виде .zip архива (или скопируйте папку проекта).
  2. В Arduino IDE перейдите в меню: Скетч -> Подключить библиотеку -> Добавить .ZIP библиотеку...
  3. Выберите скачанный файл архива.

💻 Быстрый старт

#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);
            }
        }
    }
}

📖 Справочник API

Структура GS32_SensorData

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)
};

Методы класса GS32SensorHub

int8_t addDHT(DHTType type, uint8_t pin)

Регистрирует новый датчик в реестре хаба.

  • Параметры:
    • type: Модель датчика (DHT_11, DHT_21, DHT_22, AM2301, AM2302).
    • pin: Номер GPIO пина ESP32.
  • Возвращает: Назначенный ID датчика (int8_t) или -1 в случае ошибки.

void begin()

Настраивает зарегистрированные GPIO-пины в режим INPUT_PULLUP. Вызывается в блоке setup().

void tick()

Проверяет таймер интервала и при необходимости производит опрос датчиков. Вызывается в каждом цикле loop().

bool getSensorData(uint8_t sensorId, GS32_SensorData &outData) const

Получает последние считанные данные по конкретному ID датчика.

  • Возвращает: true, если данные валидны, иначе false.

const std::vector<GS32_SensorData>& getAllSensorsData() const

Возвращает ссылку на массив с текущим состоянием всех зарегистрированных датчиков.

void setUpdateInterval(uint32_t intervalMs)

Задает интервал обновления данных в миллисекундах (минимально: 1000 мс).

uint8_t getSensorCount() const

Возвращает общее количество зарегистрированных датчиков.

Безопасность и WDT (Watchdog Timer)

Классические библиотеки работы с DHT часто вызывают падение или перезагрузку ESP32 (ошибка Guru Meditation Error / Interrupt wdt timeout), если датчик физически отключен или оборван провод, так как циклы ожидания while(digitalRead(pin) == HIGH) становятся бесконечными.

В GS32SensorHub каждый импульс считывается функцией с жестко ограниченным таймаутом (до 100 мкс). В случае отсутствия ответа опрос отменяется за доли миллисекунды, а статус датчика устанавливается в isValid = false, что полностью исключает блокировку системы.

Лицензия

Этот проект является частью экосистемы GS32Bios и распространяется под лицензией MIT. Вы можете свободно использовать, модифицировать и распространять данный код в своих некоммерческих и коммерческих проектах.

About

GS32SensorHub — неблокирующая, отказоустойчивая библиотека для ESP32 (Arduino IDE), предназначенная для динамического управления группой датчиков температуры и влажности семейства DHT (DHT11, DHT22, AM2301, AM2302) с заделом под универсальное расширение.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages