Buongiorno,
da un po di tempo ho realizzato dei circuiti con l'nRF24L01 e arduino mini per poter comandare a distanza il colore di un led rgb posto su ognuno di essi.
C'è una trasmittente che riceve dei messaggi dal seriale nel formato "Indirizzo R G B" e li riinvia tramite l'nrf, e da un po di ricevitori che quanto leggono il proprio indirizzo accendono il led del colore richiesto, tutto molto semplice.
Il codice funziona, tuttavia ogni tanto qualche ricevente si blocca sull'ultimo colore ricevuto e l'unico modo per farla tornare a lavorare è schiacciare il tasto reset.
A cosa può essere dovuto questo comportamento? Come si potrebbe risolvere? Avete consigli per modifiche/migliorie per ottimizzare ulteriormente il codice?
Vi ringrazio anticipatamente per la disponibilità e vi copio di seguito i codici
MASTER:
#include <SPI.h>
#include <RF24.h>
#include <nRF24L01.h>
int inByte;
int i;
RF24 radio(9, 10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int wait = 150;
byte col[4];
void setup(){
Serial.begin(115200);
radio.begin();
radio.openWritingPipe(pipe);
radio.setChannel(111);
radio.setAutoAck(false);
radio.enableDynamicPayloads();
// radio.setDataRate(RF24_250KBPS);
radio.setPALevel(RF24_PA_MAX);
// radio.disableCRC();
}
void loop()
{
if (Serial.available()) {
Serial.readBytes(col, 4);
if(col[0] >= 1){
radio.startWrite(&col, sizeof(col));
}
}
}
SLAVE:
/*
* col[0] -> indirizzo
* col[1] -> red
* col[2] -> green
* col[3] -> blue
*/
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9, 10);
const uint64_t pipe = 0xE8E8F0F0E1LL;
int redPin = 6;
int greenPin = 5;
int bluePin = 3;
int dipPins[] = {8, 7, 4, 2, 0, 1, A2, A3 }; //DIP Switch Pins
byte pixel;
byte col[4];
byte ch[] = {1,11,21,31,41,51,61,71,81,
2,12,22,32,42,52,62,72,82,
3,13,23,33,43,53,63,73,83,
4,14,24,34,44,54,64,74,84,
5,15,25,35,45,55,65,75,85,
6,16,26,36,46,56,66,76,86,
7,17,27,37,47,57,67,77,87,
8,18,28,38,48,58,68,78,88,
9,19,29,39,49,59,69,79,89};
void setup(void)
{
radio.begin();
radio.setChannel(111);
radio.setAutoAck(false);
radio.enableDynamicPayloads();
radio.setPALevel(RF24_PA_LOW);
radio.openReadingPipe(1, pipe);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
analogWrite(redPin, 0);
analogWrite(greenPin, 0);
analogWrite(bluePin, 0);
int i;
for(i = 0; i<=7; i++){
pinMode(dipPins[i], INPUT_PULLUP);
}
delay(100);
pixel = address()-1;
radio.startListening();
}
void loop(void)
{
if(radio.available()){
bool done = false;
while (!done) {
done = radio.read(&col, sizeof(col));
if(col[0] == ch[pixel]){
analogWrite(redPin, col[1]);
analogWrite(greenPin, col[2]);
analogWrite(bluePin, col[3]);
}
}
}
}
//Create Address from DIP Switch (8 positions used)
byte address(){
int i,j;
//Get the switches state
for(i=7; i>=0; i--){
j = (j << 1) | digitalRead(dipPins[i]); // read the input pin
}
return ~j; //return address
}