used index for PZEM measurements

This commit is contained in:
King Kévin 2016-10-14 11:09:44 +02:00
parent 89f7df59d4
commit d7168937af
1 changed files with 21 additions and 15 deletions

36
main.c
View File

@ -304,16 +304,15 @@ void main(void)
// start getting all PZEM-004T measurements from all meters // start getting all PZEM-004T measurements from all meters
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[2][SENSOR_PZEM_MAX]; // PZEM-004T measurements (2 meters, all measurements)
uint8_t pzem_id = 0; // PZEM-004T meter index (add to prefix) uint8_t pzem_meter = 0; // PZEM-004T meter index (add to prefix)
sensor_pzem_measurement_request(0xc0a80100+pzem_id, 0); // request first measurement uint8_t pzem_measurement = 0; // PZEM-004T measurement index (matches the type)
(void)pzem_measurements[pzem_id][0]; sensor_pzem_measurement_request(0xc0a80100+pzem_meter, pzem_measurement); // request first measurement
// start getting all SDM120 measurements from all meters // start getting all SDM120 measurements from all meters
float sdm120_measurements[2][SENSOR_SDM120_MEASUREMENT_MAX]; // SDM120 measurements (2 meters, all measurements) float sdm120_measurements[2][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
sensor_sdm120_measurement_request(1+sdm120_meter, sdm120_measurement); // request first measurement sensor_sdm120_measurement_request(1+sdm120_meter, sdm120_measurement); // request first measurement
(void)sdm120_measurements[sdm120_meter][sdm120_measurement];
while (true) { // infinite loop while (true) { // infinite loop
iwdg_reset(); // kick the dog iwdg_reset(); // kick the dog
@ -354,20 +353,19 @@ void main(void)
fprintf(stderr,"unknown measurement type: %u\n", measurement.type); fprintf(stderr,"unknown measurement type: %u\n", measurement.type);
while (true); // unhandled error while (true); // unhandled error
} }
pzem_measurements[pzem_id][measurement.type] = measurement; // save measurement (the type matches the index)
if (measurement.valid) { // only show valid measurement if (measurement.valid) { // only show valid measurement
switch (measurement.type) { switch (measurement.type) {
case SENSOR_PZEM_VOLTAGE: case SENSOR_PZEM_VOLTAGE:
printf("PZEM-004T meter %u voltage: %.01f V\n", pzem_id, measurement.value.voltage); // display measurement printf("PZEM-004T meter %u voltage: %.01f V\n", pzem_meter, measurement.value.voltage); // display measurement
break; break;
case SENSOR_PZEM_CURRENT: case SENSOR_PZEM_CURRENT:
printf("PZEM-004T meter %u current: %.02f A\n", pzem_id, measurement.value.current); printf("PZEM-004T meter %u current: %.02f A\n", pzem_meter, measurement.value.current);
break; break;
case SENSOR_PZEM_POWER: case SENSOR_PZEM_POWER:
printf("PZEM-004T meter %u power: %.00f W\n", pzem_id, measurement.value.power); printf("PZEM-004T meter %u power: %.00f W\n", pzem_meter, measurement.value.power);
break; break;
case SENSOR_PZEM_ENERGY: case SENSOR_PZEM_ENERGY:
printf("PZEM-004T meter %u energy: %lu Wh\n", pzem_id, measurement.value.energy); printf("PZEM-004T meter %u energy: %lu Wh\n", pzem_meter, measurement.value.energy);
break; break;
/* not used for this application /* not used for this application
case SENSOR_PZEM_ADDRESS: case SENSOR_PZEM_ADDRESS:
@ -380,16 +378,24 @@ void main(void)
default: default:
break; break;
} }
if (measurement.type<SENSOR_PZEM_MAX-1) { // not all measurement types requested if (measurement.type!=pzem_measurement) {
sensor_pzem_measurement_request(0xc0a80100+pzem_id, measurement.type+1); // request next 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 } else { // all measurement types requested
pzem_id++; // got to next meter pzem_measurements[pzem_meter][pzem_measurement] = measurement; // save measurement (the type matches the index)
if (pzem_id<LENGTH(pzem_measurements)) { // ensure next meter exists pzem_meter++; // got to next meter
sensor_pzem_measurement_request(0xc0a80100+pzem_id, 0); // request measurement for 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 } else { // measurement not valid
sensor_pzem_measurement_request(0xc0a80100+pzem_id, measurement.type+1); // request same measurement 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 while (sensor_sdm120_measurement_received) { // measurement from electricity meter received