完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在特定的功能过程中按下复位按钮时,整个EEPROM复位并填充随机值。
代码:全选#include typedef struct { uint32_t uint0_8_bit : 8; uint32_t uint8_16_bit : 8; uint32_t uint16_24_bit: 8; uint32_t uint24_32_bit: 8; } uint32_data_st; float VF = 0; float CF = 0; float Vol = 0; float Current = 0; float Power = 0; uint32_t PFData = 0; uint8_t last_state_of_PF_bit = 0; #define Button_reset_eeprom 0 uint32_t VolPar; uint32_t VolData; uint32_t PowerPar; uint32_t PowerData; uint16_t PF; uint32_t CurrentPar; uint32_t CurrentData; float last_kwh_reading = 0.0; #include //#define HL Serial SoftwareSerial HL(D1, D2); // RX, TX void setup() { // put your setup code here, to run once: pinMode(Button_reset_eeprom, INPUT_PULLUP); EEPROM.begin(512); pinMode(LED_BUILtiN, OUTPUT); Serial.begin(4800); VF = 1.88; CF = 1.0; Serial.println("--------last_kwh_reading start -------"); last_kwh_reading = read_data_total_KWH() ; Serial.println( last_kwh_reading, 4); Serial.println("--------last_kwh_reading end -------"); Serial.println("======EE========"); Serial.println((char)EEPROM.read(511)); Serial.println("========EEE======"); //delay(10000); HL.begin(4800, SWSERIAL_8E1); // HL.enableIntTx(true); } void loop() { if (digitalRead(Button_reset_eeprom) == 0) { Serial.println("============== Reset EEPROM =========== n============== reset mcu =============="); store_data_total_KWH(00.000000000); delay(1000); ESP.reset(); } digitalWrite(LED_BUILTIN, 0); HLW8032_Work(); digitalWrite(LED_BUILTIN, 1); delay(3000); }// END void loop() bool Checksum(uint8_t serial_data[24]) { byte check = 0; for (byte a = 0; a <= 20; a++) { check = check + serial_data[a]; } if (check == serial_data[21]) { return true; } else { return false; } } float GetKWh() { float InspectingPower = GetInspectingPower(); float PFcnt_pls = (1.0 / (float)PowerPar) * (1.0 / (float)VF * (float)CF ) * 1000000000.0 * 3600.0; //float KWh = ((float)PFData * (float)PF) / (float)PFcnt; float KWh = (((float)PFData * 65536.0) + (float)PF) / (float)PFcnt_pls; return KWh; } float GetInspectingPower() { return (float)Vol * (float)Current * 0.001; } void store_data_total_KWH( float data_ft) { uint32_t data_32 = FloatToUint (data_ft); uint32_data_st *data_32_data_pt ; data_32_data_pt = (uint32_data_st*) &data_32; uint8_t data_byte_0 = data_32_data_pt->uint0_8_bit; uint8_t data_byte_8 = data_32_data_pt->uint8_16_bit; uint8_t data_byte_16 = data_32_data_pt->uint16_24_bit; uint8_t data_byte_24 = data_32_data_pt->uint24_32_bit; EEPROM.write(5, data_byte_0); EEPROM.commit(); EEPROM.write(6, data_byte_8); EEPROM.commit(); EEPROM.write(7, data_byte_16); EEPROM.commit(); EEPROM.write(8, data_byte_24); EEPROM.commit(); EEPROM.write(511, 'A'); if (EEPROM.commit()) { Serial.println("------Store Done Total KWH------"); } } float read_data_total_KWH(void) { return UintToFloat (( EEPROM.read(8) << 24 | (EEPROM.read(7) << 16 | EEPROM.read(6) << 8) | (EEPROM.read(5)) )) ; } uint32_t FloatToUint(float n) { return (uint32_t)(*(uint32_t*)&n); } float UintToFloat(uint32_t n) { return (float)(*(float*)&n); } void HLW8032_Work(void) { serial_flush(); delay(200); if (HL.available() > 0) { for (uint8_t HL_Serial_loop = 0; HL_Serial_loop <= 24 ; HL_Serial_loop++) { uint8_t status_reg = HL.read(); //Serial.println(status_reg,HEX); if (status_reg == 0x55) { //delay(5); // no need due to delay before "if (HL.available() > 0)" uint8_t chk_reg = HL.read(); if (chk_reg == 0x5A) { // Serial.println("------ Serial Data Hex ------"); //for (uint8_t serial_index = 0; serial_index <= 21 ; serial_index++) uint8_t serial_data[24] = {0}; uint8_t serial_index = 0; while (HL.available() > 0) { serial_data[serial_index] = HL.read(); //delay(2); // no need due to delay before "if (HL.available() > 0)" if (serial_index >= 21) { break; } serial_index++; } Serial.println("============== serial_index length ================"); Serial.println(serial_index); Serial.println("==================================================="); if (serial_index != 21) { Serial.println("======================Return============================="); return; } //Serial.println("---------------"); if (Checksum(serial_data) == true) { VolPar = ((uint32_t)serial_data[0] << 16) + ((uint32_t)serial_data[1] << 8) + serial_data[2]; if (bitRead(serial_data[18], 6) == 1) { VolData = ((uint32_t)serial_data[3] << 16) + ((uint32_t)serial_data[4] << 8) + serial_data[5]; Vol = ((float)VolPar / (float)VolData) * (float)VF; } CurrentPar = ((uint32_t)serial_data[6] << 16) + ((uint32_t)serial_data[7] << 8) + serial_data[8]; if (bitRead(serial_data[18], 5) == 1) { CurrentData = ((uint32_t)serial_data[9] << 16) + ((uint32_t)serial_data[10] << 8) + serial_data[11]; Current = (((float)CurrentPar / (float)CurrentData) * (float)CF) * 1000.0; } if (bitRead(serial_data[18], 4) == 1 ) { PowerPar = ((uint32_t)serial_data[12] << 16) + ((uint32_t)serial_data[13] << 8) + (uint32_t)serial_data[14]; PowerData = ((uint32_t)serial_data[15] << 16) + ((uint32_t)serial_data[16] << 8) + (uint32_t)serial_data[17]; Power = (((float)PowerPar / (float)PowerData) * (float)VF * (float)CF); } PF = ((uint16_t)serial_data[19] << 8) + serial_data[20]; //store_data_KWH(PF); if (bitRead(serial_data[18], 7) == 1 && last_state_of_PF_bit == 0) { PFData++; last_state_of_PF_bit = 1; } else if (bitRead(serial_data[18], 7) == 0 && last_state_of_PF_bit == 1) { PFData++; last_state_of_PF_bit = 0; } Serial.println("++++++ Test++++++"); Serial.println(bitRead(serial_data[18], 7)); Serial.println("+++++++++++++++++"); Serial.println("n====================Readings===================="); Serial.println("Voltage= " + (String) Vol); Serial.println("CurrentData= " + (String)Current ); Serial.println("Power Active = " + (String)Power); Serial.println("Power Inspected = " + (String) GetInspectingPower()); Serial.println("Power Data= " + (String)PFData); Serial.println("PF resisror = " + (String)PF); float KWH = GetKWh(); Serial.print("Power Kwh= " ); Serial.println(KWH, 4); //store_data_KWH( KWH ); float total_power = last_kwh_reading + KWH ; store_data_total_KWH(total_power); Serial.print("Total Power Kwh= " ); Serial.println(total_power, 4); Serial.println("n=============================================="); return; } }//END if (chk_reg == 0x5A) }// END if (status_reg == 0x55) else if (status_reg >> 4 == 0x0F) { //Serial.println(status_reg,HEX); bool pwr_ovf = status_reg & 0x02; bool cur_ovf = status_reg & 0x04; bool vol_ovf = status_reg & 0x08; if (pwr_ovf == 1) { //Serial.println("----> pwr_ovf <----"); } if (cur_ovf == 1) { // Serial.println("----> cur_ovf <----"); } if (vol_ovf == 1) { //Serial.println("----> vol_ovf <----"); } } } } // END if (HL.available() > 0) } void serial_flush() { for (uint16_t i = 0; i <= 2400 ; i++) { HL.read(); HL.flush(); } } |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
313 浏览 0 评论
1170 浏览 1 评论
585浏览 6评论
483浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
468浏览 5评论
467浏览 4评论
442浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 10:44 , Processed in 0.822801 second(s), Total 75, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号