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_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 measurement; // decoded measurement to return
|
||||
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;
|
||||
}
|
||||
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
|
||||
|
||||
// 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_measurement = 0; // PZEM-004T measurement index (matches the type)
|
||||
|
||||
// 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_measurement = 0; // SDM120 measurement index
|
||||
|
||||
@ -396,6 +396,7 @@ 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);
|
||||
@ -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
|
||||
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)
|
||||
|
Loading…
Reference in New Issue
Block a user