简介
接着前面的写!!!!!!!!!
终端节点程序设计和实现
首先终端节点的任务就是采集传感器的数据并发送数据到LoRa模块、接受LoRa模块的数据并处理、控制外设。
主函数中主要判断采集的数值是否符合要求,和是否为手动控制。
串口中断和前面的逻辑一致
定时器三的任务是定时采集传感器的数据
定时器四的任务是定时判断关键字并发送数据给LoRa模块
代码
主函数
//手动控制标志位水泵
if(Water_IT1==1){
WATER=0;//开
}
else{//判断土壤湿度是否低于预设值
if(PA2_data>PA2_data_Pre){
WATER=0;
}else{WATER=1;}
}
//手动控制标志位蜂鸣器
if(Beef_IT1==1){
BEEF=1;
}else{//判断PH值是否在范围内
if(PH_data>PH_data_Pre){
BEEF=1;
}else {BEEF=0;}
}
//手动控制风扇标志位
if(Fan_IT1==1){FAN=0;}
else{
//判断二氧化碳的预设值 是否高于预设值
if(CO2_data>CO2_data_Pre){FAN=0;}
else{FAN=1;}
}
}
}
串口二中断服务函数
void USART2_IRQHandler(void) //串口2中断
{
u8 Res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //判断串口2接受标志位
{
Res =USART_ReceiveData(USART2);
if(counts == 0)
{
Lora_Clear();
}
read_bufs[counts++] = Res;
//判断格式
if(Res == 0xfe)
{
counts = 0;
}
else if(Res == '}')
{
//格式正确
counts = 0;
USART_Cmd(USART2, DISABLE);
// printf("%s",read_bufs);
Lora_Rx_data();
USART_Cmd(USART2, ENABLE);
}
if(counts>READ_BUFLONG)
{
counts = 0;
}
USART_ClearFlag(USART2, USART_FLAG_RXNE);//清除
}
}
定时器三中断服务函数
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
//采集数据
u16 adc1;
u16 adc2;
SGP30_ad_write(0x20,0x08);
data = SGP30_ad_read();
CO2_data = (data & 0xffff0000) >> 16;
adc1 = Get_Adc(1);
adc2 = Get_Adc(5);
PH_data=(float)adc1; //PH
PA2_data=(float)adc2/4096*100; //土壤
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
}
}
定时器四中断服务函数
void TIM4_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
//内容
if(TX_IT==1){
sprintf(Tx_data,"0xfeTX1ACO2:%d:%d:%d:%d:%d:%d}",CO2_data,PH_data,PA2_data,CO2_data_Pre,PH_data_Pre,PA2_data_Pre);
Lora_setData(Tx_data);//发送数据
// printf("0xfeTX1ACO2:%d:%d:%d:%d:%d:%d}",CO2_data,PH_data,PA2_data,CO2_data_Pre,PH_data_Pre,PA2_data_Pre);
LED=!LED;
TX_IT=!TX_IT;
}
TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
}
}
有问题评论区或私信-_-!!!