Arduino 33 Nano BLE Sense не совместим с pulseIn()?
Предисловие
В настоящее время я делаю приложение на Arduino 33 Nano BLE Sense. Я пытаюсь измерить текущую влажность и отправить ее через BLE на другое устройство. Цель состоит в том, чтобы посылать точное значение с высокой частотой, 8-10 значений в секунду.
Для измерения влажности я подключил внешний датчик, быстрый емкостный датчик влажности P14 (он быстрее и точнее бортового датчика влажности) с таймером NE555 IC в моностабильном режиме.
Для считывания выходного импульса (частота: около 500 Гц) я использую pulseIn()
.
Мне удалось правильно рассчитать влажность, а также сработала передача данных BLE.
Проблема
Мой (уменьшенный) скетч:
#include <ArduinoBLE.h>
void setup() {
// некоторая настройка, занимает около 10 секунд
}
void loop() {
BLE.poll(); // опрос для новых событий занимает около 10 мкс
value = pulseIn(6, HIGH); // считывание высокого импульса занимает около 500-4000 мкс
// calculating the average value, takes < 1 µs
if ((/* это if выполняется каждые 1 секунду для целей тестирования, targeted - каждые 100 мс*/) {
// влажность рассчитывается, занимает около 20 мкс
characteristic.writeValue(/* calculated value */); // takes ca. 50 µs
}
}
Когда я объединил функции, начались проблемы. Я больше не мог подключаться к Arduino.
Когда я пытаюсь подключиться к нему (с помощью приложения nrf Connect), это происходит. Когда мне удастся подключиться к нему до того, как он перестанет работать, я буду отключен с исключением GATT_CONN_TIMEOUT.
Когда Arduino включен, вызывается настройка, и она подключается во время работы установки. При первом вызове pulseIn()
соединение BLE перестает работать. Но программа продолжает работать.
Я уже пробовал вызывать pulseIn()
только каждые 10 секунд или только один раз, когда соединение BLE перестает работать.
И да, комментируя pulseIn()
снова заставляет BLE работать.
Возможное Решение
Следующее, что я хотел бы попробовать, это удалить pulseIn()
и использовать прерывания для измерения времени.
Мой вопрос в том, есть ли лучший способ исправить эту проблему?
@fuggerjaki61, 👍1
Обсуждение0
- Какова работа pulseIn?
- Как управлять встроенными светодиодами Arduino Nano 33 BLE Sense?
- Питание/зарядка батареи Arduino Nano 33
- Копирование строки в другую строку
- Как использовать две функции pulseIn() одновременно в Arduino?
- Библиотека ардуино или код для ESP32 для сканирования устройств Bluetooth?
- Отправка/получение данных от/на Raspberry Pi к/от Arduino с помощью HM-10 (модуль Bluetooth LE)
- Arduino Nano 33 BLE - использование flash для хранения данных; как расширить фрагмент примера кода
Скорее всего, вы не сможете смешать эти две библиотеки. Если вы так склонны, я бы погрузился в исходный код каждой библиотеки в попытке найти конфликт. Вероятно, вы ищете обе библиотеки, использующие один и тот же ресурс, такой как таймер. Настройка вашего собственного таймера, как указано в вопросе, может быть проще. Это может быть немного экстремально, но если вы понимаете базовый (для скетча Arduino) язык C++, вы также можете рассмотреть возможность уничтожения и создания библиотеки BLE всякий раз, когда захотите ее использовать., @st2000
откуда вы знаете, что он останавливается на " pulseIn ()"?... опубликованный вами код не имеет функций отладки, @jsotola
@jsotola как сказано в вопросе, код, который я опубликовал, очень *уменьшен*. Я печатаю значение, полученное от pulseIn ()`, и когда оно напечатано, соединение прекращается., @fuggerjaki61
поэтому он не останавливается на pulseIn() ... он останавливается через пару строк программы после, @jsotola
@jsotola извините, я не очень ясно представлял, *что* останавливается. Программа продолжает работать нормально, и я вижу, что отпечатки продолжаются. Но соединение BLE прекращается, как видно на скриншоте, устройство перестает "существовать"., @fuggerjaki61