wip:
This commit is contained in:
1 parent
036b856a93
commit
384360d2a4
3 files changed
+411
-349
No files matched your search
@@ -1,122 +1,76 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/task.h"
|
||||
#include "esp_log.h"
|
||||
#include "esp_event.h"
|
||||
|
||||
#include "zh_nrf24_gateway.h"
|
||||
#include "zh_nrf24_config.h"
|
||||
|
||||
static const char *TAG = "MAIN";
|
||||
#define GATEWAY_CHANNEL 120
|
||||
#define GATEWAY_ADDRESS 0xDDEEFF
|
||||
|
||||
#define GW_CHANNEL 120
|
||||
#define GW_ADDRESS 0xDDEEFF
|
||||
|
||||
static const zh_nrf_gateway_config_t s_gw_config = {
|
||||
.spi_host = SPI2_HOST,
|
||||
.pin_sck = 18,
|
||||
.pin_miso = 19,
|
||||
.pin_mosi = 23,
|
||||
.pin_csn = 17,
|
||||
.pin_ce = 16,
|
||||
.pin_irq = 4,
|
||||
.channel = GW_CHANNEL,
|
||||
.address = GW_ADDRESS,
|
||||
.spi_clock_hz = 0,
|
||||
};
|
||||
|
||||
static void handle_paired_event(const zh_nrf_gateway_binding_t *b)
|
||||
{
|
||||
ESP_LOGI(TAG, ">>> SENSOR PAIRED: id=%u type=%u (%s)",
|
||||
b->id, b->type,
|
||||
zh_get_nrf24_sensor_type_name((zh_nrf24_sensor_type_t)b->type));
|
||||
|
||||
/* Здесь можно добавить:
|
||||
* - публикацию в MQTT: "sensor/paired" {id, type};
|
||||
* - сохранение метаданных во внешнюю БД;
|
||||
* - запись в журнал / уведомление;
|
||||
* - поиск пользователя, которому принадлежит новое устройство,
|
||||
* и т.п.
|
||||
*/
|
||||
}
|
||||
|
||||
static void handle_sensor_data_event(const zh_nrf24_sensor_transmitted_data_t *d)
|
||||
{
|
||||
const char *name = zh_get_nrf24_sensor_type_name((zh_nrf24_sensor_type_t)d->type);
|
||||
|
||||
ESP_LOGI(TAG, "<<< sensor id=%d type=%s battery=%.2fV",
|
||||
d->id, name, d->battery / 100.0);
|
||||
|
||||
switch (d->type)
|
||||
{
|
||||
case ZH_NRF24_SENSOR_TOUCH_SWITCH:
|
||||
ESP_LOGI(TAG, " button event");
|
||||
break;
|
||||
case ZH_NRF24_SENSOR_WATER_LEAKAGE:
|
||||
ESP_LOGI(TAG, " status=%s",
|
||||
d->value_1 == ZH_NRF24_SENSOR_STATUS_ALARM ? "ALARM" : "DRY");
|
||||
break;
|
||||
case ZH_NRF24_SENSOR_OPEN_CLOSE:
|
||||
ESP_LOGI(TAG, " state=%s",
|
||||
d->value_1 == ZH_NRF24_SENSOR_STATUS_OPEN ? "OPEN" : "CLOSE");
|
||||
break;
|
||||
case ZH_NRF24_SENSOR_PLANT_HUMIDITY:
|
||||
ESP_LOGI(TAG, " humidity=%d%%", d->value_1);
|
||||
break;
|
||||
case ZH_NRF24_SENSOR_BMP280:
|
||||
ESP_LOGI(TAG, " T=%d C, P=%d", d->value_1, d->value_2);
|
||||
break;
|
||||
case ZH_NRF24_SENSOR_BME280:
|
||||
ESP_LOGI(TAG, " H=%d%% T=%d C P=%d mmHg",
|
||||
d->value_1, d->value_2, d->value_3);
|
||||
break;
|
||||
case ZH_NRF24_SENSOR_BME680:
|
||||
ESP_LOGI(TAG, " H=%d%% T=%d C P=%d Q=%d",
|
||||
d->value_1, d->value_2, d->value_3, d->value_4);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void gateway_event_handler(void *arg,
|
||||
esp_event_base_t base,
|
||||
int32_t id,
|
||||
void *event_data)
|
||||
{
|
||||
if (base != ZH_NRF_GATEWAY_EVENTS) return;
|
||||
|
||||
switch (id)
|
||||
{
|
||||
case ZH_NRF_GATEWAY_EVENT_SENSOR_DATA:
|
||||
handle_sensor_data_event((const zh_nrf24_sensor_transmitted_data_t *)event_data);
|
||||
break;
|
||||
|
||||
case ZH_NRF_GATEWAY_EVENT_SENSOR_PAIRED:
|
||||
handle_paired_event((const zh_nrf_gateway_binding_t *)event_data);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
void zh_nrf24_gateway_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data);
|
||||
|
||||
void app_main(void)
|
||||
{
|
||||
ESP_LOGI(TAG, "Starting nRF24L01+ gateway");
|
||||
esp_err_t err = nvs_flash_init();
|
||||
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND)
|
||||
{
|
||||
ESP_ERROR_CHECK(nvs_flash_erase());
|
||||
ESP_ERROR_CHECK(nvs_flash_init());
|
||||
}
|
||||
esp_event_loop_create_default();
|
||||
esp_event_handler_instance_register(ZH_NRF24_GATEWAY_EVENTS, ESP_EVENT_ANY_ID, &zh_nrf24_gateway_event_handler, NULL, NULL);
|
||||
zh_nrf_gateway_config_t config = {
|
||||
.spi_host = SPI2_HOST,
|
||||
.pin_sck = 18,
|
||||
.pin_miso = 19,
|
||||
.pin_mosi = 23,
|
||||
.pin_csn = 17,
|
||||
.pin_ce = 16,
|
||||
.pin_irq = 4,
|
||||
.channel = GATEWAY_CHANNEL,
|
||||
.address = GATEWAY_ADDRESS,
|
||||
.spi_clock_hz = 0,
|
||||
};
|
||||
zh_nrf_gateway_init(&config);
|
||||
zh_nrf_gateway_start();
|
||||
}
|
||||
|
||||
ESP_ERROR_CHECK(esp_event_loop_create_default());
|
||||
ESP_ERROR_CHECK(esp_event_handler_instance_register(
|
||||
ZH_NRF_GATEWAY_EVENTS,
|
||||
ESP_EVENT_ANY_ID,
|
||||
&gateway_event_handler,
|
||||
NULL, NULL));
|
||||
|
||||
ESP_ERROR_CHECK(zh_nrf_gateway_init(&s_gw_config));
|
||||
ESP_ERROR_CHECK(zh_nrf_gateway_start());
|
||||
|
||||
ESP_LOGI(TAG, "Gateway running: channel=%d, address=0x%06X",
|
||||
GW_CHANNEL, GW_ADDRESS);
|
||||
void zh_nrf24_gateway_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data)
|
||||
{
|
||||
switch (event_id)
|
||||
{
|
||||
case ZH_NRF_GATEWAY_EVENT_SENSOR_DATA:
|
||||
zh_nrf24_sensor_transmitted_data_t *sensor_data = (zh_nrf24_sensor_transmitted_data_t *)event_data;
|
||||
printf("Data received - id=%d type=%s battery=%.2fV ", sensor_data->id, zh_get_nrf24_sensor_type_name((zh_nrf24_sensor_type_t)sensor_data->type), sensor_data->battery / 100.0);
|
||||
switch (sensor_data->type)
|
||||
{
|
||||
case ZH_NRF24_SENSOR_TOUCH_SWITCH:
|
||||
printf("button pressed\n");
|
||||
break;
|
||||
case ZH_NRF24_SENSOR_WATER_LEAKAGE:
|
||||
printf("status=%s\n", sensor_data->value_1 == ZH_NRF24_SENSOR_STATUS_ALARM ? "ALARM" : "DRY");
|
||||
break;
|
||||
case ZH_NRF24_SENSOR_OPEN_CLOSE:
|
||||
printf("status=%s\n", sensor_data->value_1 == ZH_NRF24_SENSOR_STATUS_OPEN ? "OPEN" : "CLOSE");
|
||||
break;
|
||||
case ZH_NRF24_SENSOR_PLANT_HUMIDITY:
|
||||
printf("soil moisture=%.1f%%\n", sensor_data->value_1 / 10.0);
|
||||
break;
|
||||
case ZH_NRF24_SENSOR_BMP280:
|
||||
printf("temperature=%.1fC, atmospheric pressure=%.1fmmHg\n", sensor_data->value_1 / 10.0, sensor_data->value_2 / 10.0);
|
||||
break;
|
||||
case ZH_NRF24_SENSOR_BME280:
|
||||
printf("humidity=%.1f%%, temperature=%.1fC, atmospheric pressure=%.1fmmHg\n", sensor_data->value_1 / 10.0, sensor_data->value_2 / 10.0, sensor_data->value_3 / 10.0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case ZH_NRF_GATEWAY_EVENT_SENSOR_PAIRED:
|
||||
zh_nrf_gateway_binding_t *pairing_data = (zh_nrf_gateway_binding_t *)event_data;
|
||||
printf("Sensor paired - id=%d type=%s\n", pairing_data->id, zh_get_nrf24_sensor_type_name((zh_nrf24_sensor_type_t)pairing_data->type));
|
||||
break;
|
||||
case ZH_NRF_GATEWAY_EVENT_SENSOR_REGISTERED:
|
||||
zh_nrf_gateway_binding_t *registering_data = (zh_nrf_gateway_binding_t *)event_data;
|
||||
printf("Sensor registered - id=%d type=%s\n", registering_data->id, zh_get_nrf24_sensor_type_name((zh_nrf24_sensor_type_t)registering_data->type));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user