Chronometre avec arrêt à distance

Bonjour je suis en train de réaliser un chronometre pour mes élèves. Le projet final devrait avoir deux boitiers avec des cartes arduino uno.
une pour la mise en route et le reset
l'autre pour l'arrêt du chrono.

Je réussi à faire un chronometre sur le boitier 1 avec le bouton start et un reset.

j'ai acheté des cartes nrf24l01 pour la communication entre les deux cartes mais je n'arrive pas a configurer l'arrêt à distance

pourriez vous m'aider
merci

voici le programme du boitier 1 :slight_smile:

/ Inclure le code de la bibliothèque :
#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>


  // Initialiser la bibliothèque avec les numéros des broches de l'interface
  LiquidCrystal_I2C lcd(0x3f, 20, 4);
// La broche Numérique 6 est reliée au Bouton1. On lui donne le nom BtStartStop.
int BtStartStop = 6;
// La broche Numérique 7 est reliée au Bouton2. On lui donne le nom BtReset.
int BtReset = 7;
// Déclaration variable EtatBtStartStop qui va servir à stocker une valeur au format bool.
bool EtatBtStartStop;
// Déclaration variable EtatBtReset qui va servir à stocker une valeur au format bool.
bool EtatBtReset;
// Déclaration variable EtatBoutonAppuyer qui va servir à stocker une valeur au format int.
int EtatBoutonAppuyer;
// Etc...
int EtatChronoOnOFF;
int TempsEcoule;
int Milliseconde;
int Seconde;
int Minute;

// Variable pour stocker la valeur du timer interne du microcontrôleur (millis()) au format int unsigned long
unsigned long currentTime = 0;
// Variable pour Mémoriser la valeur du timer interne du microcontrôleur "currentTime" pour par la suite la comparer
// au format int unsigned long
unsigned long previousTime = 0;


void setup() {
  // Faire de la broche du BtStartStop une entrée avec activation de la résistance de rappel interne de l'ARDUINO .
  pinMode(BtStartStop, INPUT_PULLUP);
  // Faire de la broche du BtReset une entrée avec activation de la résistance de rappel interne de l'ARDUINO .
  pinMode(BtReset, INPUT_PULLUP);
  lcd.init();
  lcd.backlight();
  // Configurez le nombre de colonnes et de lignes de l'écran LCD :
  lcd.begin(20, 4);
  // Imprime un message sur l'écran LCD.


  lcd.setCursor(2, 1);
  lcd.print("** Boitier 1 **");
}

void loop() {
  // Lit la broche d'entrée du BtStartStop et stock ça valeur dans EtatBtStartStop.
  EtatBtStartStop = digitalRead(BtStartStop);
  // Lit la broche d'entrée du BtReset et stock ça valeur dans EtatBtReset.
  EtatBtReset = digitalRead(BtReset);
  // Si EtatBtStartStop == LOW et EtatBoutonAppuyer == 0 on exécute les actions entre {}
  if (EtatBtStartStop == LOW && EtatBoutonAppuyer == 0) {
    // La variable EtatBoutonAppuyer prend la valeur de 1.
    EtatBoutonAppuyer = 1;
    // Si EtatChronoOnOFF = 0 alors EtatChronoOnOFF = 1 et inversement.
    EtatChronoOnOFF = !EtatChronoOnOFF;
  }
  // Si EtatBtReset == LOW et EtatChronoOnOFF == 0 et EtatBoutonAppuyer == 0 on exécute les actions entre {}
  if (EtatBtReset == LOW && EtatChronoOnOFF == 0 && EtatBoutonAppuyer == 0) {
    // La variable EtatBoutonAppuyer prend la valeur de 1.
    EtatBoutonAppuyer = 1;
    // La variable Milliseconde prend la valeur de 0.
    Milliseconde = 0;
    //Etc...
    Seconde = 0;
    Minute = 0;
  }
  // Si EtatBtStartStop == HIGH et EtatBtReset == HIGH on exécute les actions entre {}
  if (EtatBtStartStop == HIGH && EtatBtReset == HIGH) {
    // La variable EtatBoutonAppuyer prend la valeur de 0.
    EtatBoutonAppuyer = 0;
  }
  //On stocke la valeur du timer interne du microcontrôleur de l'arduino qu'ont récupére grace à millis() dans la variable currentTime
  currentTime = millis();
  //On calcule la valeur de TempsEcoule en effectuant une soustraction entre currentTime et previousTime.
  TempsEcoule = currentTime - previousTime;
  //On stocke la valeur du timer interne du microcontrôleur de l'arduino qu'ont récupére grace à millis() dans la variable previousTime
  previousTime = millis();

  // Si EtatChronoOnOFF == 1 on exécute les actions entre {}
  if (EtatChronoOnOFF == 1) {
    // On calcule la valeur de Milliseconde en effectuant une addition entre Milliseconde et TempsEcoule.
    Milliseconde = Milliseconde + TempsEcoule;
    // Si Milliseconde > 999 on exécute les actions entre {}
    if (Milliseconde > 999) {
      Milliseconde = Milliseconde - 1000;
      // On incrémente la variable Seconde de + 1
      Seconde++;
    }
    if (Seconde > 59) {
      Seconde = 0;
      Minute++;
    }
  }
  // Placer le curseur sur la colonne 9, ligne 1 du LCD
  // (note : la ligne 0 est la première ligne, puisque le comptage commence par 0):
  lcd.setCursor(9, 3);
  // Imprime un message sur l'écran LCD.
  lcd.print(":");
  // Si la variable Milliseconde est plus grande que 99 on exécute les actions entre {}
  if (Milliseconde > 99) {
    // Placer le curseur sur la colonne 10, ligne 1 du LCD
    lcd.setCursor(10, 3);
    // Imprime la valeur de la variable Milliseconde sur l'écran LCD
    lcd.print(Milliseconde);
  }
  // Sinon si la variable Milliseconde est plus grande que 99 on exécute les actions entre {}
  else if (Milliseconde > 9 && Milliseconde < 100) {
    //Etc...
    lcd.setCursor(10, 3);
    lcd.print("0");
    lcd.setCursor(11, 3);
    lcd.print(Milliseconde);
  } else if (Milliseconde > 0 && Milliseconde < 10) {
    lcd.setCursor(10, 3);
    lcd.print("00");
    lcd.setCursor(12, 3);
    lcd.print(Milliseconde);
  } else {
    lcd.setCursor(9, 3);
    lcd.print(":000");
  }

  lcd.setCursor(6, 3);
  lcd.print(":");
  if (Seconde < 10) {
    lcd.setCursor(7, 3);
    lcd.print("0");
    lcd.setCursor(8, 3);
    lcd.print(Seconde);
  } else {
    lcd.setCursor(7, 3);
    lcd.print(Seconde);
  }

  lcd.setCursor(3, 3);

  if (Minute < 10) {
    lcd.setCursor(4, 3);
    lcd.print("0");
    lcd.setCursor(5, 3);
    lcd.print(Minute);
  } else {
    lcd.setCursor(4, 3);
    lcd.print(Minute);
  }
}
  • Ce gros bloc de code mériterait (en éditant le post#2) d'être indenté et mis en couleur selon les recommandation du site : Les bonnes pratiques du Forum Francophone
  • la variable EtatBoutonAppuyer est testée ligne 52 avant d'avoir été explicitement initialisée ligne 17. ÉDIT : idem pour EtatChronoOnOFF ligne 56. Ça fonctionne mais mieux vaut être explicite...
  • ÉDIT : previousTime = currentTime; serait préférable à previousTime = millis(); ligne 79, au cas où millis(); serait incrémenté pendant la soustraction 64 bits réalisée juste avant.
  • de nombreux exemples d'utilisation des nrf24l01 avec Arduino sont proposés sur internet. Au hasard : Tuto NRF24L01 : code arduino, librairie, fonctionnement, …. En général, on en choisit un (judicieusement) et on le modifie selon ses besoins...

Merci pour les conseils. Je vais essayer de communiquer entre les deux cartes avant de programmer l'arrêt.

désolé pour la mise en forme,
merci pour votre conseil, mes deux cartes communiquent il faut maintenant que j'arrive à envoyer un message lorsque j'appuie sur le boitier N°2.

Il est encore possible de la modifier dans le post#2 : il suffit de coller le code dans Arduino IDE, de faire Ctrl+A (tout sélectionner), Ctrl+T (indenter correctement), Ctrl+Maj+C (copier pour coller dans un forum) puis de venir coller ça en remplacement du code ici.
L’intérêt de la manip, c'est aussi de ne pas faire fuir des aidants potentiels...

Je n'ai plus qu'un probleme c'est d'arrêter le chrono lorsque le boitier BAS reçoit un message du boitier HAUT....

Pourquoi n'avez-vous pas intégré les suggestions du post#3 ? Elles vous semblent inutiles (ou autre) ? C'est votre droit bien sûr mais j'aime savoir si ce que je dis aide ou non...

Je ne suis pas à l'aise ...
je viens de mettre à jour mon post 2

enore merci pour vos conseils

programme du boitier HAUT (qui doit normalement arrêter le chrono) du boitier BAS

/*

  BOITIER ESCALADE HAUT
  Fichier:      sketch_jul20a - Recepteur
  Description:  Réception d'un message "stop" depuis un autre arduino nano, via un NRF24L01
  

  Librairie utilisée : RF24

  
*/
#include <SPI.h>
#include <RF24.h>

#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.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 tunnel "PIPE1"  // On définit le "nom de tunnel" (5 caractères) à travers lequel on va recevoir les données de l'émetteur

RF24 radio(pinCE, pinCSN);  // Instanciation du NRF24L01

const byte adresse[6] = tunnel;  // Mise au format "byte array" du nom du tunnel
char message[32];                // Avec cette librairie, on est "limité" à 32 caractères par message

// Initialiser la bibliothèque avec les numéros des broches de l'interface
LiquidCrystal_I2C lcd(0x3f, 20, 4);

void setup() {

  lcd.init();
  lcd.backlight();
  // Configurez le nombre de colonnes et de lignes de l'écran LCD :
  lcd.begin(20, 4);



  // Partie NRF24
  radio.begin();                      // Initialisation du module NRF24
  radio.openReadingPipe(0, adresse);  // Ouverture du tunnel en LECTURE, avec le "nom" qu'on lui a donné
  radio.setPALevel(RF24_PA_MIN);      // Sélection d'un niveau "MINIMAL" pour communiquer (pas besoin d'une forte puissance, pour nos essais)
  radio.startListening();             // Démarrage de l'écoute du NRF24 (signifiant qu'on va recevoir, et non émettre quoi que ce soit, ici)
}

void loop() {
  // On vérifie à chaque boucle si un message est arrivé
  if (radio.available()) {
    radio.read(&message, sizeof(message));  // Si un message vient d'arriver, on le charge dans la variable "message"
    lcd.setCursor(2, 0);
    lcd.print(message);
  }
}

Voici le programme du boitier BAS...

/*

  BOITIER ESCALADE BAS
  Fichier:      sketch_jul20a - Recepteur
  Description:  Réception d'un message "stop" depuis un autre arduino nano, via un NRF24L01
 

  Librairie utilisée : RF24

  
*/
#include <SPI.h>
#include <RF24.h>
#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.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 tunnel "PIPE1"  // On définit le "nom de tunnel" (5 caractères) à travers lequel on va recevoir les données de l'émetteur

RF24 radio(pinCE, pinCSN);  // Instanciation du NRF24L01

const byte adresse[6] = tunnel;  // Mise au format "byte array" du nom du tunnel
char message[32];                // Avec cette librairie, on est "limité" à 32 caractères par message
// Initialiser la bibliothèque avec les numéros des broches de l'interface
LiquidCrystal_I2C lcd(0x3f, 20, 4);

// La broche Numérique 6 est reliée au Bouton1. On lui donne le nom BtStartStop.
int BtStartStop = 6;
// La broche Numérique 7 est reliée au Bouton2. On lui donne le nom BtReset.
int BtReset = 5;
// Déclaration variable EtatBtStartStop qui va servir à stocker une valeur au format bool.
bool EtatBtStartStop;
// Déclaration variable EtatBtReset qui va servir à stocker une valeur au format bool.
bool EtatBtReset;
// Déclaration variable EtatBoutonAppuyer qui va servir à stocker une valeur au format int.
int EtatBoutonAppuyer;
// Etc...
int EtatChronoOnOFF;
int TempsEcoule;
int Milliseconde;
int Seconde;
int Minute;

// Variable pour stocker la valeur du timer interne du microcontrôleur (millis()) au format int unsigned long
unsigned long currentTime = 0;
// Variable pour Mémoriser la valeur du timer interne du microcontrôleur "currentTime" pour par la suite la comparer
// au format int unsigned long
unsigned long previousTime = 0;


void setup() {
  // Faire de la broche du BtStartStop une entrée avec activation de la résistance de rappel interne de l'ARDUINO .
  pinMode(BtStartStop, INPUT_PULLUP);
  // Faire de la broche du BtReset une entrée avec activation de la résistance de rappel interne de l'ARDUINO .
  pinMode(BtReset, INPUT_PULLUP);

  // Partie NRF24
  radio.begin();                      // Initialisation du module NRF24
  radio.openReadingPipe(0, adresse);  // Ouverture du tunnel en LECTURE, avec le "nom" qu'on lui a donné
  radio.setPALevel(RF24_PA_MIN);      // Sélection d'un niveau "MINIMAL" pour communiquer (pas besoin d'une forte puissance, pour nos essais)
  radio.startListening();             // Démarrage de l'écoute du NRF24 (signifiant qu'on va recevoir, et non émettre quoi que ce soit, ici)


  lcd.init();
  lcd.backlight();
  // Configurez le nombre de colonnes et de lignes de l'écran LCD :
  lcd.begin(20, 4);
  // Imprime un message sur l'écran LCD.
  // Configurez le nombre de colonnes et de lignes de l'écran LCD :
  lcd.setCursor(2, 0);
  lcd.print("Chrono Escalade");
  lcd.setCursor(2, 1);
  lcd.print("** Boitier 1 **");
}

void loop() {
  // Lit la broche d'entrée du BtStartStop et stock ça valeur dans EtatBtStartStop.
  EtatBtStartStop = digitalRead(BtStartStop);
  // Lit la broche d'entrée du BtReset et stock ça valeur dans EtatBtReset.
  EtatBtReset = digitalRead(BtReset);
  // Si EtatBtStartStop == LOW et EtatBoutonAppuyer == 0 on exécute les actions entre {}
  if (EtatBtStartStop == LOW && EtatBoutonAppuyer == 0) {
    // La variable EtatBoutonAppuyer prend la valeur de 1.
    EtatBoutonAppuyer = 1;
    // Si EtatChronoOnOFF = 0 alors EtatChronoOnOFF = 1 et inversement.
    EtatChronoOnOFF = !EtatChronoOnOFF;
  }
  // Si EtatBtReset == LOW et EtatChronoOnOFF == 0 et EtatBoutonAppuyer == 0 on exécute les actions entre {}
  if (EtatBtReset == LOW && EtatChronoOnOFF == 0 && EtatBoutonAppuyer == 0) {
    // La variable EtatBoutonAppuyer prend la valeur de 1.
    EtatBoutonAppuyer = 1;
    // La variable Milliseconde prend la valeur de 0.
    Milliseconde = 0;
    //Etc...
    Seconde = 0;
    Minute = 0;
  }
  // Si EtatBtStartStop == HIGH et EtatBtReset == HIGH on exécute les actions entre {}
  if (EtatBtStartStop == HIGH && EtatBtReset == HIGH) {
    // La variable EtatBoutonAppuyer prend la valeur de 0.
    EtatBoutonAppuyer = 0;
  }


  //On stocke la valeur du timer interne du microcontrôleur de l'arduino qu'ont récupére grace à millis() dans la variable currentTime
  currentTime = millis();
  //On calcule la valeur de TempsEcoule en effectuant une soustraction entre currentTime et previousTime.
  TempsEcoule = currentTime - previousTime;
  //On stocke la valeur du timer interne du microcontrôleur de l'arduino qu'ont récupére grace à millis() dans la variable previousTime
  previousTime = millis();

  // Si EtatChronoOnOFF == 1 on exécute les actions entre {}
  if (EtatChronoOnOFF == 1) {
    // On calcule la valeur de Milliseconde en effectuant une addition entre Milliseconde et TempsEcoule.
    Milliseconde = Milliseconde + TempsEcoule;
    // Si Milliseconde > 999 on exécute les actions entre {}
    if (Milliseconde > 999) {
      Milliseconde = Milliseconde - 1000;
      // On incrémente la variable Seconde de + 1
      Seconde++;
    }
    if (Seconde > 59) {
      Seconde = 0;
      Minute++;
    }
  }
  // Placer le curseur sur la colonne 9, ligne 1 du LCD
  // (note : la ligne 0 est la première ligne, puisque le comptage commence par 0):
  lcd.setCursor(9, 3);
  // Imprime un message sur l'écran LCD.
  lcd.print(":");
  // Si la variable Milliseconde est plus grande que 99 on exécute les actions entre {}
  if (Milliseconde > 99) {
    // Placer le curseur sur la colonne 10, ligne 1 du LCD
    lcd.setCursor(10, 3);
    // Imprime la valeur de la variable Milliseconde sur l'écran LCD
    lcd.print(Milliseconde);
  }
  // Sinon si la variable Milliseconde est plus grande que 99 on exécute les actions entre {}
  else if (Milliseconde > 9 && Milliseconde < 100) {
    //Etc...
    lcd.setCursor(10, 3);
    lcd.print("0");
    lcd.setCursor(11, 3);
    lcd.print(Milliseconde);
  } else if (Milliseconde > 0 && Milliseconde < 10) {
    lcd.setCursor(10, 3);
    lcd.print("00");
    lcd.setCursor(12, 3);
    lcd.print(Milliseconde);
  } else {
    lcd.setCursor(9, 3);
    lcd.print(":000");
  }

  lcd.setCursor(6, 3);
  lcd.print(":");
  if (Seconde < 10) {
    lcd.setCursor(7, 3);
    lcd.print("0");
    lcd.setCursor(8, 3);
    lcd.print(Seconde);
  } else {
    lcd.setCursor(7, 3);
    lcd.print(Seconde);
  }

  lcd.setCursor(3, 3);

  if (Minute < 10) {
    lcd.setCursor(4, 3);
    lcd.print("0");
    lcd.setCursor(5, 3);
    lcd.print(Minute);
  } else {
    lcd.setCursor(4, 3);
    lcd.print(Minute);
  }
}

je vais faire les modifications...