Added power factor and current functions

This commit is contained in:
Manticore 2025-03-20 17:36:00 +05:30
parent c5952386ea
commit c7718c80d4

View File

@ -57,7 +57,7 @@ uint32_t read_vrms() {
int len = uart_receive_response(response, sizeof(response));
if (len > 0 ) {
vrms_value = (response[2] << 8) | response[3]; // Extract VRMS value
ESP_LOGI(TAG, "VRMS: %lu", vrms_value);
// ESP_LOGI(TAG, "VRMS: %lu", vrms_value);
} else {
ESP_LOGE(TAG, "Failed to receive complete VRMS data");
}
@ -77,27 +77,83 @@ uint32_t read_active_power() {
int len = uart_receive_response(response, sizeof(response));
if (len >= 7) {
power_value = (response[2] << 24) | (response[3] << 16) | (response[4] << 8) | response[5]; // Extract Power
ESP_LOGI(TAG, "Active Power: %d", power_value);
// ESP_LOGI(TAG, "Active Power: %lu", power_value);
} else {
ESP_LOGE(TAG, "Failed to receive complete power data");
ESP_LOGE(TAG, "Failed to receive complete active power data");
}
return power_value;
}
void idle_message() {
uint8_t command[] = {0xA4}; // Example command to check acknowledge
// uint8_t command[] = { 0xA5, 0x07, 0x41, 0x00, 0x02, 0x52, 0x41 }; // find System version
uart_send_command(command, sizeof(command));
uint8_t response[1];
// Read Current RMS value
uint32_t read_current()
{
uint8_t current_cmd[] = { 0xA5, 0x07, 0x41, 0x00, 0x04, 0x44, 0x035 }; // Command for Current
uint8_t response[8];
uint32_t current_value = 0;
uart_send_command(current_cmd, sizeof(current_cmd));
vTaskDelay(pdMS_TO_TICKS(50));
int len = uart_receive_response(response, sizeof(response));
if (len >= 7) {
current_value = (response[2] << 24) | (response[3] << 16) | (response[4] << 8) | response[5]; // Extract Power
// ESP_LOGI(TAG, "Active Power: %lu", current_value);
} else {
ESP_LOGE(TAG, "Failed to receive complete current data");
}
return current_value;
}
//Read Power factor
uint32_t read_power_factor(){
uint8_t power_factor_cmd[] = { 0xA5, 0x07, 0x41, 0x00, 0x16, 0x52, 0x055 }; // Command for Current
uint8_t response[8];
uint32_t power_factor = 0;
uart_send_command(power_factor_cmd, sizeof(power_factor_cmd));
vTaskDelay(pdMS_TO_TICKS(50));
int len = uart_receive_response(response, sizeof(response));
if (len > 0) {
ESP_LOGI(TAG, "Received %d bytes", len);
for (int i = 0; i < len; i++) {
ESP_LOGI(TAG, "0x%02X", response[i]);
}
power_factor = ((response[2] << 8) | response[3]); // Extract Power
// ESP_LOGI(TAG, "====>>> Power Factor: 0x%0X", (unsigned int) power_factor);
} else {
ESP_LOGE(TAG, "Failed to receive complete power factor data");
}
return power_factor;
}
// Read reactive power
uint32_t reactive_power(){
uint8_t r_power_cmd[] = { 0xA5, 0x07, 0x41,0x00, 0x0E, 0x44, 0x3F}; // Command for Reactive power
uint8_t response[8];
uint32_t r_power_value = 0;
uart_send_command( r_power_cmd, sizeof(r_power_cmd));
vTaskDelay(pdMS_TO_TICKS(50));
int len = uart_receive_response(response, sizeof(response));
ESP_LOGI(TAG, "Active Power length : %d", len);
if (len > 0 ) {
r_power_value = (response[2] << 24) | (response[3] << 16) | (response[4] << 8) | response[5]; // Extract Power
// ESP_LOGI(TAG, "Active Power: %lu", current_value);
} else {
ESP_LOGE(TAG, "Failed to receive complete Reactive power data ");
}
return r_power_value;
}
// Main application
@ -113,10 +169,23 @@ void app_main(void) {
while (1) {
uint32_t vrms = read_vrms();
uint32_t power = read_active_power();
uint32_t current = read_current();
uint32_t p_factor = read_power_factor();
uint32_t r_power = reactive_power();
ESP_LOGI(TAG, "Voltage RMS: %.2f V", vrms / 10.0);
ESP_LOGI(TAG, "Active Power: %.3f W", power / 100.0);
ESP_LOGI(TAG, "Voltage RMS : %.2f V", vrms / 10.0);
ESP_LOGI(TAG, "Active Power : %.3f W", power / 100.0);
ESP_LOGI(TAG, "Current (RMS): %.3f A", current / 10000.0);
ESP_LOGI(TAG, "Power factor : %.3f Pf", p_factor / 32768.0); // MCP39F501 typically represents Power Factor as a signed 16-bit integer (int16_t),
// The range is -1.000 to +1.000,
// The scaling factor is 32768 (i.e., 0x8000 = -1, 0x7FFF = +1)..
ESP_LOGI(TAG, "Reactive Power : %.3f ", r_power / 100.0);
vTaskDelay(pdMS_TO_TICKS(2000)); // Read every 2 seconds
}
}