0°

七,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’。

总体的程序是这样的:

/*******************************************************
                     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);
}

五.测试代码

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

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

 

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
3 条回复 A 作者 M 管理员
  1. 文件和视频都是 File not found…

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

    • OK, thanks!

欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论