Здравствуйте, я начинающий ардуинщик. Занимаюсь реализацией проекта, который заключается в передаче дискретного сигнала с четырех герконовых датчиков на одно устройство-приемник (с помощью Wi-fi модуля nRF24l01). Каждый передатчик сообщает приемнику о том, что он среагировал на магнит, а устройство приемник подсчитывает, сколько раз среагировал каждый передатчик. Проблема заключается в том, что период опроса всех четырех передатчиков в среднем составляет 2 секунды, вследствие чего, когда какой либо из передатчиков проходит мимо магнита, он может просто не успеть передать эту информацию приемнику и срабатывание не будет засчитано. Программно задал максимальную скорость передачи пакетов данных. Подключены передатчики к питанию через понижающие модули, конденсаторы припаяны, как и все контакты. Возможно ли, что дело в скорости взаимодействия между nRF модулем и самой платой ардуино? Или это никак не влияет на скорость опроса? Возможно ли сделать так, чтобы передатчик (если за период опроса прошел магнит, но не успел отправить об этом информацию, пока значение на нем было High), каким либо образом отправил информацию о пройденной метке в следующий опрос?
TX
#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI.
#include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24
#include <RF24.h> // библиотека для работы с nRF24L01+ https://yadi.sk/d/nX_akvzEusyGz
RF24 radio(9, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN).
// Создаём переменную для передачи данных
int buttonPin = 2; // Номер пина, к которому подключен геркон
int buttonState = 0; // Переменная для записи состояния геркона
void setup() {
pinMode(buttonPin, INPUT); // Включаем второй пин на ввод
// LED. процесс приёма / передачи, подтверждаем миганием светодиода
radio.begin(); // Инициируем работу nRF24L01+.
radio.setChannel(100); // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц.(на одном канале можно, одновременно иметь "1 передатчик-рот-труба" или "6 приёмников-ушей-трубы"
radio.setDataRate (RF24_2MBPS); // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS). При скорости 2 Мб/с, задействуются сразу два канала (выбранный и следующий за ним). (самая дальнобойная 250KBPS, но скорость меньше)
radio.setPALevel (RF24_PA_MIN); // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm).
radio.openWritingPipe (0xAABBCCDD33LL); // Открываем трубу с идентификатором 0xAABBCCDD11 (для передачи данных). на одном канале может быть только 1 труба, для передачи). (последний байт "идентификатора-передатчика (11)" нужен для распознавания трубами приёмника, которых может быть до 6-на одном канале).
}
void loop () {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
radio.write(&buttonState, sizeof(buttonState)); // отправляем данные на другую Arduino. sizeof(TEST)))-указываем, сколько байт мы хотим отправить)(Приемник отправляет передатчику сигнал подтверждения приёма данных (без смены режима работы).
}
else{
radio.write(&buttonPin, sizeof(buttonPin));
}
delay(50); // "delay" устанавливаем задержку на 50 мс, за это время приемник успеет принять и обработать данные этого и другого передатчика.
}
RX
#include <SPI.h> // Подключаем библиотеку для работы с шиной SPI
#include <nRF24L01.h> // Подключаем файл настроек из библиотеки RF24
#include <RF24.h> // библиотека для работы с nRF24L01+ https://yadi.sk/d/nX_akvzEusyGz
#include <SoftwareSerial.h> // библиотека для создания дополнительного UART порта из двух пинов
RF24 radio(9, 10); // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
byte pipe; // Создаём переменную для хранения номера трубы, по которой пришли данные // Создаём переменную для приема данных
int TEST;
int pipe_i = 1;
int sum[] = {0, 0, 0, 0};
int TEST_1[] = {1, 1, 1, 1};
int res1 = 0;
int res2 = 0;
int result = 0;
int A = 0;
int B = 33;
int C = 66;
int D = 100;
void setup() {
Serial.begin(9600);
delay(1000); // перед первой командой инициализацией nRF24L01+, лучше сделать паузу. припаять конденсатор между выводами плюс и минус nRF24L01+
radio.begin(); // Инициируем работу nRF24L01+
radio.setChannel(100); // Указываем канал приёма данных (от 0 до 127), 5 - значит приём данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
radio.setDataRate (RF24_2MBPS); // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS). При скорости 2 Мб/с, задействуются сразу два канала (выбранный и следующий за ним). (самая дальнобойная 250KBPS, но скорость меньше)
radio.setPALevel (RF24_PA_MIN); // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
radio.openReadingPipe (1, 0xAABBCCDD11LL); // Открываем 1 трубу с идентификатором 0xAABBCCDD11 для приема данных ("приёмник"-на одном канале может быть открыто до 6 разных труб), (которые должны отличаться только последним байтом идентификатора)
radio.openReadingPipe (2, 0xAABBCCDD22LL); // Открываем 2 трубу с идентификатором 0xAABBCCDD22 для приема данных (То есть может одновременно ловить сигнал от шести таких же модулей, передающих на одном частотном канале)
radio.openReadingPipe (3, 0xAABBCCDD33LL);
radio.openReadingPipe (4, 0xAABBCCDD44LL);
radio.startListening (); // Включаем приемник, начинаем прослушивать открытую трубу
// radio.stopListening (); // Выключаем приёмник, если потребуется передать данные
}
void loop() {
if (radio.available(&pipe)) { // Если в буфере имеются принятые данные, то получаем номер трубы, по которой они пришли, по ссылке на переменную pipe
radio.read(& TEST, sizeof(TEST)); // Читаем данные в переменную TEST и указываем сколько байт читать
if (pipe == pipe_i){ //конструкция для поочередного опроса передатчиков с 1 по 4
if (TEST != TEST_1[pipe_i-1] && TEST == 2){ //С помощью этого условия фиксируется переход состояния геркона передатчика с High на Low и наоборот
sum[pipe_i-1] += 1;
}
TEST_1[pipe_i-1] = TEST;
pipe_i++;
if (pipe_i == 5)
pipe_i = 1;
}
}
}