huyongji1.1-system/Inf/Inf_4G.c

920 lines
33 KiB
C
Raw Normal View History

2025-04-16 09:58:09 +08:00
#include "Inf_4G.h"
// <20><>Irrigation.h<>򵥶<EFBFBD><F2B5A5B6><EFBFBD>config.h<>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD><EFBFBD>
// AT<41><54><EFBFBD><EFBFBD>״̬
typedef enum
{
AT_IDLE,
AT_SENDING,
AT_WAITING,
AT_COMPLETE
} AT_State_t;
uint8_t force_pump_off = 0; // ˮ<><CBAE>ǿ<EFBFBD>ƹرձ<D8B1>־
uint8_t force_fan_off = 0; // <20><><EFBFBD><EFBFBD>ǿ<EFBFBD>ƹرձ<D8B1>־
AT_State_t at_state = AT_IDLE;
uint32_t at_start_time = 0;
2025-05-20 09:41:22 +08:00
char sim_iccid[ICCID_LENGTH] = {0}; // <20><>ʼ<EFBFBD><CABC>ICCID<49><44><EFBFBD><EFBFBD>
2025-04-16 09:58:09 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t rxBuff[RX_BUFFER_SIZE]; /* <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>жϽ<D0B6><CFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD> */
uint16_t rxDataSize; /* һ<><D2BB><EFBFBD>жϽ<D0B6><CFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
uint8_t responseBuff[RESPONSE_BUFFER_SIZE]; /* <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>жϽ<D0B6><CFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD> */
uint16_t responseDataSize; /* һ<><D2BB><EFBFBD>жϽ<D0B6><CFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void Publish_Power_Data(void);
2025-05-20 09:41:22 +08:00
2025-04-16 09:58:09 +08:00
volatile uint8_t need_upload = 0;
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t size)
{
if (huart->Instance == USART2)
{
rxDataSize = size;
2025-05-20 09:41:22 +08:00
HAL_UARTEx_ReceiveToIdle_IT(&huart2, rxBuff, 1024);
2025-04-16 09:58:09 +08:00
}
}
void Inf_4G_Init(void)
{
/* <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2 */
MX_USART2_UART_Init();
HAL_UARTEx_ReceiveToIdle_IT(&huart2, rxBuff, 1024);
Inf_4G_SendAtCmd("AT+CFUN=1\r\n");
HAL_Delay(2000);
Inf_4G_SendAtCmd("AT\r\n");
2025-05-20 09:41:22 +08:00
// <20><>ȡICCID
Get_ICCID();
2025-04-16 09:58:09 +08:00
// <20><>ȡ<EFBFBD><C8A1>ʼ<EFBFBD>ź<EFBFBD>ǿ<EFBFBD><C7BF>
Get_Signal_Strength();
}
void Inf_4G_SendAtCmd(uint8_t *atcmd)
{
// <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
memset(responseBuff, 0, sizeof(responseBuff));
responseDataSize = 0;
rxDataSize = 0;
// <20><><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD>
HAL_UART_Transmit(&huart2, atcmd, strlen((char *)atcmd), 500);
// <20>ȴ<EFBFBD><C8B4><EFBFBD>Ӧ
uint16_t timeout = 1000; // 1<>볬ʱ
while (timeout--)
{
if (rxDataSize > 0)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ
if (strstr((char *)rxBuff, "OK") || strstr((char *)rxBuff, "ERROR"))
{
return; // <20>յ<EFBFBD><D5B5><EFBFBD>Ӧֱ<D3A6>ӷ<EFBFBD><D3B7><EFBFBD>
}
rxDataSize = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD>С
}
HAL_Delay(1); // 1ms<6D><73>ʱ
}
// <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
printf("AT<EFBFBD><EFBFBD><EFBFBD>ʱ: %s\n", atcmd);
}
// void Inf_EC800_4GInit(void)
// {
// // <20><>ʼ<EFBFBD><CABC>4Gģ<47><C4A3>
// Inf_4G_SendAtCmd("AT+CSQ\r\n");
// Inf_4G_SendAtCmd("AT+CPIN?\r\n");
// Inf_4G_SendAtCmd("AT+CEREG?\r\n");
// }
void Inf_EC800_MQTT_Publish(const char *topic, const char *payload)
{
char atCmd[128];
snprintf(atCmd, sizeof(atCmd), "AT+QMTPUB=0,0,0,0,\"%s\"\r\n", topic);
// <20><><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD>ȴ<EFBFBD>">"<22><>ʾ<EFBFBD><CABE>
Inf_4G_SendAtCmd((uint8_t *)atCmd);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
HAL_UART_Transmit(&huart2, (uint8_t *)payload, strlen(payload), 1000);
HAL_UART_Transmit(&huart2, (uint8_t *)"\x1A", 1, 1000); // Ctrl+Z
// <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD>Ӧ
HAL_Delay(1000);
}
void Inf_EC800_ReadData(void)
{
if (rxDataSize > 0)
{
printf("<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD><EFBFBD>ԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>: %s\n", rxBuff);
if (strstr((char *)rxBuff, "+QMTRECV:"))
{
char *jsonStart = strchr((char *)rxBuff, '{');
char *jsonEnd = strrchr((char *)rxBuff, '}');
if (jsonStart && jsonEnd && jsonEnd > jsonStart)
{
int jsonLen = jsonEnd - jsonStart + 1;
char jsonStr[256] = {0};
strncpy(jsonStr, jsonStart, jsonLen);
int value = 0;
// LED<45><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ģʽ<C4A3>л<EFBFBD>
if (sscanf(jsonStr, "{\"X10\":%d}", &value) == 1)
{
switch (value)
{
case 1: // <20><><EFBFBD><EFBFBD>ģʽ
Switch_Mode(MODE_FLUSH);
printf("<EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ\n");
rxDataSize = 0;
memset(rxBuff, 0, sizeof(rxBuff));
break;
case 2: // <20><><EFBFBD><EFBFBD>ģʽ
Switch_Mode(MODE_IRRIGATION);
printf("<EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ\n");
rxDataSize = 0;
memset(rxBuff, 0, sizeof(rxBuff));
break;
case 3: // ֱ<><D6B1>ģʽ
Switch_Mode(MODE_DIRECT);
printf("<EFBFBD>л<EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD>ģʽ\n");
rxDataSize = 0;
memset(rxBuff, 0, sizeof(rxBuff));
break;
default:
// printf("<22><>Ч<EFBFBD><D0A7>ģʽֵ: %d\n", value);
break;
}
}
// <20>޸<EFBFBD>ˮ<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ʱ<EFBFBD><CAB1>
else if (sscanf(jsonStr, "{\"X24\":%d}", &value) == 1)
{
// 1. <20><>ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1><EFBFBD>ж<EFBFBD>
HAL_TIM_Base_Stop_IT(&htim2); // <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD>TIM2<4D><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
switch (current_mode)
{
case MODE_IRRIGATION:
2025-05-20 09:41:22 +08:00
HIGH_LEVEL_PUMP_ON_TIME = (uint32_t)value;
2025-04-16 09:58:09 +08:00
break;
case MODE_FLUSH:
2025-05-20 09:41:22 +08:00
FLUSH_HIGH_PUMP_ON_TIME = (uint32_t)value;
2025-04-16 09:58:09 +08:00
break;
case MODE_DIRECT:
DIRECT_HIGH_PUMP_ON_TIME = (uint32_t)value;
break;
}
Time_Save(); // <20><><EFBFBD><EFBFBD><EFBFBD>޸ĺ<DEB8><C4BA><EFBFBD>ʱ<EFBFBD><CAB1>
// 3. <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Control_WaterPump(0);
Control_Fan1(0);
Control_Fan2(0);
// 4. <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
pump_timer = 0;
fan_timer = 0;
2025-05-20 09:41:22 +08:00
// timer_count = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵļ<DCB5>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҲҪ<D2B2><D2AA><EFBFBD><EFBFBD>
2025-04-16 09:58:09 +08:00
// 5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
__HAL_TIM_SET_COUNTER(&htim2, 0);
// <20><><EFBFBD><EFBFBD>ˮ<EFBFBD>ü<EFBFBD>ʱ<EFBFBD><CAB1>
Restart_Current_Mode(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰģʽ
HAL_TIM_Base_Start_IT(&htim2);
}
// <20>޸<EFBFBD>ˮ<EFBFBD><CBAE>ֹͣʱ<D6B9><CAB1>
else if (sscanf(jsonStr, "{\"X25\":%d}", &value) == 1)
{
2025-05-20 09:41:22 +08:00
// 1. <20><>ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1><EFBFBD>ж<EFBFBD>
HAL_TIM_Base_Stop_IT(&htim2); // <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD>TIM2<4D><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
2025-04-16 09:58:09 +08:00
switch (current_mode)
{
case MODE_IRRIGATION:
HIGH_LEVEL_PUMP_OFF_TIME = value;
// printf("<22><><EFBFBD><EFBFBD>ģʽˮ<CABD><CBAE>ֹͣʱ<D6B9><CAB1><EFBFBD>޸<EFBFBD>Ϊ<EFBFBD><CEAA>%d<><64><EFBFBD><EFBFBD>\n", value);
break;
case MODE_FLUSH:
FLUSH_HIGH_PUMP_OFF_TIME = value;
// printf("<22><><EFBFBD><EFBFBD>ģʽˮ<CABD><CBAE>ֹͣʱ<D6B9><CAB1><EFBFBD>޸<EFBFBD>Ϊ<EFBFBD><CEAA>%d<><64><EFBFBD><EFBFBD>\n", value);
break;
case MODE_DIRECT:
DIRECT_HIGH_PUMP_OFF_TIME = value;
// printf("ֱ<><D6B1>ģʽˮ<CABD><CBAE>ֹͣʱ<D6B9><CAB1><EFBFBD>޸<EFBFBD>Ϊ<EFBFBD><CEAA>%d<><64><EFBFBD><EFBFBD>\n", value);
break;
}
Time_Save(); // <20><><EFBFBD><EFBFBD><EFBFBD>޸ĺ<DEB8><C4BA><EFBFBD>ʱ<EFBFBD><CAB1>
// 3. <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Control_WaterPump(0);
Control_Fan1(0);
Control_Fan2(0);
// 4. <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
pump_timer = 0;
fan_timer = 0;
// timer_count = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵļ<DCB5>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҲҪ<D2B2><D2AA><EFBFBD><EFBFBD>
// 5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
__HAL_TIM_SET_COUNTER(&htim2, 0);
// <20><><EFBFBD><EFBFBD>ˮ<EFBFBD>ü<EFBFBD>ʱ<EFBFBD><CAB1>
Restart_Current_Mode(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰģʽ
HAL_TIM_Base_Start_IT(&htim2);
}
else if (sscanf(jsonStr, "{\"X54\":%d}", &value) == 1)
{
2025-05-20 09:41:22 +08:00
// 1. <20><>ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1><EFBFBD>ж<EFBFBD>
HAL_TIM_Base_Stop_IT(&htim2); // <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD>TIM2<4D><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
2025-04-16 09:58:09 +08:00
switch (current_mode)
{
case MODE_IRRIGATION:
HIGH_LEVEL_FAN_ON_TIME = value;
break;
case MODE_FLUSH:
FLUSH_HIGH_FAN_ON_TIME = value;
break;
case MODE_DIRECT:
DIRECT_HIGH_FAN_ON_TIME = value;
break;
}
Time_Save(); // <20><><EFBFBD><EFBFBD><EFBFBD>޸ĺ<DEB8><C4BA><EFBFBD>ʱ<EFBFBD><CAB1>
// 3. <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Control_WaterPump(0);
Control_Fan1(0);
Control_Fan2(0);
// 4. <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
pump_timer = 0;
fan_timer = 0;
// timer_count = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵļ<DCB5>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҲҪ<D2B2><D2AA><EFBFBD><EFBFBD>
// 5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
__HAL_TIM_SET_COUNTER(&htim2, 0);
// <20><><EFBFBD><EFBFBD>ˮ<EFBFBD>ü<EFBFBD>ʱ<EFBFBD><CAB1>
Restart_Current_Mode(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰģʽ
HAL_TIM_Base_Start_IT(&htim2);
}
// <20>޸ĸ<DEB8>Һλ<D2BA><CEBB><EFBFBD><EFBFBD>ֹͣʱ<D6B9><CAB1>
else if (sscanf(jsonStr, "{\"X55\":%d}", &value) == 1)
{
switch (current_mode)
{
case MODE_IRRIGATION:
HIGH_LEVEL_FAN_OFF_TIME = value;
break;
case MODE_FLUSH:
FLUSH_HIGH_FAN_OFF_TIME = value;
break;
case MODE_DIRECT:
DIRECT_HIGH_FAN_OFF_TIME = value;
break;
}
Time_Save(); // <20><><EFBFBD><EFBFBD><EFBFBD>޸ĺ<DEB8><C4BA><EFBFBD>ʱ<EFBFBD><CAB1>
// 3. <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Control_WaterPump(0);
Control_Fan1(0);
Control_Fan2(0);
// 4. <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
pump_timer = 0;
fan_timer = 0;
2025-05-20 09:41:22 +08:00
// timer_count = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵļ<DCB5>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҲҪ<D2B2><D2AA><EFBFBD><EFBFBD>
2025-04-16 09:58:09 +08:00
// 5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
__HAL_TIM_SET_COUNTER(&htim2, 0);
// <20><><EFBFBD><EFBFBD>ˮ<EFBFBD>ü<EFBFBD>ʱ<EFBFBD><CAB1>
Restart_Current_Mode(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰģʽ
HAL_TIM_Base_Start_IT(&htim2);
}
// <20>޸ĵ<DEB8>Һλ<D2BA><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
else if (sscanf(jsonStr, "{\"X56\":%d}", &value) == 1)
{
2025-05-20 09:41:22 +08:00
// 1. <20><>ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1><EFBFBD>ж<EFBFBD>
HAL_TIM_Base_Stop_IT(&htim2); // <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD>TIM2<4D><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
2025-04-16 09:58:09 +08:00
switch (current_mode)
{
case MODE_IRRIGATION:
LOW_LEVEL_FAN_ON_TIME = value;
break;
case MODE_FLUSH:
FLUSH_LOW_FAN_ON_TIME = value;
break;
case MODE_DIRECT:
DIRECT_LOW_FAN_ON_TIME = value;
break;
}
Time_Save(); // <20><><EFBFBD><EFBFBD><EFBFBD>޸ĺ<DEB8><C4BA><EFBFBD>ʱ<EFBFBD><CAB1>
// 3. <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-05-20 09:41:22 +08:00
Control_WaterPump(0);
2025-04-16 09:58:09 +08:00
Control_Fan1(0);
Control_Fan2(0);
// 4. <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
pump_timer = 0;
2025-05-20 09:41:22 +08:00
fan_timer = 0;
2025-04-16 09:58:09 +08:00
// timer_count = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵļ<DCB5>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҲҪ<D2B2><D2AA><EFBFBD><EFBFBD>
// 5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
__HAL_TIM_SET_COUNTER(&htim2, 0);
// <20><><EFBFBD><EFBFBD>ˮ<EFBFBD>ü<EFBFBD>ʱ<EFBFBD><CAB1>
Restart_Current_Mode(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰģʽ
HAL_TIM_Base_Start_IT(&htim2);
}
// <20>޸ĵ<DEB8>Һλ<D2BA><CEBB><EFBFBD><EFBFBD>ֹͣʱ<D6B9><CAB1>
else if (sscanf(jsonStr, "{\"X57\":%d}", &value) == 1)
{
2025-05-20 09:41:22 +08:00
// 1. <20><>ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1><EFBFBD>ж<EFBFBD>
HAL_TIM_Base_Stop_IT(&htim2); // <20><><EFBFBD><EFBFBD>ʹ<EFBFBD>õ<EFBFBD><C3B5><EFBFBD>TIM2<4D><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
2025-04-16 09:58:09 +08:00
switch (current_mode)
{
case MODE_IRRIGATION:
LOW_LEVEL_FAN_OFF_TIME = value;
break;
case MODE_FLUSH:
FLUSH_LOW_FAN_OFF_TIME = value;
break;
case MODE_DIRECT:
DIRECT_LOW_FAN_OFF_TIME = value;
break;
}
Time_Save(); // <20><><EFBFBD><EFBFBD><EFBFBD>޸ĺ<DEB8><C4BA><EFBFBD>ʱ<EFBFBD><CAB1>
// 3. <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Control_WaterPump(0);
Control_Fan1(0);
Control_Fan2(0);
// 4. <20><>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
pump_timer = 0;
fan_timer = 0;
// timer_count = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵļ<DCB5>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҲҪ<D2B2><D2AA><EFBFBD><EFBFBD>
// 5. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
__HAL_TIM_SET_COUNTER(&htim2, 0);
// <20><><EFBFBD><EFBFBD>ˮ<EFBFBD>ü<EFBFBD>ʱ<EFBFBD><CAB1>
Restart_Current_Mode(); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰģʽ
HAL_TIM_Base_Start_IT(&htim2);
}
else if (sscanf(jsonStr, "{\"X15\":%d}", &value) == 1)
{
if (value == 1)
{
ozone_running = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ozone_timer = 0; // <20><><EFBFBD>ü<EFBFBD>ʱ<EFBFBD><CAB1>
Ozone_Control(1); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// printf("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>\n");
}
else if (value == 0)
{
ozone_running = 0; // ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ozone_timer = 0; // <20><><EFBFBD>ü<EFBFBD>ʱ<EFBFBD><CAB1>
Ozone_Control(0); // <20><><EFBFBD><EFBFBD><EFBFBD>رճ<D8B1><D5B3><EFBFBD>
// printf("<22><><EFBFBD><EFBFBD>ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>\n");
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else if (sscanf(jsonStr, "{\"X20\":%d}", &value) == 1)
{
OZONE_ON_TIME = value;
ozone_timer = 0; // <20><><EFBFBD>ü<EFBFBD>ʱ<EFBFBD><CAB1>
2025-05-20 09:41:22 +08:00
Save_Ozone_Time_To_EEPROM(OZONE_ON_TIME, OZONE_OFF_TIME);
2025-04-16 09:58:09 +08:00
// printf("<22><><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>: %d<><64><EFBFBD><EFBFBD>\n", value);
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else if (sscanf(jsonStr, "{\"X21\":%d}", &value) == 1)
{
OZONE_OFF_TIME = value;
ozone_timer = 0; // <20><><EFBFBD>ü<EFBFBD>ʱ<EFBFBD><CAB1>
2025-05-20 09:41:22 +08:00
Save_Ozone_Time_To_EEPROM(OZONE_ON_TIME, OZONE_OFF_TIME); // <20><><EFBFBD>浽EEPROM
2025-04-16 09:58:09 +08:00
// printf("<22><><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1>: %d<><64><EFBFBD><EFBFBD>\n", value);
}
// ˮ<>ÿ<EFBFBD><C3BF><EFBFBD>
else if (sscanf(jsonStr, "{\"X12\":%d}", &value) == 1)
{
if (value == CMD_ON || value == CMD_OFF)
{
force_pump_off = (value == CMD_OFF); // <20><><EFBFBD><EFBFBD>ǿ<EFBFBD>ƹرձ<D8B1>־
// <20><><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEA3AC>ȷ<EFBFBD><C8B7>ǿ<EFBFBD>ƹرձ<D8B1>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (value == CMD_ON) {
force_pump_off = 0;
Control_WaterPump(1);
printf("ˮ<EFBFBD><EFBFBD>ǿ<EFBFBD>ƿ<EFBFBD><EFBFBD><EFBFBD>\n");
} else {
force_pump_off = 1;
Control_WaterPump(0);
printf("ˮ<EFBFBD><EFBFBD>ǿ<EFBFBD>ƹر<EFBFBD>\n");
}
rxDataSize = 0;
memset(rxBuff, 0, sizeof(rxBuff));
}
}
// <20><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>
else if (sscanf(jsonStr, "{\"X13\":%d}", &value) == 1)
{
if (value == CMD_ON || value == CMD_OFF)
{
force_fan_off = (value == CMD_OFF); // <20><><EFBFBD><EFBFBD>ǿ<EFBFBD>ƹرձ<D8B1>־
// <20><><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><C7BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEA3AC>ȷ<EFBFBD><C8B7>ǿ<EFBFBD>ƹرձ<D8B1>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (value == CMD_ON) {
force_fan_off = 0;
Control_Fan1(1);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1ǿ<EFBFBD>ƿ<EFBFBD><EFBFBD><EFBFBD>\n");
} else {
force_fan_off = 1;
Control_Fan1(0);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1ǿ<EFBFBD>ƹر<EFBFBD>\n");
}
// printf("<22><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD>: %s\n", value ? "<22><><EFBFBD><EFBFBD>" : "<22>ر<EFBFBD>");
}
}
// <20><><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>
else if (sscanf(jsonStr, "{\"X14\":%d}", &value) == 1)
{
if (value == CMD_ON || value == CMD_OFF)
{
// <20><><EFBFBD><EFBFBD>2<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>Ҳ<EFBFBD><D2B2>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ǿ<EFBFBD>ƹرձ<D8B1>־
if (value == CMD_ON) {
force_fan_off = 0; // <20><><EFBFBD><EFBFBD>ǿ<EFBFBD>ƹرձ<D8B1>־
Control_Fan2(1);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>2ǿ<EFBFBD>ƿ<EFBFBD><EFBFBD><EFBFBD>\n");
} else {
force_fan_off = 1; // <20><><EFBFBD><EFBFBD>ǿ<EFBFBD>ƹرձ<D8B1>־
Control_Fan2(0);
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>2ǿ<EFBFBD>ƹر<EFBFBD>\n");
}
}
}
// <20><><EFBFBD><EFBFBD>Ĥ<EFBFBD><C4A4><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> X16 <20><>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>)
else if (sscanf(jsonStr, "{\"X18\":%d}", &value) == 1)
{
if (value == CMD_ON || value == CMD_OFF)
{
Control_Heater((uint8_t)value);
// printf("<22><><EFBFBD><EFBFBD>Ĥ<EFBFBD><C4A4><EFBFBD><EFBFBD>: %s\n", value ? "<22><><EFBFBD><EFBFBD>" : "<22>ر<EFBFBD>");
}
}
else if (sscanf(jsonStr, "{\"X22\":%d}", &value) == 1)
{
temp_lower_limit = (float)value;
// printf("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD>Ϊ: %.1f<EFBFBD><EFBFBD>\n", temp_lower_limit);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD>
else if (sscanf(jsonStr, "{\"X23\":%d}", &value) == 1)
{
temp_upper_limit = (float)value;
// printf("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD>Ϊ: %.1f<EFBFBD><EFBFBD>\n", temp_upper_limit);
}
// <20>ܿ<EFBFBD><DCBF><EFBFBD>
else if (sscanf(jsonStr, "{\"X59\":%d}", &value) == 1)
{
if (value == CMD_ON || value == CMD_OFF)
{
Control_All_Devices(value); // <20><><EFBFBD><EFBFBD><EFBFBD>ܿ<EFBFBD><DCBF>ؿ<EFBFBD><D8BF>ƺ<EFBFBD><C6BA><EFBFBD>
}
}
// <20><><EFBFBD>Ƴ<EFBFBD><C6B3>׿<EFBFBD><D7BF>أ<EFBFBD>X32<33><32>
else if (sscanf(jsonStr, "{\"X49\":%d}", &value) == 1)
{
if (value == 1)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-05-20 09:41:22 +08:00
2025-04-16 09:58:09 +08:00
phosphorus_timer = 0;
polarity_state = !polarity_state;
2025-05-20 09:41:22 +08:00
Control_Phosphorus_Polarity(); // <20><><EFBFBD>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
Phosphorus_Control_Update();
2025-04-16 09:58:09 +08:00
}
else
{
2025-05-20 09:41:22 +08:00
Control_Phosphorus(0); // <20>رճ<D8B1><D5B3><EFBFBD>
2025-04-16 09:58:09 +08:00
}
}
else if (sscanf(jsonStr, "{\"X51\":%d}", &value) == 1)
{
2025-05-20 09:41:22 +08:00
PHOSPHORUS_RUN_TIME=value;
2025-05-21 13:23:18 +08:00
phosphorus_timer = 0; // <20><><EFBFBD>ü<EFBFBD>ʱ<EFBFBD><CAB1>
Save_Phosphorus_Time_To_EEPROM(PHOSPHORUS_RUN_TIME, PHOSPHORUS_STOP_TIME); // <20><><EFBFBD>浽EEPROM
2025-04-16 09:58:09 +08:00
// printf("<22><><EFBFBD>ó<EFBFBD><C3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>Ϊ<EFBFBD><CEAA>%d<><64><EFBFBD><EFBFBD>\n", value);
}
// <20><><EFBFBD>ó<EFBFBD><C3B3><EFBFBD>ֹͣʱ<D6B9>䣨X34<33><34>
else if (sscanf(jsonStr, "{\"X52\":%d}", &value) == 1)
{
2025-05-20 09:41:22 +08:00
PHOSPHORUS_STOP_TIME=value;
2025-05-21 13:23:18 +08:00
phosphorus_timer = 0; // <20><><EFBFBD>ü<EFBFBD>ʱ<EFBFBD><CAB1>
Save_Phosphorus_Time_To_EEPROM(PHOSPHORUS_RUN_TIME, PHOSPHORUS_STOP_TIME); // <20><><EFBFBD>浽EEPROM
2025-04-16 09:58:09 +08:00
// printf("<22><><EFBFBD>ó<EFBFBD><C3B3><EFBFBD>ֹͣʱ<D6B9><CAB1>Ϊ<EFBFBD><CEAA>%d<><64><EFBFBD><EFBFBD>\n", value);
}
2025-05-20 09:41:22 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD>̿<EFBFBD><CCBF>ƴ<EFBFBD><C6B4><EFBFBD>
if (sscanf(jsonStr, "{\"X53\":%d}", &value) == 1)
{
if (value == 1) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
Control_Dredge(1);
}
else if (value == 0) // <20>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
{
Control_Dredge(0);
}
}
2025-04-16 09:58:09 +08:00
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽר<CABD>ÿ<EFBFBD><C3BF>ư<EFBFBD>ť
else if (sscanf(jsonStr, "{\"X58\":%d}", &value) == 1)
{
if (value == 1)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
Switch_Mode(MODE_SPECIAL);
// printf("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ\n");
}
else if (value == 0)
{
Switch_Mode(MODE_DIRECT);
// ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>л<EFBFBD><D0BB><EFBFBD>ֱ<EFBFBD><D6B1>ģʽ
printf("ֹͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD>л<EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD>ģʽ\n");
}
rxDataSize = 0;
memset(rxBuff, 0, sizeof(rxBuff));
}
}
}
if (parameters_changed)
{
// Restart_Current_Mode();
// parameters_changed = 0; // <20><><EFBFBD>ñ<EFBFBD>־
}
rxDataSize = 0;
memset(rxBuff, 0, sizeof(rxBuff));
}
}
// MQTT<54><54>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Inf_EC800_MQTT_Init(void)
{
char mqtt_cmd[128]; // <20><><EFBFBD>ڴ洢AT<41><54><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>
// <20>ȶϿ<C8B6><CFBF><EFBFBD><EFBFBD>ܴ<EFBFBD><DCB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
Inf_4G_SendAtCmd((uint8_t *)"AT+QMTDISC=0\r\n");
HAL_Delay(300);
Inf_4G_SendAtCmd((uint8_t *)"AT+QMTCLOSE=0\r\n");
HAL_Delay(300);
// <20><><EFBFBD>ý<EFBFBD><C3BD><EFBFBD>ģʽ
Inf_4G_SendAtCmd((uint8_t *)"AT+QMTCFG=\"recv/mode\",0,0,0\r\n");
HAL_Delay(100);
// <20><><EFBFBD><EFBFBD>keepaliveʱ<65><CAB1>Ϊ60<36><30>
Inf_4G_SendAtCmd((uint8_t *)"AT+QMTCFG=\"keepalive\",0,60\r\n");
HAL_Delay(100);
// <20><><EFBFBD><EFBFBD>MQTT<54><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sprintf(mqtt_cmd, "AT+QMTOPEN=0,\"%s\",%s\r\n", MQTT_SERVER_IP, MQTT_SERVER_PORT);
Inf_4G_SendAtCmd((uint8_t *)mqtt_cmd);
HAL_Delay(2000);
// <20><><EFBFBD><EFBFBD>MQTT<54><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>Ψһ<CEA8>Ŀͻ<C4BF><CDBB><EFBFBD>ID
sprintf(mqtt_cmd, "AT+QMTCONN=0,\"%s\",\"%s\",\"%s\"\r\n",
MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD);
Inf_4G_SendAtCmd((uint8_t *)mqtt_cmd);
HAL_Delay(1000);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sprintf(mqtt_cmd, "AT+QMTSUB=0,1,\"%s\",1\r\n", MQTT_TOPIC);
Inf_4G_SendAtCmd((uint8_t *)mqtt_cmd);
HAL_Delay(1000);
}
// <20>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><E5BBBA><EFBFBD><EFBFBD>
#define TX_BUFFER_SIZE 256
uint8_t txBuff[TX_BUFFER_SIZE]; // <20><><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD>
// MQTT<54><54><EFBFBD>ݷ<EFBFBD><DDB7>ͺ<EFBFBD><CDBA><EFBFBD>
// MQTT<54><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD>
void Inf_EC800_SendMqttData(uint16_t id, uint8_t data[], uint16_t dataLen)
{
memset(txBuff, 0, sizeof(txBuff));
sprintf((char *)txBuff, "AT+QMTPUB=0,0,0,0,\"%s\"\r\n", MQTT_PUB_TOPIC);
Inf_4G_SendAtCmd(txBuff);
HAL_UART_Transmit(&huart2, data, dataLen, 1000);
HAL_UART_Transmit(&huart2, (uint8_t *)"\x1A", 1, 1000);
HAL_Delay(100);
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD>
void Upload_Device_Data(void)
{
uint8_t payload[256];
uint16_t dataLen;
Update_All_Status(); // <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>ӡ
Check_Power_Source();
2025-05-20 09:41:22 +08:00
uint8_t power_type = Get_Power_Type();
Print_Temperature(data1);
2025-04-16 09:58:09 +08:00
Get_Signal_Strength();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ȡ<EFBFBD><C8A1>ǰģʽ<C4A3><CABD>ˮ<EFBFBD><CBAE>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t current_pump_on = 0;
uint32_t current_pump_off = 0;
// <20><>ȡ<EFBFBD><C8A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>Ӹ<EFBFBD>Һλ<D2BA><CEBB><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t current_high_fan_on = 0;
uint32_t current_high_fan_off = 0;
// <20><><EFBFBD>ӵ<EFBFBD>Һλ<D2BA><CEBB><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint32_t current_low_fan_on = 0;
uint32_t current_low_fan_off = 0;
switch (current_mode)
{
case MODE_IRRIGATION:
current_pump_on = HIGH_LEVEL_PUMP_ON_TIME;
current_pump_off = HIGH_LEVEL_PUMP_OFF_TIME;
current_high_fan_on = HIGH_LEVEL_FAN_ON_TIME;
current_high_fan_off = HIGH_LEVEL_FAN_OFF_TIME;
current_low_fan_on = LOW_LEVEL_FAN_ON_TIME; // <20><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>Һλ<D2BA><CEBB><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
current_low_fan_off = LOW_LEVEL_FAN_OFF_TIME;
break;
case MODE_FLUSH:
current_pump_on = FLUSH_HIGH_PUMP_ON_TIME;
current_pump_off = FLUSH_HIGH_PUMP_OFF_TIME;
current_high_fan_on = FLUSH_HIGH_FAN_ON_TIME;
current_high_fan_off = FLUSH_HIGH_FAN_OFF_TIME;
current_low_fan_on = FLUSH_LOW_FAN_ON_TIME; // <20><><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>Һλ<D2BA><CEBB><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
current_low_fan_off = FLUSH_LOW_FAN_OFF_TIME;
break;
case MODE_DIRECT:
current_pump_on = DIRECT_HIGH_PUMP_ON_TIME;
current_pump_off = DIRECT_HIGH_PUMP_OFF_TIME;
current_high_fan_on = DIRECT_HIGH_FAN_ON_TIME;
current_high_fan_off = DIRECT_HIGH_FAN_OFF_TIME;
current_low_fan_on = DIRECT_LOW_FAN_ON_TIME; // ֱ<><D6B1>ģʽ<C4A3><CABD>Һλ<D2BA><CEBB><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
current_low_fan_off = DIRECT_LOW_FAN_OFF_TIME;
break;
case MODE_SPECIAL:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD>ֱ<EFBFBD><D6B1>ģʽ<C4A3><CABD>ͬ<EFBFBD><CDAC>
current_high_fan_on = DIRECT_HIGH_FAN_ON_TIME; // 40<34><30><EFBFBD><EFBFBD>
current_high_fan_off = DIRECT_HIGH_FAN_OFF_TIME; // 2<><32><EFBFBD><EFBFBD>
current_low_fan_on = DIRECT_LOW_FAN_ON_TIME; // 10<31><30><EFBFBD><EFBFBD>
current_low_fan_off = DIRECT_LOW_FAN_OFF_TIME; // 20<32><30><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3>׶<EFBFBD><D7B6><EFBFBD><EFBFBD><EFBFBD>ˮ<EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
switch(special_phase) {
case SPECIAL_INITIAL_STOP:
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>ʼ<EFBFBD>׶<EFBFBD> - 24Сʱֹͣ\n");
current_pump_on = 0;
current_pump_off = SPECIAL_INITIAL_STOP_TIME; // 1440<34><30><EFBFBD><EFBFBD>
break;
case SPECIAL_FIRST_PHASE:
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>һ<EFBFBD>׶<EFBFBD> - 6Сʱѭ<CAB1><D1AD>\n");
current_pump_on = SPECIAL_PUMP_RUN_TIME; // 1<><31><EFBFBD><EFBFBD>
current_pump_off = SPECIAL_FIRST_STOP_TIME; // 359<35><39><EFBFBD><EFBFBD>
break;
case SPECIAL_SECOND_PHASE:
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>ڶ<EFBFBD><EFBFBD>׶<EFBFBD> - 4Сʱѭ<CAB1><D1AD>\n");
current_pump_on = SPECIAL_PUMP_RUN_TIME; // 1<><31><EFBFBD><EFBFBD>
current_pump_off = SPECIAL_SECOND_STOP_TIME; // 239<33><39><EFBFBD><EFBFBD>
break;
default:
printf("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>׶<EFBFBD>\n");
break;
}
break;
}
// <20><>ӡ<EFBFBD><D3A1>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ֵ
// printf("\n<><6E>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ֵ:\n");
// printf("ģʽ: %d\n", current_mode);
// printf("ˮ<>ÿ<EFBFBD><C3BF><EFBFBD>ʱ<EFBFBD><CAB1>: %d<><64><EFBFBD><EFBFBD>\n", current_pump_on);
// printf("ˮ<>ùر<C3B9>ʱ<EFBFBD><CAB1>: %d<><64><EFBFBD><EFBFBD>\n", current_pump_off);
// printf("<22><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>: %d<><64><EFBFBD><EFBFBD>\n", current_high_fan_on);
// printf("<22><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1>: %d<><64><EFBFBD><EFBFBD>\n", current_high_fan_off);
// printf("<22><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>: %d<><64><EFBFBD><EFBFBD>\n", current_low_fan_on);
// printf("<22><>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1>: %d<><64><EFBFBD><EFBFBD>\n", current_low_fan_off);
// <20><><EFBFBD><EFBFBD>JSON<4F><4E><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD>base_energy<67><79>
dataLen = sprintf((char *)payload,
"{"
"\"X4\":%d," // <20>ź<EFBFBD>ǿ<EFBFBD><C7BF> X4
"\"X10\":%d," // <20>ϴ<EFBFBD><CFB4><EFBFBD>ǰģʽ X10
"\"X12\":%d," // ˮ<><CBAE> X12
"\"X13\":%d," // <20><><EFBFBD><EFBFBD>1 X13
"\"X14\":%d," // <20><><EFBFBD><EFBFBD>2 X14
"\"X15\":%d," // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ X15
"\"X18\":%d," // <20><><EFBFBD><EFBFBD>Ĥ<EFBFBD><C4A4><EFBFBD><EFBFBD> X18
"\"X20\":%d," // <20>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> X20
"\"X21\":%d," // <20>ϴ<EFBFBD><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1> X21
"\"X5\":%.2f," // <20><EFBFBD> X5
"\"X22\":%.1f," // <20><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD> X22
"\"X23\":%.1f," // <20><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD> X23
"\"X24\":%d," // <20><>ǰˮ<C7B0>ÿ<EFBFBD><C3BF><EFBFBD>ʱ<EFBFBD><CAB1> X24
"\"X25\":%d," // <20><>ǰˮ<C7B0>ùر<C3B9>ʱ<EFBFBD><CAB1> X25
"\"X35\":%d," //<2F><>ǰˮ<C7B0>õĹ<C3B5><C4B9><EFBFBD> X35
"\"X37\":%d," //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>1<EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD> X37
"\"X38\":%d," //<2F><>ǰˮ<C7B0>õĹ<C3B5><C4B9><EFBFBD> X38
"\"X44\":%d," // <20><>ǰˮ<C7B0>ùر<C3B9>ʱ<EFBFBD><CAB1> X44
"\"X46\":%d," // <20>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD> X46
"\"X47\":%d," // X47
"\"X49\":%d," // <20><><EFBFBD>׿<EFBFBD><D7BF><EFBFBD> X49
"\"X50\":%d," // <20><><EFBFBD><EFBFBD>״̬ X50
"\"X51\":%d," // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> X51
"\"X52\":%d," // <20><><EFBFBD><EFBFBD>ֹͣʱ<D6B9><CAB1> X52
"\"X53\":%d," // <20><><EFBFBD><EFBFBD> X53
"\"X54\":%d," // <20><>Һλ<D2BA><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> X54
"\"X55\":%d," // <20><>Һλ<D2BA><CEBB><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1> X55
"\"X56\":%d," // <20><>Һλ<D2BA><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
"\"X57\":%d," // <20><>Һλ<D2BA><CEBB><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1>
"\"X58\":%d," // <20><>Һλ<D2BA><CEBB><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1>
2025-05-20 09:41:22 +08:00
"\"X59\":%d," // ϵͳ״̬
"\"X300\":%.6f," // <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>ֶ<EFBFBD> X300
"\"X001\":\"%s\"" // <20><><EFBFBD><EFBFBD>ICCID<49>ֶ<EFBFBD>
2025-04-16 09:58:09 +08:00
"}",
// device_status[11], // ˮ<><CBAE> X1
gsm_signal_strength, // <20>ź<EFBFBD>ǿ<EFBFBD><C7BF> X4
current_mode, // <20>ϴ<EFBFBD><CFB4><EFBFBD>ǰģʽ X10
device_status[1], // ˮ<><CBAE> X12
device_status[2], // <20><><EFBFBD><EFBFBD>1 X13
device_status[3], // <20><><EFBFBD><EFBFBD>2 X14
ozone_running, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ X15
device_status[7], // <20><><EFBFBD><EFBFBD>Ĥ״̬ X18
OZONE_ON_TIME, // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> X20
OZONE_OFF_TIME, // <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>ʱ<EFBFBD><CAB1> X21
temperature, // <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ӵ<EFBFBD>JSON<4F><4E> X5
temp_lower_limit, // <20><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD> X22
temp_upper_limit, // <20><EFBFBD><C2B6><EFBFBD><EFBFBD><EFBFBD> X23
current_pump_on, // ֻ<>ϴ<EFBFBD>ˮ<EFBFBD><CBAE>ʱ<EFBFBD><CAB1> X24
current_pump_off, // ֻ<>ϴ<EFBFBD>ˮ<EFBFBD><CBAE>ʱ<EFBFBD><CAB1> X25
device_fault.pump_fault, // <20><><EFBFBD>ӹ<EFBFBD><D3B9><EFBFBD>״̬ 0:<3A><><EFBFBD><EFBFBD> 1:<3A><><EFBFBD><EFBFBD> X35
device_fault.fan1_fault, //<2F><><EFBFBD><EFBFBD>1<EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD> X37
device_fault.fan2_fault, //<2F><><EFBFBD><EFBFBD>2<EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD> X38
device_status[5], // <20><>Һλˮ<CEBB><CBAE>״̬ X44
device_status[8], // <20>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD> X46
2025-05-20 09:41:22 +08:00
power_type, // <20><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>״̬ X47
2025-04-16 09:58:09 +08:00
Dephosphorization_state, // <20><><EFBFBD>׿<EFBFBD><D7BF><EFBFBD>״̬ X49
device_status[9], // <20><><EFBFBD><EFBFBD>״̬ X50
PHOSPHORUS_RUN_TIME, // <20><>ǰ<EFBFBD><C7B0><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
PHOSPHORUS_STOP_TIME, // <20><>ǰ<EFBFBD><C7B0><EFBFBD>õ<EFBFBD>ֹͣʱ<D6B9><CAB1>
device_status[10], // <20><><EFBFBD><EFBFBD>״̬ X53
current_high_fan_on, // X54
current_high_fan_off, // X55
current_low_fan_on, // X56
current_low_fan_off, // X57
(current_mode == MODE_SPECIAL) ? 1 : 0, // <20><><EFBFBD><EFBFBD>ģʽ<C4A3>׶Σ<D7B6><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> x58
2025-05-20 09:41:22 +08:00
device_status[11], // ϵͳ״̬ X59
base_energy, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ӵ<EFBFBD>JSON<4F><4E> X300
sim_iccid // ICCIDֵ
2025-04-16 09:58:09 +08:00
);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Inf_EC800_SendMqttData(0, payload, dataLen);
// <20><><EFBFBD>ӵ<EFBFBD><D3B5>Դ<EFBFBD>ӡ
// printf("<22><><EFBFBD>ݷ<EFBFBD><DDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD>͵<EFBFBD>ˮ<EFBFBD><CBAE>ֵ<EFBFBD><D6B5>%d\r\n", device_status[11]);
// <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// pump_flow = 0;
// device_status[11] = 0;
// flow_to_upload = 0;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD>ȱ<EFBFBD><C8B1><EFBFBD>
int8_t gsm_signal_strength = 0;
// <20><>ȡ<EFBFBD>ź<EFBFBD>ǿ<EFBFBD>Ⱥ<EFBFBD><C8BA><EFBFBD>
void Get_Signal_Strength(void)
{
memset(rxBuff, 0, sizeof(rxBuff));
rxDataSize = 0;
Inf_4G_SendAtCmd("AT+CSQ\r\n");
// <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD><C7BF>
char *ptr = strstr((char *)rxBuff, "+CSQ:");
if (ptr)
{
int csq;
if (sscanf(ptr, "+CSQ: %d", &csq) == 1)
{
gsm_signal_strength = csq;
}
}
}
// ... existing code ...
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ... existing code ...
// <20><><EFBFBD><EFBFBD>ȫ<EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>
static uint32_t last_check_time = 0;
static uint8_t reconnect_count = 0;
#define MAX_RECONNECT_ATTEMPTS 3
#define CHECK_INTERVAL 60000 // 60<36><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Check_4G_Connection(void)
{
uint32_t current_time = HAL_GetTick();
// ÿ60<36><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
if(current_time - last_check_time >= CHECK_INTERVAL)
{
last_check_time = current_time;
// <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
memset(rxBuff, 0, sizeof(rxBuff));
rxDataSize = 0;
// <20><><EFBFBD><EFBFBD>MQTT<54><54><EFBFBD><EFBFBD>״̬
Inf_4G_SendAtCmd("AT+QMTCONN?\r\n");
HAL_Delay(100);
// ֻ<>е<EFBFBD>MQTTδ<54><CEB4><EFBFBD><EFBFBD>ʱ<EFBFBD>Ž<EFBFBD><C5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(!strstr((char *)rxBuff, "+QMTCONN: 0,3"))
{
// printf("MQTT<54><54><EFBFBD>ӶϿ<D3B6><CFBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...\n");
if(reconnect_count < MAX_RECONNECT_ATTEMPTS)
{
reconnect_count++;
Inf_EC800_MQTT_Init(); // ֻ<><D6BB><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC>MQTT<54><54><EFBFBD><EFBFBD>
// printf("MQTT<54><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d/%d\n", reconnect_count, MAX_RECONNECT_ATTEMPTS);
}
else
{
// printf("MQTT<54><54><EFBFBD><EFBFBD>ʧ<EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬\n");
}
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
reconnect_count = 0;
}
}
}
2025-05-20 09:41:22 +08:00
// <20><><EFBFBD>ӻ<EFBFBD>ȡICCID<49>ĺ<EFBFBD><C4BA><EFBFBD>
void Get_ICCID(void)
{
memset(rxBuff, 0, sizeof(rxBuff));
rxDataSize = 0;
Inf_4G_SendAtCmd("AT+QCCID\r\n");
HAL_Delay(100);
// <20><><EFBFBD><EFBFBD>ICCID
char *ptr = strstr((char *)rxBuff, "+QCCID:");
if (ptr)
{
// <20><><EFBFBD><EFBFBD>"+QCCID: "<22><>ֱ<EFBFBD>ӻ<EFBFBD>ȡICCID
ptr += 8; // <20><><EFBFBD><EFBFBD>"+QCCID: "
// ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD>ܵĿո<C4BF><D5B8>ͻ<EFBFBD><CDBB>з<EFBFBD>
while (*ptr == ' ') ptr++;
// <20><><EFBFBD><EFBFBD>ICCID<49><44>sim_iccid<69><64><EFBFBD><EFBFBD>
strncpy(sim_iccid, ptr, ICCID_LENGTH - 1);
sim_iccid[ICCID_LENGTH - 1] = '\0'; // ȷ<><C8B7><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}