Bonjour à tous, après le Test de Rapidité, je suis entrain de réaliser un système de chronométrage sur deux voies d'escalade. Bien entendu, les 2 voies sont indépendantes et chronométrées séparément. Le départ est donné à partir d'un tapis sensible On/Off et l'arrêt par un bouton poussoir (comme le "test de rapidité"). L'affichage des temps se fait par 2 matrices WS2812 64x8. Un tableau déporté affiche les 2 temps au millième sur un lcd 20x4 avec la commande de Remise à zéro des compteurs pour l'arbitre.
J'en suis arrivé à ce que le lcd et un afficheur fonctionnent bien. Sauf que le temps (par millis) compte environ 40 sec dans une minute au chronomètre de mon téléphone; et qu'il n'y a qu'un afficheur qui fonctionne.
Auriez-vous une astuce pour afficher les 2 compteurs sur mes matrices et remédier au décalage de comptage ?
Voici mon code :
```cpp
// Chronometre_simple-start/Stop/Reset
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define DATA_PIN1 9
#define DATA_PIN2 8
Adafruit_NeoMatrix matrix1 = Adafruit_NeoMatrix(56, 8, DATA_PIN1, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800);
Adafruit_NeoMatrix Led2 = Adafruit_NeoMatrix(56, 8, DATA_PIN2, NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800);
const uint16_t colors1[] = { matrix1.Color(255, 0, 0), matrix1.Color(0, 255, 0), matrix1.Color(0, 0, 255), matrix1.Color(255, 255, 255) };
const uint16_t colors2[] = { Led2.Color(255, 0, 0), Led2.Color(0, 255, 0), Led2.Color(0, 0, 255), Led2.Color(255, 255, 255) };
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
int BtStartStop1 = 4;
int BtStartStop2 = 3;
int BtReset = 2;
bool EtatBtStartStop1;
bool EtatBtStartStop2;
bool EtatBtReset;
int EtatBoutonAppuyer1;
int EtatChronoOnOFF1;
int TempsEcoule1;
int Milliseconde1;
int Seconde1;
int Minute1;
int Heure1;
unsigned long currentTime1 = 0;
unsigned long previousTime1 = 0;
int EtatBoutonAppuyer2;
int EtatChronoOnOFF2;
int TempsEcoule2;
int Milliseconde2;
int Seconde2;
int Minute2;
int Heure2;
unsigned long currentTime2 = 0;
unsigned long previousTime2 = 0;
void setup() {
pinMode(BtStartStop1, INPUT_PULLUP);
pinMode(BtStartStop2, INPUT_PULLUP);
pinMode(BtReset, INPUT_PULLUP);
pinMode(DATA_PIN1, OUTPUT);
pinMode(DATA_PIN2, OUTPUT);
lcd.begin(20, 4);
lcd.setCursor(0, 0);
lcd.print("Chrono au 1/1000 sec");
lcd.setCursor(0, 1);
lcd.print("V");
lcd.setCursor(0, 2);
lcd.print("1");
lcd.setCursor(0, 3);
lcd.print("2");
matrix1.begin();
matrix1.setBrightness(10);
matrix1.setTextWrap(true);
Led2.begin();
Led2.setBrightness(10);
Led2.setTextWrap(true);
}
int x1 = matrix1.width();
int x2 = Led2.width();
int pass = 1;
void loop() {
lcd.backlight();
matrix1.fillScreen(0);
Led2.fillScreen(0);
EtatBtStartStop1 = digitalRead(BtStartStop1);
EtatBtStartStop2 = digitalRead(BtStartStop2);
EtatBtReset = digitalRead(BtReset);
if (EtatBtStartStop1 == LOW && EtatBoutonAppuyer1 == 0) {
EtatBoutonAppuyer1 = 1;
EtatChronoOnOFF1 = !EtatChronoOnOFF1;
}
if (EtatBtReset == LOW && EtatChronoOnOFF1 == 0 && EtatBoutonAppuyer1 == 0) {
EtatBoutonAppuyer1 = 1;
Milliseconde1 = 0;
Seconde1 = 0;
Minute1 = 0;
Heure1 = 0;
}
if (EtatBtStartStop1 == HIGH && EtatBtReset == HIGH) {
EtatBoutonAppuyer1 = 0;
}
currentTime1 = millis();
TempsEcoule1 = currentTime1 - previousTime1;
previousTime1 = millis();
if (EtatChronoOnOFF1 == 1) {
Milliseconde1 = Milliseconde1 + TempsEcoule1;
if (Milliseconde1 > 999) {
Milliseconde1 = Milliseconde1 - 1000;
Seconde1++;
}
if (Seconde1 > 59) {
Seconde1 = 0;
Minute1++;
}
if (Minute1 > 59) {
Minute1 = 0;
Heure1++;
}
}
if (EtatBtStartStop2 == LOW && EtatBoutonAppuyer2 == 0) {
EtatBoutonAppuyer2 = 1;
EtatChronoOnOFF2 = !EtatChronoOnOFF2;
}
if (EtatBtReset == LOW && EtatChronoOnOFF2 == 0 && EtatBoutonAppuyer2 == 0) {
EtatBoutonAppuyer2 = 1;
Milliseconde2 = 0;
Seconde2 = 0;
Minute2 = 0;
Heure2 = 0;
}
if (EtatBtStartStop2 == HIGH && EtatBtReset == HIGH) {
EtatBoutonAppuyer2 = 0;
}
currentTime2 = millis();
TempsEcoule2 = currentTime2 - previousTime2;
previousTime2 = millis();
if (EtatChronoOnOFF2 == 1) {
Milliseconde2 = Milliseconde2 + TempsEcoule2;
if (Milliseconde2 > 999) {
Milliseconde2 = Milliseconde2 - 1000;
Seconde2++;
}
if (Seconde2 > 59) {
Seconde2 = 0;
Minute2++;
}
if (Minute2 > 59) {
Minute2 = 0;
Heure2++;
}
}
lcd.setCursor(11, 2);
lcd.print(".");
if (Milliseconde1 > 99) {
lcd.setCursor(16, 2);
lcd.print(Milliseconde1);
} else if (Milliseconde1 > 9 && Milliseconde1 < 100) {
lcd.setCursor(16, 2);
lcd.print("0");
lcd.setCursor(16, 2);
lcd.print(Milliseconde1);
} else if (Milliseconde1 > 0 && Milliseconde1 < 10) {
lcd.setCursor(16, 2);
lcd.print("00");
lcd.setCursor(16, 2);
lcd.print(Milliseconde1);
}
lcd.setCursor(11, 3);
lcd.print(".");
if (Milliseconde2 > 99) {
lcd.setCursor(16, 3);
lcd.print(Milliseconde2);
} else if (Milliseconde2 > 9 && Milliseconde2 < 100) {
lcd.setCursor(16, 3);
lcd.print("0");
lcd.setCursor(16, 3);
lcd.print(Milliseconde2);
} else if (Milliseconde2 > 0 && Milliseconde2 < 10) {
lcd.setCursor(16, 3);
lcd.print("00");
lcd.setCursor(16, 3);
lcd.print(Milliseconde2);
} else {
lcd.setCursor(15, 2);
lcd.print(".000");
lcd.setCursor(15, 3);
lcd.print(".000");
lcd.setCursor(14, 2);
lcd.print("..");
lcd.setCursor(14, 3);
lcd.print("..");
}
if (Seconde1 < 10) {
lcd.setCursor(12, 2);
lcd.print("0");
lcd.setCursor(13, 2);
lcd.print(Seconde1);
} else {
lcd.setCursor(12, 2);
lcd.print(Seconde1);
}
if (Seconde2 < 10) {
lcd.setCursor(12, 3);
lcd.print("0");
lcd.setCursor(13, 3);
lcd.print(Seconde2);
} else {
lcd.setCursor(12, 3);
lcd.print(Seconde2);
}
lcd.setCursor(10, 2);
lcd.print("..");
lcd.setCursor(10, 3);
lcd.print("..");
if (Minute1 < 10) {
lcd.setCursor(8, 2);
lcd.print("0");
lcd.setCursor(9, 2);
lcd.print(Minute1);
}
if (Minute2 < 10) {
lcd.setCursor(8, 3);
lcd.print("0");
lcd.setCursor(9, 3);
lcd.print(Minute2);
} else {
lcd.setCursor(8, 2);
lcd.print(Minute1);
lcd.setCursor(8, 3);
lcd.print(Minute2);
}
lcd.setCursor(6, 2);
lcd.print("..");
lcd.setCursor(6, 3);
lcd.print("..");
if (Heure1 < 10) {
lcd.setCursor(4, 2);
lcd.print("0");
lcd.setCursor(5, 2);
lcd.print(Heure1);
}
if (Heure2 < 10) {
lcd.setCursor(4, 3);
lcd.print("0");
lcd.setCursor(5, 3);
lcd.print(Heure2);
} else {
lcd.setCursor(5, 2);
lcd.print(Heure1);
lcd.setCursor(5, 3);
lcd.print(Heure2);
}
matrix1.setCursor(40, 1);
matrix1.setTextColor(colors1[1]);
matrix1.print(Milliseconde1);
matrix1.setCursor(35, 0);
matrix1.setTextColor(colors1[0]);
matrix1.print(".");
matrix1.setCursor(25, 1);
matrix1.setTextColor(colors1[1]);
matrix1.print(Seconde1);
matrix1.setCursor(20, 0);
matrix1.setTextColor(colors1[0]);
matrix1.print(".");
matrix1.setCursor(10, 1);
matrix1.setTextColor(colors1[1]);
matrix1.print(Minute1);
matrix1.setCursor(5, 0);
matrix1.setTextColor(colors1[0]);
matrix1.print(".");
matrix1.show();
Led2.setCursor(40, 1);
Led2.setTextColor(colors2[1]);
Led2.print(Milliseconde2);
Led2.setCursor(35, 0);
Led2.setTextColor(colors2[0]);
Led2.print(".");
Led2.setCursor(25, 1);
Led2.setTextColor(colors2[1]);
Led2.print(Seconde2);
Led2.setCursor(20, 0);
Led2.setTextColor(colors2[0]);
Led2.print(".");
Led2.setCursor(10, 1);
Led2.setTextColor(colors2[1]);
Led2.print(Minute2);
Led2.setCursor(5, 0);
Led2.setTextColor(colors2[0]);
Led2.print(".");
Led2.show();
}