Add Zeroing electrical energy

This commit is contained in:
2024-03-12 11:28:55 +08:00
parent bbd32add04
commit d329c022b5
2 changed files with 59 additions and 31 deletions

64
main.c
View File

@@ -83,8 +83,8 @@ void Analysis_data(void)
if (Rx_Buffer[0] == Read_ID) // 确认 ID 正确 if (Rx_Buffer[0] == Read_ID) // 确认 ID 正确
{ {
crcnow.word16 = chkcrc(Rx_Buffer, reveive_number - 2); // reveive_number 是接收数据总长度 crcnow.word16 = chkcrc(Rx_Buffer, receive_number - 2); // receive_number 是接收数据总长度
if ((crcnow.byte[0] == Rx_Buffer[reveive_number - 1]) && (crcnow.byte[1] == Rx_Buffer[reveive_number - 2])) // 确认 CRC 校验正确 if ((crcnow.byte[0] == Rx_Buffer[receive_number - 1]) && (crcnow.byte[1] == Rx_Buffer[receive_number - 2])) // 确认 CRC 校验正确
{ {
Voltage_data = (((unsigned long)(Rx_Buffer[3])) << 24) | (((unsigned long)(Rx_Buffer[4])) << 16) | (((unsigned long)(Rx_Buffer[5])) << 8) | Rx_Buffer[6]; Voltage_data = (((unsigned long)(Rx_Buffer[3])) << 24) | (((unsigned long)(Rx_Buffer[4])) << 16) | (((unsigned long)(Rx_Buffer[5])) << 8) | Rx_Buffer[6];
Current_data = (((unsigned long)(Rx_Buffer[7])) << 24) | (((unsigned long)(Rx_Buffer[8])) << 16) | (((unsigned long)(Rx_Buffer[9])) << 8) | Rx_Buffer[10]; Current_data = (((unsigned long)(Rx_Buffer[7])) << 24) | (((unsigned long)(Rx_Buffer[8])) << 16) | (((unsigned long)(Rx_Buffer[9])) << 8) | Rx_Buffer[10];
@@ -114,7 +114,7 @@ void Print_data(void)
float energy_data = (float)Energy_data * 0.0001; float energy_data = (float)Energy_data * 0.0001;
printf("电能: %.2f KWH\n", energy_data); printf("电能: %.2f KWH\n", energy_data);
float pf_data = (float)Pf_data *0.001; float pf_data = (float)Pf_data * 0.001;
printf("功率因数: %.2f \n", pf_data); printf("功率因数: %.2f \n", pf_data);
float cO2_data = (float)CO2_data * 0.0001; float cO2_data = (float)CO2_data * 0.0001;
@@ -123,7 +123,29 @@ void Print_data(void)
printf("温度: %.2f ℃\n", (float)Temperature_data * 0.01); printf("温度: %.2f ℃\n", (float)Temperature_data * 0.01);
printf("频率: %.2f HZ\n", (float)Hz_data * 0.01); printf("频率: %.2f HZ\n", (float)Hz_data * 0.01);
return ; return;
}
// 电能清零
void Electric_energy_(int sec)
{
uint8_t RETURN_DATA[8] = { 0 };
uint8_t ELE_ZRRO[13] = { 0x01, 0x10, 0x00, 0x4B, 0x00, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x2C };
// 加入从开机算起60秒后
if (sec >= 3) {
printf("电能清零\n");
uart_write_blocking(UART0, ELE_ZRRO, 13);
sleep_ms(10);
uart_read_blocking(UART0, RETURN_DATA, 8);
for (int i = 0; i <= 8 - 1; i++) {
printf("0x%X ", RETURN_DATA[i]);
}
printf("\n");
}
return;
} }
static uint16_t IM1253B(void) static uint16_t IM1253B(void)
@@ -139,16 +161,16 @@ static uint16_t IM1253B(void)
sleep_ms(10); sleep_ms(10);
/* /*
// 官方软件内部按钮发送的数据 // 官方软件内部按钮发送的数据
// 电能清零 TX[13]:01 10 00 4B 00 02 04 00 00 00 00 B6 2C // 电能清零 TX[13]:01 10 00 4B 00 02 04 00 00 00 00 B6 2C
// RX[8]:01 10 00 4B 00 02 31 DE // RX[8]:01 10 00 4B 00 02 31 DE
// 读取 TX[8]:00 03 00 01 00 04 14 18 // 读取 TX[8]:00 03 00 01 00 04 14 18
// RX[13]:01 03 08 02 35 01 08 41 30 01 05 44 BD (直流模块) // RX[13]:01 03 08 02 35 01 08 41 30 01 05 44 BD (直流模块)
// 设置 TX[11]:00 10 00 04 00 01 02 01 05 6B D7 // 设置 TX[11]:00 10 00 04 00 01 02 01 05 6B D7
// RX[8]:01 10 00 04 00 01 40 08 // RX[8]:01 10 00 04 00 01 40 08
*/ */
// 发送 // 发送
read_enable = 1; read_enable = 1;
@@ -156,12 +178,12 @@ static uint16_t IM1253B(void)
sleep_ms(10); sleep_ms(10);
// 发送完成后接收数据并处理 // 发送完成后接收数据并处理
reveive_number = 37; receive_number = 37;
receive_finished = 1; receive_finished = 1;
Analysis_data(); Analysis_data();
// 打印原始十六进制数据 // 打印原始十六进制数据
for (i=0; i <= 37 - 1; i++) { for (i = 0; i <= 37 - 1; i++) {
printf("0x%X ", Rx_Buffer[i]); printf("0x%X ", Rx_Buffer[i]);
} }
printf("\n"); printf("\n");
@@ -179,21 +201,27 @@ int main(void)
set_sys_clock_khz(250000, true); set_sys_clock_khz(250000, true);
// 启动看门狗, 程序如果有阻塞或者程序逻辑错误重启 // 启动看门狗, 程序如果有阻塞或者程序逻辑错误重启
if (watchdog_caused_reboot()) { // 判断是否从看门狗启动或者正常启动 if (watchdog_caused_reboot()) { // 判断是否从看门狗启动或者正常启动
printf("Rebooted by Watchdog!\n"); printf("Rebooted by Watchdog!\n");
} else { } else {
printf("Clean boot\n"); printf("Clean boot\n");
} }
watchdog_enable(8300, 1); // 8秒检测是否重新加载看门狗计数器. (不更新计数器则重启硬件, 最高8秒(8秒后不喂狗硬件重启)) watchdog_enable(8300, 1); // 8秒检测是否重新加载看门狗计数器. (不更新计数器则重启硬件, 最高8秒(8秒后不喂狗硬件重启))
watchdog_start_tick(12); watchdog_start_tick(12);
printf("IM1253B module\n"); sec = 0;
printf("IM1253B Module\n");
while (1) { while (1) {
watchdog_update(); // 喂狗 watchdog_update(); // 喂狗
IM1253B(); IM1253B();
printf("\n"); printf("\n");
// 电能清零
sec++;
Electric_energy_(sec);
sleep_ms(2000); sleep_ms(2000);
} }

4
main.h
View File

@@ -26,8 +26,9 @@
int Read_ID = 0x01; int Read_ID = 0x01;
unsigned char Tx_Buffer[8]; unsigned char Tx_Buffer[8];
unsigned char Rx_Buffer[40]; unsigned char Rx_Buffer[40];
unsigned char read_enable, receive_finished, reveive_number; unsigned char read_enable, receive_finished, receive_number;
unsigned long Voltage_data, Current_data, Power_data, Energy_data, Pf_data, CO2_data, Temperature_data, Hz_data; unsigned long Voltage_data, Current_data, Power_data, Energy_data, Pf_data, CO2_data, Temperature_data, Hz_data;
int sec;
unsigned int calccrc(unsigned char crcbuf, unsigned int crc); unsigned int calccrc(unsigned char crcbuf, unsigned int crc);
unsigned int chkcrc(unsigned char *buf, unsigned char len); unsigned int chkcrc(unsigned char *buf, unsigned char len);
@@ -36,5 +37,4 @@ void Analysis_data(void);
void Print_data(void); void Print_data(void);
static uint16_t IM1253B(void); static uint16_t IM1253B(void);
#endif #endif