Здравствуйте!
Возникла необычная проблема с системой из двух ардуино плат, соединенных по модулю NRF24L01+PA+LNA. На прошлых версиях программ приемника и передатчика все работало отлично как часы в течение недель, и проблем не испытывало. Недавно изменил один датчик на передатчике на два других, и теперь все стало троить. Передатчик шлет данные вроде бы исправно. Приемник после начала работы эти данные исправно получает, и пишет в uart примерно следующее
248
185
247
186
Эти цифры - это данные с двух датчиков в два цикла передатчика. Но внезапно, через час - два -три после начала приема сигнала приемник как бы зависает, я это определяю по отсутствию моргания Tx, так как оба модуля не подключены к ноутбуку постоянно. Вот сегодня я оставил ноутбук на модуле, чтобы читать uart, и он через два часа снова завис, с последними сообщениями
248
185
185
0
То есть данные с одной передачи с одного из датчиков не были получены, но потом откуда взялся 0, и после этого он завис. После перезагрузки приемника он снова начинает исправно получать сообщения. Вот не пойму, от чего зависает, может кто поймет. Сейчас, пока писал, подумал, может из-за того, что в передатчике обе цифры с датчиков отправляются без перерыва, и, может, они там смешиваются как-то время от времени, не знаю. Код передатчика и приемника отправляю также в тему
Передатчик
#include <SPI.h>
#include "RF24.h"
#include <NewPing.h>
RF24 radio(9, 10); // Пины CE и CSN
const byte address[6] = "00001"; // Адрес модуля
const int d2 = 0001; // Сигнал, отправляемый при получении на порт D2
// Параметры для датчика HC-SR04
#define TRIGGER_PIN3 3 // Пин 3 для подачи сигнала Trigger
#define TRIGGER_PIN5 5 // Пин 5 для подачи сигнала Trigger
#define ECHO_PIN2 2 // Пин 2 для чтения сигнала Echo
#define ECHO_PIN4 4 // Пин 4 для чтения сигнала Echo
#define MAX_DISTANCE 500 // Максимальное расстояние в сантиметрах
// Параметры для светодиода
#define LED_PIN 13 // Пин светодиода на плате Arduino
// Объект для работы с датчиком HC-SR04
NewPing sonar2(TRIGGER_PIN3, ECHO_PIN2, MAX_DISTANCE);
NewPing sonar3(TRIGGER_PIN5, ECHO_PIN4, MAX_DISTANCE);
unsigned long previousMillisSensor = 0; // Переменная для хранения предыдущего времени опроса датчика
unsigned long previousMillisUART = 0; // Переменная для хранения предыдущего времени вывода в UART
unsigned long previousMillisIf = 0; // Переменная для хранения предыдущего времени вывода в UART
const unsigned long intervalSensor = 200; // Интервал опроса датчика (в миллисекундах), 5 раз в секунду
const unsigned long intervalUART = 1000; // Интервал вывода в UART (в миллисекундах), 1 раз в секунду
const unsigned long intervalIf = 10000; // Интервал 10 секунд
int data1;
int data2;
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT); // Устанавливаем пин светодиода на вывод
radio.begin();
radio.openWritingPipe(address);
radio.setPALevel(RF24_PA_MAX);
radio.setDataRate(RF24_250KBPS);
radio.stopListening();
}
void loop() {
unsigned long currentMillis = millis(); // Получаем текущее время в миллисекундах
// Опрос датчика HC-SR04
if (currentMillis - previousMillisSensor >= intervalSensor) {
previousMillisSensor = currentMillis; // Сохраняем текущее время как предыдущее
// Опрашиваем датчик HC-SR04
data1 = sonar2.ping_cm(); // Получаем расстояние в сантиметрах
delay(100);
data2 = sonar3.ping_cm(); // Получаем расстояние в сантиметрах
delay(100);
/*// Если расстояние меньше 150 см (1,5 метра)
if (data[0] < 150 || data[1] < 150) {
digitalWrite(LED_PIN, HIGH); // Включаем светодиод
} else {
digitalWrite(LED_PIN, LOW); // Выключаем светодиод
}*/
}
// Вывод в UART
if (currentMillis - previousMillisUART >= intervalUART) {
previousMillisUART = currentMillis; // Сохраняем текущее время как предыдущее
Serial.print("Distance: "); // Выводим заголовок
Serial.print(sonar2.ping_cm()); // Выводим расстояние в сантиметрах
Serial.print(", ");
Serial.print(sonar3.ping_cm()); // Выводим расстояние в сантиметрах
Serial.println(" cm"); // Выводим единицу измерения
radio.write(&data1, sizeof(data1)); // Отправка по радио сигнала с тем-же интервалом
radio.write(&data2, sizeof(data2));
}
if (data1 < 110 || data2 < 110) {
previousMillisIf = currentMillis;
}
if (currentMillis - previousMillisIf <= intervalIf) {
radio.write(&d2, sizeof(d2));
Serial.print("Sent: ");
Serial.println(d2);
}
}
Приемник
#include <SPI.h>
#include "RF24.h"
RF24 radio(9, 10); // Пины CE и CSN
const byte address[6] = "00001"; // Адрес модуля
const int LED2 = 8; // Пин светодиода
const int LED = 13; // Пин светодиода 2
unsigned long lastTime = 0;
void setup() {
pinMode(LED, OUTPUT);
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, address);
radio.setPALevel(RF24_PA_MAX);
radio.setDataRate(RF24_250KBPS);
radio.startListening();
digitalWrite(LED, LOW);
digitalWrite(LED2, LOW);
}
void loop() {
unsigned long currentMillis = millis(); // Получаем текущее время в миллисекундах
if (radio.available()) {
int data;
radio.read(&data, sizeof(data));
Serial.print("Received: ");
Serial.println(data);
if (data <= 110) {
lastTime = millis();
//digitalWrite(LED2, HIGH);
loop2();
}
if (data > 110) {
lastTime = millis();
//digitalWrite(LED2, LOW);
}
if (data == 0001) {
lastTime = millis();
loop2();
}
}
if (millis() - lastTime > 20000) {
digitalWrite(LED2, HIGH);
Serial.println(millis() - lastTime);
//loop1();
}
}
void loop1() {
int i1 = 0;
do{
digitalWrite(LED, HIGH);
delay(500);
digitalWrite(LED, LOW);
delay(500);
}
while(i1 < 1);
}
void loop2() {
int i1 = 0;
do{
digitalWrite(LED2, HIGH);
delay(1000);
digitalWrite(LED2, LOW);
delay(1000);
}
while(i1 < 1);
}