/** library to query measurements from peacefair PZEM-004 and PZEM-004T electricity meter * @file * @author King Kévin * @copyright SPDX-License-Identifier: GPL-3.0-or-later * @date 2016-2020 * @note peripherals used: USART @ref sensor_pzem_usart, timer @ref sensor_pzem_timer */ #pragma once /** a measurement response has been received */ extern volatile bool sensor_pzem_measurement_received; /** measurements (and configurations) offered by electricity meter */ enum sensor_pzem_measurement_type_t { SENSOR_PZEM_VOLTAGE = 0, SENSOR_PZEM_CURRENT = 1, SENSOR_PZEM_POWER = 2, SENSOR_PZEM_ENERGY = 3, // SENSOR_PZEM_ADDRESS = 4, // this is a setting, not a measurement // SENSOR_PZEM_ALARM = 5, // this is a setting, not a measurement SENSOR_PZEM_MAX }; /** measurement returned by electricity meter */ struct sensor_pzem_measurement_t { enum sensor_pzem_measurement_type_t type; /**< measurement type */ bool valid; /**< is the measurement valid (e.g. format and checksum are correct) */ /** possible measurement values */ union measurement_t { float voltage; /**< measured voltage in volts */ float current; /**< measured current in amperes */ uint16_t power; /**< measured power in watts */ uint32_t energy; /**< measured energy in watts/hour (24 bits) */ } value; /**< measurement value */ }; /** setup peripherals to communicate with electricity meter */ void sensor_pzem_setup(void); /** request measurement from electricity meter * @param[in] address electricity meter device address * @param[in] type measurement type to request */ void sensor_pzem_measurement_request(uint32_t address, enum sensor_pzem_measurement_type_t type); /** decode received measurement * @return decoded measurement (invalid if no new measurement has been received) */ struct sensor_pzem_measurement_t sensor_pzem_measurement_decode(void);