代码暂存,添加断电保护功能(测试版)

This commit is contained in:
常正强 2025-03-31 17:33:05 +08:00
parent 9381774250
commit c5978ab58e
9 changed files with 145 additions and 18 deletions

View File

@ -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);

View File

@ -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_ */

View File

@ -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__

View File

@ -8,8 +8,15 @@
#include "CONFIG.h"
#include "log.h"
#include "bsp_motor.h"
#include "bsp_led.h"
#include "bsp_ml307r.h"
#include <string.h>
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;

View File

@ -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));

View File

@ -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();
}

View File

@ -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;

View File

@ -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

View File

@ -52,11 +52,10 @@ void Uart_Log_Write(char *buffer, short len)
{
if (uartLog.shell)
{
//
// log工具可以结合letter shell的尾行模式实现log和shell共用一个终端但不影响shell交互体验
// log工具可以结合letter shell的尾行模式实现log和shell共用一个终端但不影响shell交互体验
shellWriteEndLine(uartLog.shell, buffer, len);
}
// UART1_SendString((uint8_t *)buffer, len);
// UART1_SendString((uint8_t *)buffer, len);
}