Стало известно, что Wi-Fi и Bluetooth LE ранее нельзя было использовать одновременно на платах Arduino, оснащённых беспроводным модулем u-blox NINA-W102 на базе ESP32. Это затрагивало платы Arduino Nano RP2040 Connect , Arduino MKR WiFi 1010 и Arduino Nano 33 IoT .
Эта долгосрочная проблема существовала с момента появления первой платы Arduino с NINA-W10 в 2018 году и означала, что можно было использовать либо Wi-Fi, либо Bluetooth LE, но не оба интерфейса одновременно. Хорошая новость заключается в том, что проблема наконец решена благодаря новой прошивке для модуля и новым библиотекам для Wi-Fi и BLE.
Если конкретнее, потребуются следующие библиотеки и прошивка:
- Библиотека WiFiNINA версии 2.0.0 или новее
- Библиотека ArduinoBLE версии 2.0.0 или новее
- Прошивка NINA-W102 версии 3.0.1 или новее
Библиотеки можно легко обновить через Менеджер библиотек в Arduino IDE, а прошивку необходимо обновить с помощью Инструмента обновления прошивки в меню Инструменты > WiFi101 / WiFiNINA Firmware Updater.
Все три платы, упомянутые во вступлении, получают преимущества от этого обновления. Однако плата Arduino UNO WiFi Rev2 не может этого сделать из-за ограниченной памяти, несмотря на то, что также оснащена модулем NINA-W102. Вот пример кода, в котором одновременно используются и Wi-Fi, и Bluetooth:
#include <WiFiNINA.h>
#include <ArduinoBLE.h>
char ssid[] = "yourSSID"; // your network SSID (name)
char pass[] = "yourPassword"; // your network password (use for WPA, or use as key for WEP)
int status = WL_IDLE_STATUS;
void setup() {
Serial.begin(9600);
while (!Serial);
String fv = WiFi.firmwareVersion();
if (fv < "3.0.0") {
Serial.println("Please upgrade the firmware, you can't run both WiFi and BLE with this version");
}
// attempt to connect to WiFi network:
while (status != WL_CONNECTED) {
Serial.print("Attempting to connect to SSID: ");
Serial.println(ssid);
// Connect to WPA/WPA2 network.
status = WiFi.begin(ssid, pass);
// wait 10 seconds for connection:
delay(10000);
}
Serial.println("Connected to WiFi");
// Initialize BLE
if (!BLE.begin()) {
Serial.println("Failed to initialize BLE!");
while (true);
}
// Set BLE device name and local name
BLE.setLocalName("ArduinoCNXSoftPeripheral");
// Create and add a dummy BLE service
BLEService dummyService("180A"); // UUID for the Device Information service
BLE.addService(dummyService);
// Start BLE advertising
BLE.advertise();
Serial.println("BLE advertising started...");
}
void loop() {
// Add logic here to handle BLE connections or WiFi tasks if needed
}
Это всё хорошо, но почему именно ранее нельзя было использовать Wi-Fi и Bluetooth LE одновременно? Причина в том, что Wi-Fi был подключён через SPI, а Bluetooth — через UART, при этом SPI и UART использовали некоторые общие контакты, чтобы сохранить больше GPIO для пользователя, что создавало конфликты при одновременной работе обоих интерфейсов. Решением стало использование SPI как для Wi-Fi, так и для Bluetooth. Однако это не объясняет, почему это заняло так много времени.

Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.
