格式调整

main
Zeng wei (曾威) 2 years ago
parent 24f49523c8
commit d0196aa35f

@ -2,119 +2,119 @@
#include "Relays.h" #include "Relays.h"
#include "USART.h" #include "USART.h"
extern u16 tem; extern u16 tem;
float cold_tem=0; float cold_tem = 0;
float red_tem=0; float red_tem = 0;
float ti; float ti;
float ki=0.001; float ki = 0.001;
float kd=340; float kd = 340;
extern u8 hot_clod_flag; extern u8 hot_clod_flag;
extern u8 gpio_state; extern u8 gpio_state;
extern int T; extern int T;
unsigned int num=0; unsigned int num = 0;
PID pid; PID pid;
void PID_Init() void PID_Init()
{ {
//pid.set_tem=tem;//用户设定温度 // pid.set_tem=tem;//用户设定温度
pid.Kp=110; pid.Kp = 110;
pid.t=500;//PID计算周期 pid.t = 500; // PID计算周期
//pid.Ti=5000000;//积分时间 // pid.Ti=5000000;//积分时间
//pid.Td=1000;//微分时间 // pid.Td=1000;//微分时间
pid.pwmcycle=200;//pwm周期200 pid.pwmcycle = 200; // pwm周期200
pid.OUT0=1; pid.OUT0 = 1;
pid.C1ms=0; pid.C1ms = 0;
} }
void PID_Calc() //pid计算 void PID_Calc() // pid计算
{ {
float DelEk;//最近两次偏差之差 float DelEk; // 最近两次偏差之差
//float td; // float td;
float out; float out;
if(pid.C1ms<(pid.t)) //计算周期未到 if (pid.C1ms < (pid.t)) // 计算周期未到
{ {
return ; 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 else
{ {
pid.Ek=pid.now_tem-pid.set_tem; pid.Ek = pid.now_tem - pid.set_tem;
} }
pid.Pout=pid.Kp*pid.Ek; //比例输出 pid.Pout = pid.Kp * pid.Ek; // 比例输出
pid.SEk+=pid.Ek; //历史偏差总和 pid.SEk += pid.Ek; // 历史偏差总和
DelEk=pid.Ek-pid.Ek_1; //最近两次偏差之差 DelEk = pid.Ek - pid.Ek_1; // 最近两次偏差之差
//ti=pid.t/pid.Ti; // ti=pid.t/pid.Ti;
//ki=ti*pid.Kp; // ki=ti*pid.Kp;
pid.Iout=ki*pid.SEk; //积分输出 pid.Iout = ki * pid.SEk; // 积分输出
// td=pid.Td/pid.t; // td=pid.Td/pid.t;
// kd=pid.Kp*td; // kd=pid.Kp*td;
pid.Dout=kd*DelEk; //微分输出 pid.Dout = kd * DelEk; // 微分输出
if(pid.Dout<0) if (pid.Dout < 0)
{ {
pid.Dout=0-pid.Dout; pid.Dout = 0 - pid.Dout;
} }
//out= pid.Pout+pid.Iout+ pid.Dout; // out= pid.Pout+pid.Iout+ pid.Dout;
out= pid.Pout; out = pid.Pout;
if(out>pid.pwmcycle) if (out > pid.pwmcycle)
{ {
pid.OUT=pid.pwmcycle; pid.OUT = pid.pwmcycle;
} }
else if(out<=0) else if (out <= 0)
{ {
pid.OUT=pid.OUT0; pid.OUT = pid.OUT0;
} }
else else
{ {
pid.OUT=out; pid.OUT = out;
} }
pid.Ek_1=pid.Ek; //更新偏差 pid.Ek_1 = pid.Ek; // 更新偏差
pid.C1ms=0; pid.C1ms = 0;
if(pid.set_tem>pid.now_tem+1) if (pid.set_tem > pid.now_tem + 1)
{ {
//得到当前的偏差值设置温度大于实际温度1℃加热关闭压缩机打开加热棒 // 得到当前的偏差值设置温度大于实际温度1℃加热关闭压缩机打开加热棒
/*GPIO1->报警铃 GPIO6->压缩机 GPIO3->加热棒 GPIO4—>新风风扇 GPIO5->加湿器 */ /*GPIO1->报警铃 GPIO6->压缩机 GPIO3->加热棒 GPIO4—>新风风扇 GPIO5->加湿器 */
//HC595_Send_Byte(gpio_state&=0xDF);//关闭压缩机 &=1101 1111 0xDF // HC595_Send_Byte(gpio_state&=0xDF);//关闭压缩机 &=1101 1111 0xDF
TIM_SetCompare3(TIM3,0); TIM_SetCompare3(TIM3, 0);
HC595_Send_Byte(gpio_state|=0x04);//打开加热棒 |=0000 0100 0x04 HC595_Send_Byte(gpio_state |= 0x04); // 打开加热棒 |=0000 0100 0x04
hot_clod_flag=2; hot_clod_flag = 2;
pid.Iout=0; pid.Iout = 0;
} }
if(pid.now_tem>pid.set_tem) if (pid.now_tem > pid.set_tem)
{ {
//得到当前的偏差值,设置温度小于实际温度,制冷,打开压缩机,关闭加热棒 // 得到当前的偏差值,设置温度小于实际温度,制冷,打开压缩机,关闭加热棒
HC595_Send_Byte(gpio_state&=0xFB);//关闭加热棒 &=1111 1011 0xFB HC595_Send_Byte(gpio_state &= 0xFB); // 关闭加热棒 &=1111 1011 0xFB
num=(((pid.OUT*400)/pid.pwmcycle)-1);//请问这个pid.OUT与pwm占空比的值是如何换算过来的 num = (((pid.OUT * 400) / pid.pwmcycle) - 1); // 请问这个pid.OUT与pwm占空比的值是如何换算过来的
TIM_SetCompare3(TIM3,num); TIM_SetCompare3(TIM3, num);
//printf("%d\r\n",num); // printf("%d\r\n",num);
//0-200对应0-100%如果pid.out=50,占空比就是25%//num=50*400/200=100100/400=25% // 0-200对应0-100%如果pid.out=50,占空比就是25%//num=50*400/200=100100/400=25%
//HC595_Send_Byte(gpio_state|=0x20);//打开压缩机 |=0010 0000 // HC595_Send_Byte(gpio_state|=0x20);//打开压缩机 |=0010 0000
hot_clod_flag=1; hot_clod_flag = 1;
//pid.Iout=0; // pid.Iout=0;
} }
if(hot_clod_flag==1 && T<=tem-3)//制冷过程中温度下降低于设定温度0.3℃ if (hot_clod_flag == 1 && T <= tem - 3) // 制冷过程中温度下降低于设定温度0.3℃
{ {
//HC595_Send_Byte(gpio_state&=0xDB);//关闭压缩机 关闭加热棒 &=1101 1101 0xDB // HC595_Send_Byte(gpio_state&=0xDB);//关闭压缩机 关闭加热棒 &=1101 1101 0xDB
TIM_SetCompare3(TIM3,0);//关闭压缩机 TIM_SetCompare3(TIM3, 0); // 关闭压缩机
HC595_Send_Byte(gpio_state&=0xFB);//关闭加热棒 HC595_Send_Byte(gpio_state &= 0xFB); // 关闭加热棒
hot_clod_flag=0; 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 // HC595_Send_Byte(gpio_state&=0xDB);//关闭压缩机 关闭四通阀 &=1101 1101 0xDB
TIM_SetCompare3(TIM3,0);//关闭压缩机 TIM_SetCompare3(TIM3, 0); // 关闭压缩机
HC595_Send_Byte(gpio_state&=0xFB);//关闭加热棒 HC595_Send_Byte(gpio_state &= 0xFB); // 关闭加热棒
hot_clod_flag=0; hot_clod_flag = 0;
} }
} }

@ -1,70 +1,66 @@
#include "myfreertos.h" #include "myfreertos.h"
char pubTopic[512]="/sys/hp8oQhMZJ67/Device1/thing/event/property/post";//发布的主题 char pubTopic[512] = "/sys/hp8oQhMZJ67/Device1/thing/event/property/post"; // 发布的主题
char subTopic[512]="/sys/hp8oQhMZJ67/Device1/thing/service/property/set";//订阅的主题 char subTopic[512] = "/sys/hp8oQhMZJ67/Device1/thing/service/property/set"; // 订阅的主题
#define MQTT_SOCK 5 #define MQTT_SOCK 5
//任务优先级 // 任务优先级
#define START_TASK_PRIO 0 #define START_TASK_PRIO 0
//任务堆栈大小 // 任务堆栈大小
#define START_STK_SIZE 128 #define START_STK_SIZE 128
//任务句柄 // 任务句柄
TaskHandle_t StartTask_Handler; TaskHandle_t StartTask_Handler;
//任务函数 // 任务函数
void start_task(void *pvParameters); void start_task(void *pvParameters);
//任务优先级 // 任务优先级
#define Sensor_Communication_TASK_PRIO 1//与传感器通信 #define Sensor_Communication_TASK_PRIO 1 // 与传感器通信
//任务堆栈大小 // 任务堆栈大小
#define Sensor_Communication_STK_SIZE 512 #define Sensor_Communication_STK_SIZE 512
//任务句柄 // 任务句柄
TaskHandle_t Sensor_CommunicationTask_Handler; TaskHandle_t Sensor_CommunicationTask_Handler;
//任务函数 // 任务函数
void Sensor_Communication_task(void *pvParameters); void Sensor_Communication_task(void *pvParameters);
void Host_Computer_Communication(void); void Host_Computer_Communication(void);
int isZeros(u8 arr[]) ; int isZeros(u8 arr[]);
u8 RS485_RX_BUF_COPY[128]={0}; u8 RS485_RX_BUF_COPY[128] = {0};
u8 cnt_flag=0,sub_flag=0,pub_flag=0; u8 cnt_flag = 0, sub_flag = 0, pub_flag = 0;
u16 time=0;//记录ping服务器的时间 u16 time = 0; // 记录ping服务器的时间
char wet_temp[256];//订阅与发布消息的缓存区 char wet_temp[256]; // 订阅与发布消息的缓存区
u8 store_stage=1;//写入flash的阶段号断电重启后读取可以紧接着上次的阶段运行 u8 store_stage = 1; // 写入flash的阶段号断电重启后读取可以紧接着上次的阶段运行
extern PID pid; extern PID pid;
extern float kd; extern float kd;
extern float ki; extern float ki;
u8 batch_sync_buf[11];//单个同步剪切得到的数组 u8 batch_sync_buf[11]; // 单个同步剪切得到的数组
u8 ins_1=0; u8 ins_1 = 0;
int diff=0; int diff = 0;
u8 gpio_state=0x00;//继电器状态 u8 gpio_state = 0x00; // 继电器状态
u8 NUM=1;//批量同步发送的阶段号 u8 NUM = 1; // 批量同步发送的阶段号
u8 n;//阶段号 u8 n; // 阶段号
u16 i;//序列号 u16 i; // 序列号
u8 chour;//已运行小时数 u8 chour; // 已运行小时数
u8 cminute;//运行分钟数 u8 cminute; // 运行分钟数
u8 hot_clod_flag=0;//加热制冷标志位。hot_clod_flag=0, 不加热不制冷hot_clod_flag=2,加热hot_clod_flag=1,制冷 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 humidity_flag = 0; // 加湿除湿标志位。 humidity_flag=0不加湿不除湿 humidity_flag=2,加湿; humidity_flag=1除湿
u8 ALARM=0;//报警标志位。ALARM=0,不报警ALARM=1,报警 u8 ALARM = 0; // 报警标志位。ALARM=0,不报警ALARM=1,报警
u16 tick=0;//tick大于600触发报警条件会报警小于600则不报警。 u16 tick = 0; // tick大于600触发报警条件会报警小于600则不报警。
u8 Feed_Dog_Count=0;//喂狗计时 u8 Feed_Dog_Count = 0; // 喂狗计时
u8 now_stage=1;//当前运行阶段 u8 now_stage = 1; // 当前运行阶段
u16 tem,hum,red,blue,white; u16 tem, hum, red, blue, white;
u8 hour,min; u8 hour, min;
u8 change_stage_rev1=0; u8 change_stage_rev1 = 0;
u8 change_stage_rev2=0; u8 change_stage_rev2 = 0;
u8 change_stage_rev3=0; u8 change_stage_rev3 = 0;
u8 rs485buf[8]={0x01,0x03,0x00,0x01,0x00,0x09,0xD4,0x0C};//传感器交换数据 u8 rs485buf[8] = {0x01, 0x03, 0x00, 0x01, 0x00, 0x09, 0xD4, 0x0C}; // 传感器交换数据
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;
//u8 RS485_RX_BUF[64];
// u8 RS485_RX_BUF[64];
/********************* /*********************
********************** **********************
@ -73,8 +69,8 @@ float temperature=0;
*********************/ *********************/
void os_init(void) void os_init(void)
{ {
//printf("入口函数调用成功\r\n"); // printf("入口函数调用成功\r\n");
xTaskCreate( (TaskFunction_t)start_task, xTaskCreate((TaskFunction_t)start_task,
(char *)"start_task", (char *)"start_task",
(uint16_t)START_STK_SIZE, (uint16_t)START_STK_SIZE,
(void *)NULL, (void *)NULL,
@ -83,24 +79,23 @@ void os_init(void)
vTaskStartScheduler(); vTaskStartScheduler();
} }
/********************* /*********************
********************** **********************
, ,
********************** **********************
*********************/ *********************/
BaseType_t handler=0; BaseType_t handler = 0;
BaseType_t handler1=0; BaseType_t handler1 = 0;
BaseType_t handler2=0; BaseType_t handler2 = 0;
BaseType_t handler3=0; BaseType_t handler3 = 0;
BaseType_t handler4=0; BaseType_t handler4 = 0;
BaseType_t handler5=0; BaseType_t handler5 = 0;
BaseType_t handler6=0; BaseType_t handler6 = 0;
BaseType_t handler7=0; BaseType_t handler7 = 0;
BaseType_t handler8=0; BaseType_t handler8 = 0;
BaseType_t handler9=0; BaseType_t handler9 = 0;
BaseType_t handler10=0; BaseType_t handler10 = 0;
BaseType_t handler11=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(); //进入临界区 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(); //退出临界区
// 创建与传感器通信任务
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) void Sensor_Communication_task(void *pvParameters)
{ {
while (1)
while(1)
{ {
// cnt_flag=do_mqtt(MQTT_SOCK,NET_CONFIG.rip,1883,5500); // cnt_flag=do_mqtt(MQTT_SOCK,NET_CONFIG.rip,1883,5500);
// Humidity=H*0.1; // Humidity=H*0.1;
// temperature=T*0.1; // temperature=T*0.1;
// delay_ms(50); // 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,\"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); //构建数据 // //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==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==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&&sub_flag&&pub_flag==0)pub_flag=!publishMqtt(MQTT_SOCK,pubTopic,wet_temp);
// if(cnt_flag)time++; // if(cnt_flag)time++;
// if(time==50){ // if(time==50){
// time=0; // time=0;
// pingMqtt(MQTT_SOCK); // pingMqtt(MQTT_SOCK);
// } // }
now_stage=timelong_Compare();// now_stage = timelong_Compare(); //
//printf("%d %d\r\n",chour,cminute); // printf("%d %d\r\n",chour,cminute);
Array(&now_stage,&hour,&min,&tem,&hum,&red,&blue,&white);//更新对应阶段号的参数 Array(&now_stage, &hour, &min, &tem, &hum, &red, &blue, &white); // 更新对应阶段号的参数
//printf("current stage: %d\r\n",now_stage); // printf("current stage: %d\r\n",now_stage);
RS485_1_Send_Data_1(rs485buf,8);//(RS485_RX_CNT=0已被注释) RS485_1_Send_Data_1(rs485buf, 8); //(RS485_RX_CNT=0已被注释)
//printf("send finish\r\n"); // printf("send finish\r\n");
delay_xms(200); delay_xms(200);
//RX_BUF_Printf(128); // RX_BUF_Printf(128);
RS485_1_Send_Data_3(); RS485_1_Send_Data_3();
delay_xms(200); delay_xms(200);
//RX_BUF_Printf(128); // RX_BUF_Printf(128);
bufcut_Init(RS485_RX_BUF_COPY,RS485_RX_BUF,0,128); bufcut_Init(RS485_RX_BUF_COPY, RS485_RX_BUF, 0, 128);
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_BUF[0]==0x00 && RS485_RX_BUF[1]==0x00&&RS485_RX_BUF[2]==0x00 && RS485_RX_BUF[3]==0x00)) // 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"); // printf("enter while\r\n");
if(RS485_RX_BUF_COPY[0]==0x01 && RS485_RX_BUF_COPY[1]==0x03) // 判断是否校验成功 if (RS485_RX_BUF_COPY[0] == 0x01 && RS485_RX_BUF_COPY[1] == 0x03) // 判断是否校验成功
{ {
T = RS485_RX_BUF_COPY[3]; T = RS485_RX_BUF_COPY[3];
T = T<<8|RS485_RX_BUF_COPY[4]; T = T << 8 | RS485_RX_BUF_COPY[4];
H = RS485_RX_BUF_COPY[5]; H = RS485_RX_BUF_COPY[5];
H = H<<8|RS485_RX_BUF_COPY[6]; H = H << 8 | RS485_RX_BUF_COPY[6];
C= RS485_RX_BUF_COPY[19]; C = RS485_RX_BUF_COPY[19];
C = C<<8|RS485_RX_BUF_COPY[20]; 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);
// 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->加湿器 */ /*GPIO1->报警铃 GPIO6->压缩机 GPIO3->加热棒 GPIO4—>新风风扇 GPIO5->加湿器 */
if((T<(tem-20)||T>(tem+20)||H<(hum-100)||H>(hum+100))&&(tick>610))//温度偏差2℃报警湿度偏差10报警 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 HC595_Send_Byte(gpio_state |= 0x01); // 打开报警铃 GPIO1->PB1 |=0000 0001 0x01
ALARM=1; ALARM = 1;
} }
else else
{ {
HC595_Send_Byte(gpio_state&=0xFE);//关闭报警铃 &=1111 1110 0xFE HC595_Send_Byte(gpio_state &= 0xFE); // 关闭报警铃 &=1111 1110 0xFE
ALARM=0; ALARM = 0;
} }
if(T<600&&T>-30) if (T < 600 && T > -30)
{ {
diff=current_T-T; diff = current_T - T;
if(diff<0)diff=-diff; if (diff < 0)
if(diff<3||current_T==0) //最近两次温差相差0.3℃,消除传感器感应出错的影响 diff = -diff;
if (diff < 3 || current_T == 0) // 最近两次温差相差0.3℃,消除传感器感应出错的影响
{ {
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();
//num=(((pid.OUT*400)/pid.pwmcycle)-1);//请问这个pid.OUT与pwm占空比的值是如何换算过来的 // num=(((pid.OUT*400)/pid.pwmcycle)-1);//请问这个pid.OUT与pwm占空比的值是如何换算过来的
//TIM_SetCompare3(TIM3,num); // TIM_SetCompare3(TIM3,num);
//TIM_SetCompare3(TIM3,0.845*num); // TIM_SetCompare3(TIM3,0.845*num);
//printf("%d\r\n",num); // printf("%d\r\n",num);
//0-200对应0-100%如果pid.out=50,占空比就是25%//num=50*400/200=100100/400=25% // 0-200对应0-100%如果pid.out=50,占空比就是25%//num=50*400/200=100100/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); // 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; current_T = T;
} }
} }
if (H > (hum + 50)) // 湿度高于设定值5打开新风风扇 GPIO4->PD1
if(H>(hum+50))//湿度高于设定值5打开新风风扇 GPIO4->PD1
{ {
HC595_Send_Byte(gpio_state|=0x08);//打开新风风扇 |=0000 1000 0x08 HC595_Send_Byte(gpio_state |= 0x08); // 打开新风风扇 |=0000 1000 0x08
HC595_Send_Byte(gpio_state&=0xEF);//关闭加湿器 &=1110 1111 0xEF HC595_Send_Byte(gpio_state &= 0xEF); // 关闭加湿器 &=1110 1111 0xEF
humidity_flag=1; //除湿 humidity_flag = 1; // 除湿
} }
if(H<(hum-50))//湿度低于设定值5打开加湿器 GPIO5->PD0 if (H < (hum - 50)) // 湿度低于设定值5打开加湿器 GPIO5->PD0
{ {
HC595_Send_Byte(gpio_state|=0x10);//启动加湿器 |=0001 0000 0x10 HC595_Send_Byte(gpio_state |= 0x10); // 启动加湿器 |=0001 0000 0x10
HC595_Send_Byte(gpio_state&=0xF7);//关闭风扇 &=1111 0111 0xF7 HC595_Send_Byte(gpio_state &= 0xF7); // 关闭风扇 &=1111 0111 0xF7
humidity_flag=2; humidity_flag = 2;
} }
if( humidity_flag==1 && H<=hum) if (humidity_flag == 1 && H <= hum)
{ {
HC595_Send_Byte(gpio_state&=0xE7);//关闭风扇 关闭加湿器 &=1110 0111 0xE7 HC595_Send_Byte(gpio_state &= 0xE7); // 关闭风扇 关闭加湿器 &=1110 0111 0xE7
humidity_flag=0; humidity_flag = 0;
} }
if (humidity_flag == 2 && H >= hum)
if( humidity_flag==2 && H>=hum)
{ {
HC595_Send_Byte(gpio_state&=0xE7);//关闭加湿器 关闭风扇 &=1110 0111 0xE7 HC595_Send_Byte(gpio_state &= 0xE7); // 关闭加湿器 关闭风扇 &=1110 0111 0xE7
humidity_flag=0; humidity_flag = 0;
} }
RS485_1_Send_Data_2(); //上传参数 RS485_1_Send_Data_2(); // 上传参数
RX_BUF_Transfer(0,23); RX_BUF_Transfer(0, 23);
//RX_BUF_Printf(128); // RX_BUF_Printf(128);
} }
else if(RS485_RX_BUF_COPY[0]==0xEE&&RS485_RX_BUF_COPY[1]==0xB6&&RS485_RX_BUF_COPY[2]==0x03) 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); Analysis(&n, &i, RS485_RX_BUF_COPY);
//printf("B6 03 cmd: batch sync\r\n"); // printf("B6 03 cmd: batch sync\r\n");
Array(&now_stage,&hour,&min,&tem,&hum,&red,&blue,&white);//更新对应阶段号的参数 Array(&now_stage, &hour, &min, &tem, &hum, &red, &blue, &white); // 更新对应阶段号的参数
Write_Init(); Write_Init();
RX_BUF_Transfer(0,11); RX_BUF_Transfer(0, 11);
//printf("batch sync over\r\n"); // printf("batch sync over\r\n");
//RX_BUF_Printf(128); // RX_BUF_Printf(128);
} }
else if(RS485_RX_BUF_COPY[0]==0xEE&&RS485_RX_BUF_COPY[1]==0xB6&&RS485_RX_BUF_COPY[2]==0x04) 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]; change_stage_rev1 = RS485_RX_BUF_COPY[3];
//printf("B6 04 cmd: change stage\r\n"); // printf("B6 04 cmd: change stage\r\n");
RTC_synchronization_ins(2023,9,1,0,00,00); RTC_synchronization_ins(2023, 9, 1, 0, 00, 00);
now_stage=change_stage_rev1; now_stage = change_stage_rev1;
store_stage=change_stage_rev1; store_stage = change_stage_rev1;
Write_Init(); Write_Init();
RX_BUF_Transfer(0,8); RX_BUF_Transfer(0, 8);
//printf("change stage over\r\n"); // printf("change stage over\r\n");
//RX_BUF_Printf(128); // RX_BUF_Printf(128);
} }
else if(RS485_RX_BUF_COPY[0]==0xEE&&RS485_RX_BUF_COPY[1]==0xB6&&RS485_RX_BUF_COPY[2]==0x01) 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); Batch_synchronization(&n, RS485_RX_BUF_COPY);
//printf("B6 01 cmd: get one %d\r\n", n); // printf("B6 01 cmd: get one %d\r\n", n);
Array(&now_stage,&hour,&min,&tem,&hum,&red,&blue,&white);//更新对应阶段号的参数 Array(&now_stage, &hour, &min, &tem, &hum, &red, &blue, &white); // 更新对应阶段号的参数
//Write_Init();减少擦写的次数 // Write_Init();减少擦写的次数
//printf("get one over\r\n"); // printf("get one over\r\n");
RX_BUF_Transfer(0,20); RX_BUF_Transfer(0, 20);
//RX_BUF_Printf(128); // 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) 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"); // printf("cut overdata of B6 03 \r\n");
RX_BUF_Transfer(0,17); 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) 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"); // printf("cut overdata of B6 03 \r\n");
//RX_BUF_Printf(128); // RX_BUF_Printf(128);
RX_BUF_Transfer(0,16); RX_BUF_Transfer(0, 16);
//RX_BUF_Printf(128); // 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) 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"); // printf("cut overdata of B6 04 \r\n");
//RX_BUF_Printf(128); // RX_BUF_Printf(128);
RX_BUF_Transfer(0,14); 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) 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"); // printf("cut overdata of Upper computer \r\n");
//RX_BUF_Printf(128); // RX_BUF_Printf(128);
RX_BUF_Transfer(0,9); RX_BUF_Transfer(0, 9);
//RX_BUF_Printf(128); // RX_BUF_Printf(128);
} }
else else
{ {
int ZERO_Count=0; int ZERO_Count = 0;
//if()与while()的顺序不能变 // if()与while()的顺序不能变
if((RS485_RX_BUF_COPY[0]!=0x00))//不为0处理掉 if ((RS485_RX_BUF_COPY[0] != 0x00)) // 不为0处理掉
{ {
RX_BUF_Transfer(0,1); RX_BUF_Transfer(0, 1);
} }
while(RS485_RX_BUF_COPY[ZERO_Count]==0x00) while (RS485_RX_BUF_COPY[ZERO_Count] == 0x00)
{ {
ZERO_Count++; ZERO_Count++;
} }
RX_BUF_Transfer(0,ZERO_Count); RX_BUF_Transfer(0, ZERO_Count);
//printf("previous array cut\r\n"); // printf("previous array cut\r\n");
//RX_BUF_Printf(128); // RX_BUF_Printf(128);
} }
} }
// printf("%d,%d,%d\r\n",T,H,C); // 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("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"); // printf("led!!!\r\n");
if(red<=1000&&blue<=1000) if (red <= 1000 && blue <= 1000)
{ {
PWM_SetCompare1((red/100.0*3.5+28));//J9 PWM_SetCompare1((red / 100.0 * 3.5 + 28)); // J9
PWM_SetCompare2((blue/100.0*3.5+28));//J11 PWM_SetCompare2((blue / 100.0 * 3.5 + 28)); // J11
PWM_SetCompare4((white/100.0*3.5+28));//J10 PWM_SetCompare4((white / 100.0 * 3.5 + 28)); // J10
//printf("red=%d\r\n",red); // printf("red=%d\r\n",red);
//printf("bule=%d\r\n",blue); // printf("bule=%d\r\n",blue);
} }
RS485_RX_CNT=0; RS485_RX_CNT = 0;
//printf("end data to serial monitor end"); // 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) // if(RS485_RX_BUF_COPY[0]==0xEE&&RS485_RX_BUF_COPY[1]==0xB6)
// { // {
@ -433,7 +419,3 @@ void Sensor_Communication_task(void *pvParameters)
// } // }
//} //}

Loading…
Cancel
Save