代码暂存,添加断电保护功能(测试版)
This commit is contained in:
parent
9381774250
commit
c5978ab58e
|
@ -128,8 +128,8 @@ int main(void)
|
||||||
BSP_VBAT_Init();
|
BSP_VBAT_Init();
|
||||||
logDebug("VBAT init ok\n");
|
logDebug("VBAT init ok\n");
|
||||||
|
|
||||||
// BSP_Ml307r_Init();
|
BSP_Ml307r_Init();
|
||||||
// logDebug("BSP_M1307r ok\n");
|
logDebug("BSP_M1307r ok\n");
|
||||||
|
|
||||||
BSP_KEY_Init(app_task_handler);
|
BSP_KEY_Init(app_task_handler);
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,13 @@
|
||||||
#include "CH58x_common.h"
|
#include "CH58x_common.h"
|
||||||
#define VBAT_EVT_START (0x0001 << 2)
|
#define VBAT_EVT_START (0x0001 << 2)
|
||||||
|
|
||||||
|
#define VBAT_LOW_THRESHOLD 3.0f // 电池电压低阈值,单位V
|
||||||
|
|
||||||
void VBAT_ADC_Init(void);
|
void VBAT_ADC_Init(void);
|
||||||
void BSP_VBAT_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_ */
|
#endif /* INCLUDE_BSP_ADC_H_ */
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
void BSP_Ml307r_Init(void);
|
void BSP_Ml307r_Init(void);
|
||||||
void Ml307r_Loop(void);
|
void Ml307r_Loop(void);
|
||||||
|
void BSP_Module_Emergency_Send(uint8_t* data, uint8_t len);
|
||||||
#endif //!@__BSP_ML307R_H__
|
#endif //!@__BSP_ML307R_H__
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -8,8 +8,15 @@
|
||||||
#include "CONFIG.h"
|
#include "CONFIG.h"
|
||||||
#include "log.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粗调偏差值
|
signed short RoughCalib_Value = 0; // ADC粗调偏差值
|
||||||
static tmosTaskID vbat_task_id = INVALID_TASK_ID;
|
static tmosTaskID vbat_task_id = INVALID_TASK_ID;
|
||||||
|
static uint8_t vbat_low_flag = 0; // 电压过低标志
|
||||||
|
|
||||||
void VBAT_ADC_Init(void)
|
void VBAT_ADC_Init(void)
|
||||||
{
|
{
|
||||||
// 功能引脚数字输入禁用寄存器
|
// 功能引脚数字输入禁用寄存器
|
||||||
|
@ -35,20 +42,111 @@ void ADC_GPIO_Init(void)
|
||||||
R8_ADC_CFG |= RB_ADC_POWER_ON;
|
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)
|
uint16_t VBAT_ProcessEvent(uint8_t task_id, uint16_t events)
|
||||||
{
|
{
|
||||||
if (events & VBAT_EVT_START)
|
if (events & VBAT_EVT_START)
|
||||||
{
|
{
|
||||||
uint16_t adc_vbat = 0;
|
uint16_t adc_vbat = 0;
|
||||||
float 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_ChannelCfg(0);
|
||||||
adc_vbat = ADC_ExcutSingleConver() + RoughCalib_Value;
|
adc_vbat = ADC_ExcutSingleConver() + RoughCalib_Value;
|
||||||
logDebug("adc_vbat =%d \n", adc_vbat);
|
if (adc_vbat > 100 && adc_vbat < 6000) {
|
||||||
vbat = (adc_vbat/1024.0-1)*1.05;
|
vbat = (adc_vbat/1024.0-1)*1.05;
|
||||||
logDebug("vbat =%f \n", vbat);
|
IN_VBAT = vbat * 2;
|
||||||
tmos_start_task(vbat_task_id, VBAT_EVT_START, MS1_TO_SYSTEM_TIME(1000*300)); //1000*60
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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 (events ^ VBAT_EVT_START);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -617,7 +617,7 @@ BMP390_ProcessEvent(uint8_t task_id, uint16_t events)
|
||||||
P[2] = (uint32_t)(data.pressure / 100);
|
P[2] = (uint32_t)(data.pressure / 100);
|
||||||
|
|
||||||
//printf("%d, %d, %d\r\n",T[0],T[1],T[2]);
|
//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_IN_START, MS1_TO_SYSTEM_TIME(500)); //100
|
||||||
//tmos_start_task(press_task_id, BMP390_ATOM_START, MS1_TO_SYSTEM_TIME(1000));
|
//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:
|
case 0:
|
||||||
logDebug("create device...\r\n");
|
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->reset_timer(e);
|
||||||
e->state++;
|
e->state++;
|
||||||
break;
|
break;
|
||||||
|
@ -271,7 +271,7 @@ uint16_t Ml307r_Handle(uint8_t task_id, uint16_t events)
|
||||||
if (events & ML307_PERIODIC_EVT)
|
if (events & ML307_PERIODIC_EVT)
|
||||||
{
|
{
|
||||||
Ml307r_Loop();
|
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 (events ^ ML307_PERIODIC_EVT);
|
||||||
}
|
}
|
||||||
return 0;
|
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);
|
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)
|
void BSP_Ml307r_Init(void)
|
||||||
{
|
{
|
||||||
Ml307r_Gpio_Init();
|
Ml307r_Gpio_Init();
|
||||||
|
@ -299,5 +319,6 @@ void BSP_Ml307r_Init(void)
|
||||||
simcom_init();
|
simcom_init();
|
||||||
BSP_Module_Connect_CtWing();
|
BSP_Module_Connect_CtWing();
|
||||||
BSP_Module_Send_Data(databuf, 5);
|
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)
|
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_RDY:
|
||||||
case UART_II_RECV_TOUT: //接收超时
|
case UART_II_RECV_TOUT: //接收超时
|
||||||
|
printf("UART_II_RECV_TOUT \r\n");
|
||||||
while(R8_UART3_RFC)
|
while(R8_UART3_RFC)
|
||||||
{
|
{
|
||||||
|
printf("shellHandler \r\n");
|
||||||
shellHandler(&shell, R8_UART3_RBR);
|
shellHandler(&shell, R8_UART3_RBR);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -35,7 +35,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef LOG_ENABLE
|
#ifndef LOG_ENABLE
|
||||||
#define LOG_ENABLE 0 /**< 使能log */
|
#define LOG_ENABLE 1 /**< 使能log */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if LOG_USING_LOCK == 1
|
#if LOG_USING_LOCK == 1
|
||||||
|
|
|
@ -52,7 +52,6 @@ void Uart_Log_Write(char *buffer, short len)
|
||||||
{
|
{
|
||||||
if (uartLog.shell)
|
if (uartLog.shell)
|
||||||
{
|
{
|
||||||
//
|
|
||||||
// log工具可以结合letter shell的尾行模式,实现log和shell共用一个终端,但不影响shell交互体验
|
// log工具可以结合letter shell的尾行模式,实现log和shell共用一个终端,但不影响shell交互体验
|
||||||
shellWriteEndLine(uartLog.shell, buffer, len);
|
shellWriteEndLine(uartLog.shell, buffer, len);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue