Newer
Older
smart-home-server / devices / sensor / sensor.ino
@root root 18 hours ago 4 KB Device. Sensor
#include <Arduino.h>

#include "ld2420_radar.h"
#include "bh1750_sensor.h"
#include "bme280_sensor.h"

/*
    =========================
    GLOBAL OBJECTS
    =========================
*/

Ld2420Radar radar;
RadarConfig radar_config;

Bh1750Sensor light_sensor;
Bh1750Config light_config;

Bme280Sensor climate_sensor;
Bme280Config climate_config;

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

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

/*
    Интервал печати калибровочной строки радара.
*/
static const uint32_t calibration_print_interval_ms = 250;
uint32_t last_calibration_print_ms = 0;


/*
    =========================
    RADAR CONFIGURATION
    =========================
*/

void setup_radar_config() {
    radar_config.uart_rx_pin = 4;
    radar_config.uart_tx_pin = 15;
    radar_config.baud_rate = 115200;

    radar_config.presence_hold_ms = 1500;
    radar_config.stale_after_ms = 2000;

    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.speed_epsilon_m_s = 0.08f;

    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.enable_debug_unknown_lines = false;
}


/*
    =========================
    BH1750 CONFIGURATION
    =========================
*/

void setup_light_config() {
    /*
        Отдельная шина освещённости:
        SDA -> GPIO16
        SCL -> GPIO17
        ADDR -> VCC -> 0x5C
    */
    light_config.sda_pin = 16;
    light_config.scl_pin = 17;
    light_config.i2c_address = 0x5C;
    light_config.measurement_mode = 0x10;
    light_config.stale_after_ms = 2000;
    light_config.read_interval_ms = 200;
    light_config.lux_ema_alpha = 0.25f;
}


/*
    =========================
    BME/BMP280 CONFIGURATION
    =========================
*/

void setup_climate_config() {
    /*
        Отдельная климатическая шина:
        SDA -> GPIO18
        SCL -> GPIO19
        SDO -> GND  => 0x76
        SDO -> VCC  => 0x77
    */
    climate_config.sda_pin = 18;
    climate_config.scl_pin = 19;
    climate_config.i2c_address = 0x76;

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


/*
    =========================
    DEVICE INITIALIZATION
    =========================
*/

void init_radar() {
    setup_radar_config();

    radar.begin(Serial2, radar_config);
    radar.set_calibration_mode(false);

    Serial.println("Radar initialized");
}

void init_light_sensor() {
    setup_light_config();

    bool ok = light_sensor.begin(light_config);

    if (ok) {
        Serial.println("BH1750 initialized");
    } else {
        Serial.println("BH1750 init failed");
    }
}

void init_climate_sensor() {
    setup_climate_config();

    bool ok = climate_sensor.begin(i2c_climate, climate_config);

    if (ok) {
        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();
    Serial.println("Radar + 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 (!radar.is_calibration_mode()) {
        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());
        }
    } else {
        if (now_ms - last_calibration_print_ms >= calibration_print_interval_ms) {
            last_calibration_print_ms = now_ms;
            Serial.println(radar.get_calibration_line());
        }
    }
}