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
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)
sensor_pzem_measurement_request(0xc0a80100+pzem_id, 0); // request first measurement
(void)pzem_measurements[pzem_id][0];
uint8_t pzem_meter = 0; // PZEM-004T meter index (add to prefix)
uint8_t pzem_measurement = 0; // PZEM-004T measurement index (matches the type)
sensor_pzem_measurement_request(0xc0a80100+pzem_meter, pzem_measurement); // request first measurement
// start getting all SDM120 measurements from all meters
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_measurement = 0; // SDM120 measurement index
sensor_sdm120_measurement_request(1+sdm120_meter, sdm120_measurement); // request first measurement
(void)sdm120_measurements[sdm120_meter][sdm120_measurement];
while (true) { // infinite loop
iwdg_reset(); // kick the dog
@ -354,20 +353,19 @@ void main(void)
fprintf(stderr,"unknown measurement type: %u\n", measurement.type);
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
switch (measurement.type) {
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;
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;
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;
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;
/* not used for this application
case SENSOR_PZEM_ADDRESS:
@ -380,16 +378,24 @@ void main(void)
default:
break;
}
if (measurement.type<SENSOR_PZEM_MAX-1) { // not all measurement types requested
sensor_pzem_measurement_request(0xc0a80100+pzem_id, measurement.type+1); // request next measurement
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_id++; // got to next meter
if (pzem_id<LENGTH(pzem_measurements)) { // ensure next meter exists
sensor_pzem_measurement_request(0xc0a80100+pzem_id, 0); // request measurement for next meter
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
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