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

@ -2,7 +2,6 @@
#include "Relays.h"
#include "USART.h"
#include "rs485.h"
extern u16 tem;
float cold_tem = 0;
float red_tem = 0;
float ti;
@ -18,7 +17,6 @@ int max_speed_count = 6000;
void PID_Init()
{
// pid.set_tem=tem;// user set temperature
// if flash have not a vaild value, just set a default value
if (pid.Kp < 1e-7) { pid.Kp = 9.6; }
if (pid.Ki < 1e-7) { pid.Ki = 0.01; }
@ -32,13 +30,22 @@ void PID_Init()
pid.OUT0 = 1;
pid.C1ms = 0;
pid.hp = 2.4;
pid.hi = 0.02;
pid.hd = 0;
pid.max_compressor_tem = 30;
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.cd = 0;
pid.c_base = 37;
pid.h_percent = 0;
pid.c_speed = 0;
@ -93,8 +100,8 @@ void set_heater_power(int percent) {
/**
* heater power calc
*/
int calc_hp(float delta_t, float Error_calc, int p_hb, float pid_hp, float pid_hi) {
int p_h = p_hb + pid_hp * delta_t + pid_hi * Error_calc;
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 + pid_hd * DelEk;
if (p_h > 100) {
return 100;
}
@ -136,8 +143,6 @@ void PID_Calc() // pid calc
{
int min_speed_count = 1800;
int max_speed_count = 4800;
int p_hb = 52;
int p_cb = 33;
float DelEk; // The difference between the last two deviations
// float td;
float out;
@ -148,32 +153,55 @@ void PID_Calc() // pid calc
// }
float delta_t = pid.set_tem - pid.now_tem;
int p_c = calc_cp(delta_t, p_cb, pid.cp);
pid.c_speed = calc_compressor_speed(p_c, min_speed_count, max_speed_count);
// When the target tem is greater then max compressor tem, the compressor will stop
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);
}
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.Pout = pid.Kp * pid.Ek; // Proportional output
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
if (pid.SEk < - p_hb / pid.hi) {
pid.SEk = - p_hb / pid.hi;
if (pid.SEk < - h_base / hi) {
pid.SEk = - h_base / hi;
}
if (pid.c_speed == max_speed_count) {
pid.SEk = 0;
}
float Error_calc = pid.SEk;
if (Error_calc < - (p_hb + pid.hp * delta_t) / pid.hi) {
Error_calc = - (p_hb + pid.hp * delta_t) / pid.hi;
if (Error_calc < - (h_base + hp * delta_t) / hi) {
Error_calc = - (h_base + hp * delta_t) / hi;
}
if (pid.c_speed == max_speed_count) {
Error_calc = 0;
}
DelEk = pid.Ek - pid.Ek_1; // The difference between the last two deviations
// ti=pid.t/pid.Ti;
// ki=ti*pid.Kp;
@ -203,11 +231,9 @@ void PID_Calc() // pid calc
{
pid.OUT = out;
}
pid.Ek_1 = pid.Ek; // udpate difference
pid.C1ms = 0;
// 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
if (pid.c_speed == max_speed_count) {
pid.h_percent = 0;
@ -216,4 +242,8 @@ void PID_Calc() // pid calc
set_compressor_power(pid.c_speed);
set_heater_power(pid.h_percent);
pid.Ek_prev = pid.Ek; // udpate difference
pid.C1ms = 0;
}

@ -10,14 +10,30 @@ typedef struct Pid
{
float set_tem;// User settings
float now_tem;// current temperature
float max_compressor_tem; // maximum temperature of the compressor. When the target tem is greater than this value, the compressor is turned off.
float out_tem; // outer temperature
float out_humidity; // outer humidity
float hp;
float hi;
float hd;
// 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;
float cp;
float ci;
float cd;
float c_base;
int c_speed;
float Kp; // 110
@ -28,7 +44,7 @@ typedef struct Pid
float Td;
float Ek; // This deviation
float Ek_1;// Last deviation
float Ek_prev;// Last deviation
float SEk; // The sum of historical deviations
float Iout;

@ -380,6 +380,10 @@ void RS485_1_Send_Data_1(u8 *buf, u8 len)
void RS485_1_Send_Data_2(void)
{
// when H eq 0, don't send
// if (H == 0) {
// return;
// }
sendbuf[0] = 0xEE;
sendbuf[1] = 0xB5;
sendbuf[2] = 0x05;
@ -450,21 +454,35 @@ void RS485_1_Send_Data_2(void)
sendbuf[25] = 0; // ALARM state
sendbuf[26] = ALARM; // ALARM state
sendbuf[27] = (int)pid.hp / 256; // Kp 110
sendbuf[28] = (int)pid.hp % 256; // Kp 110
sendbuf[29] = ((int)(pid.hi * 100000)) / 256; // Ti 0.001
sendbuf[30] = ((int)(pid.hi * 100000)) % 256; // Ti 0.001
sendbuf[31] = (int)pid.hd / 256; // Td 340
sendbuf[32] = (int)pid.hd % 256; // Td 340
if (pid.set_tem > pid.max_compressor_tem) {
// h mode
sendbuf[27] = (int)(pid.hp_h * 1000) / 256; // Kp 110
sendbuf[28] = (int)(pid.hp_h * 1000) % 256; // Kp 110
sendbuf[29] = ((int)(pid.hi_h * 100000)) / 256; // Ti 0.001
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[34] = pid.h_percent % 256; // h_percent
sendbuf[35] = (int)pid.cp / 256; // Kp 110
sendbuf[36] = (int)pid.cp % 256; // Kp 110
sendbuf[35] = (int)(pid.cp * 1000) / 256; // Kp 110
sendbuf[36] = (int)(pid.cp * 1000) % 256; // Kp 110
sendbuf[37] = ((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[40] = (int)pid.cd % 256; // Td 340
// sendbuf[39] = (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[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"
extern u16 tem, hum, red, blue, white;
extern u8 now_stage;
extern u8 hour, min;
extern u8 gpio_state;
// int a_value=20;
// int b_value=20;
// int c_value=20;
@ -22,7 +18,6 @@ int main(void)
RTC_Init(); // 需要放在HC595_Pin_Init()后面
TIM2_Init();
Read_Init(); // 读flash的值赋值给total数组以及阶段
// Array(&now_stage,&hour,&min,&tem,&hum,&red,&blue,&white);
PWM1_Init(500 - 1, 720 - 1);
PWM2_Init(500 - 1, 720 - 1);
PWM3_Init(500 - 1, 720 - 1);

@ -1,6 +1,7 @@
#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
@ -36,23 +37,20 @@ void Host_Computer_Communication(void);
// 1seconds delay
#define MAIN_TASK_PERIOD pdMS_TO_TICKS(1000)
/**
* sensor data request: 02 03
*/
* sensor data request: 02 03
*/
void SensorDataRequestTask(void *pvParameters);
/**
* sync environment data: EE B5 01
*/
*/
void SyncEnvironmentDataRequestTask(void *pvParameters);
/**
* test
*/
*/
void HotTestRequestTask(void *pvParameters);
int isZeros(u8 arr[]);
u8 RS485_RX_BUF_COPY[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
u16 tem, hum, red, blue, white;
u8 hour, min;
u8 rs485buf[8] = {SENSOR_ADDRESS, 0x03, 0x00, 0x01, 0x00, 0x09, 0xD4, 0x3F}; // Sensor exchange data
u16 sync_cnt = 0; // 同步环境控制参数的计数器到0同步
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[];
float Humidity = 0;
float temperature = 0;
// pages in hmi
#define page_index 43
#define page_curve 45
@ -101,6 +99,24 @@ float temperature = 0;
// 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
@ -116,34 +132,14 @@ 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);
// 创建传感器数据请求任务
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(HotTestRequestTask, "HotTestRequestTask", configMINIMAL_STACK_SIZE * 8, NULL, tskIDLE_PRIORITY + 8, NULL);
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
@ -160,7 +156,8 @@ void start_task(void *pvParameters)
(const char *)"Sensor_Communication_task",
(uint16_t)Sensor_Communication_STK_SIZE,
(void *)NULL,
(UBaseType_t)Sensor_Communication_TASK_PRIO,
// (UBaseType_t)Sensor_Communication_TASK_PRIO,
tskIDLE_PRIORITY + 4,
(TaskHandle_t *)&Sensor_CommunicationTask_Handler);
// if(handler==pdPASS){printf("与传感器通信任务创建成功\r\n");}
// else{printf("与传感器通信任务创建失败\r\n");}
@ -175,161 +172,106 @@ void start_task(void *pvParameters)
// if(handler4==pdPASS){printf("控灯任务创建成功\r\n");}
// else{printf("控灯任务创建失败\r\n");}
vTaskDelete(StartTask_Handler); // 删除开始任务
taskEXIT_CRITICAL(); // 退出临界区
}
void SensorDataRequestTask(void *pvParameters)
{
while (1)
{
// 发送传感器数据请求的操作
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);
process_485_task();
void SensorDataRequestTask(void *pvParameters) {
while (1) {
// 发送传感器数据请求的操作
RS485_1_Send_Data_1(rs485buf, 8);
// delay_xms(100);
// RS485_1_Send_Data_1(RS485_RX_BUF, 48);
PID_Calc();
// 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) {
while (1) {
void SyncEnvironmentDataRequestTask(void *pvParameters)
{
while (1)
{
RS485_1_Send_Data_3();
vTaskDelay(SYNC_ENVIRONMENT_DATA_REQUEST_PERIOD);
}
vTaskDelay(SYNC_ENVIRONMENT_DATA_REQUEST_PERIOD);
}
}
int hot = 0;
/**
* pid5
*/
void HotTestRequestTask(void *pvParameters) {
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);
*/
void HotTestRequestTask(void *pvParameters)
{
while (1)
{
// // HC595_Send_Byte(gpio_state &= 0xFB); // close heater &=1111 1011 0xFB
// hot_clod_flag = 0;
// PID_Calc();
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;
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);
// }
void process_485_task(void) {
now_stage = timelong_Compare();
Array(&now_stage, &hour, &min, &tem, &hum, &red, &blue, &white); // 更新对应阶段号的参数
delay_xms(50);
bufcut_Init(RS485_RX_BUF_COPY, RS485_RX_BUF, 0, 128);
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
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];
}
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
// total length: 18
// if (CRC16_check(RS485_RX_BUF_COPY, 16) == 1) {
Batch_synchronization(&n, RS485_RX_BUF_COPY);
Array(&now_stage, &hour, &min, &tem, &hum, &red, &blue, &white); // update param correspond to current stage
bufcut_Init(RS485_DATA_TMP, RS485_RX_BUF_COPY, 0, 18);
RS485_DATA_TMP[18] = 0xFF;
RS485_DATA_TMP[19] = 0xFC;
RS485_DATA_TMP[20] = 0xFF;
RS485_DATA_TMP[21] = 0xFF;
// bufcut_Init(RS485_DATA_TMP + 8, RS485_SUFFIX, 18, 22);
RS485_1_Send_Data_1(RS485_DATA_TMP, 22);
Batch_synchronization(&n, RS485_RX_BUF_COPY);
Array(&now_stage, &hour, &min, &tem, &hum, &red, &blue, &white); // update param correspond to current stage
bufcut_Init(RS485_DATA_TMP, RS485_RX_BUF_COPY, 0, 18);
RS485_DATA_TMP[18] = 0xFF;
RS485_DATA_TMP[19] = 0xFC;
RS485_DATA_TMP[20] = 0xFF;
RS485_DATA_TMP[21] = 0xFF;
// bufcut_Init(RS485_DATA_TMP + 8, RS485_SUFFIX, 18, 22);
RS485_1_Send_Data_1(RS485_DATA_TMP, 22);
// }
RX_BUF_Transfer(0, 18);
}
@ -338,12 +280,12 @@ void Sensor_Communication_task(void *pvParameters)
// update single environment param
// total length: 9
// if (CRC16_check(RS485_RX_BUF_COPY, 7) == 1) {
Analysis(&n, &i, RS485_RX_BUF_COPY);
Array(&now_stage, &hour, &min, &tem, &hum, &red, &blue, &white); // update param correspond to current stage
Write_Init();
bufcut_Init(RS485_DATA_TMP, RS485_RX_BUF_COPY, 0, 9);
bufcut_Init(RS485_DATA_TMP + 8, RS485_SUFFIX, 9, 13);
RS485_1_Send_Data_1(RS485_DATA_TMP, 13);
Analysis(&n, &i, RS485_RX_BUF_COPY);
Array(&now_stage, &hour, &min, &tem, &hum, &red, &blue, &white); // update param correspond to current stage
Write_Init();
bufcut_Init(RS485_DATA_TMP, RS485_RX_BUF_COPY, 0, 9);
bufcut_Init(RS485_DATA_TMP + 8, RS485_SUFFIX, 9, 13);
RS485_1_Send_Data_1(RS485_DATA_TMP, 13);
// }
RX_BUF_Transfer(0, 9);
}
@ -352,16 +294,16 @@ void Sensor_Communication_task(void *pvParameters)
// change running stage
// total length: 6
// if (CRC16_check(RS485_RX_BUF_COPY, 4) == 1) {
int target_stage = RS485_RX_BUF_COPY[3];
RTC_synchronization_ins(2023, 9, 1, 0, 00, 00);
now_stage = target_stage;
store_stage = target_stage;
Write_Init();
bufcut_Init(RS485_DATA_TMP, RS485_RX_BUF_COPY, 0, 6);
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(); // 上传参数
int target_stage = RS485_RX_BUF_COPY[3];
RTC_synchronization_ins(2023, 9, 1, 0, 00, 00);
now_stage = target_stage;
store_stage = target_stage;
Write_Init();
bufcut_Init(RS485_DATA_TMP, RS485_RX_BUF_COPY, 0, 6);
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(); // 上传参数
// }
RX_BUF_Transfer(0, 6);
}
@ -370,38 +312,39 @@ void Sensor_Communication_task(void *pvParameters)
// change pid params
// total length: 8
int param_index = RS485_RX_BUF_COPY[3];
switch(param_index) {
case 0x01:
{
pid.Kp = RS485_RX_BUF_COPY[4] * 256.0 + RS485_RX_BUF_COPY[5];
break;
}
case 0x02:
{
pid.Ki = (RS485_RX_BUF_COPY[4] * 256.0 + RS485_RX_BUF_COPY[5]) / 100000.0;
break;
}
case 0x03:
{
pid.Kd = RS485_RX_BUF_COPY[4] * 256.0 + RS485_RX_BUF_COPY[5];
break;
}
case 0x04:
{
int tem_offset_10times = RS485_RX_BUF_COPY[4] * 256.0 + RS485_RX_BUF_COPY[5];
// Negative tem offset treatment
if (tem_offset_10times & 0x8000)
{
tem_offset_10times = ((~tem_offset_10times + 1) & 0xFFFF);
}
pid.tem_offset = tem_offset_10times / 10.0;
break;
}
case 0x05:
switch (param_index)
{
case 0x01:
{
pid.Kp = RS485_RX_BUF_COPY[4] * 256.0 + RS485_RX_BUF_COPY[5];
break;
}
case 0x02:
{
pid.Ki = (RS485_RX_BUF_COPY[4] * 256.0 + RS485_RX_BUF_COPY[5]) / 100000.0;
break;
}
case 0x03:
{
pid.Kd = RS485_RX_BUF_COPY[4] * 256.0 + RS485_RX_BUF_COPY[5];
break;
}
case 0x04:
{
int tem_offset_10times = RS485_RX_BUF_COPY[4] * 256.0 + RS485_RX_BUF_COPY[5];
// Negative temperature offset treatment
if (tem_offset_10times & 0x8000)
{
pid.tem_threshold = (RS485_RX_BUF_COPY[4] * 256.0 + RS485_RX_BUF_COPY[5]) / 10.0;
break;
tem_offset_10times = ((~tem_offset_10times + 1) & 0xFFFF);
}
pid.tem_offset = tem_offset_10times / 10.0;
break;
}
case 0x05:
{
pid.tem_threshold = (RS485_RX_BUF_COPY[4] * 256.0 + RS485_RX_BUF_COPY[5]) / 10.0;
break;
}
}
Write_Init();
bufcut_Init(RS485_DATA_TMP, RS485_RX_BUF_COPY, 0, 8);
@ -454,16 +397,49 @@ void Sensor_Communication_task(void *pvParameters)
// PWM_SetCompare4((white / 100.0 * 3.5 + 28)); // J10
// }
RS485_RX_CNT = 0;
}
void Sensor_Communication_task(void *pvParameters)
{
vTaskDelay(MAIN_TASK_PERIOD);
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);
}
}
/**
* process sensor data
*/
void process_sensor_data(u8 *data) {
* process inner sensor data
*/
void process_inner_sensor_data(u8 *data)
{
T = data[3];
T = T << 8 | data[4];
// 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.now_tem = T / 10.0;
// PID_Calc();
@ -521,7 +501,7 @@ void process_sensor_data(u8 *data) {
gpio_state |= 0x08;
// HC595_Send_Byte(gpio_state &= 0xEF); // 关闭加湿器 &=1110 1111 0xEF
gpio_state &= 0xEF;
humidity_flag = 1; // 除湿
humidity_flag = 1; // 除湿
}
if (H < (hum - 50)) // 湿度低于设定值5打开加湿器 GPIO5->PD0
{
@ -546,21 +526,48 @@ void process_sensor_data(u8 *data) {
humidity_flag = 0;
}
// HC595_Send_Byte(gpio_state);
// HC595_Send_Byte(gpio_state);
RS485_1_Send_Data_2(); // 上传参数
// 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
*/
void process_hmi_btn_event(u8 page, u8 btn_index, u8 value) {
switch(page) {
*/
void process_hmi_btn_event(u8 page, u8 btn_index, u8 value)
{
switch (page)
{
case page_param_adjust:
{
// 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;
RTC_synchronization_ins(2023, 9, 1, 0, 00, 00);
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"
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);
#endif

Loading…
Cancel
Save