【DPJCN物联网工具集小程序】之 蓝牙扫码连接彩色灯工具使用说明

  • ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️
  • ❤️ 本篇创建记录 2025-03-03 ❤️
  • ❤️ 本篇更新记录 2025-03-03 ❤️
  • 🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝
  • 🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!

1. 前言

为了更加方便调试开发物联网应用,博主开发了一个DPJCN物联网工具集小程序,目标是整合一些常用的开发工具到微信小程序中(毕竟现在电脑端也支持打开小程序了,那就等于这些开发工具都可以电脑端使用了,相比以往更加方便),同时也是计划不断添加新的可用性项目操作界面。
在这里插入图片描述

目前小程序已经通过备案认证,微信上可直接搜索“DPJCN物联网工具集”使用。
在这里插入图片描述
使用中存在任何问题,可以在评论区说明,博主都会修复。

2. 蓝牙彩色灯工具使用说明

这里使用esp32来作为ble客户端,通过小程序来对它的服务特征进行通信。
硬件材料

  1. esp32
  2. ws2812灯带,这里用10个灯,使用引脚4

在这里插入图片描述
这个板子是博主自制的一个小pcb。

2.1 下载一下代码到ESP32

  • bleColor.ino
// 导入必要的库
#include <BLEDevice.h>
#include <BLEServer.h>
#include <BLEUtils.h>
#include <BLE2902.h>
#include <ArduinoJson.h>   // 引入JSON处理库
#include "module_ws2812.h" // 引入WS2812库

// 设备启动打印信息
const char projectInfo[] PROGMEM = R"rawliteral(
/* *****************************************************************
 * 基于ESP32C3 SuperMini的蓝牙灯带控制系统
 *
 * 创建日期   :2024.12.14
 * 最后更改日期:2024.12.14
 *
 *
 * *****************************************************************/
)rawliteral";

/******************* 常量声明 **********************/
// 定义收发服务的UUID(唯一标识)
#define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
// 定义唯一特征 用来接收蓝牙app发送过来的数据
#define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
// 定义唯一特征 用来发送给蓝牙app
#define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"
// 说明一下,这两个ID主要用来做同步

#define INTERVAL 10000 // 读取时间间隔,默认10s
#define BUFFER_SIZE 20 // 缓存区大小
/******************* 常量声明 **********************/

/******************* 函数声明 **********************/
void initBLE(void); // 初始化BLE
void send(void);    // 发送数据
/******************* 函数声明 **********************/

/******************* 变量定义 **********************/
BLECharacteristic *pCharacteristicWrite;
BLECharacteristic *pCharacteristicNotify;

BLEServer *pServer;

char command[BUFFER_SIZE]; // 存储上传Json数据
bool deviceConnected = false;
bool oldDeviceConnected = false;
String data = "";
unsigned long previousMillis = 0; // 记录上次读取的时间戳
bool hasInit = false;
String macAddress = "";
/******************* 变量定义 **********************/

// 定义一个Server回调
class MyServerCallbacks : public BLEServerCallbacks
{
  void onConnect(BLEServer *pServer)
  {
    Serial.println("------>有一个设备连入: ");
    deviceConnected = true;
    previousMillis = 0;
  }

  void onDisconnect(BLEServer *pServer)
  {
    deviceConnected = false;
  }

  void onMtuChanged(BLEServer *pServer, esp_ble_gatts_cb_param_t *param)
  {
    Serial.println("onMtuChanged>> MTU: ");
    Serial.println(param->mtu.mtu);
    Serial.println("onMtuChanged()");
  }
};

// 定义一个特征回调
class MyWriteCallbacks : public BLECharacteristicCallbacks
{
  void onRead(BLECharacteristic *pCharacteristic)
  {
    // 处理读取请求
  }

  void onWrite(BLECharacteristic *pCharacteristic)
  {
    // 处理写入请求
    std::string rxValue = pCharacteristic->getValue();
    if (rxValue.length() > 0)
    {
      Serial.print("------>收到数据: ");
      Serial.println(rxValue.c_str());
      data = rxValue.c_str();
      Serial.println();
      parseData(data);
    }
  }
};

void setup()
{
  delay(2000);          // 延时2秒,用于等待系统上电稳定
  Serial.begin(115200); // 初始化串口,波特率 115200
  Serial.println(projectInfo);

  initBLE();    // 初始化BLE
  initWS2812(); // 初始化WS2812
}

void loop()
{
  // 断开连接
  if (!deviceConnected && oldDeviceConnected)
  {
    // 给蓝牙准备数据时间
    delay(500);
    BLEAdvertisementData oAdvData = BLEAdvertisementData();
    // 设置广播数据
    oAdvData.setManufacturerData(macAddress.c_str());

    pServer->getAdvertising()->setAdvertisementData(oAdvData);
    pServer->getAdvertising()->addServiceUUID(SERVICE_UUID);
    pServer->getAdvertising()->start();
    Serial.println("等待一个客户端连接通知...");
    hasInit = false;
  }

  // 正在连接时
  if (deviceConnected && !oldDeviceConnected)
  {
    // 记录正在连接
    oldDeviceConnected = deviceConnected;
  }

  if (deviceConnected)
  {
    if (!hasInit)
    {
      delay(300); // 延时300ms
      hasInit = true;
    }
  }

  ws2812Loop();

  delay(1000);
}

/**
 * 初始化BLE
 */
void initBLE(void)
{
  // 初始化一个ble设备
  BLEDevice::init("esp32A");
  macAddress = BLEDevice::getAddress().toString().c_str();

  Serial.print("MAC:");
  Serial.println(macAddress);
  // 为蓝牙设备创建一个服务器
  pServer = BLEDevice::createServer();
  pServer->setCallbacks(new MyServerCallbacks());
  // 基于SERVICE_UUID来创建一个服务
  BLEService *pService = pServer->createService(SERVICE_UUID);
  // 创建一个ble特征,用于收到对方数据
  pCharacteristicWrite = pService->createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_WRITE);
  pCharacteristicWrite->setCallbacks(new MyWriteCallbacks());
  pCharacteristicNotify = pService->createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY);
  pCharacteristicNotify->addDescriptor(new BLE2902());
  // 启动服务器
  pService->start();
  // 启动广播
  pServer->getAdvertising()->addServiceUUID(SERVICE_UUID);
  BLEAdvertisementData oAdvData = BLEAdvertisementData();
  // 设置广播数据
  oAdvData.setManufacturerData(macAddress.c_str());
  pServer->getAdvertising()->setAdvertisementData(oAdvData);
  pServer->getAdvertising()->start();
  Serial.println("等待一个客户端连接通知...");
  Serial.print("MTU:");
  Serial.println(BLEDevice::getMTU());
}
  • module_ws2812.h

#ifndef MODULE_WS2812_H
#define MODULE_WS2812_H

#include <Adafruit_NeoPixel.h> // 引入WS2812库

/******************* 常量声明 **********************/
#define WS2812_PIN 4        // WS2812对应的控制引脚
#define NUM_PIXELS 10        // ws2812灯珠长度
#define BRIGHT 8            // 灯珠亮度
#define PARAM_RED "red"     // 红色
#define PARAM_GREEN "green" // 绿色
#define PARAM_BLUE "blue"   // 蓝色
/******************* 常量声明 **********************/

void initWS2812(void);
void parseData(String content);
void colorRGB(int red, int green, int blue);
void ws2812Loop();

Adafruit_NeoPixel pixels(NUM_PIXELS, WS2812_PIN, NEO_GRB + NEO_KHZ800); // 表示WS2812模块

int red = 255, green = 255, blue = 255;

/**
 * 初始化WS2812
 */
void initWS2812(void)
{
  pixels.begin();               // 初始化WS2812
  pixels.setBrightness(BRIGHT); // 设置灯珠亮度
}

void ws2812Loop()
{
}

/**
 * 功能描述: 解析小程序发送过来的控制命令json字符串
 * 2.颜色控制页面
 * {
 *     "r": 154,
 *     "g": 147,
 *     "b": 255
 * }
 **/
void parseData(String content)
{
  DynamicJsonDocument doc(500);
  DeserializationError error = deserializeJson(doc, content);

  if (error)
  {
    // json解析失败
    Serial.println("deserializeJson() failed: ");
    Serial.println(error.c_str());
    return;
  }

  red = doc["r"];
  green = doc["g"];
  blue = doc["b"];
  colorRGB(red, green, blue);
}

/**
 * 控制RGB颜色
 */
void colorRGB(int red, int green, int blue)
{
  Serial.print("colorRGB:");
  Serial.print(red);
  Serial.print(",");
  Serial.print(green);
  Serial.print(",");
  Serial.println(blue);
  for (int index = 0; index < NUM_PIXELS; index++)
  {
    pixels.setPixelColor(index, red, green, blue); // 设置每个WS2812灯珠RGB值
    pixels.show();                                 // 发送RGB值给到每个WS2812灯珠
  }
}

#endif

在这里插入图片描述
这里我们用到了二维码扫码功能,内容就是mac地址。所以先生成一个二维码待会使用。

在这里插入图片描述

2.2 打开小程序,选择蓝牙彩色灯

在这里插入图片描述
在这里插入图片描述

2.3 扫码二维码控制彩色灯

在这里插入图片描述
分别控制三种颜色。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
也能看到对应的调试信息。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机菜鸟哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值