add command to set energy value
This commit is contained in:
parent
0fcfb25f08
commit
dc776f4ebe
19
main.c
19
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 <Wh>\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 {
|
||||
|
|
Loading…
Reference in New Issue