#include <Arduino.h> #include <BLEDevice.h> #include <BLEServer.h> #include <BLEUtils.h> #include <BLE2902.h> #include <String.h> BLECharacteristic *pCharacteristic; //创建一个BLE特性pCharacteristic bool deviceConnected = false; //连接否标志位 uint8_t txValue = 0; //TX的值 long lastMsg = 0; //存放时间的变量 String rxload = "BlackWalnutLabs"; //RX的预置值 #define SERVICE_UUID "6E400001-B5A3-F393-E0A9-E50E24DCCA9E" // UART service UUID #define CHARACTERISTIC_UUID_RX "6E400002-B5A3-F393-E0A9-E50E24DCCA9E" #define CHARACTERISTIC_UUID_TX "6E400003-B5A3-F393-E0A9-E50E24DCCA9E" //服务器回调 class MyServerCallbacks : public BLEServerCallbacks { void onConnect(BLEServer *pServer) { deviceConnected = true; }; void onDisconnect(BLEServer *pServer) { deviceConnected = false; } }; //特性回调 class MyCallbacks : public BLECharacteristicCallbacks { void onWrite(BLECharacteristic *pCharacteristic) { std::string rxValue = pCharacteristic->getValue(); if (rxValue.length() > 0) { rxload = ""; for (int i = 0; i < rxValue.length(); i++) { rxload += (char)rxValue[i]; Serial.print(rxValue[i]); } Serial.println(""); } } }; void setupBLE(String BLEName) { const char *ble_name = BLEName.c_str(); //将传入的BLE的名字转换为指针 BLEDevice::init(ble_name); //初始化一个蓝牙设备 BLEServer *pServer = BLEDevice::createServer(); // 创建一个蓝牙服务器 pServer->setCallbacks(new MyServerCallbacks()); //服务器回调函数设置为MyServerCallbacks BLEService *pService = pServer->createService(SERVICE_UUID); //创建一个BLE服务 pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY); //创建一个(读)特征值 类型是通知 pCharacteristic->addDescriptor(new BLE2902()); //为特征添加一个描述 BLECharacteristic *pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE); //创建一个(写)特征 类型是写入 pCharacteristic->setCallbacks(new MyCallbacks()); //为特征添加一个回调 pService->start(); //开启服务 pServer->getAdvertising()->start(); //服务器开始广播 Serial.println("Waiting a client connection to notify..."); } void setup() { Serial.begin(115200); setupBLE("ESP32BLE"); //设置蓝牙名称 } void loop() { long now = millis(); //记录当前时间 if (now - lastMsg > 1000) { //每隔1秒发一次信号 if (deviceConnected && rxload.length() > 0) { String str = rxload; if (str=="10086\r\n") { const char *newValue = str.c_str(); pCharacteristic->setValue(newValue); pCharacteristic->notify(); } } lastMsg = now; //刷新上一次发送数据的时间 } }————————————————
本文介绍ESP32中的中断机制,以及如何通过GPIO中断实现按钮控制。重点讲解了如何设置中断服务例程、处理中断抖动问题,并提供了消除中断抖动的示例代码。
本文主要介绍在未联网(AP热点)情况下实现WEB交互界面的CSS和javascript库。
本文介绍如何使用Arduino-ESP32库中的API函数获取ESP32的芯片、RAM信息等,并提供了一个示例程序代码。
ESP32系列(包括ESP32-S3)搭载Xtensa双核处理器,默认情况下Arduino框架仅使用单核运行用户代码,通过多核编程,可以充分利用硬件资源来提升系统响应和性能。
ESP32 芯片有34个物理GPIO管脚。每个GPIO管脚都可用作一个通用IO,或连接一个内部的外设信号。IO_MUX ¹、RTC IO MUX 和GPIO交换矩阵用于将信号从外设传输至GPIO管脚。