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

/*
    Главный файл примера использования первого сенсорного слоя LD2420.

    Что делает этот пример:
    - поднимает Serial для отладки
    - создаёт и настраивает драйвер радара
    - регулярно вызывает radar.update()
    - печатает JSON состояния в монитор порта

    Дальше этот же модуль можно будет встроить в твоё ядро умного дома,
    где вместо Serial.println(json) будет:
    - HTTP-ответ
    - отправка на сервер
    - публикация в MQTT
    - включение в общий /status endpoint
*/

Ld2420Radar radar;
RadarConfig radar_config;

/*
    Интервал печати JSON в монитор порта.
    Слишком часто печатать не стоит, чтобы не засорять лог.
*/
static const uint32_t print_interval_ms = 500;
uint32_t last_print_ms = 0;

/*
    Отдельный интервал печати короткой калибровочной строки.
    Пока не обязателен, но полезен, если включить calibration_mode.
*/
static const uint32_t calibration_print_interval_ms = 250;
uint32_t last_calibration_print_ms = 0;

void setup_radar_config() {
    /*
        Под твою текущую схему подключения:
        TX радара -> GPIO4 ESP (RX)
        RX радара -> GPIO15 ESP (TX)
    */
    radar_config.uart_rx_pin = 4;
    radar_config.uart_tx_pin = 15;
    radar_config.baud_rate = 115200;

    /*
        Удержание присутствия после исчезновения сырых сообщений.
    */
    radar_config.presence_hold_ms = 1500;

    /*
        Если давно не было данных от радара, сенсор помечается stale.
    */
    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;
}

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

    Serial.println();
    Serial.println("ld2420 radar project start");

    setup_radar_config();

    radar.begin(Serial2, radar_config);

    /*
        Если нужен компактный лог для ручной калибровки,
        можно включить так:
            radar.set_calibration_mode(true);

        Пока оставим выключенным, чтобы печатать JSON.
    */
    radar.set_calibration_mode(false);

    Serial.println("radar initialized");
}

void loop() {
    radar.update();

    uint32_t now_ms = millis();

    /*
        Обычный режим: печатаем JSON состояния.
        Это как раз тот формат, который потом будет удобно отдать наружу
        в твою систему умного дома.
    */
    if (!radar.is_calibration_mode()) {
        if (now_ms - last_print_ms >= print_interval_ms) {
            last_print_ms = now_ms;

            String json = radar.get_state_json();
            Serial.println(json);
        }
    } else {
        /*
            Калибровочный режим:
            печатаем короткую строку, чтобы можно было быстро ходить с рулеткой
            и смотреть соответствие Range реальной дистанции.
        */
        if (now_ms - last_calibration_print_ms >= calibration_print_interval_ms) {
            last_calibration_print_ms = now_ms;
            Serial.println(radar.get_calibration_line());
        }
    }

    /*
        Здесь не делаем delay(), чтобы update() вызывался максимально часто.
    */
}