1 switch(TxBuffer1[0]){ : 3 GPIO_SetBits(GPIOA, GPIO_Pin_4);//置PA4引脚为高 (ticks--); 6 GPIO_ResetBits(GPIOA, GPIO_Pin_4);//置PA4引脚为低 7 break; : 9 GPIO_SetBits(GPIOA, GPIO_Pin_5); 10 ticks = 900000; 11 while(ticks--); 12 GPIO_ResetBits(GPIOA, GPIO_Pin_5); 13 break; : 15 GPIO_SetBits(GPIOA, GPIO_Pin_6); 16 ticks = 900000; 17 while(ticks--); 18 GPIO_ResetBits(GPIOA, GPIO_Pin_6); 19 break; 20 default:break; 21 }
而AD则对小白来说稍微难以理解一点,简单来说AD就和电压表的功能类似,可以读取某一引脚上的电压值。
上面讲到,我们分别用PA0\PA1\PA2\PA3四个引脚读取四个指示灯的电压值,然后在嵌入式程序中判断每个电压值是高电平还是低电平,来判每个指示灯的状态:
读取电压值小于1V表示低电平,表示指示灯亮;读取电压值大于3.2V表示高电平,表示指示灯暗
其相应的代码大家也能明白:(每次通过蓝牙发送一个以'S'开头、'E'结尾、中间包含4个字母(每个字母可以是'Y'、'N'、'M',分别表示对应指示灯状态为开、关、未知...其中第5行调用GetVolt(After_filter[i])函数是取多次测AD值的一个平均,用这个平均值能减少一些干扰;接下来6、7、8三行为根据所测AD值计算对应指示灯的状态。
);(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);(i = { value[i] = GetVolt(After_filter[i]); );(value[i]>);USART_OUT(USART1,);(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); 10 ticks = 900000; 11 while(ticks--); 12 } ); 14 while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
整个嵌入式工程是基于STM32F103C8T6单片机开发的,其工程结构比较清晰如下:
Startup中的文件是stm32的启动文件,是纯汇编写的,主要用来启动stm32,在此之后就进入我们熟悉的main函数的位置执行了!
main.c函数包含主要的初始化函数和main函数,上面两个逻辑处理函数全在main函数中。
stm3f10_it.c是中断函数,这里主要有一个串口数据接收中断函数。
FWLIB中是本工程用到的功能如:AD、DMA、GPIO、RCC、USART等的库,暂不用考虑
CMSYS中是stm32固件相关,暂不用考虑
注:不熟悉的人能看懂上面两个贴出的代码就行了,要理解整个工程要一点stm32的知识~
四、用传统蓝牙HC-06沟通单片机和APP
至此我们外部MCU算是真正打入到我们要控制的家电内部了!
接下来如何让其他设备,如手机做打入内部MCU的接线人呢-?
这里我采用的是传统的蓝牙通信技术~
注:图中1、2、3、4分别为待黑家电的控制电路板、3路继电器电路板、HC-06蓝牙模块和STM32最小系统
这里采用的蓝牙模块是一种传统的(非4.0)蓝牙串口模块~
附加讲解:
① 传统的蓝牙iPhone是不支持的,目前新款安卓智能机和iPhone用的是蓝牙4.0技术(不过安卓的也兼容非4.0蓝牙),我们常听说的iBeacon、智能手环啥的里面采用的是BLE技术(即:蓝牙低功耗技术,是基于标准蓝牙4.0协议栈做的低功耗版本)
② 蓝牙串口模块即你利用此模块操作蓝牙就像串口一样简单,模块中无需自己写任何蓝牙协议代码,只需要像串口一样将其上面的TXD连接到MCU的RXD,其上面的RXD连到MCU上的TXD,接下来MCU采用串口的方式便能达到和采用蓝牙一样的通信效果。
所以,上面代码中
USART_OUT(USART1,"Y");
其实是通过蓝牙串口透传模块,将数据通发给给了已经配对且连接的蓝牙设备了(如手机)~
那么当手机通过APP发送一条控制命令时,硬件是如何收到的呢?
同样的,由于是透传模块,远端通过蓝牙发送过来的数据也会在相应的串口中断中收到~
这里的控制命令有3种:
'a'+0x0d+0x0a 表示模拟按动按键1
'b'+0x0d+0x0a 表示模拟按动按键2
'c'+0x0d+0x0a 表示模拟按动按键3