标题: stm32温湿度报警器蓝牙模块错误 [打印本页]

作者: chitu    时间: 2020-1-7 18:54
标题: stm32温湿度报警器蓝牙模块错误
上位机一直收到蓝牙发送  AT  
oled显示屏也只显示温度湿度汉字而不显示温湿度的数据
但是我编译的时候也没有报错
求求各位大佬帮我看看哪里有问题
下面是主函数

int main(void)
{
        u8 t=0;                           
        u8 temperature;              
        u8 humidity;
        u8 reclen=0;
  int tmp;         
        usart_init(9600);
         BEEP_Init();//蜂鸣器初始化
        delay_init();                           //延时初始化
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        DHT11_Init();//dht11初始化
        OLED_Init();                    //初始化OLED
  initial_olcd();                  //初始化
        usmart_dev.init(72);         //初始化USMART        
        clear_screen();                        //清屏        
        disp_string_8x16_16x16(1,1,"温度:");
        disp_string_8x16_16x16(3,1,"湿度:");
        delay_ms(1000);                        //等待蓝牙模块上电稳定
         while(HC05_Init())                 //初始化ATK-HC05模块  
        {
                delay_ms(200);

        }        
        USART_RX_STA=0;        
            
         while(1)         
        
        {        
                if(t%10==0)                        //每100ms读取一次
                {                                                                          
                        DHT11_Read_Data(&temperature,&humidity);        //读取温湿度值
                        display_number_16x8(1,46,temperature);
                        display_number_16x8(3,46,humidity);
                        u1_printf("%d %d\r\n",temperature,humidity);                //发送到蓝牙模块
                tmp=(int)temperature;
                                if((tmp<=10) || (tmp>=25))
                {
                        beep = !beep;
      led2 = 1;
                }
                else
                {
                        beep = 0;
      led2 = 0;
                }
    delay_ms(50);
               
                if(USART_RX_STA&0X8000)                        //接收到一次数据了
                {
               
                           reclen=USART_RX_STA&0X7FFF;        //得到数据长度
                          USART_RX_BUF[reclen]=0;                 //加入结束符
                        if(reclen==9||reclen==8)                 //控制DS1检测
                        {
                                if(strcmp((const char*)USART_RX_BUF,"关闭报警器")==0);        //关闭蜂鸣器
                {
                                beep = 0;
                        }
                }
                         USART_RX_STA=0;         
//                disp_string_8x16_16x16(5,1,USART_RX_BUF);
                }                                                                                                                                                                        

        }
        delay_ms(10);
                t++;
                if(t==20)
                {
                        t=0;
                }
                        
                                          
                 delay_ms(10);
                t++;
                if(t==20)
                {
                        t=0;
                }
        }

}


作者: 阔爱的钊钊    时间: 2020-1-7 20:56
         while(HC05_Init())                 //初始化ATK-HC05模块           {                 delay_ms(200);          }    看看是不是卡在初始化这一步了。
作者: 阔爱的钊钊    时间: 2020-1-7 20:58
反复调试一下,应该是蓝牙AT没配好。
作者: 疯子本人    时间: 2020-1-7 23:56
能否说明一下是哪里出现问题了,蓝牙接收到数据,但是温湿度模块没有测到数据?
作者: chitu    时间: 2020-1-8 10:02
阔爱的钊钊 发表于 2020-1-7 20:56
while(HC05_Init())                 //初始化ATK-HC05模块           {                 delay_m ...

u8 HC05_Init(void)
{
u8 retry=10,t;      
u8 temp=1;

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能PORTA

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;     // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;    //上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);      //根据设定参数初始化A15
  

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;     // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);      //根据设定参数初始化GPIOA4
GPIO_SetBits(GPIOA,GPIO_Pin_4);
  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
HC05_KEY=1;
HC05_LED=1;

usart_init(9600); //初始化串口1为:9600,波特率.

while(retry--)
{
  HC05_KEY=1;     //KEY置高,进入AT模式
  delay_ms(10);
  printf("AT\r\n");  //发送AT测试指令
  HC05_KEY=0;     //KEY拉低,退出AT模式
  for(t=0;t<10;t++)    //最长等待50ms,来接收HC05模块的回应
  {
   if(USART_RX_STA&0X8000)break;
   delay_ms(5);
  }  
  if(USART_RX_STA&0X8000) //接收到一次数据了
  {
   temp=USART_RX_STA&0X7FFF; //得到数据长度
   USART_RX_STA=0;   
   if(temp==4&&USART_RX_BUF[0]=='O'&&USART_RX_BUF[1]=='K')
   {
    temp=0;//接收到OK响应
    break;
   }
  }         
}      
if(retry==0)temp=1; //检测失败
return temp;   
}  
这是蓝牙初始化的程序  我感觉是那个循环语句一直在循环,但是我程序不变的时候又有一两次可以正确运行。。。。。。。

作者: chitu    时间: 2020-1-8 10:07
疯子本人 发表于 2020-1-7 23:56
能否说明一下是哪里出现问题了,蓝牙接收到数据,但是温湿度模块没有测到数据?

就是蓝牙配对好之后  串口调试助手一直收到AT
我把语句挨个删除之后试了一下
应该就是while(HC05_Init())                 //初始化ATK-HC05模块  
        {
                delay_ms(100);
        }
的问题
然后我看了一下
应该是HC05_Init()里的这一段他一直循环
while(retry--)
        {
                HC05_KEY=1;                                        //KEY置高,进入AT模式
                delay_ms(10);
                printf("AT\r\n");                //发送AT测试指令
                HC05_KEY=0;                                        //KEY拉低,退出AT模式
                for(t=0;t<10;t++)                         //最长等待50ms,来接收HC05模块的回应
                {
                        if(USART_RX_STA&0X8000)break;
                        delay_ms(5);
                }               
                if(USART_RX_STA&0X8000)        //接收到一次数据了
                {
                        temp=USART_RX_STA&0X7FFF;        //得到数据长度
                        USART_RX_STA=0;                         
                        if(temp==4&&USART_RX_BUF[0]=='O'&&USART_RX_BUF[1]=='K')
                        {
                                temp=0;//接收到OK响应
                                break;
                        }
                }                                           
        }                    
但是我不知道咋办,而且程序不变的时候他能用一两次,断电之后再接上又不能用了
作者: jizhongbiao    时间: 2020-1-8 11:03
你主程序里面t++了两次,第一个t++后当t =20后后t清0,紧接着又从0开始加的时候是加不到10的所以if(t % 10 == 0)是不会执行的
作者: chitu    时间: 2020-1-8 14:23
jizhongbiao 发表于 2020-1-8 11:03
你主程序里面t++了两次,第一个t++后当t =20后后t清0,紧接着又从0开始加的时候是加不到10的所以if(t % 10 ...

我把重复的那一段程序删了还是不行




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1