Bluetooth на Raspberry Pi Pico W: чтение данных с датчика

Raspberry Pi Pico W, популярная плата для IoT‑проектов от Raspberry Pi Foundation, получила широкое распространение после запуска в 2022 году. С выходом C SDK версии 1.5.1 и обновлённой сборки MicroPython стало значительно проще активировать Bluetooth на платах Pico W и WH.
Плата позволяет читать и передавать данные по Bluetooth, что открывает множество практических проектов для Интернета вещей. Большинство шагов сводятся к обновлению прошивки и загрузке пары модулей MicroPython — далее показано, как считать данные с датчика и передавать их по BLE.
Что такое Pico W/WH и как он работает с Bluetooth
Raspberry Pi Pico W — микроконтроллерная плата, унаследовавшая форм‑фактор оригинальной Pico, но с добавлением радиочипа для Wi‑Fi и Bluetooth. Плата сохраняет привычный распаечный вывод с двумя 20‑контактными заголовками GPIO.

На Pico W установлен радиочип Infineon CYW43439, который поддерживает 802.11n Wi‑Fi и Bluetooth 5.2. Для работы BLE потребуется актуальная версия MicroPython или код на C/C++ с поддержкой стека Bluetooth.
Подготовка окружения разработчика
Если вы предпочитаете писать на C/C++, потребуется Pico C/C++ SDK — набор библиотек и инструментов для сборки приложений под Pico. Основные компоненты окружения:
- ARM GCC Compiler для кросс‑компиляции под RP2040.
- CMake для генерации файлов сборки.
- Build Tools for Visual Studio 2019, если используете Windows и Visual Studio.
- Python 3.9+ для инструментов SDK и утилит.
- Git для контроля версий.
- Visual Studio Code как удобный редактор (опционально).
Если вы предпочитаете быструю разработку и примеры, используйте MicroPython — ниже приведён рабочий путь с Thonny.
Установка MicroPython и прошивки UF2
Есть два простых способа попасть в режим загрузчика (bootloader) на Pico W:
- В MicroPython REPL выполнить команду machine.bootloader().
- Удерживать кнопку BOOTSEL при подключении платы по USB.
В режиме загрузчика Pico W смонтируется как USB‑накопитель. Скопируйте в него UF2‑файл с новой прошивкой MicroPython, скачанный со страницы загрузки MicroPython.

При записи UF2 светодиод на плате будет быстро мигать; после завершения плата автоматически перезагрузится и будет готова к использованию.
Прошивка через Thonny
- Подключите Pico, удерживая BOOTSEL при подключении, чтобы включить режим загрузчика.
- Запустите Thonny.

- В меню Thonny перейдите в Tools > Options.

- Во вкладке Interpreter выберите MicroPython (Raspberry Pi Pico). Установите порт на Try to detect automatically и нажмите ссылку для установки прошивки. Thonny предложит актуальную версию MicroPython для вашей платы и выполнит прошивку.

После установки закройте окна установки и нажмите OK.
Сохранение необходимых модулей для Bluetooth
Для работы BLE в MicroPython на Pico W нужны два вспомогательных скрипта — они упрощают рекламирование (advertising) и реализацию периферийного устройства BLE.
- Откройте наш репозиторий на GitHub и скачайте файл ble_advertising.py — он собирает полезную полезную нагрузку и формирует пакеты рекламы для BLE.

В Thonny создайте новый файл, вставьте содержимое и сохраните на Raspberry Pi Pico как ble_advertising.py (File > Save as > Raspberry Pi Pico).
Аналогично сохраните ble_simple_peripheral.py — он реализует базовое периферийное поведение и отправку данных.

После этого у вас на плате будут два модуля, необходимые для демо‑передачи данных по BLE.
Чтение и отправка данных по Bluetooth LE с Pico W
Создайте файл main.py и вставьте следующий код. Он читает встроенный датчик температуры и отправляет значение через BLE, если есть подключённый центральный узел.
from machine import Pin, ADC
import bluetooth
from ble_simple_peripheral import BLESimplePeripheral
import time
# Создаём объект BLE
ble = bluetooth.BLE()
# Создаём экземпляр периферии с переданным BLE
sp = BLESimplePeripheral(ble)
adc = ADC(4)
while True:
if sp.is_connected(): # Проверяем, установлено ли BLE соединение
# Считываем значение внутреннего температурного датчика
temperature = adc.read_u16() * 3.3 / (65535 * 0.8)
# Передаём значение температуры по BLE
temperature_data = str(temperature).encode()
sp.send(temperature_data)
time.sleep(1)Сохраните как main.py на Pico W и запустите скрипт в Thonny. В Shell вы должны увидеть сообщение о запуске рекламы, например «Starting Advertising». Устройство будет передавать показания каждую секунду при подключении центрального устройства.
Настройка Android‑приложения для приёма данных

На Android‑смартфоне установите приложение Serial Bluetooth Terminal из Google Play.
- Откройте приложение и переключитесь на вкладку Devices.

- Вкладка Bluetooth LE → нажмите SCAN.

После сканирования вы увидите устройство с именем mpy‑uart. Подключитесь к нему.

В терминале приложения появится статус «Connected», а в поток будут приходить значения температуры каждую секунду.

Можно также использовать модуль ble_simple_central.py на второй плате Pico W, чтобы организовать центральную роль и принимать данные с периферии.
Улучшения и варианты применения
- Используйте внешний датчик (DS18B20, DHT22, BME280) вместо внутреннего ADC для получения реалистичных показаний окружающей среды.
- Передавайте сериализованные данные в форматах CSV или JSON, если центральная точка принимает структурированные данные.
- Добавьте механизм сохранения на флеш (LittleFS) при потере связи, чтобы синхронизировать буфер после восстановления соединения.
Альтернативные подходы
- Использовать C/C++ SDK и реализовать BLE‑функционал в нативном коде для более высокой производительности и контроля над стеком.
- Применять внешний BLE‑модуль (например, на основе nRF52) через UART или SPI, если требуется отдельный радиомодуль с сертификатами.
- Задействовать Bluetooth Classic через отдельный модуль для совместимости со старым оборудованием, где BLE не поддерживается.
Когда это может не сработать
- Недостаточная версия MicroPython или устаревшая прошивка — обновите UF2.
- Неправильно сохранённые имена файлов модулей (ble_advertising.py и ble_simple_peripheral.py обязателен). Убедитесь в точном совпадении имён.
- Конфликты с другими библиотеками, изменяющими интерфейс bluetooth в MicroPython.
- Аппаратные неисправности радиочипа Infineon CYW43439 или повреждение антенны.
Чеклисты по ролям
Чеклист для изготовителя (Maker):
- Убедиться, что Pico W — версия W или WH.
- Подготовить кабель USB и компьютер.
- Перешить UF2 через Thonny или вручную.
- Сохранить на плате ble_advertising.py, ble_simple_peripheral.py, main.py.
- Подключиться к смартфону и проверить приём.
Чеклист для разработчика:
- Настроить окружение: Python 3.9+, Thonny, Git.
- Проверить версии зависимостей и документацию MicroPython по BLE.
- Написать интеграционные тесты для приёма/отправки пакетов.
Чеклист для тестировщика:
- Проверить устойчивость соединения при помехах.
- Проверить поведение при потере питания и восстановлении.
- Проверить корректность значений (грубая проверка на отрицательные/аномальные числа).
Критерии приёмки
- Pico W запускает main.py и начинает рекламировать BLE.
- Приложение на Android видит устройство mpy‑uart в списке BLE.
- После подключения в терминал каждую секунду приходят значения температуры в ожидаемом диапазоне.
- При разрыве соединения плата не входит в неограниченный ошибочный цикл и восстанавливает рекламу.
Устранение неполадок — пошаговый план реакции
Нет устройства в списке BLE на смартфоне:
- Перепрошьйте UF2, проверьте, что Thonny показывает плату как MicroPython.
- Перезагрузите смартфон и Pico.
- Проверьте, не занята ли антенна металлическим корпусом или помехами.
Соединение устанавливается, но данные не приходят:
- Убедитесь, что main.py действительно запущен и sp.send() вызывается.
- Вставьте отладочный вывод в код (print) и смотрите Thonny Shell.
Частые разрывы связи:
- Уменьшите частоту отправки (увеличьте интервал в time.sleep).
- Проверьте наличие источников радиопомех рядом.
Плата не определяется как USB‑накопитель в режиме bootloader:
- Попробуйте другой USB‑порт или кабель данных.
- Удерживайте BOOTSEL при подключении и попробуйте снова.
Мини‑методология: как подойти к проекту с BLE на Pico W
- Определите требуемую роль устройства: периферия или центральное устройство.
- Выберите стэк: MicroPython для быстрого прототипа или C/C++ для производительности.
- Прошейте плату, загрузите вспомогательные модули, убедитесь в корректности имён файлов.
- Разработайте и протестируйте передачу небольших пакетов, затем масштабируйте.
- Добавьте обработку ошибок и сохранение данных при потере связи.
Безопасность и конфиденциальность
- BLE по умолчанию не шифрует рекламные пакеты. Не передавайте чувствительные данные в открытом виде.
- При необходимости используйте шифрование приложения (например, симметричное шифрование на уровне данных) и проверку подлинности соединения.
- На Android‑стороне не давайте приложению лишних разрешений и отключайте автопереключение на доверенные устройства.
1‑строчный глоссарий
- BLE — Bluetooth Low Energy, энергосберегающий профиль Bluetooth.
- UF2 — формат прошивки для устройств, который записывается в виде файла на USB‑накопитель.
- Peripheral — роль BLE‑устройства, которое рекламирует свои сервисы.
- Central — роль BLE‑устройства, которое сканирует и подключается к периферии.
Короткое резюме
Bluetooth на Raspberry Pi Pico W предоставляет быстрый путь для передачи телеметрии с микроконтроллера на смартфон или другое устройство. С обновлённой прошивкой MicroPython и двумя вспомогательными модулями вы получаете рабочую платформу для прототипирования IoT‑решений.
Важно: если нужна высокая производительность или специфичные профили BLE, рассматривайте нативную реализацию на C/C++ или внешний радиомодуль.
Примечание
Если вы добавляете внешние датчики или сохраняете данные на сервер, обязательно протестируйте сценарии потери соединения и проблем с питанием, а также рассмотрите шифрование данных при передаче.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента