stm32f103HC05蓝牙串口程序和自制手机APP
我最近用stm32的蓝牙串口功能,写了这篇文章分享,有不足之处欢迎指正。
一、准备
功能:用APP控制STM32F103单片机上的部件如:LED小灯。
硬件:蓝牙模块、STM32F103mini(或其他单片机)、手机一部
软件:AppInventor(网址:http://app.gzjkw.net/login/)
二、功能实现与代码分析
森森用的是正点原子的mini开发板和ATK-HC05蓝牙串口模块。
stm32与ATK-HC05蓝牙串口模块连接如下:
main函数如下:
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"
#include "hc05.h"
#include "usart3.h"
#include "string.h"
#include "usmart.h" //显示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,"STA:Disconnect"); //未连接
} int main(void){ u8 t;u8 key;u8 sendmask=0;u8 sendcnt=0;u8 sendbuf[20]; u8 reclen=0; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200); //串口初始化为9600LED_Init(); //初始化与LED连接的硬件接口KEY_Init(); //初始化按键LCD_Init(); //初始化LCDusmart_dev.init(72); //初始化USMART POINT_COLOR=RED;LCD_ShowString(30,30,200,16,16,"ALIENTEK STM32F1 ^_^"); 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,"Please Check!!!"); delay_ms(100);} LCD_ShowString(30,90,210,16,16,"KEY1: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;while(1) { key=KEY_Scan(0);if(key==KEY1_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; //打开LED1if(strcmp((const char*)USART3_RX_BUF,"+LED1 OFF")==0)LED1=1;//关闭LED1}LCD_ShowString(30,200,209,119,16,USART3_RX_BUF);//显示接收到的数据USART3_RX_STA=0; } t++; }
}
手机给单片机发送的数据,控制单片机
ATK-HC05配置如下:
#include "delay.h"
#include "usart.h"
#include "usart3.h"
#include "hc05.h"
#include "led.h"
#include "string.h"
#include "math.h"//初始化ATK-HC05模块
//返回值:0,成功;1,失败.
u8 HC05_Init(void)
{u8 retry=10,t; u8 temp=1;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能PORTAGPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; // 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化A15GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA4GPIO_SetBits(GPIOA,GPIO_Pin_4);GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);HC05_KEY=1;HC05_LED=1; usart3_init(9600); //初始化串口2为:9600,波特率.while(retry--){HC05_KEY=1; //KEY置高,进入AT模式delay_ms(10);u3_printf("AT\r\n"); //发送AT测试指令HC05_KEY=0; //KEY拉低,退出AT模式for(t=0;t<10;t++) //最长等待50ms,来接收HC05模块的回应{if(USART3_RX_STA&0X8000)break;delay_ms(5);} if(USART3_RX_STA&0X8000) //接收到一次数据了{temp=USART3_RX_STA&0X7FFF; //得到数据长度USART3_RX_STA=0; if(temp==4&&USART3_RX_BUF[0]=='O'&&USART3_RX_BUF[1]=='K'){temp=0;//接收到OK响应break;}} } if(retry==0)temp=1; //检测失败return temp;
}
//获取ATK-HC05模块的角色
//返回值:0,从机;1,主机;0XFF,获取失败.
u8 HC05_Get_Role(void)
{ u8 retry=0X0F;u8 temp,t;while(retry--){HC05_KEY=1; //KEY置高,进入AT模式delay_ms(10);u3_printf("AT+ROLE?\r\n"); //查询角色for(t=0;t<20;t++) //最长等待200ms,来接收HC05模块的回应{delay_ms(10);if(USART3_RX_STA&0X8000)break;} HC05_KEY=0; //KEY拉低,退出AT模式if(USART3_RX_STA&0X8000) //接收到一次数据了{temp=USART3_RX_STA&0X7FFF; //得到数据长度USART3_RX_STA=0; if(temp==13&&USART3_RX_BUF[0]=='+')//接收到正确的应答了{temp=USART3_RX_BUF[6]-'0';//得到主从模式值break;}} }if(retry==0)temp=0XFF;//查询失败.return temp;
}
//ATK-HC05设置命令
//此函数用于设置ATK-HC05,适用于仅返回OK应答的AT指令
//atstr:AT指令串.比如:"AT+RESET"/"AT+UART=9600,0,0"/"AT+ROLE=0"等字符串
//返回值:0,设置成功;其他,设置失败.
u8 HC05_Set_Cmd(u8* atstr)
{ u8 retry=0X0F;u8 temp,t;while(retry--){HC05_KEY=1; //KEY置高,进入AT模式delay_ms(10);u3_printf("%s\r\n",atstr); //发送AT字符串HC05_KEY=0; //KEY拉低,退出AT模式for(t=0;t<20;t++) //最长等待100ms,来接收HC05模块的回应{if(USART3_RX_STA&0X8000)break;delay_ms(5);} if(USART3_RX_STA&0X8000) //接收到一次数据了{temp=USART3_RX_STA&0X7FFF; //得到数据长度USART3_RX_STA=0; if(temp==4&&USART3_RX_BUF[0]=='O')//接收到正确的应答了{ temp=0;break; }} }if(retry==0)temp=0XFF;//设置失败.return temp;
}
//通过该函数,可以利用USMART,调试接在串口3上的ATK-HC05模块
//str:命令串.(这里注意不再需要再输入回车符)
void HC05_CFG_CMD(u8 *str)
{ u8 temp;u8 t; HC05_KEY=1; //KEY置高,进入AT模式delay_ms(10);u3_printf("%s\r\n",(char*)str); //发送指令for(t=0;t<50;t++) //最长等待500ms,来接收HC05模块的回应{if(USART3_RX_STA&0X8000)break;delay_ms(10);} HC05_KEY=0; //KEY拉低,退出AT模式if(USART3_RX_STA&0X8000) //接收到一次数据了{temp=USART3_RX_STA&0X7FFF; //得到数据长度USART3_RX_STA=0;USART3_RX_BUF[temp]=0; //加结束符 printf("\r\n%s",USART3_RX_BUF);//发送回应数据到串口1}
}
HC05_KEY连接PA15引脚,HC05_LED连接PA4引脚
hc05程序可以移植。
三、APP的制作
**
森森制作控制stm32的APP是App Inventor。Google App Inventor是一个完全在线开发的Android编程环境,抛弃复杂的程式代码而使用积木式的堆叠法来完成您的Android程式。对于想要用手机控制机器人的使用者而言,他们不大需要太华丽的界面,只要使用基本元件例如按钮、文字输入输出即可。开发一个App Inventor 程式就从您的浏览器开始,您首先要设计程序的外观。接着是设定程序的行为,这部分就像玩乐高积木一样简单有趣。最后只要将手机与电脑联接,刚出炉的程序就会出现在您的手机上了。
App Inventor 有离线版和不需要下载的网站版本。 森森制作控制stm32的APP网站版本就完全可以,网站网址App Inventor。想要学习App Inventor,可以在中国大学慕课上搜索吴明辉老师的App Inventor-零基础Android移动开发。如下图:
森森控制stm32APP组件设计:
森森控制stm32APP逻辑设计:
该程序完成后,在APP上显示:
进入该APP,按下LED灯开,手机向单片机发送+LED1 ON,LED灯亮。
按下LED灯关,手机向单片机发送+LED1 OFF,LED灯灭。
对应main函数中:
通过改此处可以控制stm32单片机。
APP制作完成后下载到手机、先用手机连接HC05蓝牙,然后打开APP 按选择蓝牙设备即可连接蓝牙。然后按对应按键即可。
注:森森在学习蓝牙串口时,这篇文章对我帮助很大,森森很多是自己理解后对他的补充。基于蓝牙的APP控制STM32板LED小灯
1、自制App下载链接:蓝牙串口App
2、stm32f103HC05蓝牙串口程序下载地址:stm32f103的HC05蓝牙串口程序
stm32f103HC05蓝牙串口程序和自制手机APP相关推荐
- uniapp app蓝牙打印_给编程器加装蓝牙串口模块,用手机APP操作打印信息进控制台...
公众号回复[编程器]可下载蓝牙串口APP 专用蓝牙串口模块购买: https://item.taobao.com/item.htm?id=619731291566 编程器加装蓝牙模块后,可以方便的使用 ...
- 小白学习HC-05蓝牙透传模块(有实例讲解——自制手机app实现蓝牙控制单片机加热系统)第一天 :整体分析,理清思路
小编刚开始接触HC-05蓝牙透传模块,只是感到很神奇.但对它的原理和使用方法一无所知.做项目要用到它的时候,无非就是代码复制粘贴,有种照搬照抄的意思. 但是今天小编要谈谈一段时间内对HC-05学习的心 ...
- Android蓝牙串口程序开发
本文主要介绍了针对android的蓝牙串口上位机开发. 程序下载地址:点击打开链接 一.帧定义 androidclient依照一定的数据帧格式通过蓝牙串口发送数据到连接到MCU的蓝牙从机.MCU接收到 ...
- HC05与STM32进行串口通讯实现与手机APP的数据透传
HC05与STM32与手机透传 1.实验工具:正点原子的精英版STM32F103ZET6,通用BLE蓝牙模块一个HC05(最便宜的蓝牙模块),手机,电脑 2.HC05调试:若HC05上面有小按键,则按 ...
- 自制手机app的51蓝牙+WiFi+循迹+避障OLED显示速度小车
最近有空了,重新复习了下51单片机,真的是温故而知新,学到了之前没学到的知识,所以打算做个基于51的蓝牙小车玩玩,也算是圆大一的梦吧,就当复习一下. 实现效果: 1.蓝牙可以控制前后左右,调速(快慢) ...
- python日程提醒小程序_用手机APP管理日程太繁琐?试试这个微信小程序
随着我们日常生活.学习以及工作的日益繁忙,合理安排自己的日程事项变得越来越重要.相信大家在自己的手机里也安装过一些任务管理APP,可是真正坚持用下来的人又有多少呢?如果你觉得手机里的任务管理APP功能 ...
- 手机APP开发之MIT Appinventor详细实战教程(一),利用通过蓝牙控制单片机,以及实现单片机与android设备之间的串口通信
目录 (一)前期软件准备和硬件准备 ( 二 ) 实现的思路和操作原理 ( 三) 具体的操作方法 MIT Appinventor 是编程领域较为受欢迎且适用的编程软件 ,因其操作流程和使用方法简单,一直 ...
- 自制蓝牙手机app控制stm8/stm32/C51板载LED
这里来分享下,自制手机app来控制单片机上的LED,以实现上位机,下位机的通讯 这次分享的是蓝牙app控制stm8,stm32,C51的我前面的文章分享过,不懂的可以看看–>传送门 原理很简单, ...
- arduino蓝牙通讯代码_通过手机控制蓝牙串口模块与Arduino通讯
功能 通过手机APP向蓝牙模块发送指令,蓝牙模块通过串口将指令传递给Arduino开发板,并由Arduino做出反馈,传递给手机. 工具材料Arduino 开发板 ×1 蓝牙串口模块×1 Androi ...
最新文章
- linux 下 jenkins 安装注意事项
- 统计学原理-----概率分布
- 利用ASP.NET一般处理程序动态生成Web图像
- Struts2简单入门实例
- java并发-独占锁与共享锁
- 如何开发出一款仿映客直播APP项目实践篇 -【原理篇】
- qq音乐推荐下载器(一)——模拟搜索,下载,读取评论制作词云并将下载数据传至数据库
- Kibana:使用 drilldown 从一个仪表板切换到另外一个仪表板
- TypeError: format expected at most 2 arguments, got 7
- Zepto中touch模块的使用(移动端)
- 十六进制颜色与RGB颜色转换
- 解决0xc000012f 损坏的映像rasman.dll没有被指定在windows运行问题
- 4298. 【NOIP2015模拟11.2晚】我的天
- 覃卫平java,广西外国语学院与柳州市柳江区实验高中、柳城县中学签订优质生源基地协议并圆满完成挂牌仪式...
- 【头歌】顺序表的基本操作
- java设计模式-六大设计原则
- 一分钟让你知道黑白照片修复彩色软件有哪些?
- 括号匹配算法问题 JS
- 是时候废除“网络君主制”啦?认识 Usenet ~
- 使用Nginx防止IP地址被恶意解析