一.介绍
今天我们将制作一个很酷的多彩项目,我们将使用ESP32微控制器通过蓝牙控制rgb LED。简单来说,我们将通过手机控制RGB-LED。
ESP内置有低功耗蓝牙,它与我们在蓝牙音频等产品中可能会发现的传统蓝牙略有不同。BLE“服务器”(如ESP32读取传感器数据)可以定期“通知”客户端(如智能手机),而不是不断地传输数据,而是向他们发送一些数据。因此,BLE更适用于不需要大量数据的低功耗物联网应用。
前面的我们已经介绍了RGB-LED灯的如何使用了,我这里就不多说了。在这里我就重点说一下,ESP32内置蓝牙的使用。
二.元器件清单
- ESP32开发板
- 一个RGB-LED
- 面包板
- 导线若干
三.电路图
四.代码设计
关于这里的android手机端的软件可以从这里下载
关于arduino的代码接下来,我就进行详细地介绍,根据我自己的研究发现,使用ESP32的arduino示例程序BluetoothSerial:
//This example code is in the Public Domain (or CC0 licensed, at your option.)
//By Evandro Copercini - 2018
//
//This example creates a bridge between Serial and Classical Bluetooth (SPP)
//and also demonstrate that SerialBT have the same functionalities of a normal Serial
#include "BluetoothSerial.h"
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
BluetoothSerial SerialBT;
void setup() {
Serial.begin(115200);
SerialBT.begin("ESP32test"); //Bluetooth device name
Serial.println("The device started, now you can pair it with bluetooth!");
}
void loop() {
if (Serial.available()) {
SerialBT.write(Serial.read());
}
if (SerialBT.available()) {
Serial.write(SerialBT.read());
}
delay(20);
}
这里面的 Serial.read() 是读取我们手机发送的数据。也就是用来接收数据的,如果按照示例的设计的话,数据会丢掉的。而手机APP发送的数据是字符的形式发送过来的。
我的设计是这样的,我是利用一个数组通过循环来接收数据的:
int i;
char BT[9] = {0};
for (i = 0; i < 9; i++)
{
BT[i] = SerialBT.read();
}
}
这里接收到的数据有九个,因为有R,G,B三种颜色,而每一种颜色有255种变化,所以就有九个数据。但是有时也会只有八个数据,我们可以判断BT[8]这一个数据,我是这样弄的:
if (BT[8] )
{
Serial.println("OK ");
red = chartonumber(BT[0])*100+chartonumber(BT[1])*10+chartonumber(BT[2]);
green =chartonumber(BT[3])*100+chartonumber(BT[4])*10+chartonumber(BT[5]);
blue = chartonumber(BT[6])*100+chartonumber(BT[7])*10+chartonumber(BT[8]);
Serial.print(red);
Serial.print(" ");
Serial.print(green);
Serial.print(" ");
Serial.println(blue);
}
else
{
Serial.println("NO ");
red = chartonumber(BT[0])*10+chartonumber(BT[1]);
green =chartonumber(BT[2])*100+chartonumber(BT[3])*10+chartonumber(BT[4]);
blue = chartonumber(BT[5])*100+chartonumber(BT[6])*10+chartonumber(BT[7]);
Serial.print(red);
Serial.print(" ");
Serial.print(green);
Serial.print(" ");
Serial.println(blue);
}
哦,对了,里面的 chartonumber()是把字符数据转换成整形数据。我定义了一个宏定义:
#define chartonumber(x) (x-'0')
里面的X就是你自己需要转换的数据,x-‘0’是根据ASCAll表得出的。就是字符数字必整形数据间隔了一个‘0’。
总体的程序是这样的:
[scu name=”arduino-ide-post” platform=”esp32:esp32:esp32″]
/*******************************************************
ESP32蓝牙控制RGB-LED
功能:使用手机蓝牙APP来控制RGB-LED颜色的变换
引脚:R->25 G->26 B->27
Designer: Code_Mouse
Date:2018-9-4
*******************************************************/
#include "BluetoothSerial.h"
#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif
#define chartonumber(x) (x-'0')
BluetoothSerial SerialBT;
long int val = 0;
uint8_t ledR = 25;
uint8_t ledG = 26;
uint8_t ledB = 27;
int i;
char BT[9] = {0};
int red = 0;
int green = 0;
int blue = 0;
void setup() {
Serial.begin(115200);
ledcAttachPin(ledR, 1); //引脚的通道
ledcAttachPin(ledG, 2);
ledcAttachPin(ledB, 3);
ledcSetup(1, 12000, 8); // 12 kHz PWM,8位的分辨率
ledcSetup(2, 12000, 8);
ledcSetup(3, 12000, 8);
}
void loop() {
if (Serial.available()) {
SerialBT.write(Serial.read());
}
if (SerialBT.available()) {
delay(50);
for (i = 0; i < 9; i++)
{
BT[i] = SerialBT.read();
}
}
if (BT[8] )
{
Serial.println("OK ");
red = chartonumber(BT[0]) * 100 + chartonumber(BT[1]) * 10 + chartonumber(BT[2]);
green = chartonumber(BT[3]) * 100 + chartonumber(BT[4]) * 10 + chartonumber(BT[5]);
blue = chartonumber(BT[6]) * 100 + chartonumber(BT[7]) * 10 + chartonumber(BT[8]);
Serial.print(red);
Serial.print(" ");
Serial.print(green);
Serial.print(" ");
Serial.println(blue);
}
else
{
Serial.println("NO ");
red = chartonumber(BT[0]) * 10 + chartonumber(BT[1]);
green = chartonumber(BT[2]) * 100 + chartonumber(BT[3]) * 10 + chartonumber(BT[4]);
blue = chartonumber(BT[5]) * 100 + chartonumber(BT[6]) * 10 + chartonumber(BT[7]);
Serial.print(red);
Serial.print(" ");
Serial.print(green);
Serial.print(" ");
Serial.println(blue);
}
ledcWrite(1, (255 - red));
ledcWrite(2, (255 - green));
ledcWrite(3, (255 - blue));
delay(100);
}
[/scu]
五.测试代码
要测试代码,只需使用Arduino IDE上传它。然后,您应该看到手机切换RGB-LED灯效果。以下视频就是实现的效果:
http://gp.qutaojiao.com/index.php?share/file&user=100&sid=FBQ2kveD
文件和视频都是 File not found…
有些文章网站升级过程中丢失了哦,这个app可以从应用商店下载类似的蓝牙串口软件就可以了,程序是正确的哦
OK, thanks!
thanks
app下不了
网站升级的时候丢失了,app从应用商店随便下载一个就可以,可以从“酷安”或者“应用汇”上面下载比较多蓝牙串口工具。
thanks
hahahaha
加油吧
加油
加油
?
thanks
评论
学习
想看一下app真难
注册完再评论,然后才能看到下载不了app
这个app网站升级过程丢了,找不到了,你直接应用商店下载一个就行,都可以用的,搜索 蓝牙串口
我是小白 ,大神能在讲详细点就好了,感谢感谢
6
我觉得不错
受教了
有没有WiFi串口工具?
我感觉循环那里应该有问题
怎么控制小灯颜色啊,有人知道吗,回复我一下,求调、教
首先你得是RGB灯,然后通过PWM控制三种颜色的引脚,通过不同的占空比来改变颜色
怎么了