Bonsoir hazrod
Excellente motivation, si je peux participer à ton confort 
J'ai "réaménagé", un peu ton programme, surtout au niveau de la gestion des boutons, qui ne sont plus pris individuellement:
int buttonState1 = 0;
int buttonState2 = 0;
mais mis en tableau:
int buttonsState[] = {0, 0}; // Tableau contenant l'état des boutons (envoyé au récepteur)
int ledState[] = {0, 0}; // Etat des LED, recu en quittance du récepteur
Le tableau ledState[] est surtout là pour la démo.
Ainsi, mis en tableau, l'état des boutons se transmet "d'un coup":
radio.write(&buttonsState, sizeof(buttonsState)); // Envoi de l'état des boutons
et est reçu de même:
radio.read(&buttonsState, sizeof(buttonsState)); // Réception de l'état des boutons Ce qui facilite grandement les choses.
Ainsi, les boutons sont lus à l'émetteur (void boutonsLecture()), transmis au récepteur qui lui remets à jour les LED (void ledEcriture()) et le récepteur envoie en retour, comme quittance (ACK), l'état des LED, à l'émetteur.
Attention, la console à passé de 9600 à 115200.
A l'émetteur, dans la console, défile l'état des LED du récepteur.
Au récepteur, défile l'état des boutons.
Des 2 côtés il y a un watchdog qui, s'il n'y a plus de réception, allume une LED, sur la pin:
const int watchdogLedPin = 7;
L'émetteur:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define buttonPin1 3
#define buttonPin2 4
int buttonsState[] = {0, 0}; // Tableau contenant l'état des boutons
int ledState[] = {0, 0}; // Etat des LED, recu en quittance du récepteur
RF24 radio(9, 8); // CE, CSN
const byte address[6] = "00002";
const byte addressB[6] = "00003";
const unsigned long rf24SendTempo = 250; // Toutes les 1/4 de seconde
unsigned long rf24SendMillis = millis(); // Chronomètrwe
const unsigned long rf24watchdogTempo = 750; // Toutes les 1/2 de seconde
unsigned long rf24watchdogdMillis = millis(); // Chronomètrwe
const int watchdogLedPin = 7;
const int watchdogLedEtatOn = HIGH; // Etat pour allumer la LED du watchdog
void setup()
{
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(watchdogLedPin, OUTPUT);
digitalWrite(watchdogLedPin, !watchdogLedEtatOn); // Eteindre la LED
Serial.begin(115200);
radio.begin();
radio.openWritingPipe(address); // Canal d'envoi de données (sont croisés sur récepteur)
radio.openReadingPipe(0, addressB); // Canal de réception de données
radio.setPALevel(RF24_PA_MIN);
radio.startListening(); // Radio en mode écoute
}
void loop()
{
if (millis() - rf24SendMillis >= rf24SendTempo) // Si temporisation envoi échue
{
boutonsLecture();
radio.stopListening(); // Radio en mode émission
radio.write(&buttonsState, sizeof(buttonsState)); // Envoi de l'état des boutons (tableau)
radio.startListening(); // Radio en mode écoute
unsigned long start_timeout = millis(); // Si éventuellement pas de réponse
while (!radio.available()) // Attente de la réponse
{
if (millis() - start_timeout > 200) // Attente 200 millisecondes
break;
}
if (radio.available()) // Si recu des données
{
radio.read(&ledState, sizeof(ledState)); // Réception de l'état des LED (tableau) comme acquittement (ACK)
Serial.print(F("\nEtat des LED\t")) ; Serial.print(ledState[0]);
Serial.print("\t"); Serial.print(ledState[1]);
rf24watchdogdMillis = millis(); // Mise à jour watchdog
}
rf24SendMillis = millis(); // Redémarrer le timer d'envoi
}
//--------------------------------- Watchdog
if (millis() - rf24watchdogdMillis >= rf24watchdogTempo) // Si plus de transmission du récepteur
{
digitalWrite(watchdogLedPin, watchdogLedEtatOn); // Allumer la LED
}
else
{
digitalWrite(watchdogLedPin, !watchdogLedEtatOn); // Eteindre la LED
}
}
void boutonsLecture()
{
buttonsState[0] = digitalRead(buttonPin1);
buttonsState[1] = digitalRead(buttonPin2);
}
Le récepteur:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define led1 A0
#define led2 A1
int buttonsState[] = {0, 0}; // Etat des boutons (recu)
int ledState[] = {0, 0}; // Rtat des LED, envoyés en quittance
RF24 radio(9, 8); // CE, CSN
const byte address[6] = "00002";
const byte addressB[6] = "00003";
const unsigned long rf24watchdogTempo = 750; // Temps avant alerte
unsigned long rf24watchdogdMillis = millis(); // Chronomètrwe
const int watchdogLedPin = 7;
const int watchdogLedEtatOn = HIGH; // Etat pour allumer la LED du watchdog
void setup()
{
Serial.begin(115200);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
digitalWrite(led1, HIGH);
digitalWrite(led2, HIGH);
pinMode(watchdogLedPin, OUTPUT);
digitalWrite(watchdogLedPin, !watchdogLedEtatOn); // Eteindre la LED
radio.begin();
radio.openWritingPipe(addressB); // Canal d'envoi de données (sont croisés sur émetteur)
radio.openReadingPipe(0, address); // Canal de réception de données
radio.setPALevel(RF24_PA_MIN);
radio.startListening(); // Radio en mode écoute
}
void loop()
{
if (radio.available())
{
while (!radio.available());
{
radio.read(&buttonsState, sizeof(buttonsState)); // Réception de l'état des boutons de l'émetteur (tableau)
rf24watchdogdMillis = millis(); // Mise à jour watchdog
}
radio.stopListening(); // Radio en mode émission
delay(20); // Petite attente pour "retournement" de la transmission
ledEcriture(); // Commande des LED en fonction de l'état des boutons
ledLecture(); // Lecture de l'état des LED
radio.write(&ledState, sizeof(ledState)); // Envoi de^l'état des LED comme acquittement (ACK)
radio.startListening(); // Radio en mode écoute
Serial.print(F("\nEtat des boutons\t")) ; Serial.print(buttonsState[0]);
Serial.print("\t"); Serial.print(buttonsState[1]);
}
//--------------------------------- Watchdog
if (millis() - rf24watchdogdMillis >= rf24watchdogTempo) // Si plus de transmission de l'émetteur
{
digitalWrite(watchdogLedPin, watchdogLedEtatOn); // Allumer la LED
}
else
{
digitalWrite(watchdogLedPin, !watchdogLedEtatOn); // Eteindre la LED
}
}
void ledLecture()
{
ledState[0] = digitalRead(led1);
ledState[1] = digitalRead(led2);
}
void ledEcriture()
{
digitalWrite(led1, !buttonsState[0]); // ! = inversion vu que les boutons, au repos donnent un HIGH (PULL_UP)
digitalWrite(led2, !buttonsState[1]);
}
A ta disposition pour toutes questions, amuses toi bien
.
Cordialement
jpbbricole