nRF24L01 + потеря пакетов, вызванная считыванием Arduino и связью с датчиками
У меня есть 2 ардуино, которые общаются друг с другом. Моя проблема в том, что один отправляет пакеты каждые 1,5-2 секунды, а другой Arduino выполняет считывание датчиков и загрузку данных с помощью модуля Wi-Fi, что может занять до 5 секунд до следующего раза, когда nRF24L01 + будет доступен для приема данных.
Это приводит примерно к 4 потерям пакетов, а если мне повезет, то и к 2. Есть ли способ, чтобы, когда nRF24L01 + отправляет данные, другой Arduino останавливает все, чтобы получить данные? Как связь между этими двумя ардуино, которая будет открыта 24/7, так что другой Arduino может выполнять многозадачность (считывать датчики и загружать данные через Wi-Fi).
Я использую код из этого урока. Вот моя проблема на изображении (надеюсь, это поможет вам ее понять). Заранее спасибо.
@Oluderi, 👍1
Обсуждение2 ответа
Вам нужно несколько переформулировать вашу программу (я бы предположил). nRF нужно читать одновременно с другими делами. Это означает чередование его с другими вашими операциями.
Существует концепция, называемая конечным автоматом, которая является лучшим способом написания такой сложной программы. Идея состоит в том, что ничто никогда не блокируется, а просто меняет состояния. И все время могут происходить другие вещи, такие как чтение модуля nRF24L01 +.
У меня есть небольшой учебник по конечному автомату здесь:
- https://hackingmajenkoblog.wordpress.com/2016/02/01/the-finite-state-machine /
Если вы используете концепцию конечного автомата для считывания ваших датчиков и записи данных в Wi-Fi, то nRF может быть постоянно опрошен за пределами FSM постоянно - возможно, с помощью собственного FSM, чтобы иметь дело с приемом и т. Д.
Что нужно запомнить:
- Избегайте
delay()
, конечно, для чего-то более длительного, чем пара мс. - Избегайте
while()
,for()
и т. Д., За исключением очень коротких циклов, которые быстро заканчиваются. - Любая операция, выполнение которой занимает более нескольких мс, должна быть разбита на несколько подопераций и закодирована как отдельные состояния FSM.
Я вижу, что это старая нить, но решил вмешаться.
Вы могли бы выполнить ту же функцию "конечного автомата" с операционной системой реального времени, построенной для микроконтроллеров. Я могу порекомендовать FreeRTOS в качестве удобного входа в это. Вы можете определить несколько постоянно работающих циклов while, которые обработчик потоков RTOS затем чередует для последовательного выполнения. У вас может быть 1 поток для вашего RF и 1 поток для вашего Wi-Fi с установленными скоростями выполнения, а RTOS обрабатывает все остальное, например, он будет пытаться поместить RF-считывания внутри цикла Wi-Fi всякий раз, когда он может найти время простоя. Это, скорее всего, сделает ваш цикл Wi-Fi несколько длиннее в качестве жертвы. Вы можете начать с этого: Краткое руководство по запуску ядра FreeRTOS Справочное руководство FreeRTOS
- Как автоматически сбросить nrf24l01+ с кодом?
- Сообщение передается несколько раз от одного arduino к другому с помощью nRF24L01
- nRF24L01 - пропускает конечные символы во время передачи
- Serial.parseInt() занимает больше времени, чем хотелось бы
- nRF24L01+ Невозможно установить адрес
- Не вызовут ли помехи одновременно работающие радиомодули nrf24L01 ?
- Код приемника RF 433 МГц работает только после сброса Arduino.
- Шум в передатчике и приемнике RF 434
Вы используете программное обеспечение serial для модуля WiFi?, @KIIV
Да, и я общаюсь с помощью AT-команд., @Oluderi
NRF24L01 имеет буфер RX FIFO из 3 пакетов. Так что я не понимаю, как вы могли пропустить 4 пакета. Я предполагаю, что что-то еще идет не так. Не могли бы вы опубликовать какой-нибудь минимальный код, который все еще выдает эту ошибку?, @Gerben
Прямо сейчас неясно, если причина, по которой вы пропускаете пакеты, заключается в том, что вы используете Wi-Fi блокирующим способом, или если это потому, что Wi-Fi радио мешает nRF24 в том же общем диапазоне частот. И то, и другое - потенциальные проблемы. Не могли бы вы пронумеровать свои узлы при каждом чтении и отправить их в несколько точек времени? Таким образом, данная передача может включать показания 1345, 1346 и 1347, в то время как следующая передача будет иметь значения 1346, 1347 и 1348 и т. Д., @Chris Stratton