fix how received PZEM messages are handled
This commit is contained in:
parent
0c2d13bbe5
commit
51d8d5a3f5
|
@ -96,13 +96,16 @@ void sensor_pzem_measurement_request(uint32_t address, enum sensor_pzem_measurem
|
||||||
|
|
||||||
usart_enable_tx_interrupt(USART(SENSOR_PZEM_USART)); // enable interrupt to send other bytes
|
usart_enable_tx_interrupt(USART(SENSOR_PZEM_USART)); // enable interrupt to send other bytes
|
||||||
usart_send(USART(SENSOR_PZEM_USART),tx_buffer[tx_i++]); // start transmission
|
usart_send(USART(SENSOR_PZEM_USART),tx_buffer[tx_i++]); // start transmission
|
||||||
|
|
||||||
|
sensor_pzem_measurement_received = false; // reset flag
|
||||||
|
rx_i = 0; // prepare buffer to receive next measurement
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sensor_pzem_measurement_t sensor_pzem_measurement_decode(void)
|
struct sensor_pzem_measurement_t sensor_pzem_measurement_decode(void)
|
||||||
{
|
{
|
||||||
struct sensor_pzem_measurement_t measurement; // decoded measurement to return
|
struct sensor_pzem_measurement_t measurement; // decoded measurement to return
|
||||||
measurement.valid = false; // wait until the end to ensure validity
|
measurement.valid = false; // wait until the end to ensure validity
|
||||||
if (!sensor_pzem_measurement_received) { // no measurement received
|
if (rx_i<LENGTH(rx_buffer)) { // buffer is not full, thus no measurement received
|
||||||
return measurement;
|
return measurement;
|
||||||
}
|
}
|
||||||
if ((rx_buffer[0]&0xf0)!=0xa0) { // not a response received
|
if ((rx_buffer[0]&0xf0)!=0xa0) { // not a response received
|
||||||
|
|
14
main.c
14
main.c
|
@ -358,12 +358,12 @@ void main(void)
|
||||||
led_on(); // indicate setup is complete
|
led_on(); // indicate setup is complete
|
||||||
|
|
||||||
// variables for PZEM-004T meter measurements
|
// variables for PZEM-004T meter measurements
|
||||||
struct sensor_pzem_measurement_t pzem_measurements[2][SENSOR_PZEM_MAX]; // PZEM-004T measurements (2 meters, all 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_meter = 0; // PZEM-004T meter index (add to prefix)
|
||||||
uint8_t pzem_measurement = 0; // PZEM-004T measurement index (matches the type)
|
uint8_t pzem_measurement = 0; // PZEM-004T measurement index (matches the type)
|
||||||
|
|
||||||
// variables for SDM120 meter measurements
|
// variables for SDM120 meter measurements
|
||||||
float sdm120_measurements[2][SENSOR_SDM120_MEASUREMENT_MAX]; // SDM120 measurements (2 meters, all 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)
|
uint8_t sdm120_meter = 0; // SDM120 meter index (add to 1 to get ID)
|
||||||
uint8_t sdm120_measurement = 0; // SDM120 measurement index
|
uint8_t sdm120_measurement = 0; // SDM120 measurement index
|
||||||
|
|
||||||
|
@ -396,6 +396,7 @@ void main(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (sensor_pzem_measurement_received) { // measurement from electricity meter received
|
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
|
struct sensor_pzem_measurement_t measurement = sensor_pzem_measurement_decode(); // decode measurement
|
||||||
if (measurement.type>=SENSOR_PZEM_MAX) {
|
if (measurement.type>=SENSOR_PZEM_MAX) {
|
||||||
fprintf(stderr,"unknown measurement type: %u\n", measurement.type);
|
fprintf(stderr,"unknown measurement type: %u\n", measurement.type);
|
||||||
|
@ -513,15 +514,6 @@ void main(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (button_flag) { // user pressed button
|
|
||||||
action = true; // action has been performed
|
|
||||||
printf("button pressed\n");
|
|
||||||
led_toggle(); // toggle LED
|
|
||||||
for (uint32_t i=0; i<1000000; i++) { // wait a bit to remove noise and double trigger
|
|
||||||
__asm__("nop");
|
|
||||||
}
|
|
||||||
button_flag = false; // reset flag
|
|
||||||
}
|
|
||||||
while (rtc_internal_tick_flag) { // the internal RTC ticked
|
while (rtc_internal_tick_flag) { // the internal RTC ticked
|
||||||
rtc_internal_tick_flag = false; // reset flag
|
rtc_internal_tick_flag = false; // reset flag
|
||||||
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)
|
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)
|
||||||
|
|
Loading…
Reference in New Issue