简介
做完了大棚,快速而有快乐的开始做车间。还是分为两部分写,因为有些地方需要边调试边写。
系统设计方案
传感器采集数据,主控通过继电器控制外设,数据通过ZigBee模块上发给ZigBee协调器,WiFi模块发送数据到上位。
三块Zigbee模块通信逻辑设计
由于使用的ZigBee模块有三块,需要三块相互通信,所以通信的时候需要将时间错开防止数据出现错误。
协调器程序设计及实现
协调器负责接受终端数据、下发阈值到终端、整理终端数据发送给WiFi模块。
主函数
定时器三中断
定时器3主要任务是发送数据到ZigBee模块和接受Zigbee模块的数据,并将接受的终端数据发送给WiFi模块。
串口接收中断(二、三)
主要任务接受WiFi的数据和ZigBee的数据,并对数据进行验证和处理。
终端节点设计与实现
终端节点就是最底层的,它主要负责数据的采集与接受并将接受的数据发送到协调器。
主函数
主函数中,采集传感器的数据并控制外设的状态。
定时器三中断
定时器3定时进行数据发送,进入定时器3中断服务函数之后,首先进行格式化字符串,字符串处理完成后进行数据发送,发送完成后清除中断标志位并返回。
串口二接收中断
处理从ZigBee模块来的数据,逻辑和协调器中的一样
代码
终端节点
主函数
adc1 = Get_yanwu();//烟雾的值
adc2 = Get_MQ();//MQ135的值
dianji=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11); //---------------风扇状态
if(y3==1)//----------------------------------判断有无开启风扇指令
{
GPIO_ResetBits(GPIOB,GPIO_Pin_11);//---开启风扇
}
else
{
if(adc1>y1||adc2>y2)//----------判断是否超过阈值
{
GPIO_ResetBits(GPIOB,GPIO_Pin_11);//---开启风扇
}
else
{
GPIO_SetBits(GPIOB,GPIO_Pin_11);//---关闭风扇
}
}
if(y4==1)//---------------------------判断有无开窗指令
{
fan=1;
TIM_SetCompare3(TIM4,1950); //----开窗
}
else
{
if(adc1>y1||adc2>y2)//---------是否超过阈值
{
// delay_ms(10);
// adc1 = Get_yanwu();//烟雾的值
// adc2 = Get_MQ();//MQ135的值
// if(adc1>y1||adc2>y2)
// {
fan=1;
TIM_SetCompare3(TIM4,1950); //-------开窗
// }
}
else
{
fan=0;
TIM_SetCompare3(TIM4,1800);//-------------关窗
}
}
定时器三中断服务函数
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
times++;
if(times%2==1)
{
//printf("PM:%d\n",adc1);
sprintf(data,"0xf0p1:%d:%d:%d:%d:%d:%d:%d:}",adc1,adc2,fire,y1,y2,!dianji,fan);//映射值、包头包尾、分隔符
//printf("MQ:%d\n",adc2);
Send_data(USART2,data);//--------------------通过串口2发送数据给协调器
}
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
// LED1=!LED1;
}
串口二接收中断
void USART2_IRQHandler(void) //串口2中断服务程序------------------接收协调器数据
{
u8 Res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART2);//(USART1->DR); //读取接收到的数据
if(counts == 0)
{
zig_Clear();
}
read_bufs[counts++] = Res;
if(Res == 0xf6)//判断数据是否正确,
{
counts = 0;
}
else if(Res == '}')
{
counts = 0;
USART_Cmd(USART2, DISABLE);//关闭使能
//printf("%s\n",read_bufs);
zigbee_data();//-------------------------数据解析
USART_Cmd(USART2, ENABLE);//打开使能
}
if(counts>500)//数据错误
{
counts = 0;
}
USART_ClearFlag(USART2, USART_FLAG_RXNE);
}
else
{
}
}
协调器
主函数
kee(); //按键按下时显屏显示与刷新
show(); //显示阈值
if(fi1==1)//判断节点一有火焰
{
POINT_COLOR=RED;
LCD_ShowString(150,650,200,24,24,"Point 1 Warning!!!!");
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_2); //蜂鸣器和LED灯=低电平
delay_ms(100);
LCD_ShowString(150,650,200,24,24," ");
GPIO_SetBits(GPIOB,GPIO_Pin_8);
GPIO_SetBits(GPIOB,GPIO_Pin_2); //蜂鸣器和LED灯=高电平
delay_ms(100);
}
else
{
POINT_COLOR=BLUE;
LCD_ShowString(150,650,200,24,24," ");
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_2); //蜂鸣器和LED灯=低电平
}
if(fi2==1)//判断节点二有火焰
{
POINT_COLOR=RED;
LCD_ShowString(150,700,200,24,24,"Point 2 Warning!!!!");
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
delay_ms(100);
LCD_ShowString(150,700,200,24,24," ");
GPIO_SetBits(GPIOB,GPIO_Pin_8);
GPIO_SetBits(GPIOB,GPIO_Pin_2);
delay_ms(100);
}
else
{
POINT_COLOR=BLUE;
LCD_ShowString(150,700,200,24,24," ");
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_2);
}
}
定时器三中断服务函数
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
//void show();
static int i=0;
i++;
//
if(i>10)//------------------------------------数据定时发送至节点
{
sprintf(kdata,"0xf6RESET}");//映射值、包头包尾、分隔符
//printf("---%s\n",kdata);
Send_data(USART2,kdata);//-------串口2发送
i=0;
}
//-----------------------------------数据通过WiFi定时上发给云平台
if(HC_STA==0)
{
HC_25_data();//--------串口3发送
}
// }
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中断标志
// LED1=!LED1;
}
}
串口二接收中断服务函数
void USART2_IRQHandler(void) //串口2中断服务程序-------------------------------------------接收数据
{
u8 Res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART2);//(USART1->DR); //读取接收到的数据
if(countz == 0)
{
zig_Clear();
}
read_bufs[countz++] = Res;
if(Res == 0xf0)
{
countz = 0;
}
else if(Res == '}')
{
countz = 0;
USART_Cmd(USART2, DISABLE);
//printf("%s\n",read_bufs);
zigbee_data();//------------------------------------解析数据
USART_Cmd(USART2, ENABLE);
}
if(countz>50)
{
countz = 0;
}
USART_ClearFlag(USART2, USART_FLAG_RXNE);
}
}
串口三中断服务函数
void USART3_IRQHandler(void) //串口3中断服务程序---------- -------接收wifi数据
{
u8 Res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收中断(判断数据包头包尾)
{
Res =USART_ReceiveData(USART3);//(USART1->DR); //读取接收到的数据
if(counts == 0)
{
wifi_Clear();
}
HC_bufs[counts++] = Res;
if(Res == '{')
{
counts = 0;
}
else if(Res == '}')
{
counts = 0;
USART_Cmd(USART3, DISABLE);//关闭时能
//hc_data();
printf("%s\n",HC_bufs);//数据解析
USART_Cmd(USART3, ENABLE);//打开使能
Send_data(USART2,HC_bufs);//--------------把WiFi接收的数据直接发给zigbee节点
}
if(counts>500)
{
counts = 0;
}
USART_ClearFlag(USART3, USART_FLAG_RXNE); //清除中断标志位
}
}
有问题评论区 或私信-_-