ESP32-CAM 连接低功耗蓝牙的步骤

1.第一步,设定蓝牙的UUID 共三个,代码如下:

#define SERVICE_UUID "43F4B114-CA67-48E8-A46F-9A8FFEB7146A"
#define CHARACTERISTIC_WRITE_NO_RESPONSE_UUID "BF83F3F1-399A-414D-9035-CE64CEB3FF67"
#define CHARACTERISTIC_NOTIFY_UUID "BF83F3F2-399A-414D-9035-CE64CEB3FF67"
#define BLE_SERVER_NAME "HEA2100010N000019N" 

SERVICE_UUID 服务uuid

CHARACTERISTIC_WRITE_NO_RESPONSE_UUID 写入的uuid

CHARACTERISTIC_NOTIFY_UUID 读的UUID

BLE_SERVER_NAME 蓝牙名称

2.第二步,连接低功耗蓝牙,并接收返回数据。

// 搜索到设备时回调功能
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
    void onResult(BLEAdvertisedDevice advertisedDevice) {
      // if (advertisedDevice.haveServiceUUID() && advertisedDevice.isAdvertisingService(BLEUUID("4fafc201-1fb5-459e-8fcc-c5c9c331914b"))) {
      if (advertisedDevice.haveName() && (advertisedDevice.getName() == BLE_SERVER_NAME)) {
          advertisedDevice.getScan()->stop(); // 停止当前扫描
          pServer = new BLEAdvertisedDevice(advertisedDevice); // 暂存设备
          doSacn = false;
          doConnect = true;
          Serial.println(" - 发现连接设备");
      }
    }
};

// 客户端与服务器连接与断开回调功能
class MyClientCallback : public BLEClientCallbacks {
  void onConnect(BLEClient* pclient) {}
  void onDisconnect(BLEClient* pclient) {
    doSacn = true;
    connected = false;
    Serial.println(" - 失去与设备的连接");
  }
};

// 收到服务推送的数据时的回调函数
void NotifyCallback(BLERemoteCharacteristic* pBLERemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify) {
    char buf[length + 1];
    for (size_t i = 0; i < length; i++) {
      buf[i] = pData[i];
    }
    buf[length] = 0;
    Serial.printf("[%d]: %s\n", length, buf);
}

// 用来连接设备获取其中的服务与特征
bool ConnectToServer(void) {
    BLEClient* pClient  = BLEDevice::createClient(); // 创建客户端
    pClient->setClientCallbacks(new MyClientCallback()); // 添加客户端与服务器连接与断开回调功能
   
    if (!pClient->connect(pServer)) { //尝试连接设备
      return false;
    }else{
      Serial.println(" - [server]: 连接设备成功");
    }
    
    BLERemoteService* pRemoteService = pClient->getService(SERVICE_UUID); // 尝试获取设备中的服务
    if (pRemoteService == nullptr) {
      Serial.println(" - 获取服务失败");
      pClient->disconnect();
      return false;
    }else{
      Serial.println(" - [server]: 获取服务成功");
    }
    
    pRemoteCharacteristicWrite = pRemoteService->getCharacteristic(CHARACTERISTIC_WRITE_NO_RESPONSE_UUID); // 尝试获取服务中的特征
    if (pRemoteCharacteristicWrite == nullptr) {
      Serial.println(" - [Write]:获取特性失败");
      pClient->disconnect();
      return false;
    }else{
      Serial.println(" - [Write]: 获取特征成功..");
    }
    
    if(pRemoteCharacteristicWrite->canRead()) { // 如果特征值可以读取则读取数据
      Serial.printf(" - 该特征值可以读取并且当前值为[Write]: %s\r\n", pRemoteCharacteristicWrite->readValue().c_str());
    }else{
      Serial.println(" - [Write]: CHARACTERISTIC_WRITE_NO_RESPONSE_UUID canRead ERROR!");
    }
    
    if(pRemoteCharacteristicWrite->canNotify()) { // 如果特征值启用了推送则添加推送接收处理
      pRemoteCharacteristicWrite->registerForNotify(NotifyCallback);
    }else{
      Serial.println(" - [Write]: CHARACTERISTIC_WRITE_NO_RESPONSE_UUID canNotify ERROR!");      
    }

    pRemoteCharacteristicNotify = pRemoteService->getCharacteristic(CHARACTERISTIC_NOTIFY_UUID); // 尝试获取服务中的特征
    if (pRemoteCharacteristicWrite == nullptr) {
      Serial.println(" - [Notify]:获取特性失败");
      pClient->disconnect();
      return false;
    }else{
      Serial.println(" - [Notify]: 获取特征成功..");
    }
  
    if(pRemoteCharacteristicNotify->canRead()) { // 如果特征值可以读取则读取数据
      Serial.printf(" - 该特征值可以读取并且当前值为[Write]: %s\r\n", pRemoteCharacteristicNotify->readValue().c_str());
    }else{
      Serial.println(" - [Notify]: CHARACTERISTIC_NOTIFY_UUID canRead ERROR!");
    }
    if(pRemoteCharacteristicNotify->canNotify()) { // 如果特征值启用了推送则添加推送接收处理
      pRemoteCharacteristicNotify->registerForNotify(NotifyCallback);     
    }else{
      Serial.println(" - [Notify]: CHARACTERISTIC_NOTIFY_UUID canNotify ERROR!");      
    }

}

3.第三步,写入特征值,获取返回的数据。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在上一期的免费项目:高性价比WIFI图传方案快速入门教程的介绍中,详细地介绍了ESP32-CAM模块的简单使用 ,其裁剪了官方图传和人脸识别的代码改造成简单的图传代码,由官方四个文件的代码缩减成一个文件的代码。目的就是让买家能快速上手这个源码。让这个源码复杂度降低很多,利于阅读和学习。 在这一期的免费项目:修改了上一期的项目的源码,实现嵌入式web server功能实现远程浏览器WIFI点灯的操作(PIN4的IO口集成了闪光灯LED,所以不用外接灯了,亮瞎眼的亮度),实现了将服务器嵌入到单片机,单片机wifi联网之后,局域网访问单片机主页(通过串口打印的网址)就可以在网页里面控制开发板的灯,该设计是ESP32-CAM物联网应用的一个巨大的尝试,本人浪费生命值写了两天代码,踩了很多坑,也学到很多,写了一共三个版本的代码,此版本的代码是最便宜的一个版本,呵呵,不会接线和操作的看上期的项目即可,这里不再重复说明了,重要的事情说一遍:我有收费版的代码,服务更周到。 下面请看模块运行效果图: 下面是实物图: 模块的原理图: 电脑接上串口CH340,CH340接上ESP32-CAM之后,打开串口调试助手,调试效果如下: 服务器返回消息: 真源码截图(绝对给力): 项目总结:这次是利用ESP32-CAM模块对物联网应用的一次巨大的尝试,在电路城目前好像还没有相关的教程,在B站虽然有类似的项目,但是根本没有源码,也没有教程,而且功能没有我这个那么强大,因为我这个嵌入式服务器是有反馈的,而且支持网页手动输入指令,开灯或者关灯指令发送之后服务器会给客户端一个响应的,代码都是自己手工完成的,也借鉴过很多相关的项目。只要掌握这个嵌入式服务器远程点灯的项目,那么其他类似的设计就可以举一反三了。需要注意的是这个版本的代码是没有任何注释的,代码冗余度也很大,收费版的代码更加精简和加入详细注释(最关键)和调试代码。如下所示: 后期的的项目会涉及到图像处理(颜色识别,人脸检测,人脸识别,颜色跟踪,智能小车,手机app客户端控制,云平台语音识别,云平台图像识别等等,私有云图像处理,私有云监控搭建)全部原创开源,敬请期待。
好的,以下是一个基本的 Arduino 代码,用于将 ESP32-CAM 连接蓝牙并实现无线监控: ```c++ #include "esp_camera.h" #include <BluetoothSerial.h> // Define the camera pins #define CAM_PIN_PWDN 32 #define CAM_PIN_RESET -1 #define CAM_PIN_XCLK 0 #define CAM_PIN_SIOD 26 #define CAM_PIN_SIOC 27 #define CAM_PIN_D7 35 #define CAM_PIN_D6 34 #define CAM_PIN_D5 39 #define CAM_PIN_D4 36 #define CAM_PIN_D3 21 #define CAM_PIN_D2 19 #define CAM_PIN_D1 18 #define CAM_PIN_D0 5 #define CAM_PIN_VSYNC 25 #define CAM_PIN_HREF 23 #define CAM_PIN_PCLK 22 // Create a BluetoothSerial object BluetoothSerial SerialBT; void setup() { Serial.begin(115200); // Initialize the camera camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = CAM_PIN_D0; config.pin_d1 = CAM_PIN_D1; config.pin_d2 = CAM_PIN_D2; config.pin_d3 = CAM_PIN_D3; config.pin_d4 = CAM_PIN_D4; config.pin_d5 = CAM_PIN_D5; config.pin_d6 = CAM_PIN_D6; config.pin_d7 = CAM_PIN_D7; config.pin_xclk = CAM_PIN_XCLK; config.pin_pclk = CAM_PIN_PCLK; config.pin_vsync = CAM_PIN_VSYNC; config.pin_href = CAM_PIN_HREF; config.pin_sscb_sda = CAM_PIN_SIOD; config.pin_sscb_scl = CAM_PIN_SIOC; config.pin_pwdn = CAM_PIN_PWDN; config.pin_reset = CAM_PIN_RESET; config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG; if (psramFound()) { config.frame_size = FRAMESIZE_UXGA; config.jpeg_quality = 10; config.fb_count = 2; } else { config.frame_size = FRAMESIZE_SVGA; config.jpeg_quality = 12; config.fb_count = 1; } esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x", err); return; } // Initialize the BluetoothSerial object SerialBT.begin("ESP32-CAM"); } void loop() { // Capture a frame from the camera camera_fb_t *fb = esp_camera_fb_get(); if (!fb) { Serial.println("Camera capture failed"); return; } // Send the frame over Bluetooth SerialBT.write(fb->buf, fb->len); // Release the frame buffer esp_camera_fb_return(fb); // Wait 50ms before capturing the next frame delay(50); } ``` 此代码使用 ESP32-CAM 模块连接蓝牙,并从摄像头捕获图像,并通过蓝牙发送它们。请注意,此代码假定您已经将 ESP32-CAM 配置为连接到 WiFi 并具有 Internet 访问权限。如果您还没有完成此操作,您需要先完成此操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值