Pourquoi un reset pour faire marcher un RH NRF24 radio ?

Salutations du jour.

J’ai fabriqué des éléments de costume et un décor pour un jeu de rôle grandeur nature.
Ces éléments communiquent par radio vais des transmetteurs RF24, ça évite les fils inutiles.

Tout fonctionne parfaitement au détail près que je dois faire un reset physique de l’arduino nano pour que la partie radio fonctionne. C’est peut pratique !!

Pourriez vous m’éclairer pour passer ce problème qui me pèse (on va dire ça comme ça)

Je vous join le code du programme :

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h>
#endif
#include <Wire.h>  
#include <SoftwareSerial.h>


#define PIXEL_COUNT_1 16
#define PIXEL_COUNT_2 16
#define PIXEL_COUNT_3 16
#define PIXEL_COUNT_4 16

bool oldState_1 = HIGH;
bool oldState_2 = HIGH;
bool oldState_3 = HIGH;
bool oldState_4 = HIGH;

bool newState_1 = HIGH;



//----------------pixels
#define PIXEL_COUNT_1 16
#define PIXEL_COUNT_2 16
#define PIXEL_COUNT_3 16
#define PIXEL_COUNT_4 16
int var_continu = 0 ;
//int _ABVAR_2_BLEU = 0 ;
int _ABVAR_1_a=0;

#define PIN_A 3 //pin de la bande de led A (pour la led interne du flora c'est le port 8)
//#define PIN_B 3 //pin de la bande de led B
//#define PINC 0 //pin de la bande de led C
//#define PIND 0 //pin de la bande de led D
//#define PINE 0 //pin de la bande de led E

int NPIXA = 24 ; // nombre de pixels de la stripA
//int NPIXB = 7 ; // nombre de pixels de la stripB
//int NPIXC = 0 ; // nombre de pixels de la stripC
//int NPIXD = 0 ; // nombre de pixels de la stripD
//int NPIXE = 0 ; // nombre de pixels de la stripE

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
Adafruit_NeoPixel stripA = Adafruit_NeoPixel(NPIXA, PIN_A, NEO_GRB + NEO_KHZ800); //déclaration de la premiere strip led
//Adafruit_NeoPixel stripB = Adafruit_NeoPixel(NPIXB, PIN_B, NEO_GRB + NEO_KHZ800);  
//Adafruit_NeoPixel stripC = Adafruit_NeoPixel(NPIXC, PINC, NEO_GRBW + NEO_KHZ800); 
//Adafruit_NeoPixel stripD = Adafruit_NeoPixel(NPIXD, PIND, NEO_GRBW + NEO_KHZ800); 
//Adafruit_NeoPixel stripE = Adafruit_NeoPixel(NPIXE, PINE, NEO_GRBW + NEO_KHZ800); 
//------------------fin pixels

//------------------selecteur de couleur
uint16_t Green_selecteur = 0;
uint16_t Red_selecteur = 50;
uint16_t Blue_selecteur = 250;
uint16_t White_selecteur = 0;
uint16_t Green_selecteur_pulse = 0;
uint16_t Red_selecteur_pulse = 0;
uint16_t Blue_selecteur_pulse = 5;
uint16_t White_selecteur_pulse = 0;

int showType_1 = 0; //variable qui stocke la couleur sélectionnée par bouton
int showType_2 = 0;
int showType_3 = 0;
int showType_4 = 0;

//------------------fin selecteur de couleur

/*
//capteur capacitif
#include <Wire.h>
#include "Adafruit_MPR121.h"
// You can have up to 4 on one i2c bus but one is enough for testing!
Adafruit_MPR121 cap = Adafruit_MPR121();
// Keeps track of the last pins touched
// so we know when buttons are 'released'
uint16_t lasttouched = 0;
uint16_t currtouched = 0;
uint16_t code_capacitif = 0;
//capteur capacitif
*/

//----------------FIN radio HF--------------------------------------------------
//ces modules radio ont besoin des pin 8,10,11,12 et 13 pour fonctionner (plus l'alimentation)

#include <RH_NRF24.h>
// Singleton instance of the radio driver
RH_NRF24 nrf24;
// RH_NRF24 nrf24(8, 7);  // use this to be electrically compatible with Mirf
// RH_NRF24 nrf24(8, 10); // For Leonardo, need explicit SS pin
// RH_NRF24 nrf24(8, 7);  // For RFM73 on Anarduino Mini
//uint8_t code_radio1;      // déclare une variable pour stocker le code radio reçu.
//uint8_t code_radio1;      // déclare une variable pour stocker le code radio reçu.
uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];          // declare la variable "buf" en lui donnant la taille maximum
uint8_t len = sizeof(buf);

//------variables des codes radio----------------------------
uint8_t code_radio_A[]="A";
uint8_t code_radio_B[]="B";
uint8_t code_radio_C[]="C";
uint8_t code_radio_D[]="D";
uint8_t code_radio_E[]="E";
uint8_t code_radio_F[]="F";
uint8_t code_radio_G[]="G";
uint8_t code_radio_H[]="H";
uint8_t code_radio_I[]="I";
uint8_t code_radio_J[]="J";
uint8_t code_radio_K[]="K";
uint8_t code_radio_L[]="L";
uint8_t code_radio_M[]="M";
uint8_t code_radio_N[]="N";
uint8_t code_radio_O[]="O";
uint8_t code_radio_P[]="P";
uint8_t code_radio_Q[]="Q";
uint8_t code_radio_R[]="R";
uint8_t code_radio_S[]="S";
uint8_t code_radio_T[]="T";
uint8_t code_radio_U[]="U";
uint8_t code_radio_V[]="V";
uint8_t code_radio_W[]="W";
uint8_t code_radio_X[]="X";
uint8_t code_radio_Y[]="Y";
uint8_t code_radio_Z[]="Z";

//----------------FIN radio HF--------------------------------------------------


//-------------------------CAPTEUR SOLAIRE---------------
int lument_Pin = 0;  //the analog pin photoresistor
//the time we give the sensor to calibrate (10-60 secs according to the datasheet)
int calibrationTime = 5;

//int inputPin = 2;               // choose the input pin (for PIR sensor)
//int pirState = LOW;             // we start, assuming no motion detected
//int val = 0;                    // variable for reading the pin status

//-------------------------FIN CAPTEUR SOLAIRE---------------

void setup() {

//-------------------------solaire-------------------------  
   //pinMode(inputPin, INPUT);     // declare sensor as input
pinMode(lument_Pin, INPUT);     // declare sensor as input
Serial.begin(9600);

 Serial.print("calibrating sensor ");
 for(int i = 0; i < calibrationTime; i++){
   Serial.print(".");
   delay(250);
 }
//-------------------------fin solaire--------------------

//-------------------init strip de led adressable--------------------
 stripA.begin();
 stripA.show(); 
 //stripB.begin();
 //stripB.show();
//-------------------fin init strip de led adressable--------------------


 //----------------debut initialisation des radios--------------------
 while (!Serial) 
   ; // wait for serial port to connect. Needed for Leonardo only
 if (!nrf24.init())
   Serial.println("init failed");
 // Defaults after init are 2.402 GHz (channel 2), 2Mbps, 0dBm
 if (!nrf24.setChannel(1))
   Serial.println("setChannel failed");
 if (!nrf24.setRF(RH_NRF24::DataRate2Mbps, RH_NRF24::TransmitPower0dBm))
   Serial.println("setRF failed");    
//----------------fin initialisation des radios--------------------

}

void loop(){



 //------------------------allumage solaire----------------------------
 int lightLevel = analogRead(lument_Pin); //Read the lightlevel
 lightLevel = map(lightLevel, 0, 900, 0, 255);
 lightLevel = constrain(lightLevel, 0, 255);
 Serial.println(lightLevel);
 //analogWrite(ledPin, lightLevel);

   if(lightLevel>150){ //---s'il fait nuit faire une pulsation des leds----

   changement_de_couleur_par_radio();    // verifie s'il y a un signal radio pour changer de couleur des leds

   //-----------------------allume la strip de LED parcequ'il fait nuit---------------------------
   //rainbow(&stripA,20);
   //PULSE_SELECTIF(&stripA, Green_selecteur_pulse, Red_selecteur_pulse, Blue_selecteur_pulse, White_selecteur_pulse, 5, 30);
   alumage_une_led_a_la_foi(&stripA, stripA.Color(Green_selecteur, Red_selecteur, Blue_selecteur, White_selecteur), 100);
   alumage_une_led_a_la_foi(&stripA, stripA.Color(0, 0, 0, 0), 100);


   delay(100);
 }

 if (lightLevel<150) //--------------il fait jour donc on eteind tout-----------------------------
 { 
   colorWipe(&stripA, stripA.Color(0, 0, 0, 0), 1);
   delay(60000); //-------attente d'une minute avant de voir si le soleil est couché
   //delay(500);
 }

 //-----------------------fin allumage solaire-------------------------

 //---------------------------------------début interprétation du code radio reçu----------------------------
 //uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];          // declare la variable "buf" en lui donnant la taille maximum
 //uint8_t len = sizeof(buf);                      // declare la variable "len" en lui donnant la taille de "buf"
 //code_radio1 = (char*)buf ;
 //code_radio1 = buf ;
 //Serial.print("reponse code radio 1:   ");
 //Serial.println(code_radio1);

[code]

Tout fonctionne parfaitement au détail près que je dois faire un reset physique de l'arduino nano pour que la partie radio fonctionne. C'est peu pratique !!

Un reset quand ? après avoir téléchargé le code ?