Zeng wei (曾威) 2 years ago
parent 801c188a5d
commit 7d3897e9c9

@ -2,7 +2,6 @@
#include "Relays.h" #include "Relays.h"
#include "USART.h" #include "USART.h"
#include "rs485.h" #include "rs485.h"
extern u16 tem;
float cold_tem = 0; float cold_tem = 0;
float red_tem = 0; float red_tem = 0;
float ti; float ti;
@ -18,7 +17,6 @@ int max_speed_count = 6000;
void PID_Init() void PID_Init()
{ {
// pid.set_tem=tem;// user set temperature
// if flash have not a vaild value, just set a default value // if flash have not a vaild value, just set a default value
if (pid.Kp < 1e-7) { pid.Kp = 9.6; } if (pid.Kp < 1e-7) { pid.Kp = 9.6; }
if (pid.Ki < 1e-7) { pid.Ki = 0.01; } if (pid.Ki < 1e-7) { pid.Ki = 0.01; }
@ -32,13 +30,22 @@ void PID_Init()
pid.OUT0 = 1; pid.OUT0 = 1;
pid.C1ms = 0; pid.C1ms = 0;
pid.hp = 2.4; pid.max_compressor_tem = 30;
pid.hi = 0.02;
pid.hd = 0;
pid.cp = 9.6; pid.hp_h = 5;
pid.hi_h = 0.02;
pid.hd_h = 0.5;
pid.h_base_h = 0;
pid.hp_l = 19.2;
pid.hi_l = 0.08;
pid.hd_l = 0;
pid.h_base_l = 30;
pid.cp = 4.8;
pid.ci = 0; pid.ci = 0;
pid.cd = 0; pid.cd = 0;
pid.c_base = 37;
pid.h_percent = 0; pid.h_percent = 0;
pid.c_speed = 0; pid.c_speed = 0;
@ -93,8 +100,8 @@ void set_heater_power(int percent) {
/** /**
* heater power calc * heater power calc
*/ */
int calc_hp(float delta_t, float Error_calc, int p_hb, float pid_hp, float pid_hi) { int calc_hp(float delta_t, float Error_calc, float DelEk, int p_hb, float pid_hp, float pid_hi, float pid_hd) {
int p_h = p_hb + pid_hp * delta_t + pid_hi * Error_calc; int p_h = p_hb + pid_hp * delta_t + pid_hi * Error_calc + pid_hd * DelEk;
if (p_h > 100) { if (p_h > 100) {
return 100; return 100;
} }
@ -136,8 +143,6 @@ void PID_Calc() // pid calc
{ {
int min_speed_count = 1800; int min_speed_count = 1800;
int max_speed_count = 4800; int max_speed_count = 4800;
int p_hb = 52;
int p_cb = 33;
float DelEk; // The difference between the last two deviations float DelEk; // The difference between the last two deviations
// float td; // float td;
float out; float out;
@ -148,32 +153,55 @@ void PID_Calc() // pid calc
// } // }
float delta_t = pid.set_tem - pid.now_tem; float delta_t = pid.set_tem - pid.now_tem;
// When the target tem is greater then max compressor tem, the compressor will stop
int p_c = calc_cp(delta_t, p_cb, pid.cp); if (pid.set_tem > pid.max_compressor_tem) {
pid.c_speed = 0;
} else {
int p_c = calc_cp(delta_t, pid.c_base, pid.cp);
pid.c_speed = calc_compressor_speed(p_c, min_speed_count, max_speed_count); pid.c_speed = calc_compressor_speed(p_c, min_speed_count, max_speed_count);
}
float hp = pid.hp_h;
float hi = pid.hi_h;
float hd = pid.hd_h;
int h_base = pid.h_base_h;
// l mode
if (pid.set_tem <= pid.max_compressor_tem) {
hp = pid.hp_l;
hi = pid.hi_l;
hd = pid.hd_l;
h_base = pid.h_base_l;
}
pid.Ek = pid.set_tem - pid.now_tem; pid.Ek = pid.set_tem - pid.now_tem;
pid.Pout = pid.Kp * pid.Ek; // Proportional output pid.Pout = pid.Kp * pid.Ek; // Proportional output
pid.SEk += pid.Ek; // Total historical deviation pid.SEk += pid.Ek; // Total historical deviation
DelEk = pid.Ek - pid.Ek_prev; // The difference between the last two deviations
// no integral when the deviation is too large
if (pid.now_tem < pid.set_tem - 3) {
pid.SEk = 0;
}
// SEk limit, updated func // SEk limit, updated func
if (pid.SEk < - p_hb / pid.hi) { if (pid.SEk < - h_base / hi) {
pid.SEk = - p_hb / pid.hi; pid.SEk = - h_base / hi;
} }
if (pid.c_speed == max_speed_count) { if (pid.c_speed == max_speed_count) {
pid.SEk = 0; pid.SEk = 0;
} }
float Error_calc = pid.SEk; float Error_calc = pid.SEk;
if (Error_calc < - (p_hb + pid.hp * delta_t) / pid.hi) { if (Error_calc < - (h_base + hp * delta_t) / hi) {
Error_calc = - (p_hb + pid.hp * delta_t) / pid.hi; Error_calc = - (h_base + hp * delta_t) / hi;
} }
if (pid.c_speed == max_speed_count) { if (pid.c_speed == max_speed_count) {
Error_calc = 0; Error_calc = 0;
} }
DelEk = pid.Ek - pid.Ek_1; // The difference between the last two deviations
// ti=pid.t/pid.Ti; // ti=pid.t/pid.Ti;
// ki=ti*pid.Kp; // ki=ti*pid.Kp;
@ -203,11 +231,9 @@ void PID_Calc() // pid calc
{ {
pid.OUT = out; pid.OUT = out;
} }
pid.Ek_1 = pid.Ek; // udpate difference
pid.C1ms = 0;
// heater percent // heater percent
pid.h_percent = calc_hp(delta_t, Error_calc, p_hb, pid.hp, pid.hi); pid.h_percent = calc_hp(delta_t, Error_calc, DelEk, h_base, hp, hi, hd);
// close heater when compressor is running in full state // close heater when compressor is running in full state
if (pid.c_speed == max_speed_count) { if (pid.c_speed == max_speed_count) {
pid.h_percent = 0; pid.h_percent = 0;
@ -216,4 +242,8 @@ void PID_Calc() // pid calc
set_compressor_power(pid.c_speed); set_compressor_power(pid.c_speed);
set_heater_power(pid.h_percent); set_heater_power(pid.h_percent);
pid.Ek_prev = pid.Ek; // udpate difference
pid.C1ms = 0;
} }

@ -11,13 +11,29 @@ typedef struct Pid
float set_tem;// User settings float set_tem;// User settings
float now_tem;// current temperature float now_tem;// current temperature
float hp; float max_compressor_tem; // maximum temperature of the compressor. When the target tem is greater than this value, the compressor is turned off.
float hi;
float hd; float out_tem; // outer temperature
float out_humidity; // outer humidity
// in h mode
float hp_h;
float hi_h;
float hd_h;
int h_base_h; // base power percent in h mode
// in l mode
float hp_l;
float hi_l;
float hd_l;
int h_base_l; // base power percent in l mode
int h_percent; int h_percent;
float cp; float cp;
float ci; float ci;
float cd; float cd;
float c_base;
int c_speed; int c_speed;
float Kp; // 110 float Kp; // 110
@ -28,7 +44,7 @@ typedef struct Pid
float Td; float Td;
float Ek; // This deviation float Ek; // This deviation
float Ek_1;// Last deviation float Ek_prev;// Last deviation
float SEk; // The sum of historical deviations float SEk; // The sum of historical deviations
float Iout; float Iout;

@ -380,6 +380,10 @@ void RS485_1_Send_Data_1(u8 *buf, u8 len)
void RS485_1_Send_Data_2(void) void RS485_1_Send_Data_2(void)
{ {
// when H eq 0, don't send
// if (H == 0) {
// return;
// }
sendbuf[0] = 0xEE; sendbuf[0] = 0xEE;
sendbuf[1] = 0xB5; sendbuf[1] = 0xB5;
sendbuf[2] = 0x05; sendbuf[2] = 0x05;
@ -450,21 +454,35 @@ void RS485_1_Send_Data_2(void)
sendbuf[25] = 0; // ALARM state sendbuf[25] = 0; // ALARM state
sendbuf[26] = ALARM; // ALARM state sendbuf[26] = ALARM; // ALARM state
sendbuf[27] = (int)pid.hp / 256; // Kp 110 if (pid.set_tem > pid.max_compressor_tem) {
sendbuf[28] = (int)pid.hp % 256; // Kp 110 // h mode
sendbuf[29] = ((int)(pid.hi * 100000)) / 256; // Ti 0.001 sendbuf[27] = (int)(pid.hp_h * 1000) / 256; // Kp 110
sendbuf[30] = ((int)(pid.hi * 100000)) % 256; // Ti 0.001 sendbuf[28] = (int)(pid.hp_h * 1000) % 256; // Kp 110
sendbuf[31] = (int)pid.hd / 256; // Td 340 sendbuf[29] = ((int)(pid.hi_h * 100000)) / 256; // Ti 0.001
sendbuf[32] = (int)pid.hd % 256; // Td 340 sendbuf[30] = ((int)(pid.hi_h * 100000)) % 256; // Ti 0.001
sendbuf[31] = (int)pid.hd_h / 256; // Td 340
sendbuf[32] = (int)pid.hd_h % 256; // Td 340
} else {
// l mode
sendbuf[27] = (int)(pid.hp_l * 1000) / 256; // Kp 110
sendbuf[28] = (int)(pid.hp_l * 1000) % 256; // Kp 110
sendbuf[29] = ((int)(pid.hi_l * 100000)) / 256; // Ti 0.001
sendbuf[30] = ((int)(pid.hi_l * 100000)) % 256; // Ti 0.001
sendbuf[31] = (int)pid.hd_l / 256; // Td 340
sendbuf[32] = (int)pid.hd_l % 256; // Td 340
}
sendbuf[33] = pid.h_percent / 256; // h_percent sendbuf[33] = pid.h_percent / 256; // h_percent
sendbuf[34] = pid.h_percent % 256; // h_percent sendbuf[34] = pid.h_percent % 256; // h_percent
sendbuf[35] = (int)pid.cp / 256; // Kp 110 sendbuf[35] = (int)(pid.cp * 1000) / 256; // Kp 110
sendbuf[36] = (int)pid.cp % 256; // Kp 110 sendbuf[36] = (int)(pid.cp * 1000) % 256; // Kp 110
sendbuf[37] = ((int)(pid.ci * 100000)) / 256; // Ti 0.001 sendbuf[37] = ((int)(pid.ci * 100000)) / 256; // Ti 0.001
sendbuf[38] = ((int)(pid.ci * 100000)) % 256; // Ti 0.001 sendbuf[38] = ((int)(pid.ci * 100000)) % 256; // Ti 0.001
sendbuf[39] = (int)pid.cd / 256; // Td 340 // sendbuf[39] = (int)pid.cd / 256; // Td 340
sendbuf[40] = (int)pid.cd % 256; // Td 340 // sendbuf[40] = (int)pid.cd % 256; // Td 340
// TODO::temply print out_tem
sendbuf[39] = (int)(pid.out_tem * 10) / 256; // Td 340
sendbuf[40] = (int)(pid.out_tem * 10) % 256; // Td 340
sendbuf[41] = pid.c_speed / 256; // h_percent sendbuf[41] = pid.c_speed / 256; // h_percent
sendbuf[42] = pid.c_speed % 256; // h_percent sendbuf[42] = pid.c_speed % 256; // h_percent

File diff suppressed because one or more lines are too long

@ -1,9 +1,5 @@
#include "myfreertos.h" #include "myfreertos.h"
extern u16 tem, hum, red, blue, white;
extern u8 now_stage;
extern u8 hour, min;
extern u8 gpio_state;
// int a_value=20; // int a_value=20;
// int b_value=20; // int b_value=20;
// int c_value=20; // int c_value=20;
@ -22,7 +18,6 @@ int main(void)
RTC_Init(); // 需要放在HC595_Pin_Init()后面 RTC_Init(); // 需要放在HC595_Pin_Init()后面
TIM2_Init(); TIM2_Init();
Read_Init(); // 读flash的值赋值给total数组以及阶段 Read_Init(); // 读flash的值赋值给total数组以及阶段
// Array(&now_stage,&hour,&min,&tem,&hum,&red,&blue,&white);
PWM1_Init(500 - 1, 720 - 1); PWM1_Init(500 - 1, 720 - 1);
PWM2_Init(500 - 1, 720 - 1); PWM2_Init(500 - 1, 720 - 1);
PWM3_Init(500 - 1, 720 - 1); PWM3_Init(500 - 1, 720 - 1);

@ -1,6 +1,7 @@
#include "myfreertos.h" #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 pubTopic[512] = "/sys/hp8oQhMZJ67/Device1/thing/event/property/post"; // Publish topic
char subTopic[512] = "/sys/hp8oQhMZJ67/Device1/thing/service/property/set"; // Subscribe topic char subTopic[512] = "/sys/hp8oQhMZJ67/Device1/thing/service/property/set"; // Subscribe topic
@ -36,23 +37,20 @@ void Host_Computer_Communication(void);
// 1seconds delay // 1seconds delay
#define MAIN_TASK_PERIOD pdMS_TO_TICKS(1000) #define MAIN_TASK_PERIOD pdMS_TO_TICKS(1000)
/** /**
* sensor data request: 02 03 * sensor data request: 02 03
*/ */
void SensorDataRequestTask(void *pvParameters); void SensorDataRequestTask(void *pvParameters);
/** /**
* sync environment data: EE B5 01 * sync environment data: EE B5 01
*/ */
void SyncEnvironmentDataRequestTask(void *pvParameters); void SyncEnvironmentDataRequestTask(void *pvParameters);
/** /**
* test * test
*/ */
void HotTestRequestTask(void *pvParameters); void HotTestRequestTask(void *pvParameters);
int isZeros(u8 arr[]); int isZeros(u8 arr[]);
u8 RS485_RX_BUF_COPY[128] = {0}; u8 RS485_RX_BUF_COPY[128] = {0};
u8 RS485_DATA_TMP[128] = {0}; u8 RS485_DATA_TMP[128] = {0};
@ -81,14 +79,14 @@ u8 Feed_Dog_Count = 0; // Feeding dog timing
u8 now_stage = 1; // Current operational phase u8 now_stage = 1; // Current operational phase
u16 tem, hum, red, blue, white; u16 tem, hum, red, blue, white;
u8 hour, min; u8 hour, min;
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同步 u16 sync_cnt = 0; // 同步环境控制参数的计数器到0同步
int T = 0, H = 0, C = 0, G = 0, current_T = 0; int T = 0, H = 0, C = 0, G = 0, current_T = 0;
extern u8 total[]; extern u8 total[];
float Humidity = 0; float Humidity = 0;
float temperature = 0; float temperature = 0;
// pages in hmi // pages in hmi
#define page_index 43 #define page_index 43
#define page_curve 45 #define page_curve 45
@ -101,6 +99,24 @@ float temperature = 0;
// u8 RS485_RX_BUF[64]; // u8 RS485_RX_BUF[64];
/*********************
**********************
Create handles for tasks, queues, signal sets, etc., which can also be tested using
**********************
*********************/
BaseType_t handler = 0;
BaseType_t handler1 = 0;
BaseType_t handler2 = 0;
BaseType_t handler3 = 0;
BaseType_t handler4 = 0;
BaseType_t handler5 = 0;
BaseType_t handler6 = 0;
BaseType_t handler7 = 0;
BaseType_t handler8 = 0;
BaseType_t handler9 = 0;
BaseType_t handler10 = 0;
BaseType_t handler11 = 0;
/********************* /*********************
********************** **********************
entry function entry function
@ -117,33 +133,13 @@ void os_init(void)
(TaskHandle_t *)&StartTask_Handler); (TaskHandle_t *)&StartTask_Handler);
// 创建传感器数据请求任务 // 创建传感器数据请求任务
xTaskCreate(SensorDataRequestTask, "SensorDataRequestTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL); xTaskCreate(SensorDataRequestTask, "SensorDataRequestTask", configMINIMAL_STACK_SIZE * 8, NULL, tskIDLE_PRIORITY + 6, NULL);
xTaskCreate(SyncEnvironmentDataRequestTask, "SyncEnvironmentDataRequestTask", configMINIMAL_STACK_SIZE * 8, NULL, tskIDLE_PRIORITY + 7, NULL);
xTaskCreate(SyncEnvironmentDataRequestTask, "SyncEnvironmentDataRequestTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 2, NULL); xTaskCreate(HotTestRequestTask, "HotTestRequestTask", configMINIMAL_STACK_SIZE * 8, NULL, tskIDLE_PRIORITY + 8, NULL);
xTaskCreate(HotTestRequestTask, "HotTestRequestTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 3, NULL);
vTaskStartScheduler(); vTaskStartScheduler();
} }
/*********************
**********************
Create handles for tasks, queues, signal sets, etc., which can also be tested using
**********************
*********************/
BaseType_t handler = 0;
BaseType_t handler1 = 0;
BaseType_t handler2 = 0;
BaseType_t handler3 = 0;
BaseType_t handler4 = 0;
BaseType_t handler5 = 0;
BaseType_t handler6 = 0;
BaseType_t handler7 = 0;
BaseType_t handler8 = 0;
BaseType_t handler9 = 0;
BaseType_t handler10 = 0;
BaseType_t handler11 = 0;
/* /*
Start function: Create other functions and timers Start function: Create other functions and timers
@ -160,7 +156,8 @@ void start_task(void *pvParameters)
(const char *)"Sensor_Communication_task", (const char *)"Sensor_Communication_task",
(uint16_t)Sensor_Communication_STK_SIZE, (uint16_t)Sensor_Communication_STK_SIZE,
(void *)NULL, (void *)NULL,
(UBaseType_t)Sensor_Communication_TASK_PRIO, // (UBaseType_t)Sensor_Communication_TASK_PRIO,
tskIDLE_PRIORITY + 4,
(TaskHandle_t *)&Sensor_CommunicationTask_Handler); (TaskHandle_t *)&Sensor_CommunicationTask_Handler);
// if(handler==pdPASS){printf("与传感器通信任务创建成功\r\n");} // if(handler==pdPASS){printf("与传感器通信任务创建成功\r\n");}
// else{printf("与传感器通信任务创建失败\r\n");} // else{printf("与传感器通信任务创建失败\r\n");}
@ -175,25 +172,33 @@ void start_task(void *pvParameters)
// if(handler4==pdPASS){printf("控灯任务创建成功\r\n");} // if(handler4==pdPASS){printf("控灯任务创建成功\r\n");}
// else{printf("控灯任务创建失败\r\n");} // else{printf("控灯任务创建失败\r\n");}
vTaskDelete(StartTask_Handler); // 删除开始任务 vTaskDelete(StartTask_Handler); // 删除开始任务
taskEXIT_CRITICAL(); // 退出临界区 taskEXIT_CRITICAL(); // 退出临界区
} }
void SensorDataRequestTask(void *pvParameters)
void SensorDataRequestTask(void *pvParameters) { {
while (1) { while (1)
{
// 发送传感器数据请求的操作 // 发送传感器数据请求的操作
RS485_1_Send_Data_1(rs485buf, 8); RS485_1_Send_Data_1(INNER_SENSOR_485_REQUEST_COMMAND, 8);
// delay_xms(100); vTaskDelay(100);
RS485_1_Send_Data_1(OUTER_SENSOR_485_REQUEST_COMMAND, 8);
vTaskDelay(100);
process_485_task();
PID_Calc();
// RS485_1_Send_Data_1(RS485_RX_BUF, 48); // RS485_1_Send_Data_1(RS485_RX_BUF, 48);
vTaskDelay(SENSOR_DATA_REQUEST_PERIOD); vTaskDelay(4800);
// vTaskDelay(SENSOR_DATA_REQUEST_PERIOD);
} }
} }
void SyncEnvironmentDataRequestTask(void *pvParameters) { void SyncEnvironmentDataRequestTask(void *pvParameters)
while (1) { {
while (1)
{
RS485_1_Send_Data_3(); RS485_1_Send_Data_3();
vTaskDelay(SYNC_ENVIRONMENT_DATA_REQUEST_PERIOD); vTaskDelay(SYNC_ENVIRONMENT_DATA_REQUEST_PERIOD);
@ -203,118 +208,55 @@ void SyncEnvironmentDataRequestTask(void *pvParameters) {
int hot = 0; int hot = 0;
/** /**
* pid5 * pid5
*/ */
void HotTestRequestTask(void *pvParameters) { void HotTestRequestTask(void *pvParameters)
while (1) { {
while (1)
PID_Calc(); {
// if (T >= 350) {
// hot = 0;
// hot_clod_flag = 0;
// } else {
// hot = 52;
// hot_clod_flag = 2;
// // hot += 10;
// // if (hot > 100) {
// // hot = 10;
// // }
// }
// u8 temp_data[8] = { 0x10, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 };
// temp_data[4] = hot / 256;
// temp_data[5] = hot % 256;
// GetCRC16(temp_data, 6, temp_data + 6, temp_data + 7);
// RS485_3_Init(9600);
// RS485_3_Send_Data(temp_data, 8);
// // RS485_1_Send_Data(temp_data, 8);
// delay_xms(30);
// RS485_1_Init(9600);
// HC595_Send_Byte(gpio_state |= 0x04); // open heater |=0000 0100 0x04
// vTaskDelay(60000);
// temp_data[4] = 0;
// temp_data[5] = 0;
// GetCRC16(temp_data, 6, temp_data + 6, temp_data + 7);
// // RS485_3_Init(9600);
// RS485_1_Send_Data(temp_data, 8);
// // RS485_3_Send_Data(temp_data, 8);
// // delay_xms(30);
// // RS485_1_Init(9600);
// // HC595_Send_Byte(gpio_state &= 0xFB); // close heater &=1111 1011 0xFB // PID_Calc();
// hot_clod_flag = 0; RS485_1_Send_Data_2(); // 上传参数
vTaskDelay(5000); vTaskDelay(5000);
} }
} }
u8 temp[4] = {0xaa, 0xbb, 0xcc, 0xdd};
u8 temp[4] = {0xaa,0xbb,0xcc,0xdd};
u8 times = 0; u8 times = 0;
void Sensor_Communication_task(void *pvParameters)
{
while (1) void process_485_task(void) {
{
// RS485_3_Init(9600);
// // temp[2] = (int)pid.Ki / 256;
// // temp[3] = (int)pid.Ki % 256;
// temp[2] = 4800 / 256;
// temp[3] = 4800 % 256;
// RS485_3_Send_Data(temp, 4);
// // RS485_1_Send_Data(temp_data, 8);
// delay_xms(30);
// RS485_1_Init(9600);
// RS485_1_Send_Data(temp, 4);
// HC595_Send_Byte(0x00);
// cnt_flag=do_mqtt(MQTT_SOCK,NET_CONFIG.rip,1883,5500);
// Humidity=H*0.1;
// temperature=T*0.1;
// delay_ms(50);
// sprintf(wet_temp,"{\"method\":\"thing.event.property.post\",\"params\":{\"Humidity\":%.2f,\"temperature\":%.2f,\"CO2\":%d,\"red_light\":%d,\"white_light\":%d,\"blue_light\":%d},\"version\":\"1.0.0\"}",Humidity,temperature,C,red/10,white/10,blue/10); //构建数据
// //sprintf(wet_temp,"{\"method\":\"thing.event.property.post\",\"params\":{\"Humidity\":%.2f,\"temperature\":%.2f,\"CO2\":%d},\"version\":\"1.0.0\"}",Humidity,temperature,C); //构建数据
// if(cnt_flag==0){sub_flag=0;pub_flag=0;time=0;}
// if(cnt_flag&&sub_flag==0)sub_flag=!subscribMqtt(MQTT_SOCK,subTopic);
// if(cnt_flag&&sub_flag&&pub_flag==0)pub_flag=!publishMqtt(MQTT_SOCK,pubTopic,wet_temp);
// if(cnt_flag)time++;
// if(time==50){
// time=0;
// pingMqtt(MQTT_SOCK);
// }
now_stage = timelong_Compare(); now_stage = timelong_Compare();
Array(&now_stage, &hour, &min, &tem, &hum, &red, &blue, &white); // 更新对应阶段号的参数 Array(&now_stage, &hour, &min, &tem, &hum, &red, &blue, &white); // 更新对应阶段号的参数
delay_xms(50); delay_xms(50);
bufcut_Init(RS485_RX_BUF_COPY, RS485_RX_BUF, 0, 128); bufcut_Init(RS485_RX_BUF_COPY, RS485_RX_BUF, 0, 128);
u8 c = 0;
RS485_RX_CNT = 0; RS485_RX_CNT = 0;
while (isAllZeros(RS485_RX_BUF_COPY, 128) == 0) while (isAllZeros(RS485_RX_BUF_COPY, 128) == 0)
// while (RS485_RX_CNT > 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 // receive message from sensor
u8 temp_data[23] = {0}; u8 temp_data[23] = {0};
for (int i=0;i<23;i++) { for (int i = 0; i < 23; i++)
{
temp_data[i] = RS485_RX_BUF_COPY[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); 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) 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)
{ {
@ -370,7 +312,8 @@ void Sensor_Communication_task(void *pvParameters)
// change pid params // change pid params
// total length: 8 // total length: 8
int param_index = RS485_RX_BUF_COPY[3]; int param_index = RS485_RX_BUF_COPY[3];
switch(param_index) { switch (param_index)
{
case 0x01: case 0x01:
{ {
pid.Kp = RS485_RX_BUF_COPY[4] * 256.0 + RS485_RX_BUF_COPY[5]; pid.Kp = RS485_RX_BUF_COPY[4] * 256.0 + RS485_RX_BUF_COPY[5];
@ -389,7 +332,7 @@ void Sensor_Communication_task(void *pvParameters)
case 0x04: case 0x04:
{ {
int tem_offset_10times = RS485_RX_BUF_COPY[4] * 256.0 + RS485_RX_BUF_COPY[5]; int tem_offset_10times = RS485_RX_BUF_COPY[4] * 256.0 + RS485_RX_BUF_COPY[5];
// Negative tem offset treatment // Negative temperature offset treatment
if (tem_offset_10times & 0x8000) if (tem_offset_10times & 0x8000)
{ {
tem_offset_10times = ((~tem_offset_10times + 1) & 0xFFFF); tem_offset_10times = ((~tem_offset_10times + 1) & 0xFFFF);
@ -454,16 +397,49 @@ void Sensor_Communication_task(void *pvParameters)
// PWM_SetCompare4((white / 100.0 * 3.5 + 28)); // J10 // PWM_SetCompare4((white / 100.0 * 3.5 + 28)); // J10
// } // }
RS485_RX_CNT = 0; RS485_RX_CNT = 0;
}
void Sensor_Communication_task(void *pvParameters)
{
while (1)
{
// RS485_3_Init(9600);
// // temp[2] = (int)pid.Ki / 256;
// // temp[3] = (int)pid.Ki % 256;
// temp[2] = 4800 / 256;
// temp[3] = 4800 % 256;
// RS485_3_Send_Data(temp, 4);
// // RS485_1_Send_Data(temp_data, 8);
// delay_xms(30);
// RS485_1_Init(9600);
// RS485_1_Send_Data(temp, 4);
// HC595_Send_Byte(0x00);
// cnt_flag=do_mqtt(MQTT_SOCK,NET_CONFIG.rip,1883,5500);
// Humidity=H*0.1;
// temperature=T*0.1;
// delay_ms(50);
// sprintf(wet_temp,"{\"method\":\"thing.event.property.post\",\"params\":{\"Humidity\":%.2f,\"temperature\":%.2f,\"CO2\":%d,\"red_light\":%d,\"white_light\":%d,\"blue_light\":%d},\"version\":\"1.0.0\"}",Humidity,temperature,C,red/10,white/10,blue/10); //构建数据
// //sprintf(wet_temp,"{\"method\":\"thing.event.property.post\",\"params\":{\"Humidity\":%.2f,\"temperature\":%.2f,\"CO2\":%d},\"version\":\"1.0.0\"}",Humidity,temperature,C); //构建数据
// if(cnt_flag==0){sub_flag=0;pub_flag=0;time=0;}
// if(cnt_flag&&sub_flag==0)sub_flag=!subscribMqtt(MQTT_SOCK,subTopic);
// if(cnt_flag&&sub_flag&&pub_flag==0)pub_flag=!publishMqtt(MQTT_SOCK,pubTopic,wet_temp);
// if(cnt_flag)time++;
// if(time==50){
// time=0;
// pingMqtt(MQTT_SOCK);
// }
process_485_task();
vTaskDelay(MAIN_TASK_PERIOD); vTaskDelay(MAIN_TASK_PERIOD);
} }
} }
/** /**
* process sensor data * process inner sensor data
*/ */
void process_sensor_data(u8 *data) { void process_inner_sensor_data(u8 *data)
{
T = data[3]; T = data[3];
T = T << 8 | data[4]; T = T << 8 | data[4];
// Negative temperature treatment // Negative temperature treatment
@ -508,6 +484,10 @@ void process_sensor_data(u8 *data) {
// // } // // }
// } // }
// 如果目标温度变化新的目标温度和现在的目标温度相差大于等于0.1度),则清除误差累计
if (pid.set_tem - tem / 10.0 >= 0.1 || pid.set_tem - tem / 10.0 <= -0.1) {
pid.SEk = 0;
}
pid.set_tem = tem / 10.0; pid.set_tem = tem / 10.0;
pid.now_tem = T / 10.0; pid.now_tem = T / 10.0;
// PID_Calc(); // PID_Calc();
@ -552,15 +532,42 @@ void process_sensor_data(u8 *data) {
// delay_xms(200); // delay_xms(200);
} }
/**
* process inner 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 * hmi event process
*/ */
void process_hmi_btn_event(u8 page, u8 btn_index, u8 value) { void process_hmi_btn_event(u8 page, u8 btn_index, u8 value)
switch(page) { {
switch (page)
{
case page_param_adjust: case page_param_adjust:
{ {
// change current stage // change current stage
if (btn_index >= 45 && btn_index <= 50 && value == 0x01) { if (btn_index >= 45 && btn_index <= 50 && value == 0x01)
{
int target_stage = btn_index - 44; int target_stage = btn_index - 44;
RTC_synchronization_ins(2023, 9, 1, 0, 00, 00); RTC_synchronization_ins(2023, 9, 1, 0, 00, 00);
now_stage = target_stage; now_stage = target_stage;
@ -573,86 +580,3 @@ void process_hmi_btn_event(u8 page, u8 btn_index, u8 value) {
} }
} }
} }
// 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");
// }
//}

@ -24,7 +24,9 @@
#include "mqtt_api.h" #include "mqtt_api.h"
void os_init(void); void os_init(void);
void process_sensor_data(u8 *data); void process_inner_sensor_data(u8 *data);
void process_outer_sensor_data(u8 *data);
void process_485_task(void);
void process_hmi_btn_event(u8 page_index, u8 btn_index, u8 value); void process_hmi_btn_event(u8 page_index, u8 btn_index, u8 value);
#endif #endif

Loading…
Cancel
Save