Horloge Géante

Il n'affiche pas Mise a jour : heure = xxxx ?
Ces textes s'affichent bien toutes les secondes, pas en continu ?

Au passage, à la fin de la fonction StartChrono, il faut ajouter

dernierTempsChrono = millis();

Après cette modif, peux-tu poster le code tel qu'il est et ce qu'affiche la console ? Merci

si je rajoute le code

dernierTempsChrono = millis();

sa me met que se n'est pas declaré dans le scope

le code actuel est

#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include "FastLED.h"
#define NUM_LEDS 114 // Number of LED controls (remember I have 3 leds / controler
#define COLOR_ORDER BRG  // Define color order for your strip
#define DATA_PIN 6  // Data pin for led comunication
#define BP_START 7 // Pin bouton Start
#define BP_STOP   8 // Pin bouton Stop
#define BP_RESET 9 // Pin bouton Reset
#define INTER 10   // Pin inter 15 / 45

CRGB leds[NUM_LEDS]; // Define LEDs strip
byte digits[10][28] = {
  {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, //0
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}, //1
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, //2
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, //3
  {1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1}, //4
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, //5
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, //6
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, //7
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, //8
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, //9 | 2D Array for numbers on 7 segment
};
bool Dot = true;  //Dot state
int ledColor = 0x0000FF; // Color used (in hex)
int Heure = 0;
bool EtatChrono = false;  // Chrono arrêté
int HeureMax = 4500;

void setup() {
  Serial.begin(9600);
  //  Wire.begin();
  LEDS.addLeds<WS2811, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Set LED strip type
  LEDS.setBrightness(255); // Set initial brightness
  pinMode(BP_START, INPUT_PULLUP); // bouton START
  pinMode(BP_STOP, INPUT_PULLUP); // bouton STOP
  pinMode(BP_RESET, INPUT_PULLUP); // bouton RESET
  pinMode(INTER, INPUT_PULLUP); // inter 15 / 45
  TimeToArray();
  FastLED.show();

}

// Check Light sensor and set brightness accordingly
void BrightnessCheck() {
  const byte sensorPin = 3; // light sensor pin
  const byte brightnessLow = 5; // Low brightness value
  const byte brightnessHigh = 255; // High brightness value
  int sensorValue = digitalRead(sensorPin); // Read sensor
  if (sensorValue == 0) {
    LEDS.setBrightness(brightnessHigh);
  }
  else {
    LEDS.setBrightness(brightnessLow);
  }
}

// Convert time to array needet for display
void TimeToArray() {
  int cursor = 0;
  int Secondes = Heure % 100;
  int Now = Heure;

  Dot = true;
  if (Secondes % 2 == 1) Dot = false;
  if (Dot) {
    leds[56] = ledColor;
    leds[57] = ledColor;
  }
  else {
    leds[56] = 0x000000;
    leds[57] = 0x000000;
  }

  for (int i = 1; i <= 4; i++) {
    int digit = Now % 10; // get last digit in time
    if (i == 1) {
            Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 0;
      for (int k = 0; k <= 27; k++) {
                Serial.print(digits[digit][k]);
        leds[cursor + k] = ledColor * digits[digit][k];
        cursor ++;
      }
            Serial.println();
    }
    else if (i == 2) {
            Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 28;
      for (int k = 0; k <= 27; k++) {
                Serial.print(digits[digit][k]);
        leds[cursor + k] = ledColor * digits[digit][k];
        cursor ++;
      }
            Serial.println();
    }
    else if (i == 3) {
            Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 58;
      for (int k = 0; k <= 27; k++) {
                Serial.print(digits[digit][k]);
        leds[cursor + k] = ledColor * digits[digit][k];
        cursor ++;
      }
            Serial.println();
    }
    else if (i == 4) {
            Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
      cursor = 86;
      for (int k = 0; k <= 27; k++) {
                Serial.print(digits[digit][k]);
        leds[cursor + k] = ledColor * digits[digit][k];
        cursor ++;
      }
            Serial.println();
    }
    Now /= 10;
  }
}

void MiseAJour()
{
  Heure += 1;
  if (Heure % 100 == 60) Heure = Heure + 40;
  Serial.print(" Mise a jour : heure = ");
  Serial.println(Heure);
}

void LectureBoutons()
{
  int EtatBPStart = digitalRead(BP_START);
  int EtatBPStop = digitalRead(BP_STOP);
  int EtatBPReset = digitalRead(BP_RESET);
  int EtatInter = digitalRead(INTER);
  if (EtatBPStart) StartChrono ();
  if (EtatBPStop) StopChrono ();
  if (EtatBPReset) ResetChrono ();
  HeureMax = 4500;
  if (EtatInter) HeureMax = 1500;
}

void loop()  // Main loop
{
  LectureBoutons();
  if (EtatChrono)
  {
    unsigned long dernierTempsChrono;
    if (millis() - dernierTempsChrono >= 1000)
    {
      MiseAJour();
      TimeToArray();
      dernierTempsChrono += 1000;
    }
  }
  FastLED.show(); // Display leds array
  if (Heure >= HeureMax) EtatChrono = false;
}

void StartChrono () {
  EtatChrono = true;
}

void StopChrono () {
  EtatChrono = false;
}

void ResetChrono () {
  EtatChrono = false;
  Heure = 0;
}

Merci
pour que ça compile, il faut déplacer le ligne

   unsigned long dernierTempsChrono;

dans l'entête, après int HeureMax par exemple

Au passage, commente les lignes
                Serial.print(digits[digit][k]);c'est à dire que tu mets // en début de ces lignes
ça évitera trop de texte qui ne sert pas

le code compile et dans la console sur une ligne sa ecrit:

Dig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDigitDigitDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮⸮⸮⸮⸮tDig⸮T⸮tDigitDigitDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮⸮⸮⸮⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮⸮⸮⸮⸮tDig⸮T⸮tDigitDigitDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮⸮⸮⸮⸮tDig⸮T⸮tDigitDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮tDig⸮T⸮tDigitDig⸮T⸮tDig⸮T⸮tDigitDig⸮T⸮tDig⸮T⸮tDigitDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDigitDigitDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮⸮⸮⸮⸮tDig⸮T⸮tDigitDigitDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮tDig⸮T⸮⸮⸮⸮⸮⸮⸮⸮⸮

Ainsi de suite

Tu as bien sélectionné 9600 en bas de la console ?

J"ai fini par avancer : ça marche chez moi sauf pour les boutons que je n'ai pas connectés. Donc s'il y a encore un problème, ça vient des boutons. Notamment, je n'ai pas géré les rebonds. Si on veut être précis, il ne faut pas utiliser un delay (je vais me renseigner sur e point) et faire plutôt une gestion matérielle. Là je ne suis pas très au courant, il faudra demander sur le forum.

Voici le code :

#include "FastLED.h"
#define NUM_LEDS 114 // Number of LED controls (remember I have 3 leds / controler
#define COLOR_ORDER BRG  // Define color order for your strip
#define DATA_PIN 6  // Data pin for led comunication
#define BP_START 7 // Pin bouton Start
#define BP_STOP   8 // Pin bouton Stop
#define BP_RESET 9 // Pin bouton Reset
#define INTER 10   // Pin inter 15 / 45

CRGB leds[NUM_LEDS]; // Define LEDs strip
byte digits[10][28] = {
  {0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, //0
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0}, //1
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, //2
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, //3
  {1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1}, //4
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, //5
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, //6
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, //7
  {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, //8
  {1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, //9 | 2D Array for numbers on 7 segment
};
bool Dot = true;  //Dot state
int ledColor = 0x0000FF; // Color used (in hex)
int Heure = 0;
bool EtatChrono = false;  // Chrono arrêté
int HeureMax = 4500;
unsigned long dernierTempsChrono;

void setup() {
  Serial.begin(115200);
  LEDS.addLeds<WS2811, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Set LED strip type
  LEDS.setBrightness(255); // Set initial brightness
  pinMode(BP_START, INPUT_PULLUP); // bouton START
  pinMode(BP_STOP, INPUT_PULLUP); // bouton STOP
  pinMode(BP_RESET, INPUT_PULLUP); // bouton RESET
  pinMode(INTER, INPUT_PULLUP); // inter 15 / 45
  TimeToArray();
  FastLED.show();
  dernierTempsChrono = millis();
}

// Check Light sensor and set brightness accordingly
void BrightnessCheck() {
  const byte sensorPin = 3; // light sensor pin
  const byte brightnessLow = 5; // Low brightness value
  const byte brightnessHigh = 255; // High brightness value
  int sensorValue = digitalRead(sensorPin); // Read sensor
  if (sensorValue == 0) {
    LEDS.setBrightness(brightnessHigh);
  }
  else {
    LEDS.setBrightness(brightnessLow);
  }
}

// Convert time to array needet for display
void TimeToArray() {
  int cursor = 0;
  int Secondes = Heure % 100;
  int Now = Heure;

  Dot = true;
  if (Secondes % 2 == 1) Dot = false;
  if (Dot) {
    leds[56] = ledColor;
    leds[57] = ledColor;
  }
  else {
    leds[56] = 0x000000;
    leds[57] = 0x000000;
  }

  for (int i = 1; i < 5; i++) {
    int digit = Now % 10; // get last digit in time
    cursor = (i - 1) * 28;
    if (i > 2) cursor += 2;
    Serial.print (" "); Serial.print(digit);
    for (int k = 0; k < 28; k++) {
      leds[cursor + k] = ledColor * digits[digit][k];
    }
    Now /= 10;
  }
  Serial.println();
}

void MiseAJour()
{
  Heure += 1;
  if (Heure % 100 == 60) Heure = Heure + 40;
  Serial.print("Heure = "); Serial.print(Heure); Serial.print (" :");
}

void LectureBoutons()
{
  if (digitalRead(BP_START)) StartChrono ();
  if (digitalRead(BP_STOP))  StopChrono ();
  if (digitalRead(BP_RESET)) ResetChrono ();
  HeureMax = 4500;
  if (digitalRead(INTER)) HeureMax = 1500;
}

void loop()  // Main loop
{
  LectureBoutons();
  if (EtatChrono)
  {
    if (millis() - dernierTempsChrono >= 1000)
    {
      MiseAJour();
      TimeToArray();
      dernierTempsChrono += 1000;
      FastLED.show(); // Display leds array
    }
  }
  if (Heure >= HeureMax) EtatChrono = false;
}

void StartChrono () {
  EtatChrono = true;
  dernierTempsChrono = millis();
}

void StopChrono () {
  EtatChrono = false;
}

void ResetChrono () {
  EtatChrono = false;
  Heure = 0;
}

Il faut que tu règles la console à 115200 (tout en bas, liste déroulante). Le code attend que tu appuies sur le bouton Start pour lancer le chrono. Bouton stop pour l'arrêter et start pour le relancer. Reset remet à 0 et attend start pour lancer le chrono.
Enfin, l'interrupteur permet de choisir entre 15 et 45 minutes.

Dis-moi si ça marche ...
A+

Bonsoir lesept

je te ferais un retour demain soir ou mardi.

Merci

Bonsoir lesept

j'ai fait l'essais pour le chronomètre il affiche bien'00:00'

mais impossible de le lancer ?

j'ai verifié a plusieurs fois mon câblage et se n'est pas un problème d'affichage.

Je n 'ai pas testé les boutons, c'est vrai. On va mettre des serial dans la fonction de lecture des boutons : tu peux tester ça ?

void LectureBoutons()
{
  int EtatStart = digitalRead(BP_START);
  int EtatStop = digitalRead(BP_STOP);
  int EtatReset = digitalRead(BP_RESET);
  Serial.print ("Etat des boutons : Start = ");
  Serial.print (EtatStart);
  Serial.print (" Stop = ");
  Serial.print (EtatStop);
  Serial.print (" Reset = ");
  Serial.println (EtatReset);
  if (EtatStart)  StartChrono ();
  if (EtatStop)  StopChrono ();
  if (EtatReset) ResetChrono ();
  HeureMax = 4500;
  if (digitalRead(INTER)) HeureMax = 1500;
}

Et me dire ce qui s'affiche sur la console (115200 bauds). Merci

EDIT : au fait, si tu veux voir le chrono fonctionner (malgré les boutons), tu peux mettre (temporairement)

bool EtatChrono = true;  // <-- true au lieu de false

Il devrait marcher (je croise les doigts, je n'ai plus de corbeaux...:slight_smile: )

Je viens de faire le test et voici l'affichage dans la console:

Etat des boutons : Start = 1 Stop = 1 Reset = 1

le code tourne en boucle

lorsque j'appuie sur l'un des bouton l'état passe a 0 (exemple :Etat des boutons : Start = 0 Stop = 1 Reset = 1)

(j'avais déjà mis la valeur a true pour 'bool EtatChrono = true;' sans succes)

Ok, lis ça et en particulier la différence entre pullup et pulldown. J'avais une chance sur 2...

Du coup, il faut changer PULLUP en PULLDOWN dans ces lignes :

 pinMode(BP_START, INPUT_PULLUP); // bouton START
  pinMode(BP_STOP, INPUT_PULLUP); // bouton STOP
  pinMode(BP_RESET, INPUT_PULLUP); // bouton RESET
  pinMode(INTER, INPUT_PULLUP); // inter 15 / 45

Sinon ceci :

  if (!EtatStart)  StartChrono ();
  if (!EtatStop)  StopChrono ();
  if (!EtatReset) ResetChrono ();

"!" après les if.

j'ai mis le '!' après les if

le chrono se lance tout seul je peux l'arreter si après j'appuie sur start le chrono se relance mais en affichant le temps qui c'est réellement ecoulé (c'est a dire si je l'arrete a '00:20' et que j'attend 20 secondes et que j'appuie sur start il repart a '00:40')

la remise a zero du chrono ne fonctionne pas

si je met PULLDOWN a la place de PULLUP il me met que se n'est pas déclaré dans le scope.

ASSM:
si je met PULLDOWN a la place de PULLUP il me met que se n'est pas déclaré dans le scope.

oui c'est pour ça que j'ai proposé l'autre solution

ASSM:
j'ai mis le '!' après les if

le chrono se lance tout seul je peux l'arreter si après j'appuie sur start le chrono se relance mais en affichant le temps qui c'est réellement ecoulé (c'est a dire si je l'arrete a '00:20' et que j'attend 20 secondes et que j'appuie sur start il repart a '00:40'

Est ce qu'il affiche Heure = et des chiffres ensuite ?
As tu remis au début du code EtatChrono = false ; ?

j'ai bien remis EtatChrono = false ;

voici ce qu'il affiche

Heure = 1 : 1 0 0 0
Etat des boutons : Start = 0 Stop = 1 Reset = 1
Heure = 2 : 2 0 0 0
Etat des boutons : Start = 0 Stop = 1 Reset = 1
Heure = 3 : 3 0 0 0
Etat des boutons : Start = 0 Stop = 1 Reset = 1
Heure = 4 : 4 0 0 0
Etat des boutons : Start = 0 Stop = 1 Reset = 1
Heure = 5 : 5 0 0 0
Etat des boutons : Start = 0 Stop = 1 Reset = 1
Heure = 6 : 6 0 0 0

si j'appuie sur le bouton reset il fait la meme chose que le bouton stop.

Et côté leds ? C'est bon ?
Que se passe t-il si tu appuies sur le bouton stop?

coté affichage les il n'y a aucun soucis
si j'appuie sur stop le compteur s'arrete sur le temps actuel par exemple '00:32' mais continue de compter en mémoire.
exactement la meme chose pour le bouton reset.