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
/ 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);
}
}
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...