代码暂存,添加断电保护功能(测试版)
This commit is contained in:
parent
9381774250
commit
c5978ab58e
|
@ -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);
|
||||
|
||||
|
|
|
@ -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_ */
|
||||
|
|
|
@ -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__
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue