Newer
Older
smart-home-server / devices / sensor / sensor.ino
/*********************************************************************
 *  sensor.ino
 *
 *  Проект «Radar + BH1750 + BME/BMP280» – полный пример.
 *  В нём используется новый класс Ld2420Radar (файлы ld2420_radar.h/.cpp).
 *********************************************************************/

#include <Arduino.h>

/* ---------- СТАНДАРТНЫЕ БИБЛИОТЕКИ ДЛЯ ИНТЕРФЕЙСОВ ------------- */
#include "ld2420_radar.h"          // радар LD‑2420 (2.1)
#include "bh1750_sensor.h"         // BH1750 – датчик освещённости
#include "bme280_sensor.h"         // BME280/BMP280 – климатический датчик

/* ---------------------  ГЛОБАЛЬНЫЕ ОБЪЕКТЫ  ---------------------- */
Ld2420Radar radar;
RadarConfig radar_config;

Bh1750Sensor light_sensor;
Bh1750Config light_config;

Bme280Sensor climate_sensor;
Bme280Config climate_config;

/* -----------------  Отдельные I2C‑шины (ESP32)  ------------------- */
TwoWire i2c_climate = TwoWire(1);   // шина для BME/BMP280

/* -----------------  Интервал печати состояния  ------------------- */
static const uint32_t print_interval_ms = 500;
uint32_t last_print_ms = 0;

/* ------------------------------------------------------------------ */
/* ---------------------  Конфигурация радара  ----------------------*/
/* ------------------------------------------------------------------ */

void setup_radar_config() {
    /* Пины UART2 (по умолчанию GPIO4 – OT1, GPIO15 – RX) */
    radar_config.uart_rx_pin   = 4;
    radar_config.uart_tx_pin   = 15;
    radar_config.baud_rate     = 115200;

    radar_config.presence_hold_ms      = 1500;   // как долго держать presence
    radar_config.stale_after_ms        = 2000;   // если не пришло данных – offline

    radar_config.median_window_size    = 5;
    radar_config.max_zone_step_per_sample = 4;

    radar_config.distance_ema_alpha    = 0.35f;
    radar_config.speed_ema_alpha       = 0.25f;

    radar_config.min_valid_zone        = 1;
    radar_config.max_valid_zone        = 200;

    radar_config.zone_to_meter_k       = 0.7f;   // калибровка зоны → м
    radar_config.zone_to_meter_b       = 0.0f;

    radar_config.activity_min_speed_m_s = 0.03f;
    radar_config.activity_max_speed_m_s = 1.20f;

    radar_config.enable_debug_unknown_lines = false;
}

/* ------------------------------------------------------------------ */
/* ---------------------  Конфигурация BH1750  ----------------------*/
/* ------------------------------------------------------------------ */

void setup_light_config() {
    light_config.sda_pin           = 16;      // SDA
    light_config.scl_pin           = 17;      // SCL
    light_config.i2c_address       = 0x5C;
    light_config.measurement_mode  = 0x10;    // Continuous High Resolution
    light_config.stale_after_ms    = 2000;
    light_config.read_interval_ms  = 200;
    light_config.lux_ema_alpha     = 0.25f;
}

/* ------------------------------------------------------------------ */
/* ---------------------  Конфигурация BME/BMP280  -------------------*/
/* ------------------------------------------------------------------ */

void setup_climate_config() {
    climate_config.sda_pin           = 18;      // SDA
    climate_config.scl_pin           = 19;      // SCL
    climate_config.i2c_address       = 0x76;    // адрес при подключении к GND

    climate_config.stale_after_ms    = 3000;
    climate_config.read_interval_ms  = 1000;

    climate_config.temperature_ema_alpha = 0.25f;
    climate_config.pressure_ema_alpha     = 0.20f;
    climate_config.humidity_ema_alpha     = 0.20f;
}

/* ------------------------------------------------------------------ */
/* ---------------------  Инициализация устройств  -----------------*/
/* ------------------------------------------------------------------ */

void init_radar() {
    setup_radar_config();
    radar.begin(Serial2, radar_config);
    Serial.println("Radar initialized");
}

void init_light_sensor() {
    setup_light_config();
    if (light_sensor.begin(light_config)) {
        Serial.println("BH1750 initialized");
    } else {
        Serial.println("BH1750 init failed");
    }
}

void init_climate_sensor() {
    setup_climate_config();
    if (climate_sensor.begin(i2c_climate, climate_config)) {
        Serial.print("Climate sensor initialized: ");
        Serial.println(climate_sensor.get_sensor_type_string());
    } else {
        Serial.println("Climate sensor init failed");
    }
}

/* ------------------------------------------------------------------ */
/* ---------------------------  SETUP  --------------------------------*/
/* ------------------------------------------------------------------ */

void setup() {
    Serial.begin(115200);
    delay(1000);

    Serial.println("\nRadar + BH1750 + BME/BMP280 project start");

    init_radar();
    init_light_sensor();
    init_climate_sensor();
}

/* ------------------------------------------------------------------ */
/* ---------------------------  LOOP  --------------------------------*/
/* ------------------------------------------------------------------ */

void loop() {
    /* Обновляем каждое устройство */
    radar.update();
    light_sensor.update();
    climate_sensor.update();

    uint32_t now_ms = millis();

    if (now_ms - last_print_ms >= print_interval_ms) {
        last_print_ms = now_ms;

        Serial.println(radar.get_state_json());
        Serial.println(light_sensor.get_state_json());
        Serial.println(climate_sensor.get_state_json());
    }
}