Arduino 33 Nano BLE Sense не совместим с pulseIn()?

ble arduino-nano-ble 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.

nrf Connect App Screenshot

Когда Arduino включен, вызывается настройка, и она подключается во время работы установки. При первом вызове pulseIn() соединение BLE перестает работать. Но программа продолжает работать.

Я уже пробовал вызывать pulseIn() только каждые 10 секунд или только один раз, когда соединение BLE перестает работать.

И да, комментируя pulseIn() снова заставляет BLE работать.


Возможное Решение

Следующее, что я хотел бы попробовать, это удалить pulseIn() и использовать прерывания для измерения времени.

Мой вопрос в том, есть ли лучший способ исправить эту проблему?

, 👍1

Обсуждение

Скорее всего, вы не сможете смешать эти две библиотеки. Если вы так склонны, я бы погрузился в исходный код каждой библиотеки в попытке найти конфликт. Вероятно, вы ищете обе библиотеки, использующие один и тот же ресурс, такой как таймер. Настройка вашего собственного таймера, как указано в вопросе, может быть проще. Это может быть немного экстремально, но если вы понимаете базовый (для скетча Arduino) язык C++, вы также можете рассмотреть возможность уничтожения и создания библиотеки BLE всякий раз, когда захотите ее использовать., @st2000

откуда вы знаете, что он останавливается на " pulseIn ()"?... опубликованный вами код не имеет функций отладки, @jsotola

@jsotola как сказано в вопросе, код, который я опубликовал, очень *уменьшен*. Я печатаю значение, полученное от pulseIn ()`, и когда оно напечатано, соединение прекращается., @fuggerjaki61

поэтому он не останавливается на pulseIn() ... он останавливается через пару строк программы после, @jsotola

@jsotola извините, я не очень ясно представлял, *что* останавливается. Программа продолжает работать нормально, и я вижу, что отпечатки продолжаются. Но соединение BLE прекращается, как видно на скриншоте, устройство перестает "существовать"., @fuggerjaki61