七,ESP32 android蓝牙控制LED

释放双眼,带上耳机,听听看~!

一.介绍

今天我们将制作一个很酷的多彩项目,我们将使用ESP32微控制器通过蓝牙控制rgb LED。简单来说,我们将通过手机控制RGB-LED。

ESP内置有低功耗蓝牙,它与我们在蓝牙音频等产品中可能会发现的传统蓝牙略有不同。BLE“服务器”(如ESP32读取传感器数据)可以定期“通知”客户端(如智能手机),而不是不断地传输数据,而是向他们发送一些数据。因此,BLE更适用于不需要大量数据的低功耗物联网应用。

前面的我们已经介绍了RGB-LED灯的如何使用了,我这里就不多说了。在这里我就重点说一下,ESP32内置蓝牙的使用。

二.元器件清单

  • ESP32开发板
  • 一个RGB-LED
  • 面包板
  • 导线若干

三.电路图

七,ESP32 android蓝牙控制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

 

给TA打赏
共{{data.count}}人
人已打赏
ESP32ESP32-基础

六、ESP32RGB-LED灯

2018-9-4 23:30:20

ESP32ESP32-基础

八,ESP32使用多个串行端口

2018-9-7 22:57:54

27 条回复 A文章作者 M管理员
  1. billq

    文件和视频都是 File not found…

    • Luca

      有些文章网站升级过程中丢失了哦,这个app可以从应用商店下载类似的蓝牙串口软件就可以了,程序是正确的哦

    • billq

      OK, thanks!

  2. 周全

    thanks

  3. 周全

    app下不了

    • Luca

      网站升级的时候丢失了,app从应用商店随便下载一个就可以,可以从“酷安”或者“应用汇”上面下载比较多蓝牙串口工具。

  4. devicegate

    thanks

  5. Codebear

    hahahaha

  6. 末世之王

    加油吧

  7. MT冷

    thanks

  8. 静水流深

    评论

  9. 狗

    学习

  10. 不可爱

    想看一下app真难

  11. 不可爱

    注册完再评论,然后才能看到下载不了app

    • Luca

      这个app网站升级过程丢了,找不到了,你直接应用商店下载一个就行,都可以用的,搜索 蓝牙串口

  12. Chris

    我是小白 ,大神能在讲详细点就好了,感谢感谢

  13. voven

    我觉得不错

  14. ESP8266EX

    受教了

  15. ESP8266EX

    有没有WiFi串口工具?

  16. 我感觉循环那里应该有问题

  17. 烟花易冷

    怎么控制小灯颜色啊,有人知道吗,回复我一下,求调、教

    • Luca

      首先你得是RGB灯,然后通过PWM控制三种颜色的引脚,通过不同的占空比来改变颜色

  18. 余伟小相如

    怎么了

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
'); })();