【DigiKey好物畅享】Arduino UNO R4 WiFi开发板的蓝牙功能使用

本期分享的是Arduino 的新一代UNO开发板,Arduino UNO R4 WiFi 是 Arduino 产品线的一次重大跨越。它将经典的 UNO 形状和 5V 兼容性(兼容旧版 Shield)与 Renesas RA4M1 32位 MCU 和 ESP32-S3 WiFi/BLE 模块 融合在一起,定义了 Arduino 的“下一代”标准。但是Arduino UNO R4 WiFi 的 BLE 功能基于板载 ESP32-S3 模块。UNO R4 WiFi 出厂固件通常为 0.1.x(仅支持 Wi-Fi)。要使用 BLE 功能,必须升级至 0.2.0 或更高版本。出厂时板载固件可能不支持 BLE(仅 Wi-Fi),需要通过 Arduino IDE 更新无线模块固件至支持 BLE 的版本。更新固件方法可参考官网Arduino UNO R4 WiFi的相关介绍,主要有三种方法:

1. 通过Arduino IED自带固件升级方案:设置—固件更新—选择对应开发板即可(但是国内网络不稳定,可能升级失败);

2. 打开Arduino官网,搜索关键次”Radio module firmware version 0.2.0 is now available”在相关讨论板块有介绍;

3.Arduino官网论坛下载unor4wifi-update-linux.zip文件运行烧写到即可。

主控单元 (CPU):Renesas RA4M1 通讯单元 (WiFi/BLE):ESP32-S3-MINI-1-N8
架构: Arm Cortex-M4 (32位) 架构: Xtensa 双核 32位 LX7 MCU
主频: 48MHz 频率: 最高 240MHz
内存: 256KB Flash, 32KB SRAM, 8KB EEPROM 内存: 384KB ROM, 512KB SRAM
特色: (FPU)、CAN总线、DAC、OPAMP、RTC、USB HID 特色: 板载天线、低功耗、可作为独立协处理器

下载ArduinoBLE.h,打开ButtonLED案例教程,编译完成烧写到Arduino Uno R4 WIF

通过Arduino BLE模块,实现按键状态监测与LED灯的远程/本地双重控制,以下是代码的逐段解析和逻辑梳理:

一、头文件与引脚定义

#include <ArduinoBLE.h>

const int ledPin = LED_BUILTIN; // 开发板自带LED引脚

const int buttonPin = 4; // 按键连接的数字引脚4

//引入 ArduinoBLE 库,用于驱动BLE蓝牙模块。

//定义LED和按键对应的硬件引脚, LED_BUILTIN 是开发板默认的LED引脚(通常为13号)。

二、BLE服务与特征值创建

BLEService ledService(“19B10010-E8F2-537E-4F6C-D104768A1214”); // 自定义BLE服务UUID

BLEByteCharacteristic ledCharacteristic(“19B10011-E8F2-537E-4F6C-D104768A1214”, BLERead | BLEWrite); // LED特征值(可读可写)

BLEByteCharacteristic buttonCharacteristic(“19B10012-E8F2-537E-4F6C-D104768A1214”, BLERead | BLENotify); // 按键特征值(可读+通知)

//BLE服务:相当于一个功能集合,用唯一UUID标识,供蓝牙中心设备(如手机)识别。

//LED特征值:支持 BLERead (中心设备读取状态)和 BLEWrite (中心设备写入指令控制LED)。

//按键特征值:支持 BLERead (中心设备读取按键状态)和 BLENotify (按键状态变化时主动通知中心设备)。

三、初始化函数 setup()

1. 串口与引脚初始化

Serial.begin(9600);

while (!Serial); // 等待串口连接

pinMode(ledPin, OUTPUT); // LED引脚设为输出

pinMode(buttonPin, INPUT); // 按键引脚设为输入

2. BLE模块启动与检测

if (!BLE.begin()) {

Serial.println(“starting Bluetooth® Low Energy module failed!”);

while (1); // 启动失败则卡死程序

}

3. BLE参数配置与广播

BLE.setLocalName(“ButtonLED”); // 设置蓝牙设备名称

BLE.setAdvertisedService(ledService); // 绑定要广播的服务

ledService.addCharacteristic(ledCharacteristic); // 特征值加入服务

ledService.addCharacteristic(buttonCharacteristic);

BLE.addService(ledService); // 服务加入BLE协议栈

ledCharacteristic.writeValue(0); // 初始值:LED关闭

buttonCharacteristic.writeValue(0); // 初始值:按键未按下

BLE.advertise(); // 开始广播,等待中心设备连接

Serial.println(“Bluetooth® device active, waiting for connections…”);

四、主循环函数 loop()

1. BLE事件轮询

BLE.poll(); // 持续检测BLE连接、数据传输等事件

2. 按键状态检测与更新

char buttonValue = digitalRead(buttonPin); // 读取当前按键状态

bool buttonChanged = (buttonCharacteristic.value() != buttonValue); // 判断状态是否变化

if (buttonChanged) {

ledCharacteristic.writeValue(buttonValue); // 同步按键状态到LED特征值

buttonCharacteristic.writeValue(buttonValue); // 更新按键特征值

}

//按键按下时 buttonValue 为高电平(1),松开时为低电平(0)。

//状态变化时,自动同步两个特征值,实现按键本地控制LED。

3. LED状态控制

if (ledCharacteristic.written() || buttonChanged) { // 触发条件:中心设备写指令 或 按键状态变化

if (ledCharacteristic.value()==0x32) { // 特征值为1时

Serial.println(“LED on”);

digitalWrite(ledPin, HIGH); // 点亮LED

} else { // 特征值为0时

Serial.println(“LED off”);

digitalWrite(ledPin, LOW); // 熄灭LED

}

}

//支持两种控制方式:Arduino Uno R4 WIF开发板按键控制和蓝牙中心设备远程控制

核心逻辑总结

1. 蓝牙未连接时:按键直接控制LED,按下亮、松开灭。

2. 蓝牙连接后:手机等中心设备可读写 ledCharacteristic 远程控制LED,同时按键状态变化会主动通知中心设备。

本期总结:使用Arduino UNO R4 WiFi的ESP32通讯模组完成低功耗蓝牙Ble的使用,扩展该开发板的应用场景及智能家居领域的小刀试水,通过已上案例充分说明Arduino UNO R4 WiFi新一代开发板功能强大及对于电子爱好者来说开发板的资源对于实现各种功能是绰绰有余的。