OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8455|回复: 1

stm32蓝牙温湿度采集

[复制链接]

6

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2017-9-3
在线时间
8 小时
发表于 2017-12-21 19:41:02 | 显示全部楼层 |阅读模式
使用蓝牙模块在F4开发板上实现,手机接收温湿度数据。参考的实验,蓝牙HC05,和温湿度实验。一直这两个实验例程时,有两个问题。1:手机发送温湿度工作指令后,进入初始化,之后怎么退出这个温湿度工作状态。2:两个实验例程用的同一个中断优先级,如何配置3:移植代码时,温湿度进入初始化后,初始化函数在主函数中如何放置,就是如安排,其中有了,HC05初始化函数,我放置其后。代码如下:
#include "sys.h"
#include "delay.h"  
#include "usart.h"  
#include "led.h"
#include "lcd.h"
#include "usmart.h"               
#include "hc05.h"          
#include "usart3.h"        
#include "key.h"          
#include "string.h"
#include "beep.h"
#include "dht11.h"

//ALIENTEK 探索者STM32F407开发板 扩展实验1
//ATK-HC05蓝牙串口模块实验 -库函数版本
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com  
//广州市星翼电子科技有限公司  
//作者:正点原子 @ALIENTEK


//显示ATK-HC05模块的主从状态
void HC05_Role_Show(void)
{
        if(HC05_Get_Role()==1)LCD_ShowString(30,140,200,16,16,"ROLE:Master");        //主机
        else LCD_ShowString(30,140,200,16,16,"ROLE:Slave ");                                         //从机
}
//显示ATK-HC05模块的连接状态
void HC05_Sta_Show(void)
{                                                                                                 
        if(HC05_LED)LCD_ShowString(120,140,120,16,16,"STA:Connected ");                        //连接成功
        else LCD_ShowString(120,140,120,16,16,"STAisconnect");                                 //未连接                                 
}         


int main(void)
{
        u8 t;
        u8 key;
        u8 sendmask=0;
        u8 sendcnt=0;
        u8 sendbuf[20];          
        u8 reclen=0;
                u8 t1=0;                            
        u8 temperature;              
        u8 humidity;        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);      //初始化延时函数
        uart_init(115200);                //初始化串口波特率为115200
       
        usmart_dev.init(84);                 //初始化USMART               
        LED_Init();                                        //初始化LED
        KEY_Init();                                        //初始化按键
        LCD_Init();
                                         //初始化LCD
                BEEP_Init();        
        POINT_COLOR=RED;
        LCD_ShowString(30,30,200,16,16,"ALIENTEK STM32F4 ^_^");       
        LCD_ShowString(30,50,200,16,16,"HC05 BLUETOOTH COM TEST");       
        LCD_ShowString(30,70,200,16,16,"ATOM@ALIENTEK");
        delay_ms(1000);                        //等待蓝牙模块上电稳定
        while(HC05_Init())                 //初始化ATK-HC05模块  
        {
                LCD_ShowString(30,90,200,16,16,"ATK-HC05 Error!");
                delay_ms(500);
                LCD_ShowString(30,90,200,16,16,"lease Check!!!");
                delay_ms(100);
        }                                                                                                      
        LCD_ShowString(30,90,210,16,16,"KEY_UP:ROLE KEY0:SEND/STOP");  
        LCD_ShowString(30,110,200,16,16,"ATK-HC05 Standby!");  
          LCD_ShowString(30,160,200,16,16,"Send:");       
        LCD_ShowString(30,180,200,16,16,"Receive:");
        POINT_COLOR=BLUE;
        HC05_Role_Show();
        delay_ms(100);
        USART3_RX_STA=0;
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//设置系统中断优先级分组3,这个优先级是否正确
        while(1)
        {                        
                if(t%10==0)//每100ms读取一次
                {                                                                          
                        DHT11_Read_Data(&temperature,&humidity);                //读取温湿度值       
                                                u3_printf("ALIENTEK HC05 %d\r\n",sendcnt);//发送数据给单片机                       
                        LCD_ShowNum(30+40,150,temperature,2,16);                //显示温度                             
                        LCD_ShowNum(30+40,170,humidity,2,16);                        //显示湿度                   
                }                                  
                 delay_ms(10);
                t1++;
                if(t1==20)
                {
                        t1=0;
                        LED0=!LED0;
                }
        }
       
       
        while(1)
        {               
                key=KEY_Scan(0);
                if(key==WKUP_PRES)                                                //切换模块主从设置
                {
                           key=HC05_Get_Role();
                        if(key!=0XFF)
                        {
                                key=!key;                                          //状态取反          
                                if(key==0)HC05_Set_Cmd("AT+ROLE=0");
                                else HC05_Set_Cmd("AT+ROLE=1");
                                HC05_Role_Show();
                                HC05_Set_Cmd("AT+RESET");        //复位ATK-HC05模块
                                delay_ms(200);
                        }
                }else if(key==KEY0_PRES)
                {
                        sendmask=!sendmask;                                //发送/停止发送           
                        if(sendmask==0)LCD_Fill(30+40,160,240,160+16,WHITE);//清除显示
                }else delay_ms(10);          
                if(t==50)
                {
                        if(sendmask)                                        //定时发送
                        {
                                sprintf((char*)sendbuf,"ALIENTEK HC05 %d\r\n",sendcnt);
                                  LCD_ShowString(30+40,160,200,16,16,sendbuf);        //显示发送数据       
                                u3_printf("ALIENTEK HC05 %d\r\n",sendcnt);                //发送到蓝牙模块
                                sendcnt++;
                                if(sendcnt>99)sendcnt=0;
                        }
                        HC05_Sta_Show();            
                        t=0;
                        LED0=!LED0;              
                }          
                if(USART3_RX_STA&0X8000)                        //接收到一次数据了
                {
                        LCD_Fill(30,200,240,320,WHITE);        //清除显示
                        reclen=USART3_RX_STA&0X7FFF;        //得到数据长度
                          USART3_RX_BUF[reclen]=0;                 //加入结束符
                        if(reclen==9||reclen==8)                 //控制DS1检测
                        {
                                if(strcmp((const char*)USART3_RX_BUF,"+LED1 ON")==0)LED1=0;        //打开LED1
                                if(strcmp((const char*)USART3_RX_BUF,"+LED1 OFF")==0)LED1=1;//关闭LED1
                                if(strcmp((const char*)USART3_RX_BUF,"+BEEP OFF")==0)GPIO_ResetBits(GPIOF,GPIO_Pin_8);
                                if(strcmp((const char*)USART3_RX_BUF,"+BEEP ON")==0)GPIO_SetBits(GPIOF,GPIO_Pin_8);
                                if(strcmp((const char*)USART3_RX_BUF,"+DHT ON")==0)DHT11_Init();//进入温湿度初始化,这里是否正确
                        }
                        LCD_ShowString(30,200,209,119,16,USART3_RX_BUF);//显示接收到的数据
                        USART3_RX_STA=0;         
                }                                                                                                                                                                        
                t++;       
        }                                                                                            
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2017-9-3
在线时间
8 小时
 楼主| 发表于 2017-12-21 19:45:29 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 14:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表