diff --git a/APP/peripheral_main.c b/APP/peripheral_main.c index cd45e72..7b9ad81 100644 --- a/APP/peripheral_main.c +++ b/APP/peripheral_main.c @@ -128,8 +128,8 @@ int main(void) BSP_VBAT_Init(); logDebug("VBAT init ok\n"); - // BSP_Ml307r_Init(); - // logDebug("BSP_M1307r ok\n"); + BSP_Ml307r_Init(); + logDebug("BSP_M1307r ok\n"); BSP_KEY_Init(app_task_handler); diff --git a/bsp/inc/bsp_adc.h b/bsp/inc/bsp_adc.h index 7c9fe2a..0e1c01e 100644 --- a/bsp/inc/bsp_adc.h +++ b/bsp/inc/bsp_adc.h @@ -11,7 +11,13 @@ #include "CH58x_common.h" #define VBAT_EVT_START (0x0001 << 2) +#define VBAT_LOW_THRESHOLD 3.0f // 电池电压低阈值,单位V + void VBAT_ADC_Init(void); void BSP_VBAT_Init(void); + +void Send_Low_Battery_Message(float vbat); +void Handle_Low_Battery(float vbat); + #endif /* INCLUDE_BSP_ADC_H_ */ diff --git a/bsp/inc/bsp_ml307r.h b/bsp/inc/bsp_ml307r.h index e63790c..8468ee1 100644 --- a/bsp/inc/bsp_ml307r.h +++ b/bsp/inc/bsp_ml307r.h @@ -16,7 +16,7 @@ void BSP_Ml307r_Init(void); void Ml307r_Loop(void); - +void BSP_Module_Emergency_Send(uint8_t* data, uint8_t len); #endif //!@__BSP_ML307R_H__ diff --git a/bsp/src/bsp_adc.c b/bsp/src/bsp_adc.c index 307d185..7287dd7 100644 --- a/bsp/src/bsp_adc.c +++ b/bsp/src/bsp_adc.c @@ -8,8 +8,15 @@ #include "CONFIG.h" #include "log.h" +#include "bsp_motor.h" +#include "bsp_led.h" +#include "bsp_ml307r.h" +#include + signed short RoughCalib_Value = 0; // ADC粗调偏差值 static tmosTaskID vbat_task_id = INVALID_TASK_ID; +static uint8_t vbat_low_flag = 0; // 电压过低标志 + void VBAT_ADC_Init(void) { // 功能引脚数字输入禁用寄存器 @@ -35,20 +42,111 @@ void ADC_GPIO_Init(void) R8_ADC_CFG |= RB_ADC_POWER_ON; } + +void Send_Low_Battery_Message(float vbat) +{ + char json_buffer[300]; + char time_str[20] = {0}; + snprintf(json_buffer, sizeof(json_buffer), + "{" + "\"device\":{" + "\"id\":\"SCV001\"," + "\"type\":\"SelfClosingValve\"," + "\"time\":\"%s\"" + "}," + "\"status\":\"closed\"," + "\"fault\":{" + "\"lowBattery\":true," + "\"commError\":false," + "\"code\":1001" + "}," + "\"monitor\":{" + "\"pressure\":0.8," + "\"voltage\":%.2f," + "\"lowVoltage\":true" + "}," + "\"network\":{" + "\"sinr\":15.2," + "\"rsrp\":-95.5," + "\"signal\":4" + "}," + "\"standards\":{" + "\"iotId\":\"IoT-SCV-12345\"" + "}" + "}", + time_str, vbat); + BSP_Module_Emergency_Send((uint8_t*)json_buffer, strlen(json_buffer)); + logDebug("Send low battery message: %s\n", json_buffer); +} + +// 处理电池电压低事件 +void Handle_Low_Battery(float vbat) +{ + if (!vbat_low_flag) { + VALVE_CLOSE(); + LED_VALVE_CLOSE; + Send_Low_Battery_Message(vbat); + vbat_low_flag = 1; + logDebug("Voltage is too low (%.2fV),Close valve\n", vbat); + } + LED_VBAT_OPEN; + DelayMs(100); +} + uint16_t VBAT_ProcessEvent(uint8_t task_id, uint16_t events) { if (events & VBAT_EVT_START) { uint16_t adc_vbat = 0; float vbat = 0; - ADC_GPIO_Init(); + float IN_VBAT = 0; + // ADC_GPIO_Init(); + // ADC_ChannelCfg(0); + // adc_vbat = ADC_ExcutSingleConver() + RoughCalib_Value; + // logDebug("adc_vbat =%d \n", adc_vbat); + // vbat = (adc_vbat/1024.0-1)*1.05; + // logDebug("vbat =%f \n", vbat); + // tmos_start_task(vbat_task_id, VBAT_EVT_START, MS1_TO_SYSTEM_TIME(1000*60)); //1000*60 + uint8_t retry_count = 0; + uint8_t success = 0; + + while (retry_count < 3 && !success) { + ADC_GPIO_Init(); + ADC_ChannelCfg(0); + adc_vbat = ADC_ExcutSingleConver() + RoughCalib_Value; + if (adc_vbat > 100 && adc_vbat < 6000) { + vbat = (adc_vbat/1024.0-1)*1.05; + IN_VBAT = vbat * 2; + logDebug("adc_vbat = %d, IN_VBAT = %.2f V\n", adc_vbat, IN_VBAT); + success = 1; + } else { + retry_count++; + DelayMs(10); + logDebug("ADC error %d/3\n", retry_count); + } + } + + if (success) { + if (IN_VBAT < VBAT_LOW_THRESHOLD) { + Handle_Low_Battery(IN_VBAT); + } else if (vbat_low_flag) { + vbat_low_flag = 0; + LED_VBAT_CLOSE; + logDebug("Voltage is normal (%.2fV)\n", IN_VBAT); + } + } else { + logDebug("Voltage measurement failed\n"); + if (!vbat_low_flag) { + IN_VBAT = 1.0f; + Handle_Low_Battery(IN_VBAT); + } + } - ADC_ChannelCfg(0); - adc_vbat = ADC_ExcutSingleConver() + RoughCalib_Value; - logDebug("adc_vbat =%d \n", adc_vbat); - vbat = (adc_vbat/1024.0-1)*1.05; - logDebug("vbat =%f \n", vbat); - tmos_start_task(vbat_task_id, VBAT_EVT_START, MS1_TO_SYSTEM_TIME(1000*300)); //1000*60 + uint32_t next_check_time = vbat_low_flag ? + MS1_TO_SYSTEM_TIME(1000*1) : //1000*30 电压低时30秒检测一次 + MS1_TO_SYSTEM_TIME(1000*6); //1000*60 正常时1分钟检测一次 + + tmos_start_task(vbat_task_id, VBAT_EVT_START, next_check_time); return (events ^ VBAT_EVT_START); } return 0; diff --git a/bsp/src/bsp_bmp390.c b/bsp/src/bsp_bmp390.c index babf4b7..4a3446c 100644 --- a/bsp/src/bsp_bmp390.c +++ b/bsp/src/bsp_bmp390.c @@ -617,7 +617,7 @@ BMP390_ProcessEvent(uint8_t task_id, uint16_t events) P[2] = (uint32_t)(data.pressure / 100); //printf("%d, %d, %d\r\n",T[0],T[1],T[2]); - // printf("%d, %d, %d, %d, %d, %d, %d \r\n",T[0],T[1],T[2],P[0],P[1],P[2],P[0]-P[1]); + logDebug("%d, %d, %d, %d, %d, %d, %d \r\n",T[0],T[1],T[2],P[0],P[1],P[2],P[0]-P[1]); } tmos_start_task(press_task_id, BMP390_IN_START, MS1_TO_SYSTEM_TIME(500)); //100 //tmos_start_task(press_task_id, BMP390_ATOM_START, MS1_TO_SYSTEM_TIME(1000)); diff --git a/bsp/src/bsp_ml307r.c b/bsp/src/bsp_ml307r.c index 167d4d8..da0d83a 100644 --- a/bsp/src/bsp_ml307r.c +++ b/bsp/src/bsp_ml307r.c @@ -170,7 +170,7 @@ static int BSP_Module_Connect_CtWing_Handle(at_env_t *e) { case 0: logDebug("create device...\r\n"); - e->println(e, "AT+MIPOPEN=0,\"TCP\",\"8.135.10.183\",32994,,1"); + e->println(e, "AT+MIPOPEN=0,\"TCP\",\"8.135.10.183\",32665,,1"); // 8.135.10.183,32994 e->reset_timer(e); e->state++; break; @@ -271,7 +271,7 @@ uint16_t Ml307r_Handle(uint8_t task_id, uint16_t events) if (events & ML307_PERIODIC_EVT) { Ml307r_Loop(); - tmos_start_task(ml307_task_id, ML307_PERIODIC_EVT, MS1_TO_SYSTEM_TIME(5)); + tmos_start_task(ml307_task_id, ML307_PERIODIC_EVT, MS1_TO_SYSTEM_TIME(1000)); //5 return (events ^ ML307_PERIODIC_EVT); } return 0; @@ -283,6 +283,26 @@ void BSP_Module_Send_Data(uint8_t* data, uint8_t len) at_send_data(ml307r_obj, &attr, data, len); } +// 断电保护数据上报 +void BSP_Module_Emergency_Send(uint8_t* data, uint8_t len) +{ + if (ml307_task_id != INVALID_TASK_ID) { + GPIOB_SetBits(ENABLE_3_8_V); // 确保3.8V供电正常 + BSP_Read_Module(); // 确保模块在工作状态 + at_attr_t attr; + at_send_data(ml307r_obj, &attr, data, len); + Ml307_Power_Off(); + logDebug("Power failure protection data has been sent\n"); + } else { + BSP_Ml307r_Init(); // 如果模块未初始化,先初始化 + logDebug("4G initialization\n"); + at_attr_t attr; + at_send_data(ml307r_obj, &attr, data, len); + Ml307_Power_Off(); + logDebug("Power failure protection data has been sent\n"); + } +} + void BSP_Ml307r_Init(void) { Ml307r_Gpio_Init(); @@ -299,5 +319,6 @@ void BSP_Ml307r_Init(void) simcom_init(); BSP_Module_Connect_CtWing(); BSP_Module_Send_Data(databuf, 5); + // Ml307_Power_Off(); } diff --git a/bsp/src/bsp_uart.c b/bsp/src/bsp_uart.c index 6d67339..898f767 100644 --- a/bsp/src/bsp_uart.c +++ b/bsp/src/bsp_uart.c @@ -40,7 +40,8 @@ unsigned int BSP_Uart1_Send_Data(const void *buf, unsigned int len) //串口接收 unsigned int BSP_Uart3_Receive_Data(void *buf, unsigned int len) { - return lwrb_write(&uart3_rx_t, buf, len); + // return lwrb_write(&uart3_rx_t, buf, len); + return lwrb_read(&uart3_rx_t, buf, len); } //串口发送数据 @@ -198,8 +199,10 @@ void UART3_IRQHandler(void) } case UART_II_RECV_RDY: case UART_II_RECV_TOUT: //接收超时 + printf("UART_II_RECV_TOUT \r\n"); while(R8_UART3_RFC) { + printf("shellHandler \r\n"); shellHandler(&shell, R8_UART3_RBR); } break; diff --git a/common/letter-shell-master/src/log.h b/common/letter-shell-master/src/log.h index e9cf349..14f6100 100644 --- a/common/letter-shell-master/src/log.h +++ b/common/letter-shell-master/src/log.h @@ -35,7 +35,7 @@ extern "C" { #endif #ifndef LOG_ENABLE - #define LOG_ENABLE 0 /**< 浣胯兘log */ + #define LOG_ENABLE 1 /**< 浣胯兘log */ #endif #if LOG_USING_LOCK == 1 diff --git a/common/letter-shell-master/src/shell_port.c b/common/letter-shell-master/src/shell_port.c index 6c0d7ba..f6780cc 100644 --- a/common/letter-shell-master/src/shell_port.c +++ b/common/letter-shell-master/src/shell_port.c @@ -52,11 +52,10 @@ void Uart_Log_Write(char *buffer, short len) { if (uartLog.shell) { -// -// log宸ュ叿鍙互缁撳悎letter shell鐨勫熬琛屾ā寮忥紝瀹炵幇log鍜宻hell鍏辩敤涓涓粓绔紝浣嗕笉褰卞搷shell浜や簰浣撻獙 + // log宸ュ叿鍙互缁撳悎letter shell鐨勫熬琛屾ā寮忥紝瀹炵幇log鍜宻hell鍏辩敤涓涓粓绔紝浣嗕笉褰卞搷shell浜や簰浣撻獙 shellWriteEndLine(uartLog.shell, buffer, len); } -// UART1_SendString((uint8_t *)buffer, len); + // UART1_SendString((uint8_t *)buffer, len); }