Faire baisser la consomation d'un module RF

Bonjour,
J'ai fait un projet avec deux arduino communiquant ensemble via des module nRF24.
J'ai constaté qu'ils consommaient beaucoup (impossible de faire fonctionner sur pile).
J'aimerais donc faire diminuer la consommation électrique en mettant l’émetteur en "stand-by" quand il n'est pas utilisé.
J'ai trouvé sur la toile les commandes suivantes:
Mirf.powerUpRx()
Mirf.powerUpTx()
Mirf.powerDown()

Pour faire des tests simple, j'ai fait deux codes "minimaliste".
Coté récepteur une led s'allume qu'en il recoit "ALARM"
et coté émetteur, un bouton poussoir "allume l'antenne" et envoie "ALARM" , l'autre B.P. "éteint" l'antenne.

Cela fonctionne tant que que le BP off n'est pas activé. Une fois celui-ci activé, le système se bloc et n’émet plus.

Je cherche donc à réactiver "l’antenne".

Voici le code de l'emetteur:

// Test Tx+testAlim

#include <SPI.h>      // Pour la communication via le port SPI
#include <Mirf.h>     // Pour la gestion de la communication
#include <nRF24L01.h> // Pour les définitions des registres du nRF24L01
#include <MirfHardwareSpiDriver.h> // Pour la communication SPI

const int boutonOff = 2; // broche du Bouton
const int boutonOn = 4;
const int ledPinoff = 3;
const int ledPinon = 5;

int buttonState = 0; // etat de la sortie du Bouton
 
void setup(){
  Serial.begin (9600);
  pinMode(ledPinoff, OUTPUT); //la broche de la LED est mise en sortie
  pinMode(boutonOff, INPUT); //la broche du capteur est mise en entree
  pinMode(ledPinon, OUTPUT); //la broche de la LED est mise en sortie
  pinMode(boutonOn, INPUT); //la broche du capteur est mise en entree

  Mirf.cePin = 9; // Broche CE sur D9
  Mirf.csnPin = 10; // Broche CSN sur D10
  Mirf.spi = &MirfHardwareSpi; // On veut utiliser le port SPI hardware
  Mirf.init(); // Initialise la bibliothèque
  Mirf.channel = 0; // Choix du canal de communication (128 canaux disponibles, de 0 à 127)
  Mirf.payload = 8; // Taille d'un message (maximum 32 octets)
  Mirf.config(); // Sauvegarde la configuration dans le module radio
  Mirf.setTADDR((byte *) "nrf02"); // Adresse de transmission
  Mirf.setRADDR((byte *) "nrf01"); // Adresse de réception


 digitalWrite(ledPinon, HIGH);
 digitalWrite(ledPinoff, HIGH);
 delay (100);
 digitalWrite(ledPinon, LOW);
 digitalWrite(ledPinoff, LOW);
 delay (100);
 
}

 
void loop(){

  digitalWrite(ledPinon, LOW);
  digitalWrite(ledPinoff, LOW);
  
  if (digitalRead(boutonOff) == LOW) 
  {
    digitalWrite(ledPinoff, HIGH); 
   
    Mirf.powerDown();

    delay (100); 
    Serial.println("OFF");
       
  }
    if (digitalRead(boutonOn) == LOW) 
  {
    digitalWrite(ledPinon, HIGH); 
   
    Mirf.powerUpTx();
    Mirf.powerUpRx();
 
    Serial.println("Transmission");
    byte message[8] = "ALARM";
    Mirf.send(message); // On envoi le message
    while(Mirf.isSending()); // On attend la fin de l'envoi 
    delay (100); 

   Serial.println("ON");
       
  }
  
}

Et le code du récepteur:

//Test RX

#include <SPI.h>      // Pour la communication via le port SPI
#include <Mirf.h>     // Pour la gestion de la communication
#include <nRF24L01.h> // Pour les définitions des registres du nRF24L01
#include <MirfHardwareSpiDriver.h> // Pour la communication SPI

const byte PIN_BUTTON = 2;
const byte ledRouge = 3;


void setup() {
  Serial.begin(9600);
  
  pinMode(ledRouge, OUTPUT);
  pinMode(PIN_BUTTON, INPUT_PULLUP);

  Mirf.cePin = 9; // Broche CE sur D9
  Mirf.csnPin = 10; // Broche CSN sur D10
  Mirf.spi = &MirfHardwareSpi; // On veut utiliser le port SPI hardware
  Mirf.init(); // Initialise la bibliothèque

  Mirf.channel = 0; // Choix du canal de communication (128 canaux disponibles, de 0 à 127)
  Mirf.payload = 8; // Taille d'un message (maximum 32 octets)
  Mirf.config(); // Sauvegarde la configuration dans le module radio

  Mirf.setTADDR((byte *) "nrf01"); // Adresse de transmission
  Mirf.setRADDR((byte *) "nrf02"); // Adresse de réception

  Serial.println("Go !");
  digitalWrite (ledRouge,HIGH);
  delay (500);
  digitalWrite (ledRouge,LOW);

  
}

void loop() {
   digitalWrite (ledRouge, LOW);

  byte message[8];

   if(Mirf.dataReady()){
    Mirf.getData(message); // Réception du paquet
    
    if (strcmp((char*) message, "ALARM") == 0) {
      Serial.println("ALARM Recus !");
      digitalWrite(ledRouge, HIGH);
      tone (7,1000,20);
      delay (100);
    }
   }

} //fin loop

Ah je ne suis pas le seul à utiliser la vieille Mirf :smiley: !

J'utilise également powerDown(); pour mettre en veille mon module nrf24l01
Mais j'ai remarqué que je n'avais pas besoin de le "reveiller" avec powerUp ... il se réveille de lui même quand
mon programme demande l'envoi d'une donnée ..

Je n'ai pas trouvé d'exemple concernant l'utilisation "propre" de PowerUpTx ..

En attendant , mon montage avec une pro mini 3v3 et un nrf24l01 avoisine les 20-25mA en mode éveillé .
Et une fois tout le monde endormi , je suis à une centaine de µA ..

Avec ou sans powerUp, le système reste bloqué à la hauteur de

   Serial.println("Transmission");
    byte message[8] = "ALARM";
    Mirf.send(message); // On envoi le message
    while(Mirf.isSending()); // On attend la fin de l'envoi 
    delay (100);

Ta commande mirf.send est incomplète il me semble .

Ceci est bien entendu une petite partie du code,pour monter ou le système se bloque.
Et fonctionne si Mirf.powerDown() n’est pas activé.

Mais je ne sais pas ce qu’il manquerait