remove PZEM support and add bliking LED

This commit is contained in:
King Kévin 2017-01-22 16:33:44 +01:00
parent 6ca29dff8e
commit 2a842d6bbd
1 changed files with 4 additions and 124 deletions

128
main.c
View File

@ -44,7 +44,6 @@
#include "global.h" // board definitions
//#include "usart.h" // USART utilities
#include "usb_cdcacm.h" // USB CDC ACM utilities
#include "sensor_pzem.h" // PZEM electricity meter utilities
#include "sensor_sdm120.h" // SDM120 electricity meter utilities
#include "radio_esp8266.h" // ESP8266 WiFi SoC utilities
@ -273,6 +272,7 @@ void main(void)
// setup board
board_setup();
led_on();
// setup USART and USB for user communication
//usart_setup(); // setup USART (for printing)
@ -348,11 +348,6 @@ void main(void)
timer_enable_counter(TIM(DDM100TC_TIMER)); // enable timer
printf("OK\n");
// setup PZEM electricity meter
printf("setup PZEM-004 electricity meter: ");
sensor_pzem_setup(); // setup PZEM electricity meter
printf("OK\n");
// setup SDM120 electricity meter
printf("setup SDM120 electricity meter: ");
sensor_sdm120_setup(9600); // setup SDM120 electricity meter (get baud rate by scrolling through the menu on the device)
@ -371,11 +366,6 @@ void main(void)
bool char_flag = false; // a new character has been received
led_on(); // indicate setup is complete
// variables for PZEM-004T meter measurements
struct sensor_pzem_measurement_t pzem_measurements[3][SENSOR_PZEM_MAX]; // PZEM-004T measurements (2 meters, all measurements)
uint8_t pzem_meter = 0; // PZEM-004T meter index (add to prefix)
uint8_t pzem_measurement = 0; // PZEM-004T measurement index (matches the type)
// variables for SDM120 meter measurements
float sdm120_measurements[3][SENSOR_SDM120_MEASUREMENT_MAX]; // SDM120 measurements (2 meters, all measurements)
uint8_t sdm120_meter = 0; // SDM120 meter index (add to 1 to get ID)
@ -409,59 +399,6 @@ void main(void)
}
}
}
while (sensor_pzem_measurement_received) { // measurement from electricity meter received
sensor_pzem_measurement_received = false; // clear flag
struct sensor_pzem_measurement_t measurement = sensor_pzem_measurement_decode(); // decode measurement
if (measurement.type>=SENSOR_PZEM_MAX) {
fprintf(stderr,"unknown measurement type: %u\n", measurement.type);
while (true); // unhandled error
}
if (measurement.valid) { // only show valid measurement
printf("PZEM-004T meter %u ", pzem_meter);
switch (measurement.type) {
case SENSOR_PZEM_VOLTAGE:
printf("voltage: %.01f V\n", measurement.value.voltage); // display measurement
break;
case SENSOR_PZEM_CURRENT:
printf("current: %.02f A\n", measurement.value.current);
break;
case SENSOR_PZEM_POWER:
printf("power: %u W\n", measurement.value.power);
break;
case SENSOR_PZEM_ENERGY:
printf("energy: %lu Wh\n", measurement.value.energy);
break;
/* not used for this application
case SENSOR_PZEM_ADDRESS:
printf("address set\n");
break;
case SENSOR_PZEM_ALARM:
printf("alarm threshold set\n");
break;
*/
default:
break;
}
if (measurement.type!=pzem_measurement) {
fprintf(stderr, "PZEM-004T measurement mismatch: expected %u, got %u\n", pzem_measurement, measurement.type);
sensor_pzem_measurement_request(0xc0a80100+pzem_meter, pzem_measurement); // request same measurement
} else if (pzem_measurement<SENSOR_PZEM_MAX-1) { // not all measurement types requested
pzem_measurements[pzem_meter][pzem_measurement] = measurement; // save measurement (the type matches the index)
pzem_measurement++; // go to next measurement
sensor_pzem_measurement_request(0xc0a80100+pzem_meter, pzem_measurement); // request next measurement
} else { // all measurement types requested
pzem_measurements[pzem_meter][pzem_measurement] = measurement; // save measurement (the type matches the index)
pzem_meter++; // got to next meter
pzem_measurement = 0; // restart measurements
if (pzem_meter<LENGTH(pzem_measurements)) { // ensure next meter exists
sensor_pzem_measurement_request(0xc0a80100+pzem_meter, pzem_measurement); // request measurement for next meter
}
}
} else { // measurement not valid
fprintf(stderr, "PZEM-004T measurement invalid\n");
sensor_pzem_measurement_request(0xc0a80100+pzem_meter, pzem_measurement); // request same measurement
}
}
while (sensor_sdm120_measurement_received) { // measurement from electricity meter received
float measurement = sensor_sdm120_measurement_decode(); // decode measurement
if (isnan(measurement)) {
@ -530,6 +467,7 @@ void main(void)
}
while (rtc_internal_tick_flag) { // the internal RTC ticked
rtc_internal_tick_flag = false; // reset flag
led_toggle(); // toggle LED to indicate if main function is stuck
gpio_toggle(GPIO(LED_HEARTBEAT_PORT), GPIO(LED_HEARTBEAT_PIN)); // toggle heart beat LED to indicate if main function is stuck (do not toggle onboard the LED on PC13 on the blue pill board since this heavily influences the RTC)
ticks_time = rtc_get_counter_val(); // copy time from internal RTC for processing
action = true; // action has been performed
@ -540,10 +478,6 @@ void main(void)
printf("query meter measurements (%lu.%02lu:%02lu:%02lu)\n", ticks_time/(60*60*24), (ticks_time/(60*60))%24, (ticks_time%(60*60))/60, (ticks_time%60));
gpio_clear(GPIO(LED_QUERY_PORT), GPIO(LED_QUERY_PIN)); // switch on query LED
// start getting all PZEM-004T measurements from all meters
pzem_meter = 0; // reset PZEM meter number
pzem_measurement = 0; // reset PZEM measurement index
sensor_pzem_measurement_request(0xc0a80100+pzem_meter, pzem_measurement); // request first measurement
// start getting all SDM120 measurements from all meters
sdm120_meter = 0; // reset SDM120 meter number
sdm120_measurement = 0; // reset SDM120 measurement index
@ -560,17 +494,11 @@ void main(void)
printf("DDM100TC meter power: %lu W\n", ddm100tc_value_power);
}
}
while (pzem_meter>=LENGTH(pzem_measurements) && sdm120_meter>=LENGTH(sdm120_measurements)) { // all measurements received for all meter
while (sdm120_meter>=LENGTH(sdm120_measurements)) { // all measurements received for all meter
action = true; // action has been performed
printf("saving measurements to database: ");
gpio_set(GPIO(LED_QUERY_PORT), GPIO(LED_QUERY_PIN)); // switch off query LED
gpio_clear(GPIO(LED_SUBMIT_PORT), GPIO(LED_SUBMIT_PIN)); // switch off submit LED
const char* pzem_strings[SENSOR_PZEM_MAX] = {
"voltage,meter=PZEM-004T,phase=%u value=%.1f\n",
"current,meter=PZEM-004T,phase=%u value=%.2f\n",
"power,meter=PZEM-004T,phase=%u value=%u\n",
"energy,meter=PZEM-004T,phase=%u value=%lu\n"
};
const char* sdm120_strings[SENSOR_SDM120_MEASUREMENT_MAX] = {
"voltage,meter=SDM120,phase=%u value=%.3f\n",
"current,meter=SDM120,phase=%u value=%.3f\n",
@ -592,29 +520,6 @@ void main(void)
// calculate length for text to POST
char line[256] = {0}; // measurement line to send
size_t data_length = 0; /**< length of the data string to send */
for (pzem_meter = 0; pzem_meter<LENGTH(pzem_measurements); pzem_meter++) {
for (pzem_measurement = 0; pzem_measurement<SENSOR_PZEM_MAX; pzem_measurement++) {
struct sensor_pzem_measurement_t measurement = pzem_measurements[pzem_meter][pzem_measurement]; // get measurement
if (measurement.valid) { // only use valid measurements
switch (measurement.type) { // get the size (hope no error is occurring)
case SENSOR_PZEM_VOLTAGE:
data_length += snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.voltage);
break;
case SENSOR_PZEM_CURRENT:
data_length += snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.current);
break;
case SENSOR_PZEM_POWER:
data_length += snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.power);
break;
case SENSOR_PZEM_ENERGY:
data_length += snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.energy);
break;
default:
break;
}
}
}
}
for (sdm120_meter = 0; sdm120_meter<LENGTH(sdm120_measurements); sdm120_meter++) {
for (sdm120_measurement = 0; sdm120_measurement<SENSOR_SDM120_MEASUREMENT_MAX; sdm120_measurement++) {
if (sdm120_measurement<SENSOR_SDM120_ENERGY_ACTIVE_IMPORT) {
@ -631,31 +536,6 @@ void main(void)
if (!http_post_header(DATABASE_HOST, DATABASE_PORT, data_length)) { // send header
fprintf(stderr,"could not sent HTTP POST header\n");
} else {
// send PZEM-004T values
for (pzem_meter = 0; pzem_meter<LENGTH(pzem_measurements); pzem_meter++) {
for (pzem_measurement = 0; pzem_measurement<SENSOR_PZEM_MAX; pzem_measurement++) {
struct sensor_pzem_measurement_t measurement = pzem_measurements[pzem_meter][pzem_measurement]; // get measurement
if (measurement.valid) { // only use valid measurements
switch (measurement.type) { // make line (hope no error is occurring)
case SENSOR_PZEM_VOLTAGE:
snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.voltage);
break;
case SENSOR_PZEM_CURRENT:
snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.current);
break;
case SENSOR_PZEM_POWER:
snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.power);
break;
case SENSOR_PZEM_ENERGY:
snprintf(line, LENGTH(line), pzem_strings[pzem_measurement], pzem_meter, measurement.value.energy);
break;
default:
break;
}
http_send((uint8_t*)line, 0); // don't care about the result
}
}
}
// send SDM120 values
for (sdm120_meter = 0; sdm120_meter<LENGTH(sdm120_measurements); sdm120_meter++) {
for (sdm120_measurement = 0; sdm120_measurement<SENSOR_SDM120_MEASUREMENT_MAX; sdm120_measurement++) {
@ -670,6 +550,7 @@ void main(void)
}
}
}
// send DM100TC values
if (snprintf(line, LENGTH(line), ddm100tc_string_energy, ddm100tc_value_energy)>0) {
http_send((uint8_t*)line, 0); // don't care about the result
}
@ -681,7 +562,6 @@ void main(void)
printf("OK\n");
}
pzem_meter = 0; // reset meter
sdm120_meter = 0; // reset meter
}