diff --git a/main.c b/main.c index 227c56c..15358c1 100644 --- a/main.c +++ b/main.c @@ -74,6 +74,7 @@ volatile bool rtc_internal_tick_flag = false; /**< flag set when internal RTC ti #define DDM100TC_TIMER 4 /**< timer to measure time between pulses **/ #define DDM100TC_PORT B /**< timer ipnut capture port (TIM4_CH1=PB6) **/ #define DDM100TC_CAPTURE TIM4_CH1 /**< time input capture used to detect pulse **/ +#define DDM100TC_RATE 1600 /**< number of impulse/kWh */ volatile uint32_t ddm100tc_interval = 0; /**< last time interval between pulses **/ /** @} */ @@ -135,8 +136,8 @@ static void process_command(char* str) // parse command if (0==strcmp(word,"help")) { printf("available commands:\n"); - printf("led [on|off|toggle]\n"); - printf("time [HH:MM:SS]\n"); + printf("led on|off|toggle\n"); + printf("energy \n"); } else if (0==strcmp(word,"led")) { word = strtok(NULL,delimiter); if (!word) { @@ -153,6 +154,18 @@ static void process_command(char* str) } else { goto error; } + } else if (0==strcmp(word,"energy")) { + word = strtok(NULL,delimiter); + if (!word) { // value required but not provided + goto error; + } else { // save energy value + uint64_t energy = (atol(word)*DDM100TC_RATE)/1000; // get value to save + pwr_disable_backup_domain_write_protect(); // enable backup register write + BKP_DR1 = (energy>>16); // set high 16 bits + BKP_DR2 = (energy&0xffff); // set low 16 bits + pwr_enable_backup_domain_write_protect(); // protect backup register from write + printf("energy value set\n"); // notify user + } } else { goto error; } @@ -480,7 +493,7 @@ void main(void) sensor_sdm120_measurement_request(1+sdm120_meter, sdm120_measurement); // request first measurement // calculate and show DDM100TC measurements (base on number of pulses and interval) - ddm100tc_value_energy = (uint32_t)((((BKP_DR1<<16)+BKP_DR2)*(uint64_t)1000)/1600); // the meter has 1600 impulses/kWh (use 64-bit calculation to not overflow after 2684354 Wh) + ddm100tc_value_energy = (uint32_t)((((BKP_DR1<<16)+BKP_DR2)*(uint64_t)1000)/DDM100TC_RATE); // the meter has 1600 impulses/kWh (use 64-bit calculation to not overflow after 2684354 Wh) if (ddm100tc_interval==0) { // no measurements received yet ddm100tc_value_power = 0; } else {