七,ESP32 android蓝牙控制LED

一.介绍

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

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

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

二.元器件清单

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

三.电路图

七,ESP32 android蓝牙控制LED

四.代码设计

关于arduino的代码接下来,我就进行详细地介绍,根据我自己的研究发现,使用ESP32的arduino示例程序BluetoothSerial:

  1. //This example code is in the Public Domain (or CC0 licensed, at your option.)
  2. //By Evandro Copercini - 2018
  3. //
  4. //This example creates a bridge between Serial and Classical Bluetooth (SPP)
  5. //and also demonstrate that SerialBT have the same functionalities of a normal Serial
  6. #include "BluetoothSerial.h"
  7. #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
  8. #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
  9. #endif
  10. BluetoothSerial SerialBT;
  11. void setup() {
  12. Serial.begin(115200);
  13. SerialBT.begin("ESP32test"); //Bluetooth device name
  14. Serial.println("The device started, now you can pair it with bluetooth!");
  15. }
  16. void loop() {
  17. if (Serial.available()) {
  18. SerialBT.write(Serial.read());
  19. }
  20. if (SerialBT.available()) {
  21. Serial.write(SerialBT.read());
  22. }
  23. delay(20);
  24. }

这里面的 Serial.read() 是读取我们手机发送的数据。也就是用来接收数据的,如果按照示例的设计的话,数据会丢掉的。而手机APP发送的数据是字符的形式发送过来的。

我的设计是这样的,我是利用一个数组通过循环来接收数据的:

  1. int i;
  2. char BT[9] = {0};
  3. for (i = 0; i < 9; i++)
  4. {
  5. BT[i] = SerialBT.read();
  6. }
  7. }

这里接收到的数据有九个,因为有R,G,B三种颜色,而每一种颜色有255种变化,所以就有九个数据。但是有时也会只有八个数据,我们可以判断BT[8]这一个数据,我是这样弄的:

  1. if (BT[8] )
  2. {
  3. Serial.println("OK ");
  4. red = chartonumber(BT[0])*100+chartonumber(BT[1])*10+chartonumber(BT[2]);
  5. green =chartonumber(BT[3])*100+chartonumber(BT[4])*10+chartonumber(BT[5]);
  6. blue = chartonumber(BT[6])*100+chartonumber(BT[7])*10+chartonumber(BT[8]);
  7. Serial.print(red);
  8. Serial.print(" ");
  9. Serial.print(green);
  10. Serial.print(" ");
  11. Serial.println(blue);
  12. }
  13. else
  14. {
  15. Serial.println("NO ");
  16. red = chartonumber(BT[0])*10+chartonumber(BT[1]);
  17. green =chartonumber(BT[2])*100+chartonumber(BT[3])*10+chartonumber(BT[4]);
  18. blue = chartonumber(BT[5])*100+chartonumber(BT[6])*10+chartonumber(BT[7]);
  19. Serial.print(red);
  20. Serial.print(" ");
  21. Serial.print(green);
  22. Serial.print(" ");
  23. Serial.println(blue);
  24. }

哦,对了,里面的 chartonumber()是把字符数据转换成整形数据。我定义了一个宏定义:

  1. #define chartonumber(x) (x-'0')

里面的X就是你自己需要转换的数据,x-‘0’是根据ASCAll表得出的。就是字符数字必整形数据间隔了一个‘0’。

总体的程序是这样的:

[scu name=”arduino-ide-post” platform=”esp32:esp32:esp32″]

  1. #include "BluetoothSerial.h"
  2. #if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
  3. #error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
  4. #endif
  5. #define chartonumber(x) (x-'0')
  6. BluetoothSerial SerialBT;
  7. long int val = 0;
  8. uint8_t ledR = 25;
  9. uint8_t ledG = 26;
  10. uint8_t ledB = 27;
  11. int i;
  12. char BT[9] = {0};
  13. int red = 0;
  14. int green = 0;
  15. int blue = 0;
  16. void setup() {
  17. Serial.begin(115200);
  18. ledcAttachPin(ledR, 1); //引脚的通道
  19. ledcAttachPin(ledG, 2);
  20. ledcAttachPin(ledB, 3);
  21. ledcSetup(1, 12000, 8); // 12 kHz PWM,8位的分辨率
  22. ledcSetup(2, 12000, 8);
  23. ledcSetup(3, 12000, 8);
  24. }
  25. void loop() {
  26. if (Serial.available()) {
  27. SerialBT.write(Serial.read());
  28. }
  29. if (SerialBT.available()) {
  30. delay(50);
  31. for (i = 0; i < 9; i++)
  32. {
  33. BT[i] = SerialBT.read();
  34. }
  35. }
  36. if (BT[8] )
  37. {
  38. Serial.println("OK ");
  39. red = chartonumber(BT[0]) * 100 + chartonumber(BT[1]) * 10 + chartonumber(BT[2]);
  40. green = chartonumber(BT[3]) * 100 + chartonumber(BT[4]) * 10 + chartonumber(BT[5]);
  41. blue = chartonumber(BT[6]) * 100 + chartonumber(BT[7]) * 10 + chartonumber(BT[8]);
  42. Serial.print(red);
  43. Serial.print(" ");
  44. Serial.print(green);
  45. Serial.print(" ");
  46. Serial.println(blue);
  47. }
  48. else
  49. {
  50. Serial.println("NO ");
  51. red = chartonumber(BT[0]) * 10 + chartonumber(BT[1]);
  52. green = chartonumber(BT[2]) * 100 + chartonumber(BT[3]) * 10 + chartonumber(BT[4]);
  53. blue = chartonumber(BT[5]) * 100 + chartonumber(BT[6]) * 10 + chartonumber(BT[7]);
  54. Serial.print(red);
  55. Serial.print(" ");
  56. Serial.print(green);
  57. Serial.print(" ");
  58. Serial.println(blue);
  59. }
  60. ledcWrite(1, (255 - red));
  61. ledcWrite(2, (255 - green));
  62. ledcWrite(3, (255 - blue));
  63. delay(100);
  64. }

五.测试代码

要测试代码,只需使用Arduino IDE上传它。然后,您应该看到手机切换RGB-LED灯效果。以下视频就是实现的效果:

http://gp.qutaojiao.com/index.php?share/file&user=100&sid=FBQ2kveD

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
ESP-32

六、ESP32RGB-LED灯

2025-4-15 17:08:05

ESP-32

八,ESP32使用多个串行端口

2025-4-15 17:15:18

个人中心
购物车
优惠劵
今日签到
私信列表
搜索