|
|
|
|
@ -1,6 +1,8 @@
|
|
|
|
|
#include "myfreertos.h"
|
|
|
|
|
|
|
|
|
|
#define SENSOR_ADDRESS 0x02
|
|
|
|
|
#define INNER_SENSOR_ADDRESS 0x02
|
|
|
|
|
#define OUTER_SENSOR_ADDRESS 0x04
|
|
|
|
|
|
|
|
|
|
char pubTopic[512] = "/sys/hp8oQhMZJ67/Device1/thing/event/property/post"; // Publish topic
|
|
|
|
|
char subTopic[512] = "/sys/hp8oQhMZJ67/Device1/thing/service/property/set"; // Subscribe topic
|
|
|
|
|
@ -8,7 +10,7 @@ char subTopic[512] = "/sys/hp8oQhMZJ67/Device1/thing/service/property/set"; // S
|
|
|
|
|
#define MQTT_SOCK 5
|
|
|
|
|
|
|
|
|
|
// task priority
|
|
|
|
|
#define START_TASK_PRIO 0
|
|
|
|
|
#define START_TASK_PRIO 1
|
|
|
|
|
// Task stack size
|
|
|
|
|
#define START_STK_SIZE 128
|
|
|
|
|
// task handle
|
|
|
|
|
@ -41,15 +43,21 @@ void Host_Computer_Communication(void);
|
|
|
|
|
* sensor data request: 02 03
|
|
|
|
|
*/
|
|
|
|
|
void SensorDataRequestTask(void *pvParameters);
|
|
|
|
|
// task handle
|
|
|
|
|
TaskHandle_t SensorDataRequestTask_Handler;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* sync environment data: EE B5 01
|
|
|
|
|
*/
|
|
|
|
|
void SyncEnvironmentDataRequestTask(void *pvParameters);
|
|
|
|
|
// task handle
|
|
|
|
|
TaskHandle_t SyncEnvironmentDataRequestTask_Handler;
|
|
|
|
|
/**
|
|
|
|
|
* 定时制热test
|
|
|
|
|
*/
|
|
|
|
|
void HotTestRequestTask(void *pvParameters);
|
|
|
|
|
// task handle
|
|
|
|
|
TaskHandle_t HotTestRequestTask_Handler;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -81,7 +89,9 @@ u8 Feed_Dog_Count = 0; // Feeding dog timing
|
|
|
|
|
u8 now_stage = 1; // Current operational phase
|
|
|
|
|
u16 tem, hum, red, blue, white;
|
|
|
|
|
u8 hour, min;
|
|
|
|
|
u8 rs485buf[8] = {SENSOR_ADDRESS, 0x03, 0x00, 0x01, 0x00, 0x09, 0xD4, 0x3F}; // Sensor exchange data
|
|
|
|
|
// u8 rs485buf[8] = {SENSOR_ADDRESS, 0x03, 0x00, 0x01, 0x00, 0x09, 0xD4, 0x3F}; // Sensor exchange data
|
|
|
|
|
u8 INNER_SENSOR_485_REQUEST_COMMAND[8] = {INNER_SENSOR_ADDRESS, 0x03, 0x00, 0x01, 0x00, 0x09, 0xD4, 0x3F}; // Inner sensor exchange data
|
|
|
|
|
u8 OUTER_SENSOR_485_REQUEST_COMMAND[8] = {OUTER_SENSOR_ADDRESS, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x5E}; // Outer sensor exchange data
|
|
|
|
|
u16 sync_cnt = 0; // 同步环境控制参数的计数器,到0同步
|
|
|
|
|
int T = 0, H = 0, C = 0, G = 0, current_T = 0;
|
|
|
|
|
extern u8 total[];
|
|
|
|
|
@ -116,13 +126,6 @@ void os_init(void)
|
|
|
|
|
(UBaseType_t)START_TASK_PRIO,
|
|
|
|
|
(TaskHandle_t *)&StartTask_Handler);
|
|
|
|
|
|
|
|
|
|
// 创建传感器数据请求任务
|
|
|
|
|
xTaskCreate(SensorDataRequestTask, "SensorDataRequestTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
|
|
|
|
|
|
|
|
|
|
xTaskCreate(SyncEnvironmentDataRequestTask, "SyncEnvironmentDataRequestTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 2, NULL);
|
|
|
|
|
xTaskCreate(HotTestRequestTask, "HotTestRequestTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 3, NULL);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vTaskStartScheduler();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -156,7 +159,8 @@ void start_task(void *pvParameters)
|
|
|
|
|
taskENTER_CRITICAL(); // 进入临界区
|
|
|
|
|
|
|
|
|
|
// 创建与传感器通信任务
|
|
|
|
|
handler = xTaskCreate((TaskFunction_t)Sensor_Communication_task,
|
|
|
|
|
xTaskCreate(
|
|
|
|
|
(TaskFunction_t)Sensor_Communication_task,
|
|
|
|
|
(const char *)"Sensor_Communication_task",
|
|
|
|
|
(uint16_t)Sensor_Communication_STK_SIZE,
|
|
|
|
|
(void *)NULL,
|
|
|
|
|
@ -175,6 +179,31 @@ void start_task(void *pvParameters)
|
|
|
|
|
// if(handler4==pdPASS){printf("控灯任务创建成功\r\n");}
|
|
|
|
|
// else{printf("控灯任务创建失败\r\n");}
|
|
|
|
|
|
|
|
|
|
// 创建传感器数据请求任务
|
|
|
|
|
xTaskCreate(
|
|
|
|
|
(TaskFunction_t)SensorDataRequestTask,
|
|
|
|
|
(const char *)"SensorDataRequestTask",
|
|
|
|
|
(uint16_t)configMINIMAL_STACK_SIZE,
|
|
|
|
|
(void *)NULL,
|
|
|
|
|
(UBaseType_t)tskIDLE_PRIORITY + 2,
|
|
|
|
|
(TaskHandle_t* )&SensorDataRequestTask_Handler);
|
|
|
|
|
|
|
|
|
|
xTaskCreate(
|
|
|
|
|
(TaskFunction_t)SyncEnvironmentDataRequestTask,
|
|
|
|
|
(const char *)"SyncEnvironmentDataRequestTask",
|
|
|
|
|
(uint16_t)configMINIMAL_STACK_SIZE,
|
|
|
|
|
(void *)NULL,
|
|
|
|
|
(UBaseType_t)tskIDLE_PRIORITY + 3,
|
|
|
|
|
(TaskHandle_t* )&SyncEnvironmentDataRequestTask_Handler);
|
|
|
|
|
xTaskCreate(
|
|
|
|
|
(TaskFunction_t)HotTestRequestTask,
|
|
|
|
|
(const char *)"HotTestRequestTask",
|
|
|
|
|
(uint16_t)configMINIMAL_STACK_SIZE,
|
|
|
|
|
(void *)NULL,
|
|
|
|
|
(UBaseType_t)tskIDLE_PRIORITY + 4,
|
|
|
|
|
(TaskHandle_t* )&HotTestRequestTask_Handler);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vTaskDelete(StartTask_Handler); // 删除开始任务
|
|
|
|
|
taskEXIT_CRITICAL(); // 退出临界区
|
|
|
|
|
@ -184,12 +213,14 @@ void start_task(void *pvParameters)
|
|
|
|
|
void SensorDataRequestTask(void *pvParameters) {
|
|
|
|
|
while (1) {
|
|
|
|
|
// 发送传感器数据请求的操作
|
|
|
|
|
RS485_1_Send_Data_1(rs485buf, 8);
|
|
|
|
|
delay_xms(100);
|
|
|
|
|
RS485_1_Send_Data_1(INNER_SENSOR_485_REQUEST_COMMAND, 8);
|
|
|
|
|
vTaskDelay(100);
|
|
|
|
|
RS485_1_Send_Data_1(OUTER_SENSOR_485_REQUEST_COMMAND, 8);
|
|
|
|
|
vTaskDelay(100);
|
|
|
|
|
|
|
|
|
|
// RS485_1_Send_Data_1(RS485_RX_BUF, 48);
|
|
|
|
|
|
|
|
|
|
vTaskDelay(SENSOR_DATA_REQUEST_PERIOD);
|
|
|
|
|
vTaskDelay(SENSOR_DATA_REQUEST_PERIOD - 200);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -257,9 +288,8 @@ void Sensor_Communication_task(void *pvParameters)
|
|
|
|
|
u8 c = 0;
|
|
|
|
|
RS485_RX_CNT = 0;
|
|
|
|
|
while (isAllZeros(RS485_RX_BUF_COPY, 128) == 0)
|
|
|
|
|
// while (RS485_RX_CNT > 0)
|
|
|
|
|
{
|
|
|
|
|
if (RS485_RX_BUF_COPY[0] == 0x02 && RS485_RX_BUF_COPY[1] == 0x03 && CRC16_check(RS485_RX_BUF_COPY, 21) == 1)
|
|
|
|
|
if (RS485_RX_BUF_COPY[0] == INNER_SENSOR_ADDRESS && RS485_RX_BUF_COPY[1] == 0x03 && CRC16_check(RS485_RX_BUF_COPY, 21) == 1)
|
|
|
|
|
{
|
|
|
|
|
c++;
|
|
|
|
|
// receive message from sensor
|
|
|
|
|
@ -267,11 +297,22 @@ void Sensor_Communication_task(void *pvParameters)
|
|
|
|
|
for (int i=0;i<23;i++) {
|
|
|
|
|
temp_data[i] = RS485_RX_BUF_COPY[i];
|
|
|
|
|
}
|
|
|
|
|
process_sensor_data(temp_data);
|
|
|
|
|
process_inner_sensor_data(temp_data);
|
|
|
|
|
RX_BUF_Transfer(0, 23);
|
|
|
|
|
// u8 tmpaaa[] = {c};
|
|
|
|
|
// RS485_1_Send_Data_1(tmpaaa, 1);
|
|
|
|
|
}
|
|
|
|
|
else if (RS485_RX_BUF_COPY[0] == OUTER_SENSOR_ADDRESS && RS485_RX_BUF_COPY[1] == 0x03 && CRC16_check(RS485_RX_BUF_COPY, 7) == 1)
|
|
|
|
|
{
|
|
|
|
|
// receive message from sensor
|
|
|
|
|
u8 temp_data[9] = {0};
|
|
|
|
|
for (int i = 0; i < 9; i++)
|
|
|
|
|
{
|
|
|
|
|
temp_data[i] = RS485_RX_BUF_COPY[i];
|
|
|
|
|
}
|
|
|
|
|
process_outer_sensor_data(temp_data);
|
|
|
|
|
RX_BUF_Transfer(0, 9);
|
|
|
|
|
}
|
|
|
|
|
else if (RS485_RX_BUF_COPY[0] == 0xEE && RS485_RX_BUF_COPY[1] == 0xB6 && RS485_RX_BUF_COPY[2] == 0x01 && CRC16_check(RS485_RX_BUF_COPY, 16) == 1)
|
|
|
|
|
{
|
|
|
|
|
// batch update params in a stage
|
|
|
|
|
@ -317,7 +358,7 @@ void Sensor_Communication_task(void *pvParameters)
|
|
|
|
|
bufcut_Init(RS485_DATA_TMP + 8, RS485_SUFFIX, 6, 10);
|
|
|
|
|
RS485_1_Send_Data_1(RS485_DATA_TMP, 10);
|
|
|
|
|
// delay_ms(10);
|
|
|
|
|
RS485_1_Send_Data_2(); // 上传参数
|
|
|
|
|
RS485_1_Upload_Params(); // 上传参数
|
|
|
|
|
// }
|
|
|
|
|
RX_BUF_Transfer(0, 6);
|
|
|
|
|
}
|
|
|
|
|
@ -419,7 +460,7 @@ void Sensor_Communication_task(void *pvParameters)
|
|
|
|
|
/**
|
|
|
|
|
* process sensor data
|
|
|
|
|
*/
|
|
|
|
|
void process_sensor_data(u8 *data) {
|
|
|
|
|
void process_inner_sensor_data(u8 *data) {
|
|
|
|
|
T = data[3];
|
|
|
|
|
T = T << 8 | data[4];
|
|
|
|
|
// Negative temperature treatment
|
|
|
|
|
@ -504,10 +545,34 @@ void process_sensor_data(u8 *data) {
|
|
|
|
|
|
|
|
|
|
// HC595_Send_Byte(gpio_state);
|
|
|
|
|
|
|
|
|
|
RS485_1_Send_Data_2(); // 上传参数
|
|
|
|
|
RS485_1_Upload_Params(); // 上传参数
|
|
|
|
|
// delay_xms(200);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* process outer sensor data
|
|
|
|
|
*/
|
|
|
|
|
void process_outer_sensor_data(u8 *data)
|
|
|
|
|
{
|
|
|
|
|
int out_tem = data[3];
|
|
|
|
|
out_tem = out_tem << 8 | data[4];
|
|
|
|
|
// Negative temperature treatment
|
|
|
|
|
if (out_tem & 0x8000)
|
|
|
|
|
{
|
|
|
|
|
out_tem = ((~out_tem + 1) & 0xFFFF);
|
|
|
|
|
}
|
|
|
|
|
pid.out_tem = (float)out_tem / 10;
|
|
|
|
|
|
|
|
|
|
int out_humidity = data[5];
|
|
|
|
|
out_humidity = out_humidity << 8 | data[6];
|
|
|
|
|
// Negative temperature treatment
|
|
|
|
|
if (out_humidity & 0x8000)
|
|
|
|
|
{
|
|
|
|
|
out_humidity = ((~out_humidity + 1) & 0xFFFF);
|
|
|
|
|
}
|
|
|
|
|
pid.out_humidity = out_humidity;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* hmi event process
|
|
|
|
|
*/
|
|
|
|
|
@ -522,93 +587,9 @@ void process_hmi_btn_event(u8 page, u8 btn_index, u8 value) {
|
|
|
|
|
now_stage = target_stage;
|
|
|
|
|
store_stage = target_stage;
|
|
|
|
|
Write_Init();
|
|
|
|
|
// delay_ms(10);
|
|
|
|
|
RS485_1_Send_Data_2(); // 上传参数
|
|
|
|
|
RS485_1_Upload_Params(); // 上传参数
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// void Host_Computer_Communication(void)
|
|
|
|
|
//{
|
|
|
|
|
// if(RS485_RX_BUF_COPY[0]==0xEE&&RS485_RX_BUF_COPY[1]==0xB6)
|
|
|
|
|
// {
|
|
|
|
|
// if(RS485_RX_BUF_COPY[2]==0x03)//单个同步
|
|
|
|
|
// {
|
|
|
|
|
// Analysis(&n,&i,RS485_RX_BUF_COPY);
|
|
|
|
|
// //printf("B6 03 cmd: batch sync\r\n");
|
|
|
|
|
// Array(&now_stage,&hour,&min,&tem,&hum,&red,&blue,&white);//更新对应阶段号的参数
|
|
|
|
|
// Write_Init();
|
|
|
|
|
// RX_BUF_Transfer(0,11);
|
|
|
|
|
//
|
|
|
|
|
// }
|
|
|
|
|
// if(RS485_RX_BUF_COPY[2]==0x04)//阶段切换
|
|
|
|
|
// {
|
|
|
|
|
// change_stage_rev1=RS485_RX_BUF_COPY[3];
|
|
|
|
|
// //printf("B6 04 cmd: change stage\r\n");
|
|
|
|
|
// RTC_synchronization_ins(2023,9,1,0,00,00);
|
|
|
|
|
// now_stage=change_stage_rev1;
|
|
|
|
|
// store_stage=change_stage_rev1;
|
|
|
|
|
// Write_Init();
|
|
|
|
|
// RX_BUF_Transfer(0,8);
|
|
|
|
|
// }
|
|
|
|
|
// if(RS485_RX_BUF_COPY[2]==0x01)//批量同步
|
|
|
|
|
// {
|
|
|
|
|
// Batch_synchronization(&n,RS485_RX_BUF_COPY);
|
|
|
|
|
// //printf("B6 01 cmd: get one %d\r\n", n);
|
|
|
|
|
// Array(&now_stage,&hour,&min,&tem,&hum,&red,&blue,&white);//更新对应阶段号的参数
|
|
|
|
|
// //Write_Init();减少擦写的次数
|
|
|
|
|
// RX_BUF_Transfer(0,20);
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// else if(RS485_RX_BUF_COPY[0]==0xEE&&RS485_RX_BUF_COPY[1]==0xB1)
|
|
|
|
|
// {
|
|
|
|
|
// if(RS485_RX_BUF_COPY[2]==0x11&&RS485_RX_BUF_COPY[15]==0xFF&&RS485_RX_BUF[16]==0xFF)//单个同步默认带的数据
|
|
|
|
|
// {
|
|
|
|
|
// //printf("cut overdata of B6 03 \r\n");
|
|
|
|
|
// RX_BUF_Transfer(0,17);
|
|
|
|
|
// }
|
|
|
|
|
// if(RS485_RX_BUF_COPY[2]==0x11&&RS485_RX_BUF_COPY[14]==0xFF&&RS485_RX_BUF[15]==0xFF)//单个同步默认带的数据
|
|
|
|
|
// {
|
|
|
|
|
// //printf("cut overdata of B6 03 \r\n");
|
|
|
|
|
// //RX_BUF_Printf(128);
|
|
|
|
|
// RX_BUF_Transfer(0,16);
|
|
|
|
|
// //RX_BUF_Printf(128);
|
|
|
|
|
// }
|
|
|
|
|
// if(RS485_RX_BUF_COPY[2]==0x11&&RS485_RX_BUF_COPY[12]==0xFF&&RS485_RX_BUF_COPY[13]==0xFF)//阶段切换默认带的数据
|
|
|
|
|
// {
|
|
|
|
|
// //printf("cut overdata of B6 04 \r\n");
|
|
|
|
|
// //RX_BUF_Printf(128);
|
|
|
|
|
// RX_BUF_Transfer(0,14);
|
|
|
|
|
// }
|
|
|
|
|
// if(RS485_RX_BUF_COPY[2]==0x01&&RS485_RX_BUF_COPY[7]==0xFF&&RS485_RX_BUF_COPY[8]==0xFF)//上位机默认带的数据
|
|
|
|
|
// {
|
|
|
|
|
// //printf("cut overdata of Upper computer \r\n");
|
|
|
|
|
// //RX_BUF_Printf(128);
|
|
|
|
|
// RX_BUF_Transfer(0,9);
|
|
|
|
|
// //RX_BUF_Printf(128);
|
|
|
|
|
//
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// else
|
|
|
|
|
// {
|
|
|
|
|
// //int ZERO_Count=0;
|
|
|
|
|
// //if()与while()的顺序不能变
|
|
|
|
|
//// if((RS485_RX_BUF_COPY[0]!=0x00))//不为0,处理掉
|
|
|
|
|
//// {
|
|
|
|
|
//// RX_BUF_Transfer(0,1);
|
|
|
|
|
//// //printf("the number is no zero\r\n");
|
|
|
|
|
//// }
|
|
|
|
|
////
|
|
|
|
|
//// while(RS485_RX_BUF_COPY[ZERO_Count]==0x00)
|
|
|
|
|
//// {
|
|
|
|
|
//// ZERO_Count++;
|
|
|
|
|
//// }
|
|
|
|
|
//// RX_BUF_Transfer(0,ZERO_Count);
|
|
|
|
|
//
|
|
|
|
|
// RX_BUF_Transfer(0,1);
|
|
|
|
|
// //printf("previous array cut\r\n");
|
|
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
//}
|
|
|
|
|
|