Problème de code avec NRF24l01

Bonsoir,

je débute avec Arduino et je viens demander votre aide car je n' arrive pas a faire fonctionner mes modules nrf24l01: j' arrive très bien à transmettre un message entre les deux module donc ce n' est pas un problème au niveau des composants , mais lorsque j' intègre le code dans mon code final, l' Arduino se stoppe au bout d' un certain temps et le programme ne veut plus avancer. Cela ce passe même quand l' émetteur n' envoie pas de signal.
auriez vous des idées de a quoi cela pourrait être dus ?

voici le code du recepteur ( où se trouve le problème )
il s' agit d' un systeme d' arrosage automatique ( deso si le code n' est pas très bien organisé et assez long , et ce n' est pas la version finale).

#include "SPI.h"
#include "nRF24L01.h"
#include "RF24.h"
#include <LiquidCrystal_I2C.h>
#include <Wire.h>


#define pinCE   7             // On associe la broche "CE" du NRF24L01 à la sortie digitale D7 de l'arduino
#define pinCSN  8             // On associe la broche "CSN" du NRF24L01 à la sortie digitale D8 de l'arduino
#define tunnel1 "PIPE1"     // On définit un premier "nom de tunnel" (5 caractères), pour pouvoir envoyer des données à l'autre NRF24
#define tunnel2 "PIPE2"     // On définit un second "nom de tunnel" (5 caractères), pour pouvoir recevoir des données de l'autre NRF24

RF24 radio(pinCE, pinCSN);  // Instanciation du NRF24L01
// Instanciation d'un objet pour contrôler le servomoteur

const byte adresses[][6] = {tunnel1, tunnel2};    // Tableau des adresses de tunnel, au format "byte array"
// Instanciation du NRF24L01
int mesure;



// Mise au format "byte array" du nom du tunnel



int etatvanne;
int Temperature;
int CHPstart;
long prevMillis1 = 0;
long prevMillis3 = 0;
long prevMillis = 0;
long prevMillis2 = 0;
int delaylcd = 30000;
int delayboutons = 200;
int delaycapteur = 2000;
int delayexecution = 3000;

LiquidCrystal_I2C lcd(0x27, 16, 2);//pin analogiques 4 et 5

int PinAnalogiqueHumiditeS = A1;
int CHS = 6;
int hsolS;  //Humidite su sol, mesure analogique


int hsolP;

int pompe_a_eau = 2;

int lampe = 5;

#define photoresistancein A0
long vphotoresistancein ;


int boutonM = 10;
int constBM = 0;
int trucM = 1;
int precedantM;
int boutonL = 9;
int constBL = 0;
int trucL = 1;
int precedantL;
int boutonAS = 3;
int constBAS = 0;
int trucAS = 1;
int precedantAS;
int trucAS2 = 0;
int boutonAP = 4;
int constBAP = 0;
int trucAP = 1;
int precedantAP;


void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  lcd.init();





  radio.begin();                           // Initialisation du module NRF24
  radio.openWritingPipe(adresses[0]);      // Ouverture du "tunnel1" en ÉCRITURE
  radio.openReadingPipe(1, adresses[1]);   // Ouverture du "tunnel2" en LECTURE
  radio.setPALevel(RF24_PA_MIN);           // Séle



  pinMode(PinAnalogiqueHumiditeS, INPUT);       //pin A0 en entrée analogique
  pinMode(CHS, OUTPUT);  //pin 3 en entrée numérique

  //pin A0 en entrée analogique

  //pompe a eau
  pinMode(pompe_a_eau, OUTPUT);
  //photoresistancs
  pinMode(photoresistancein, INPUT);



  ///interrupteurs
  pinMode(boutonAP, INPUT);
  pinMode(boutonAS, INPUT);
  pinMode(boutonL, INPUT);
  pinMode(boutonM, INPUT);

  pinMode(lampe, OUTPUT);

  pinMode(photoresistancein, INPUT);
  digitalWrite(pompe_a_eau, HIGH);
  digitalWrite(lampe, HIGH);
  lcd.noBacklight();






}



void loop() {

  delay(5);


  constBAS = digitalRead(boutonAS);
  constBAP = digitalRead(boutonAP);
  constBM = digitalRead(boutonM);
  constBL = digitalRead(boutonL);




  if ( constBM != precedantM) {
    precedantM = constBM;
    lcd.backlight();
    prevMillis1 = millis();
  }
  if ( constBAS != precedantAS) {
    precedantAS = constBAS;
    lcd.backlight();
    prevMillis1 = millis();
  }
  if ( constBAP != precedantAP) {
    precedantAP = constBAP;
    lcd.backlight();
    prevMillis1 = millis();
  }
  if ( constBL != precedantL) {
    precedantL = constBL;
    lcd.backlight();
    prevMillis1 = millis();

  }
  if (millis() - prevMillis1 > delaylcd) {
    prevMillis1 = millis();
    lcd.noBacklight();
  }



  radio.stopListening();
  radio.write(&etatvanne, sizeof(etatvanne));
  radio.startListening();                                                 // On commence par arrêter le mode envoi, pour pouvoir réceptionner des données
  if (radio.available()) {                                                // On regarde si une donnée a été reçue
    Serial.println("message");                    // Si une donné est en attente de lecture, on va la lire
    radio.read(&mesure, sizeof(mesure));  // Lecture des données reçues, une par une                          // … et ajustement de l'angle du servomoteur à chaque fois
  }



  if (millis() - prevMillis > delaycapteur) {
    prevMillis = millis();

    Serial.println(mesure);                           // avec une petite pause, avant de reboucler

    Temperature = ((mesure - 214.5) / 10.5);
    lcd.setCursor(1, 0);
    lcd.print(Temperature);
    lcd.setCursor(7, 0);
    lcd.print("DEGRES");

  }

  if (millis() - prevMillis2 > delayboutons) {
    prevMillis2 = millis();



    if (constBM == 1) {
      digitalWrite(CHS, LOW);
      if ( trucM == 0) {
        trucM = 1 ;
        lcd.clear();
        lcd.print("Mode Auto:");
        lcd.setCursor(0, 1);
        lcd.print("OFF");
        delay(2000);
        lcd.clear();
      }

      if (constBL == 1) {
        digitalWrite(lampe, HIGH);

      }
      else {
        digitalWrite(lampe, LOW);
      }

      if (constBAS == 1) {
        if (trucAS == 1) {
          trucAS = 0;
          digitalWrite(pompe_a_eau, HIGH);

          lcd.clear();

        }
      }
      else {
        lcd.clear();
        digitalWrite(pompe_a_eau, LOW);
        lcd.print("Arrosage des");
        lcd.setCursor(0, 1);
        lcd.print("S. en cours");
        trucAS = 1;


      }
      //////////////////////////////
      if (constBAP == 1) {
        etatvanne = 1;
        lcd.clear();
        lcd.print("   Arrosage du");
        lcd.setCursor(0, 1);
        lcd.print("Potager en cours");
        trucAP = 1;
      }

      else {
        etatvanne = 0;
        if (trucAP == 1) {
          lcd.clear();
          trucAP = 0;
        }
      }
      ////////////////////////////

    }
    if (constBM == 0) {
      if ( trucM == 1) {
        trucM = 0;
        lcd.clear();
        lcd.print("Mode Auto:");
        lcd.setCursor(0, 1);
        lcd.print("ON");
        delay(2000);
        lcd.clear();
      }



      if (constBL == 0) {
        if ( trucL == 0) {
          trucL = 1;
          lcd.clear();
          lcd.print("Lumiere Auto");
          lcd.setCursor(0, 1);
          lcd.print("OFF");
          delay(2000);
          lcd.clear();
        }
        digitalWrite(lampe, HIGH);
      }


      if (constBL == 1) {
        if ( trucL == 1) {
          trucL = 0;
          lcd.clear();
          lcd.print("Lumiere Auto");
          lcd.setCursor(0, 1);
          lcd.print("ON");
          delay(2000);
          lcd.clear();
        }







      }
      if (constBAS == 0) {
        if ( trucAS == 0) {
          trucAS = 1;
          lcd.clear();
          lcd.print("Arrosage Semi");
          lcd.setCursor(0, 1);
          lcd.print("Auto : OFF");
          delay(2000);
          lcd.clear();
        }

      }
      if (constBAS == 1) {
        if ( trucAS == 1) {
          trucAS = 0;
          lcd.clear();
          lcd.print("Arrosage Semis");
          lcd.setCursor(0, 1);
          lcd.print("Auto : ON");
          delay(2000);
          lcd.clear();
        }
      }

    }
    //         hsolS=analogRead(PinAnalogiqueHumiditeS);
    // Serial.println(hsolS);
  }


  if (millis() - prevMillis3 > delayexecution) {
    prevMillis3 = millis();
    if (constBM == 0) {


      if (constBL == 1) {
        vphotoresistancein = analogRead(photoresistancein);
        Serial.println(vphotoresistancein);
        if ( (vphotoresistancein > 200) && (vphotoresistancein < 400) ) {
          digitalWrite(lampe, LOW);
        }
        else {
          digitalWrite(lampe, HIGH);
        }
      }



      if (constBAS == 0) {

        digitalWrite(CHS, LOW);
      }

      if (constBAS == 1) {


        digitalWrite(CHS, HIGH);
        hsolS = analogRead(PinAnalogiqueHumiditeS);
        Serial.println(hsolS);
        if (hsolS > 350 ) {
          for (int t = 0; t < 5; t++) {
            hsolS = analogRead(PinAnalogiqueHumiditeS);
            Serial.println(hsolS);
            if (hsolS > 350 ) {
              lcd.clear();
              lcd.write("arrosage des");
              lcd.setCursor(0, 1) ;
              lcd.write("semis");
              Serial.println("arrosage des semis");
              digitalWrite(pompe_a_eau, LOW);
              delay(2000);
              digitalWrite(pompe_a_eau, HIGH);
              lcd.clear();
            }
          }
        }
        delay(15);
        digitalWrite(CHS, LOW);
      }
    }
  }
}


Merci d' avance

qu'est-ce qui est branché sur l'arduino ? des vannes / pompes ? comment tout cela est-il alimenté et protégé des perturbations ?

(Assurez vous d'indenter le code correctement dans l'IDE avant de le copier pour le coller ici. Cela se fait en pressant ctrlT sur PC ou cmdT sur un Mac)

l' arduino est connectée a un lcd i2c , une pompe a eau controlée par un transistor, un capteur d' humidité au sol, une photorésistance, un relais qui controle une lampe le nrf24l01 et plusieurs boutons ( oui ça fait beaucoup :slightly_smiling_face: ).
le tout est alimenté avec une alim de 5v et le nrf est alimenté avec un petit module adaptateur/convertisseur. Apres, je pense que ce n' est as un problème de montage car j' ai testé le nrf avec touts les autres composants branchés sur l' arduino et il marchait très bien.

aussi, j' ai peut être trouvé une piste car tout semble fonctionner quant on est en mode manuel (dans mon programme) mais tout se stoppe lorsque on passe en mode automatique .

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.