#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;
/*
=========================
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.distance_ema_alpha = 0.35f;
radar_config.gate_size_m = 0.70f; // уточни по реальным замерам
radar_config.total_energy_max = 2000; // откалибруй под помещение
radar_config.activity_avg_window_s = 60;
radar_config.activity_trend_window_min = 10;
radar_config.enable_debug_frames = 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);
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 (now_ms - last_print_ms >= print_interval_ms) {
last_print_ms = now_ms;
/*
Каждый сенсор отдаёт свой JSON независимо.
Радар теперь отдаёт упрощённую структуру вида:
{
"online": true,
"presence": true,
"activity_score": 5,
"activity_score_current": 4,
"activity_score_dynamics": "increasing",
"distance_m": 2.3
}
*/
Serial.println(radar.get_state_json());
Serial.println(light_sensor.get_state_json());
Serial.println(climate_sensor.get_state_json());
}
}