new buzzer component
This commit is contained in:
@@ -22,4 +22,4 @@ set(includes
|
||||
idf_component_register(SRCS "${srcs}"
|
||||
INCLUDE_DIRS "${includes}"
|
||||
PRIV_REQUIRES nvs_flash
|
||||
REQUIRES esp_event esp-modbus spi_bus_manager)
|
||||
REQUIRES esp_event esp-modbus spi_bus_manager network)
|
||||
|
||||
@@ -59,7 +59,6 @@ static void meter_ade7758_post_event(const meter_ade7758_internal_data_t *data)
|
||||
}
|
||||
}
|
||||
|
||||
// === Task de leitura ===
|
||||
static void meter_ade7758_task_func(void *param) {
|
||||
ESP_LOGI(TAG, "Tarefa de medição ADE7758 iniciada");
|
||||
|
||||
@@ -68,7 +67,7 @@ static void meter_ade7758_task_func(void *param) {
|
||||
while (true) {
|
||||
meter_ade7758_internal_data_t meterData = {0};
|
||||
|
||||
//ESP_LOGI(TAG, "Tarefa de medição ADE7758 iniciada %d",getVersion());
|
||||
ESP_LOGI(TAG, "Tarefa de medição ADE7758 iniciada %d",getVersion());
|
||||
|
||||
meterData.vrms[0] = avrms() / VRMS_CAL;
|
||||
meterData.vrms[1] = bvrms() / VRMS_CAL;
|
||||
@@ -82,6 +81,21 @@ static void meter_ade7758_task_func(void *param) {
|
||||
if (setPotLine(PHASE_B, 20)) meterData.watt[1] = getWatt(PHASE_B);
|
||||
if (setPotLine(PHASE_C, 20)) meterData.watt[2] = getWatt(PHASE_C);
|
||||
|
||||
ESP_LOGI(TAG, "VRMS: A=%.2f V, B=%.2f V, C=%.2f V",
|
||||
(double)meterData.vrms[0],
|
||||
(double)meterData.vrms[1],
|
||||
(double)meterData.vrms[2]);
|
||||
|
||||
ESP_LOGI(TAG, "IRMS: A=%.2f A, B=%.2f A, C=%.2f A",
|
||||
(double)meterData.irms[0],
|
||||
(double)meterData.irms[1],
|
||||
(double)meterData.irms[2]);
|
||||
|
||||
ESP_LOGI(TAG, "Watt: A=%.2f W, B=%.2f W, C=%.2f W",
|
||||
(double)meterData.watt[0],
|
||||
(double)meterData.watt[1],
|
||||
(double)meterData.watt[2]);
|
||||
|
||||
if (memcmp(&previous, &meterData, sizeof(meterData)) != 0) {
|
||||
if (xSemaphoreTake(meter_mutex, pdMS_TO_TICKS(10)) == pdTRUE) {
|
||||
meter_data = meterData;
|
||||
|
||||
@@ -54,11 +54,21 @@ typedef struct {
|
||||
|
||||
static bool phase_updated[PHASE_COUNT] = {false, false, false};
|
||||
|
||||
|
||||
static meter_zigbee_data_t meter_data = {0};
|
||||
static SemaphoreHandle_t meter_mutex = NULL;
|
||||
static TaskHandle_t meter_zigbee_task = NULL;
|
||||
|
||||
|
||||
bool meter_zigbee_is_running(void) {
|
||||
return meter_zigbee_task != NULL;
|
||||
}
|
||||
|
||||
void send_stop_command(void) {
|
||||
const char *cmd = "stop\n"; // Comando enviado para o outro lado interpretar e dormir
|
||||
uart_write_bytes(UART_PORT, cmd, strlen(cmd));
|
||||
uart_wait_tx_done(UART_PORT, pdMS_TO_TICKS(100)); // Aguarda envio terminar
|
||||
}
|
||||
|
||||
static void meter_zigbee_post_event(void) {
|
||||
meter_event_data_t evt = {
|
||||
.source = "GRID",
|
||||
@@ -212,7 +222,15 @@ esp_err_t meter_zigbee_start(void) {
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void meter_zigbee_stop(void) {
|
||||
|
||||
send_stop_command();
|
||||
|
||||
vTaskDelay(pdMS_TO_TICKS(100)); // Aguarda o outro lado processar
|
||||
|
||||
if (meter_zigbee_task) {
|
||||
vTaskDelete(meter_zigbee_task);
|
||||
meter_zigbee_task = NULL;
|
||||
@@ -224,8 +242,4 @@ void meter_zigbee_stop(void) {
|
||||
vSemaphoreDelete(meter_mutex);
|
||||
meter_mutex = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
bool meter_zigbee_is_running(void) {
|
||||
return meter_zigbee_task != NULL;
|
||||
}
|
||||
}
|
||||
@@ -2,66 +2,116 @@
|
||||
#define METER_MANAGER_H
|
||||
|
||||
#include "esp_err.h"
|
||||
#include <stdbool.h> // Para garantir que 'bool' seja reconhecido
|
||||
#include <stdbool.h>
|
||||
|
||||
// Definindo tipos de medidores possíveis para EVSE e Grid
|
||||
/**
|
||||
* @brief Supported meter types for EVSE and Grid.
|
||||
*/
|
||||
typedef enum {
|
||||
METER_TYPE_NONE, // Nenhum Medidor
|
||||
METER_TYPE_ADE7758, // ADE7758
|
||||
METER_TYPE_ORNO513, // ORNO 513
|
||||
METER_TYPE_ORNO516, // ORNO 516
|
||||
METER_TYPE_MONO_ZIGBEE, // Medidor Zigbee (Mono)
|
||||
METER_TYPE_TRIF_ZIGBEE // Medidor Zigbee (Trifásico)
|
||||
METER_TYPE_NONE, // No meter
|
||||
METER_TYPE_ADE7758, // ADE7758 meter
|
||||
METER_TYPE_ORNO513, // ORNO-513
|
||||
METER_TYPE_ORNO516, // ORNO-516
|
||||
METER_TYPE_MONO_ZIGBEE, // Zigbee single-phase
|
||||
METER_TYPE_TRIF_ZIGBEE // Zigbee three-phase
|
||||
} meter_type_t;
|
||||
|
||||
/**
|
||||
* @brief Funções para gerenciar o medidor EVSE (ex: ADE7758).
|
||||
* @brief Initializes the meter manager system.
|
||||
*
|
||||
* Registers network event handlers and initializes both EVSE and GRID meters.
|
||||
*/
|
||||
|
||||
// Inicializa o medidor EVSE com o tipo especificado (ex: ADE7758)
|
||||
esp_err_t meter_manager_evse_init(void);
|
||||
|
||||
// Inicia o medidor EVSE com o tipo especificado
|
||||
esp_err_t meter_manager_evse_start(void);
|
||||
|
||||
// Para o medidor EVSE
|
||||
esp_err_t meter_manager_evse_stop(void);
|
||||
|
||||
// Verifica se o medidor EVSE está habilitado
|
||||
bool meter_manager_evse_is_enabled(void);
|
||||
|
||||
// Define o modelo do medidor EVSE (ADE7758, etc)
|
||||
esp_err_t meter_manager_evse_set_model(meter_type_t meter_type);
|
||||
|
||||
// Retorna o modelo do medidor EVSE (ADE7758, etc)
|
||||
meter_type_t meter_manager_evse_get_model(void);
|
||||
esp_err_t meter_manager_init(void);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Funções para gerenciar o medidor Grid (ORNO 513, ORNO 516, Zigbee).
|
||||
* @brief Starts all configured meters (EVSE and GRID).
|
||||
*
|
||||
* @return esp_err_t ESP_OK on success, or an error code from one of the start calls.
|
||||
*/
|
||||
esp_err_t meter_manager_start(void);
|
||||
|
||||
|
||||
/**
|
||||
* @brief Stops all meters and unregisters network event handlers.
|
||||
*/
|
||||
esp_err_t meter_manager_stop(void);
|
||||
|
||||
/**
|
||||
* @brief EVSE Meter Management
|
||||
*/
|
||||
|
||||
// Inicializa o medidor Grid com o tipo especificado (ORNO 513, ORNO 516, Zigbee)
|
||||
/**
|
||||
* @brief Initializes the EVSE meter based on configured type.
|
||||
*/
|
||||
esp_err_t meter_manager_evse_init(void);
|
||||
|
||||
/**
|
||||
* @brief Starts the EVSE meter.
|
||||
*/
|
||||
esp_err_t meter_manager_evse_start(void);
|
||||
|
||||
/**
|
||||
* @brief Stops the EVSE meter.
|
||||
*/
|
||||
esp_err_t meter_manager_evse_stop(void);
|
||||
|
||||
/**
|
||||
* @brief Returns true if an EVSE meter is configured (not NONE).
|
||||
*/
|
||||
bool meter_manager_evse_is_enabled(void);
|
||||
|
||||
/**
|
||||
* @brief Sets the EVSE meter type and saves it to NVS.
|
||||
*/
|
||||
esp_err_t meter_manager_evse_set_model(meter_type_t meter_type);
|
||||
|
||||
/**
|
||||
* @brief Gets the current EVSE meter type.
|
||||
*/
|
||||
meter_type_t meter_manager_evse_get_model(void);
|
||||
|
||||
/**
|
||||
* @brief Grid Meter Management
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Initializes the Grid meter based on configured type.
|
||||
*/
|
||||
esp_err_t meter_manager_grid_init(void);
|
||||
|
||||
// Inicia o medidor Grid com o tipo especificado
|
||||
/**
|
||||
* @brief Starts the Grid meter.
|
||||
*/
|
||||
esp_err_t meter_manager_grid_start(void);
|
||||
|
||||
// Para o medidor Grid
|
||||
/**
|
||||
* @brief Stops the Grid meter.
|
||||
*/
|
||||
esp_err_t meter_manager_grid_stop(void);
|
||||
|
||||
// Habilita ou desabilita o medidor Grid
|
||||
void meter_manager_grid_set_enabled(bool value);
|
||||
|
||||
// Define o modelo do medidor Grid (ORNO 513, ORNO 516, Zigbee)
|
||||
/**
|
||||
* @brief Sets the Grid meter type and saves it to NVS.
|
||||
*/
|
||||
esp_err_t meter_manager_grid_set_model(meter_type_t meter_type);
|
||||
|
||||
// Retorna o modelo do medidor Grid (ORNO 513, ORNO 516, Zigbee)
|
||||
/**
|
||||
* @brief Gets the current Grid meter type.
|
||||
*/
|
||||
meter_type_t meter_manager_grid_get_model(void);
|
||||
|
||||
// Função auxiliar para converter o tipo de medidor em uma string
|
||||
/**
|
||||
* @brief Utility functions
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Converts a meter_type_t to a human-readable string.
|
||||
*/
|
||||
const char* meter_type_to_str(meter_type_t type);
|
||||
|
||||
/**
|
||||
* @brief Converts a string to a meter_type_t.
|
||||
*/
|
||||
meter_type_t string_to_meter_type(const char *str);
|
||||
|
||||
#endif // METER_MANAGER_H
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
#include "nvs_flash.h"
|
||||
#include "nvs.h"
|
||||
#include <string.h>
|
||||
#include "network_events.h"
|
||||
|
||||
|
||||
static const char *TAG = "meter_manager";
|
||||
|
||||
@@ -18,6 +20,33 @@ static meter_type_t meter_grid_type = METER_TYPE_NONE;
|
||||
#define NVS_EVSE_MODEL "evse_model"
|
||||
#define NVS_GRID_MODEL "grid_model"
|
||||
|
||||
|
||||
static void meter_manager_network_event_handler(void* arg, esp_event_base_t base, int32_t event_id, void* data){
|
||||
|
||||
if (base != NETWORK_EVENTS) return;
|
||||
|
||||
switch (event_id) {
|
||||
case NETWORK_EVENT_AP_STARTED:
|
||||
ESP_LOGI(TAG, "Recebido NETWORK_EVENT_AP_STARTED, parando medidor de grid");
|
||||
meter_manager_grid_stop();
|
||||
break;
|
||||
|
||||
case NETWORK_EVENT_AP_STOP:
|
||||
ESP_LOGI(TAG, "Recebido NETWORK_EVENT_AP_STOP, reiniciando medidor de grid");
|
||||
meter_manager_grid_start();
|
||||
break;
|
||||
|
||||
case NETWORK_EVENT_STA_GOT_IP:
|
||||
ESP_LOGI(TAG, "Recebido NETWORK_EVENT_STA_GOT_IP");
|
||||
// opcional: reiniciar ou logar
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Função unificada para ler ou inicializar um modelo de medidor
|
||||
static esp_err_t load_or_init_meter_model(const char *key, meter_type_t *type) {
|
||||
nvs_handle_t handle;
|
||||
@@ -64,6 +93,83 @@ static esp_err_t write_meter_model_to_nvs(const char *key, meter_type_t meter_ty
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Initializes the meter manager system.
|
||||
*
|
||||
* This function initializes both the EVSE and GRID meters,
|
||||
* and registers the event handler to listen for NETWORK_EVENTS
|
||||
* (e.g., AP started/stopped, STA got IP).
|
||||
*
|
||||
* @return esp_err_t ESP_OK on success, or an error code.
|
||||
*/
|
||||
esp_err_t meter_manager_init(void) {
|
||||
esp_err_t err;
|
||||
|
||||
// Initialize EVSE meter
|
||||
//err = meter_manager_evse_init();
|
||||
//if (err != ESP_OK) return err;
|
||||
|
||||
// Initialize GRID meter
|
||||
err = meter_manager_grid_init();
|
||||
if (err != ESP_OK) return err;
|
||||
|
||||
// Register handler for custom network events
|
||||
ESP_LOGI(TAG, "Registering network event handler");
|
||||
return esp_event_handler_register(NETWORK_EVENTS,
|
||||
ESP_EVENT_ANY_ID,
|
||||
meter_manager_network_event_handler,
|
||||
NULL);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Starts all configured meters (EVSE and GRID).
|
||||
*
|
||||
* This function starts the EVSE and GRID meters based on their configured types.
|
||||
* It does not register event handlers — that is handled by `meter_manager_init()`.
|
||||
*
|
||||
* @return esp_err_t ESP_OK on success, or an error code from one of the start calls.
|
||||
*/
|
||||
esp_err_t meter_manager_start(void) {
|
||||
esp_err_t err;
|
||||
|
||||
// Start EVSE meter
|
||||
//err = meter_manager_evse_start();
|
||||
//if (err != ESP_OK) return err;
|
||||
|
||||
// Start GRID meter
|
||||
err = meter_manager_grid_start();
|
||||
if (err != ESP_OK) return err;
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @brief Stops all meters and unregisters event handlers.
|
||||
*
|
||||
* This function gracefully stops the EVSE and GRID meters
|
||||
* and unregisters the previously registered network event handler.
|
||||
*
|
||||
* @return esp_err_t ESP_OK on success, or an error code.
|
||||
*/
|
||||
esp_err_t meter_manager_stop(void) {
|
||||
esp_err_t err;
|
||||
|
||||
// Stop EVSE meter
|
||||
//err = meter_manager_evse_stop();
|
||||
//if (err != ESP_OK) return err;
|
||||
|
||||
// Stop GRID meter
|
||||
err = meter_manager_grid_stop();
|
||||
if (err != ESP_OK) return err;
|
||||
|
||||
return ESP_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Função para inicializar o medidor EVSE
|
||||
esp_err_t meter_manager_evse_init() {
|
||||
esp_err_t err = load_or_init_meter_model(NVS_EVSE_MODEL, &meter_evse_type);
|
||||
|
||||
Reference in New Issue
Block a user