diff --git a/HARDWARE/PID.c b/HARDWARE/PID.c index 041f443..23e1246 100644 --- a/HARDWARE/PID.c +++ b/HARDWARE/PID.c @@ -2,119 +2,119 @@ #include "Relays.h" #include "USART.h" extern u16 tem; -float cold_tem=0; -float red_tem=0; +float cold_tem = 0; +float red_tem = 0; float ti; -float ki=0.001; -float kd=340; +float ki = 0.001; +float kd = 340; extern u8 hot_clod_flag; extern u8 gpio_state; extern int T; -unsigned int num=0; +unsigned int num = 0; PID pid; void PID_Init() { - //pid.set_tem=tem;//用户设定温度 - pid.Kp=110; - pid.t=500;//PID计算周期 - //pid.Ti=5000000;//积分时间 - //pid.Td=1000;//微分时间 - pid.pwmcycle=200;//pwm周期200 - pid.OUT0=1; - pid.C1ms=0; + // pid.set_tem=tem;//用户设定温度 + pid.Kp = 110; + pid.t = 500; // PID计算周期 + // pid.Ti=5000000;//积分时间 + // pid.Td=1000;//微分时间 + pid.pwmcycle = 200; // pwm周期200 + pid.OUT0 = 1; + pid.C1ms = 0; } -void PID_Calc() //pid计算 +void PID_Calc() // pid计算 { - float DelEk;//最近两次偏差之差 - //float td; + float DelEk; // 最近两次偏差之差 + // float td; float out; - if(pid.C1ms<(pid.t)) //计算周期未到 - { - return ; - } + if (pid.C1ms < (pid.t)) // 计算周期未到 + { + return; + } - if(pid.set_tem>pid.now_tem) + if (pid.set_tem > pid.now_tem) { - pid.Ek=pid.set_tem-pid.now_tem; + pid.Ek = pid.set_tem - pid.now_tem; } else { - pid.Ek=pid.now_tem-pid.set_tem; + pid.Ek = pid.now_tem - pid.set_tem; + } + pid.Pout = pid.Kp * pid.Ek; // 比例输出 + + pid.SEk += pid.Ek; // 历史偏差总和 + + DelEk = pid.Ek - pid.Ek_1; // 最近两次偏差之差 + + // ti=pid.t/pid.Ti; + // ki=ti*pid.Kp; + + pid.Iout = ki * pid.SEk; // 积分输出 + + // td=pid.Td/pid.t; + // kd=pid.Kp*td; + + pid.Dout = kd * DelEk; // 微分输出 + if (pid.Dout < 0) + { + pid.Dout = 0 - pid.Dout; } - pid.Pout=pid.Kp*pid.Ek; //比例输出 - - pid.SEk+=pid.Ek; //历史偏差总和 - - DelEk=pid.Ek-pid.Ek_1; //最近两次偏差之差 - - //ti=pid.t/pid.Ti; - //ki=ti*pid.Kp; - - pid.Iout=ki*pid.SEk; //积分输出 -// td=pid.Td/pid.t; -// kd=pid.Kp*td; - - pid.Dout=kd*DelEk; //微分输出 - if(pid.Dout<0) + // out= pid.Pout+pid.Iout+ pid.Dout; + out = pid.Pout; + if (out > pid.pwmcycle) { - pid.Dout=0-pid.Dout; + pid.OUT = pid.pwmcycle; } - - //out= pid.Pout+pid.Iout+ pid.Dout; - out= pid.Pout; - if(out>pid.pwmcycle) - { - pid.OUT=pid.pwmcycle; - } - else if(out<=0) - { - pid.OUT=pid.OUT0; - } - else - { - pid.OUT=out; - } - pid.Ek_1=pid.Ek; //更新偏差 - pid.C1ms=0; - - if(pid.set_tem>pid.now_tem+1) + else if (out <= 0) { - //得到当前的偏差值,设置温度大于实际温度1℃,加热,关闭压缩机,打开加热棒 + pid.OUT = pid.OUT0; + } + else + { + pid.OUT = out; + } + pid.Ek_1 = pid.Ek; // 更新偏差 + pid.C1ms = 0; + + if (pid.set_tem > pid.now_tem + 1) + { + // 得到当前的偏差值,设置温度大于实际温度1℃,加热,关闭压缩机,打开加热棒 /*GPIO1->报警铃 GPIO6->压缩机 GPIO3->加热棒 GPIO4—>新风风扇 GPIO5->加湿器 */ - //HC595_Send_Byte(gpio_state&=0xDF);//关闭压缩机 &=1101 1111 0xDF - TIM_SetCompare3(TIM3,0); - HC595_Send_Byte(gpio_state|=0x04);//打开加热棒 |=0000 0100 0x04 - hot_clod_flag=2; - pid.Iout=0; - } - if(pid.now_tem>pid.set_tem) + // HC595_Send_Byte(gpio_state&=0xDF);//关闭压缩机 &=1101 1111 0xDF + TIM_SetCompare3(TIM3, 0); + HC595_Send_Byte(gpio_state |= 0x04); // 打开加热棒 |=0000 0100 0x04 + hot_clod_flag = 2; + pid.Iout = 0; + } + if (pid.now_tem > pid.set_tem) + { + // 得到当前的偏差值,设置温度小于实际温度,制冷,打开压缩机,关闭加热棒 + HC595_Send_Byte(gpio_state &= 0xFB); // 关闭加热棒 &=1111 1011 0xFB + num = (((pid.OUT * 400) / pid.pwmcycle) - 1); // 请问这个pid.OUT与pwm占空比的值是如何换算过来的 + TIM_SetCompare3(TIM3, num); + // printf("%d\r\n",num); + // 0-200对应0-100%,如果pid.out=50,占空比就是25%,//num=50*400/200=100,100/400=25% + // HC595_Send_Byte(gpio_state|=0x20);//打开压缩机 |=0010 0000 + hot_clod_flag = 1; + // pid.Iout=0; + } + if (hot_clod_flag == 1 && T <= tem - 3) // 制冷过程中温度下降低于设定温度0.3℃ { - //得到当前的偏差值,设置温度小于实际温度,制冷,打开压缩机,关闭加热棒 - HC595_Send_Byte(gpio_state&=0xFB);//关闭加热棒 &=1111 1011 0xFB - num=(((pid.OUT*400)/pid.pwmcycle)-1);//请问这个pid.OUT与pwm占空比的值是如何换算过来的 - TIM_SetCompare3(TIM3,num); - //printf("%d\r\n",num); - //0-200对应0-100%,如果pid.out=50,占空比就是25%,//num=50*400/200=100,100/400=25% - //HC595_Send_Byte(gpio_state|=0x20);//打开压缩机 |=0010 0000 - hot_clod_flag=1; - //pid.Iout=0; + // HC595_Send_Byte(gpio_state&=0xDB);//关闭压缩机 关闭加热棒 &=1101 1101 0xDB + TIM_SetCompare3(TIM3, 0); // 关闭压缩机 + HC595_Send_Byte(gpio_state &= 0xFB); // 关闭加热棒 + hot_clod_flag = 0; } - if(hot_clod_flag==1 && T<=tem-3)//制冷过程中温度下降低于设定温度0.3℃ - { - //HC595_Send_Byte(gpio_state&=0xDB);//关闭压缩机 关闭加热棒 &=1101 1101 0xDB - TIM_SetCompare3(TIM3,0);//关闭压缩机 - HC595_Send_Byte(gpio_state&=0xFB);//关闭加热棒 - hot_clod_flag=0; - } - if(hot_clod_flag==2 && T>=tem) + if (hot_clod_flag == 2 && T >= tem) { - //HC595_Send_Byte(gpio_state&=0xDB);//关闭压缩机 关闭四通阀 &=1101 1101 0xDB - TIM_SetCompare3(TIM3,0);//关闭压缩机 - HC595_Send_Byte(gpio_state&=0xFB);//关闭加热棒 - hot_clod_flag=0; + // HC595_Send_Byte(gpio_state&=0xDB);//关闭压缩机 关闭四通阀 &=1101 1101 0xDB + TIM_SetCompare3(TIM3, 0); // 关闭压缩机 + HC595_Send_Byte(gpio_state &= 0xFB); // 关闭加热棒 + hot_clod_flag = 0; } } diff --git a/myfreertos/myfreertos.c b/myfreertos/myfreertos.c index 163f91d..33e4962 100644 --- a/myfreertos/myfreertos.c +++ b/myfreertos/myfreertos.c @@ -1,70 +1,66 @@ #include "myfreertos.h" -char pubTopic[512]="/sys/hp8oQhMZJ67/Device1/thing/event/property/post";//发布的主题 -char subTopic[512]="/sys/hp8oQhMZJ67/Device1/thing/service/property/set";//订阅的主题 +char pubTopic[512] = "/sys/hp8oQhMZJ67/Device1/thing/event/property/post"; // 发布的主题 +char subTopic[512] = "/sys/hp8oQhMZJ67/Device1/thing/service/property/set"; // 订阅的主题 #define MQTT_SOCK 5 -//任务优先级 -#define START_TASK_PRIO 0 -//任务堆栈大小 -#define START_STK_SIZE 128 -//任务句柄 +// 任务优先级 +#define START_TASK_PRIO 0 +// 任务堆栈大小 +#define START_STK_SIZE 128 +// 任务句柄 TaskHandle_t StartTask_Handler; -//任务函数 +// 任务函数 void start_task(void *pvParameters); -//任务优先级 -#define Sensor_Communication_TASK_PRIO 1//与传感器通信 -//任务堆栈大小 -#define Sensor_Communication_STK_SIZE 512 -//任务句柄 +// 任务优先级 +#define Sensor_Communication_TASK_PRIO 1 // 与传感器通信 +// 任务堆栈大小 +#define Sensor_Communication_STK_SIZE 512 +// 任务句柄 TaskHandle_t Sensor_CommunicationTask_Handler; -//任务函数 +// 任务函数 void Sensor_Communication_task(void *pvParameters); void Host_Computer_Communication(void); -int isZeros(u8 arr[]) ; -u8 RS485_RX_BUF_COPY[128]={0}; -u8 cnt_flag=0,sub_flag=0,pub_flag=0; -u16 time=0;//记录ping服务器的时间 -char wet_temp[256];//订阅与发布消息的缓存区 -u8 store_stage=1;//写入flash的阶段号,断电重启后读取可以紧接着上次的阶段运行 +int isZeros(u8 arr[]); +u8 RS485_RX_BUF_COPY[128] = {0}; +u8 cnt_flag = 0, sub_flag = 0, pub_flag = 0; +u16 time = 0; // 记录ping服务器的时间 +char wet_temp[256]; // 订阅与发布消息的缓存区 +u8 store_stage = 1; // 写入flash的阶段号,断电重启后读取可以紧接着上次的阶段运行 extern PID pid; extern float kd; extern float ki; -u8 batch_sync_buf[11];//单个同步剪切得到的数组 -u8 ins_1=0; -int diff=0; -u8 gpio_state=0x00;//继电器状态 -u8 NUM=1;//批量同步发送的阶段号 -u8 n;//阶段号 -u16 i;//序列号 -u8 chour;//已运行小时数 -u8 cminute;//运行分钟数 -u8 hot_clod_flag=0;//加热制冷标志位。hot_clod_flag=0, 不加热不制冷;hot_clod_flag=2,加热;hot_clod_flag=1,制冷 -u8 humidity_flag=0;//加湿除湿标志位。 humidity_flag=0,不加湿不除湿; humidity_flag=2,加湿; humidity_flag=1,除湿 -u8 ALARM=0;//报警标志位。ALARM=0,不报警;ALARM=1,报警 -u16 tick=0;//tick大于600,触发报警条件会报警;小于600则不报警。 -u8 Feed_Dog_Count=0;//喂狗计时 -u8 now_stage=1;//当前运行阶段 -u16 tem,hum,red,blue,white; -u8 hour,min; -u8 change_stage_rev1=0; -u8 change_stage_rev2=0; -u8 change_stage_rev3=0; -u8 rs485buf[8]={0x01,0x03,0x00,0x01,0x00,0x09,0xD4,0x0C};//传感器交换数据 -int T=0,H=0,C=0,G=0, current_T=0; +u8 batch_sync_buf[11]; // 单个同步剪切得到的数组 +u8 ins_1 = 0; +int diff = 0; +u8 gpio_state = 0x00; // 继电器状态 +u8 NUM = 1; // 批量同步发送的阶段号 +u8 n; // 阶段号 +u16 i; // 序列号 +u8 chour; // 已运行小时数 +u8 cminute; // 运行分钟数 +u8 hot_clod_flag = 0; // 加热制冷标志位。hot_clod_flag=0, 不加热不制冷;hot_clod_flag=2,加热;hot_clod_flag=1,制冷 +u8 humidity_flag = 0; // 加湿除湿标志位。 humidity_flag=0,不加湿不除湿; humidity_flag=2,加湿; humidity_flag=1,除湿 +u8 ALARM = 0; // 报警标志位。ALARM=0,不报警;ALARM=1,报警 +u16 tick = 0; // tick大于600,触发报警条件会报警;小于600则不报警。 +u8 Feed_Dog_Count = 0; // 喂狗计时 +u8 now_stage = 1; // 当前运行阶段 +u16 tem, hum, red, blue, white; +u8 hour, min; +u8 change_stage_rev1 = 0; +u8 change_stage_rev2 = 0; +u8 change_stage_rev3 = 0; +u8 rs485buf[8] = {0x01, 0x03, 0x00, 0x01, 0x00, 0x09, 0xD4, 0x0C}; // 传感器交换数据 +int T = 0, H = 0, C = 0, G = 0, current_T = 0; extern u8 total[]; -float Humidity=0; -float temperature=0; - -//u8 RS485_RX_BUF[64]; - - - +float Humidity = 0; +float temperature = 0; +// u8 RS485_RX_BUF[64]; /********************* ********************** @@ -72,35 +68,34 @@ float temperature=0; ********************** *********************/ void os_init(void) -{ - //printf("入口函数调用成功\r\n"); - xTaskCreate( (TaskFunction_t)start_task, - (char *)"start_task", - (uint16_t)START_STK_SIZE, - (void *)NULL, - (UBaseType_t)START_TASK_PRIO, - (TaskHandle_t *)&StartTask_Handler); - vTaskStartScheduler(); +{ + // printf("入口函数调用成功\r\n"); + xTaskCreate((TaskFunction_t)start_task, + (char *)"start_task", + (uint16_t)START_STK_SIZE, + (void *)NULL, + (UBaseType_t)START_TASK_PRIO, + (TaskHandle_t *)&StartTask_Handler); + vTaskStartScheduler(); } - /********************* ********************** 创建 任务,队列,信号集等句柄,也可以测试用 ********************** *********************/ -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; +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; /* @@ -108,250 +103,241 @@ BaseType_t handler11=0; */ -void start_task(void*pvParameters) +void start_task(void *pvParameters) { - - taskENTER_CRITICAL(); //进入临界区 - - //创建与传感器通信任务 - handler=xTaskCreate((TaskFunction_t )Sensor_Communication_task, - (const char* )"Sensor_Communication_task", - (uint16_t )Sensor_Communication_STK_SIZE, - (void* )NULL, - (UBaseType_t )Sensor_Communication_TASK_PRIO, - (TaskHandle_t* )&Sensor_CommunicationTask_Handler); -// if(handler==pdPASS){printf("与传感器通信任务创建成功\r\n");} -// else{printf("与传感器通信任务创建失败\r\n");} - - -// //创建控灯任务 -// handler4=xTaskCreate((TaskFunction_t )led_task, -// (const char* )"led_task", -// (uint16_t )LED_STK_SIZE, -// (void* )NULL, -// (UBaseType_t )LED_TASK_PRIO, -// (TaskHandle_t* )&LEDTask_Handler); -// if(handler4==pdPASS){printf("控灯任务创建成功\r\n");} -// else{printf("控灯任务创建失败\r\n");} - vTaskDelete(StartTask_Handler); //删除开始任务 - taskEXIT_CRITICAL(); //退出临界区 + taskENTER_CRITICAL(); // 进入临界区 + + // 创建与传感器通信任务 + handler = xTaskCreate((TaskFunction_t)Sensor_Communication_task, + (const char *)"Sensor_Communication_task", + (uint16_t)Sensor_Communication_STK_SIZE, + (void *)NULL, + (UBaseType_t)Sensor_Communication_TASK_PRIO, + (TaskHandle_t *)&Sensor_CommunicationTask_Handler); + // if(handler==pdPASS){printf("与传感器通信任务创建成功\r\n");} + // else{printf("与传感器通信任务创建失败\r\n");} + + // //创建控灯任务 + // handler4=xTaskCreate((TaskFunction_t )led_task, + // (const char* )"led_task", + // (uint16_t )LED_STK_SIZE, + // (void* )NULL, + // (UBaseType_t )LED_TASK_PRIO, + // (TaskHandle_t* )&LEDTask_Handler); + // if(handler4==pdPASS){printf("控灯任务创建成功\r\n");} + // else{printf("控灯任务创建失败\r\n");} + vTaskDelete(StartTask_Handler); // 删除开始任务 + taskEXIT_CRITICAL(); // 退出临界区 } void Sensor_Communication_task(void *pvParameters) -{ - - - while(1) - { - - // 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();// - //printf("%d %d\r\n",chour,cminute); - Array(&now_stage,&hour,&min,&tem,&hum,&red,&blue,&white);//更新对应阶段号的参数 - //printf("current stage: %d\r\n",now_stage); - RS485_1_Send_Data_1(rs485buf,8);//(RS485_RX_CNT=0已被注释) - //printf("send finish\r\n"); - delay_xms(200); - //RX_BUF_Printf(128); - RS485_1_Send_Data_3(); - delay_xms(200); - //RX_BUF_Printf(128); - bufcut_Init(RS485_RX_BUF_COPY,RS485_RX_BUF,0,128); - RS485_RX_CNT=0; - while((isAllZeros(RS485_RX_BUF_COPY,128)==0)) - //while(!(RS485_RX_BUF[0]==0x00 && RS485_RX_BUF[1]==0x00&&RS485_RX_BUF[2]==0x00 && RS485_RX_BUF[3]==0x00)) - { - //printf("enter while\r\n"); - - if(RS485_RX_BUF_COPY[0]==0x01 && RS485_RX_BUF_COPY[1]==0x03) // 判断是否校验成功 - { - - T = RS485_RX_BUF_COPY[3]; - T = T<<8|RS485_RX_BUF_COPY[4]; - - H = RS485_RX_BUF_COPY[5]; - H = H<<8|RS485_RX_BUF_COPY[6]; - - C= RS485_RX_BUF_COPY[19]; - C = C<<8|RS485_RX_BUF_COPY[20]; - - //printf("now_tem=%d.%d℃,now_hum=%d.%d%% ,co2=%d\r\n",T/10,T%10,H/10,H%10,C); +{ + while (1) + { - /*GPIO1->报警铃 GPIO6->压缩机 GPIO3->加热棒 GPIO4—>新风风扇 GPIO5->加湿器 */ + // 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(); // + // printf("%d %d\r\n",chour,cminute); + Array(&now_stage, &hour, &min, &tem, &hum, &red, &blue, &white); // 更新对应阶段号的参数 + // printf("current stage: %d\r\n",now_stage); + RS485_1_Send_Data_1(rs485buf, 8); //(RS485_RX_CNT=0已被注释) + // printf("send finish\r\n"); + delay_xms(200); + // RX_BUF_Printf(128); + RS485_1_Send_Data_3(); + delay_xms(200); + // RX_BUF_Printf(128); + bufcut_Init(RS485_RX_BUF_COPY, RS485_RX_BUF, 0, 128); + RS485_RX_CNT = 0; + while ((isAllZeros(RS485_RX_BUF_COPY, 128) == 0)) + // while(!(RS485_RX_BUF[0]==0x00 && RS485_RX_BUF[1]==0x00&&RS485_RX_BUF[2]==0x00 && RS485_RX_BUF[3]==0x00)) + { + // printf("enter while\r\n"); + + if (RS485_RX_BUF_COPY[0] == 0x01 && RS485_RX_BUF_COPY[1] == 0x03) // 判断是否校验成功 + { - if((T<(tem-20)||T>(tem+20)||H<(hum-100)||H>(hum+100))&&(tick>610))//温度偏差2℃报警,湿度偏差10报警 - { - HC595_Send_Byte(gpio_state|=0x01);//打开报警铃 GPIO1->PB1 |=0000 0001 0x01 - ALARM=1; - } - else - { - HC595_Send_Byte(gpio_state&=0xFE);//关闭报警铃 &=1111 1110 0xFE - ALARM=0; - } - if(T<600&&T>-30) - { - diff=current_T-T; - if(diff<0)diff=-diff; - if(diff<3||current_T==0) //最近两次温差相差0.3℃,消除传感器感应出错的影响 - { - pid.set_tem=tem/10.0; - pid.now_tem=T/10.0; - PID_Calc(); - //num=(((pid.OUT*400)/pid.pwmcycle)-1);//请问这个pid.OUT与pwm占空比的值是如何换算过来的 - //TIM_SetCompare3(TIM3,num); - //TIM_SetCompare3(TIM3,0.845*num); - //printf("%d\r\n",num); - //0-200对应0-100%,如果pid.out=50,占空比就是25%,//num=50*400/200=100,100/400=25% - //printf("%d ,%d ,%d ,%d ,%f ,%f ,%f ,%f ,%f ,%f ,%f ,%.3f\r\n",T,H,C,num,(pid.set_tem*10),pid.Kp,ki,kd,pid.Pout,pid.Iout,pid.Dout,num/399.0); - current_T=T; - } - } + T = RS485_RX_BUF_COPY[3]; + T = T << 8 | RS485_RX_BUF_COPY[4]; + H = RS485_RX_BUF_COPY[5]; + H = H << 8 | RS485_RX_BUF_COPY[6]; - if(H>(hum+50))//湿度高于设定值5,打开新风风扇 GPIO4->PD1 - { - HC595_Send_Byte(gpio_state|=0x08);//打开新风风扇 |=0000 1000 0x08 - HC595_Send_Byte(gpio_state&=0xEF);//关闭加湿器 &=1110 1111 0xEF - humidity_flag=1; //除湿 - } - if(H<(hum-50))//湿度低于设定值5,打开加湿器 GPIO5->PD0 - { - HC595_Send_Byte(gpio_state|=0x10);//启动加湿器 |=0001 0000 0x10 - HC595_Send_Byte(gpio_state&=0xF7);//关闭风扇 &=1111 0111 0xF7 - humidity_flag=2; - } + C = RS485_RX_BUF_COPY[19]; + C = C << 8 | RS485_RX_BUF_COPY[20]; - if( humidity_flag==1 && H<=hum) - { - HC595_Send_Byte(gpio_state&=0xE7);//关闭风扇 关闭加湿器 &=1110 0111 0xE7 - humidity_flag=0; - } + // printf("now_tem=%d.%d℃,now_hum=%d.%d%% ,co2=%d\r\n",T/10,T%10,H/10,H%10,C); + /*GPIO1->报警铃 GPIO6->压缩机 GPIO3->加热棒 GPIO4—>新风风扇 GPIO5->加湿器 */ - if( humidity_flag==2 && H>=hum) - { - HC595_Send_Byte(gpio_state&=0xE7);//关闭加湿器 关闭风扇 &=1110 0111 0xE7 - humidity_flag=0; - } - RS485_1_Send_Data_2(); //上传参数 - RX_BUF_Transfer(0,23); - //RX_BUF_Printf(128); - - } - - else if(RS485_RX_BUF_COPY[0]==0xEE&&RS485_RX_BUF_COPY[1]==0xB6&&RS485_RX_BUF_COPY[2]==0x03) + if ((T < (tem - 20) || T > (tem + 20) || H < (hum - 100) || H > (hum + 100)) && (tick > 610)) // 温度偏差2℃报警,湿度偏差10报警 { - 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); - //printf("batch sync over\r\n"); - //RX_BUF_Printf(128); + HC595_Send_Byte(gpio_state |= 0x01); // 打开报警铃 GPIO1->PB1 |=0000 0001 0x01 + ALARM = 1; } - else if(RS485_RX_BUF_COPY[0]==0xEE&&RS485_RX_BUF_COPY[1]==0xB6&&RS485_RX_BUF_COPY[2]==0x04) + else { - 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); - //printf("change stage over\r\n"); - //RX_BUF_Printf(128); + HC595_Send_Byte(gpio_state &= 0xFE); // 关闭报警铃 &=1111 1110 0xFE + ALARM = 0; } - else if(RS485_RX_BUF_COPY[0]==0xEE&&RS485_RX_BUF_COPY[1]==0xB6&&RS485_RX_BUF_COPY[2]==0x01) + if (T < 600 && T > -30) { - 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();减少擦写的次数 - //printf("get one over\r\n"); - RX_BUF_Transfer(0,20); - //RX_BUF_Printf(128); + diff = current_T - T; + if (diff < 0) + diff = -diff; + if (diff < 3 || current_T == 0) // 最近两次温差相差0.3℃,消除传感器感应出错的影响 + { + pid.set_tem = tem / 10.0; + pid.now_tem = T / 10.0; + PID_Calc(); + // num=(((pid.OUT*400)/pid.pwmcycle)-1);//请问这个pid.OUT与pwm占空比的值是如何换算过来的 + // TIM_SetCompare3(TIM3,num); + // TIM_SetCompare3(TIM3,0.845*num); + // printf("%d\r\n",num); + // 0-200对应0-100%,如果pid.out=50,占空比就是25%,//num=50*400/200=100,100/400=25% + // printf("%d ,%d ,%d ,%d ,%f ,%f ,%f ,%f ,%f ,%f ,%f ,%.3f\r\n",T,H,C,num,(pid.set_tem*10),pid.Kp,ki,kd,pid.Pout,pid.Iout,pid.Dout,num/399.0); + current_T = T; + } } - else if(RS485_RX_BUF_COPY[0]==0xEE&&RS485_RX_BUF_COPY[1]==0xB1&&RS485_RX_BUF_COPY[2]==0x11&&RS485_RX_BUF_COPY[15]==0xFF&&RS485_RX_BUF[16]==0xFF) + + if (H > (hum + 50)) // 湿度高于设定值5,打开新风风扇 GPIO4->PD1 { - //printf("cut overdata of B6 03 \r\n"); - RX_BUF_Transfer(0,17); + HC595_Send_Byte(gpio_state |= 0x08); // 打开新风风扇 |=0000 1000 0x08 + HC595_Send_Byte(gpio_state &= 0xEF); // 关闭加湿器 &=1110 1111 0xEF + humidity_flag = 1; // 除湿 } - else if(RS485_RX_BUF_COPY[0]==0xEE&&RS485_RX_BUF_COPY[1]==0xB1&&RS485_RX_BUF_COPY[2]==0x11&&RS485_RX_BUF_COPY[14]==0xFF&&RS485_RX_BUF[15]==0xFF) + if (H < (hum - 50)) // 湿度低于设定值5,打开加湿器 GPIO5->PD0 { - //printf("cut overdata of B6 03 \r\n"); - //RX_BUF_Printf(128); - RX_BUF_Transfer(0,16); - //RX_BUF_Printf(128); + HC595_Send_Byte(gpio_state |= 0x10); // 启动加湿器 |=0001 0000 0x10 + HC595_Send_Byte(gpio_state &= 0xF7); // 关闭风扇 &=1111 0111 0xF7 + humidity_flag = 2; } - else if(RS485_RX_BUF_COPY[0]==0xEE&&RS485_RX_BUF_COPY[1]==0xB1&&RS485_RX_BUF_COPY[2]==0x11&&RS485_RX_BUF_COPY[12]==0xFF&&RS485_RX_BUF[13]==0xFF) + + if (humidity_flag == 1 && H <= hum) { - //printf("cut overdata of B6 04 \r\n"); - //RX_BUF_Printf(128); - RX_BUF_Transfer(0,14); + HC595_Send_Byte(gpio_state &= 0xE7); // 关闭风扇 关闭加湿器 &=1110 0111 0xE7 + humidity_flag = 0; } - else if(RS485_RX_BUF_COPY[0]==0xEE&&RS485_RX_BUF_COPY[1]==0xB1&&RS485_RX_BUF_COPY[2]==0x01&&RS485_RX_BUF_COPY[7]==0xFF&&RS485_RX_BUF_COPY[8]==0xFF) + + if (humidity_flag == 2 && H >= hum) { - //printf("cut overdata of Upper computer \r\n"); - //RX_BUF_Printf(128); - RX_BUF_Transfer(0,9); - //RX_BUF_Printf(128); + HC595_Send_Byte(gpio_state &= 0xE7); // 关闭加湿器 关闭风扇 &=1110 0111 0xE7 + humidity_flag = 0; } - else + RS485_1_Send_Data_2(); // 上传参数 + RX_BUF_Transfer(0, 23); + // RX_BUF_Printf(128); + } + + else if (RS485_RX_BUF_COPY[0] == 0xEE && RS485_RX_BUF_COPY[1] == 0xB6 && 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); + // printf("batch sync over\r\n"); + // RX_BUF_Printf(128); + } + else if (RS485_RX_BUF_COPY[0] == 0xEE && RS485_RX_BUF_COPY[1] == 0xB6 && 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); + // printf("change stage over\r\n"); + // RX_BUF_Printf(128); + } + else if (RS485_RX_BUF_COPY[0] == 0xEE && RS485_RX_BUF_COPY[1] == 0xB6 && 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();减少擦写的次数 + // printf("get one over\r\n"); + RX_BUF_Transfer(0, 20); + // RX_BUF_Printf(128); + } + else if (RS485_RX_BUF_COPY[0] == 0xEE && RS485_RX_BUF_COPY[1] == 0xB1 && 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); + } + else if (RS485_RX_BUF_COPY[0] == 0xEE && RS485_RX_BUF_COPY[1] == 0xB1 && 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); + } + else if (RS485_RX_BUF_COPY[0] == 0xEE && RS485_RX_BUF_COPY[1] == 0xB1 && RS485_RX_BUF_COPY[2] == 0x11 && RS485_RX_BUF_COPY[12] == 0xFF && RS485_RX_BUF[13] == 0xFF) + { + // printf("cut overdata of B6 04 \r\n"); + // RX_BUF_Printf(128); + RX_BUF_Transfer(0, 14); + } + else if (RS485_RX_BUF_COPY[0] == 0xEE && RS485_RX_BUF_COPY[1] == 0xB1 && 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,处理掉 { - int ZERO_Count=0; - //if()与while()的顺序不能变 - if((RS485_RX_BUF_COPY[0]!=0x00))//不为0,处理掉 - { - RX_BUF_Transfer(0,1); - } - - while(RS485_RX_BUF_COPY[ZERO_Count]==0x00) - { - ZERO_Count++; - } - RX_BUF_Transfer(0,ZERO_Count); - //printf("previous array cut\r\n"); - //RX_BUF_Printf(128); + RX_BUF_Transfer(0, 1); } - } - - // printf("%d,%d,%d\r\n",T,H,C); - //printf("current params: %d:%d,hot or cold flag:%d, humidity flag:%d, alarm: %d\r\n",chour, cminute, hot_clod_flag, humidity_flag, ALARM); - //printf("led!!!\r\n"); - if(red<=1000&&blue<=1000) - { - PWM_SetCompare1((red/100.0*3.5+28));//J9 - PWM_SetCompare2((blue/100.0*3.5+28));//J11 - PWM_SetCompare4((white/100.0*3.5+28));//J10 - //printf("red=%d\r\n",red); - //printf("bule=%d\r\n",blue); - } - RS485_RX_CNT=0; - //printf("end data to serial monitor end"); - - + while (RS485_RX_BUF_COPY[ZERO_Count] == 0x00) + { + ZERO_Count++; + } + RX_BUF_Transfer(0, ZERO_Count); + // printf("previous array cut\r\n"); + // RX_BUF_Printf(128); } + } + + // printf("%d,%d,%d\r\n",T,H,C); + // printf("current params: %d:%d,hot or cold flag:%d, humidity flag:%d, alarm: %d\r\n",chour, cminute, hot_clod_flag, humidity_flag, ALARM); + // printf("led!!!\r\n"); + if (red <= 1000 && blue <= 1000) + { + + PWM_SetCompare1((red / 100.0 * 3.5 + 28)); // J9 + PWM_SetCompare2((blue / 100.0 * 3.5 + 28)); // J11 + PWM_SetCompare4((white / 100.0 * 3.5 + 28)); // J10 + // printf("red=%d\r\n",red); + // printf("bule=%d\r\n",blue); + } + RS485_RX_CNT = 0; + // printf("end data to serial monitor end"); + } } - -//void Host_Computer_Communication(void) +// void Host_Computer_Communication(void) //{ // if(RS485_RX_BUF_COPY[0]==0xEE&&RS485_RX_BUF_COPY[1]==0xB6) // { @@ -362,25 +348,25 @@ void Sensor_Communication_task(void *pvParameters) // 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; +// now_stage=change_stage_rev1; // store_stage=change_stage_rev1; // Write_Init(); // RX_BUF_Transfer(0,8); // } -// if(RS485_RX_BUF_COPY[2]==0x01)//批量同步 +// 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); +// RX_BUF_Transfer(0,20); // } // } // else if(RS485_RX_BUF_COPY[0]==0xEE&&RS485_RX_BUF_COPY[1]==0xB1) @@ -388,7 +374,7 @@ void Sensor_Communication_task(void *pvParameters) // 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); +// RX_BUF_Transfer(0,17); // } // if(RS485_RX_BUF_COPY[2]==0x11&&RS485_RX_BUF_COPY[14]==0xFF&&RS485_RX_BUF[15]==0xFF)//单个同步默认带的数据 // { @@ -408,8 +394,8 @@ void Sensor_Communication_task(void *pvParameters) // //printf("cut overdata of Upper computer \r\n"); // //RX_BUF_Printf(128); // RX_BUF_Transfer(0,9); -// //RX_BUF_Printf(128); -// +// //RX_BUF_Printf(128); +// // } // } // else @@ -421,19 +407,15 @@ void Sensor_Communication_task(void *pvParameters) //// 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"); // } //} - - - -