友情提示:380元/半年,儿童学编程,就上码丁实验室。
我是潘,曾经是个工程师。这是 “Arduino 公开课” 系列的入门教程。本课将介绍软件串口和蓝牙通信。有任何疑问请在评论区提出,我会逐一回答。
串口是应用最广泛的通信协议,可以实现高速传输(相对单片机来说),而且只需要两个线 RX 和 TX 即可。但串口也有缺点,每个串口只能实现一组通信, 而 Arduino Uno 只提供了一个串口(D0 – RX、D1 -TX),并且是和 USB 转换模块共用的。换句话说,如果 USB 端在使用, 就无法再接其他串口设备,比如,我们这次要介绍的 CC2541 蓝牙模块。
幸好,Arduino 官方提供了软件串口的库,可以将任意两个数字端口,模拟成串口。软件串口库不需要下载,IDE 已经集成,打开“菜单 -> 项目 -> 加载库 -> SoftwareSerial “即可加载。
使用软件串口前,先介绍一下 HM10 蓝牙模块。该模块采用德州仪器 CC2541 蓝牙4.0芯片,主从一体机,采用串口通信。另外,不建议使用老旧的HC5、HC6等,因为此类模块基于老旧的蓝牙2.1协议,耗电较大、很多新特性都不支持,而且也不便宜。
这个模块需要转焊,但也可以购买已经带底座的模块,更省事。我们只要4跟连接线:
3.3V 连接 3.3V(最高不超过7V);
GND 连接 GND;
TX 连接 D8;
RX 连接 D9;
往Arduino 写入程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
/*
作者:Ardui.co
效果:手机连接蓝牙通信
版本:1.0
更新时间:2017年3月15日
*/
#include <SoftwareSerial.h> //加载软件串口库
SoftwareSerial BT(8,9); //新建对象,设置软件串口端口,RX为D8,TX为D9
charval; //存储接收的变量
voidsetup(){
Serial.begin(9600); //与PC串口连接
Serial.println(“BT is ready!”);
BT.begin(9600); //设置波特率
}
voidloop(){
//如果串口接收到数据,输出到蓝牙串口(手机)
if(Serial.available()){
val=Serial.read();
BT.print(val);
}
//如果接收到蓝牙模块的数据,输出到屏幕
if(BT.available()){
val=BT.read();
Serial.println(val);
}
}
|
这程序在理解上毫无难度。
此时,我们还需要在手机上下载一个蓝牙串口控制器,Arduino 设备推荐 ”BLE蓝牙串口“,iOS 推荐LightBlue,均为免费软件。最后打开PC 串口监视器和手机的蓝牙串口APP,就可以双向通信了。
顺便介绍一下 iOS 上 LightBlue 的使用。连接蓝牙模块后,我们把界面拉到最底部,找到UUID的选项点击进入,打开”Listen for nobiantifications“,此时才能监听蓝牙的串口数据。同时,要把右上角的Hex(十六进制),改为String(字符串)。
现在要结合 DHT11 温湿度传感器,在手机上显示实时温度。同时,不用软件串口了,让蓝牙模块直接使用 Uno 的硬件串口(D0、D1即硬件串口):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
/*
作者:Ardui.Co
效果:手机蓝牙显示温湿度
版本:1.0
更新时间:2017年3月14日
*/
#include “DHT.h” //加载DHT11的库
#define DHTTYPE DHT11 // 定义传感器类似 DHT11
#define DHTPIN 2 //宏定义DHT数据接口,编译时DHTPIN会替换成2
DHT dht(DHTPIN,DHTTYPE);//声明 dht 函数
voidsetup(){
Serial.begin(9600);
dht.begin();//启动传感器
}
voidloop(){
delay(1000); //采样延时,每次抓取数据时间间隔 1~2秒钟
floath=dht.readHumidity();//读取湿度
floatt=dht.readTemperature();//读取摄氏度
if(isnan(h)||isnan(t)){
Serial.println(“Failed to read from DHT sensor!”);
return;
}//检查抓取是否成功
Serial.print(h);
Serial.print(” %\t”);
Serial.print(t);
Serial.print(” *C “);
}
|
这其实就是第9课的程序简化版。
程序上传完毕后,拔掉USB,否则会产生冲突。蓝牙模块的 TX 接 D0,RX 接 D1,并使用 Uno 的外界电源口供电,打开手机蓝牙串口,看到湿度温度在刷新:
利用蓝牙通信,我们终于可以脱离PC大屏幕了,手机就能实现人机互动。