Partage
  • Partager sur Facebook
  • Partager sur Twitter

Reveil arduino : afficheur 7 segments

Besoin d'aide en programmation

Sujet résolu
    8 février 2018 à 21:41:33

    Bonjour/Bonsoir,

    J'aurais besoin de l'aide d'une âme charitable pour la programmation d'une carte arduino mega.

    Je vous explique mon problème :

    J'ai commencé l'électronique il y a un peu plus de 2 ans environ en amateur J'ai décidé il y a quelques mois de me lancer dans la conception d'un reveil matin sous arduino. J'ai donc pour cela utilisé une carte arduino mega, un module DS3231 et un afficheur 7 segments de 4 digits à Anode commune.

    J'ai reussi avec succès à coder la fonction "afficher heure" grâce aux librairies sevseg et DS3231 ( aux adresses : https://playground.arduino.cc/Main/SevenSegmentLibrary et https://github.com/jarzebski/Arduino-DS3231 ). Cependant je me suis récemment heurté à un problème pour coder la fonction "changer heure" à l'aide de 3 boutons poussoirs. Non pas que je sois incapable de changer l'heure du module, mais c'est plutôt un problème visuel.

    J'ai donc 3 boutons : un qui me sert à vérifier le fait que l'utilisateur veuille accéder à la fonction "modifier heure" et les 2 autres servant respectivement à régler heures et minutes. Les boutons me permettent bien de modifier l'heure du module mais au moment d'incrémenter plus une heure ou minute, l'afficheur 7 segment passe par un état d'allumage "aléatoire" de segments.

    Dès lors que j'appuie sur le bouton pour augmenter le temps d'une heure ou minute, l'afficheur passe par un état aléatoire puis lorsque je relâche ledit bouton, l'afficheur m'indique l'heure nouvellement réglée.

    Voici mon code :

    <#include "SevSeg.h"


    #include <Wire.h>
    #include "DS3231.h"

    SevSeg sevseg; //Instantiate a seven segment object
    DS3231 clock;
    RTCDateTime dt;
    const int HButton = 2;
    const int MButton = 4;
    const int SetTButton = 3;

    int CurrentHour = 0;
    int CurrentMin = 0;
    int lastButtonTState = 0;
    int ButtonTState = 0;
    int ButtonHState = 0;
    int lastButtonHState = 0;
    int ButtonMState = 0;
    int lastButtonMState = 0;



    void setup() {
        Wire.begin();
        pinMode(HButton, INPUT);
        pinMode(MButton, INPUT);
        pinMode(SetTButton, INPUT);

        byte numDigits = 4;
        byte digitPins[] = {52, 50, 48, 46};
        byte segmentPins[] = {38, 42, 36, 34, 32, 44, 40, 30};
        sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins);
        sevseg.setBrightness(50);

        clock.begin();

    }

    void loop() {
        sevseg.refreshDisplay();
        MiseaHeure();
        AfficherH();

      delay(1);

    }

    void AfficherH() {
         dt = clock.getDateTime();
        sevseg.setNumber(dt.hour*100+dt.minute, 4);
    }


    //Définition de la fonction mise à l'heure
    void MiseaHeure() {
       CurrentHour = dt.hour;
       CurrentMin = dt.minute;
       ButtonTState = digitalRead(SetTButton);
        if (ButtonTState != lastButtonTState) {
         if (ButtonTState == HIGH) {
      while (ButtonTState == HIGH) {
           sevseg.refreshDisplay();
           ButtonHState = digitalRead(HButton);
           ButtonMState = digitalRead(MButton);
           if (ButtonHState != lastButtonHState) {
           if (ButtonHState == HIGH) {
             //Si besoin on change les heures
             CurrentHour = CurrentHour + 1;
             if (CurrentHour >= 24) {
               CurrentHour = 0;
             }
        clock.setDateTime(dt.year, dt.month, dt.day, CurrentHour, dt.minute,
    dt.second);
        sevseg.refreshDisplay();
        delay(500);
           }
         }
         else if (ButtonMState != lastButtonMState) {
           if (ButtonMState == HIGH) {
             //Si besoin, on change les minutes
              CurrentMin = CurrentMin + 1;
             if (CurrentMin >= 60) {
               CurrentMin = 0;
             }
        clock.setDateTime(dt.year, dt.month, dt.day, dt.hour, CurrentMin,
    dt.second);
        sevseg.refreshDisplay();
        delay(500);
           }
         }
    AfficherH();
    sevseg.refreshDisplay();
    ButtonTState = digitalRead(SetTButton);
         }
        }
      }


    lastButtonTState = ButtonTState;
    lastButtonHState = ButtonHState;
    lastButtonMState = ButtonMState;
    }>

    Je joint dans le prochain post, une photo du problème.

    [Edit]

    Je me rends compte que le code est mal présenté sous cette forme. Je joindrai donc demain un pdf ou fichier texte ainsi que la photo du problème que je n'ai malheureusement pas sur moi pour le moment. 

    Merci

    -
    Edité par PCov3r 6 avril 2018 à 9:36:38

    • Partager sur Facebook
    • Partager sur Twitter
      8 février 2018 à 22:09:56

      Bonsoir,

      Il faut utiliser l'icône </> pour ajouter le code sur le forum...

      L'afficheur étant multiplexé temporellement, il faut appeler la fonction d'affichage en permanence pour voir quelque chose grâce à la persistence rétinienne, sinon avec un delay(500) l'afficheur n'est pas mis à jour pendant ces 500ms. Et apparemment, tu ne mets pas à jour la valeur affichée avant d'appeler refreshDisplay.

      Au lieu de:

      sevseg.refreshDisplay();
      delay(500);

      tu devrais avoir quelque chose comme ça:

      AfficherH(); // ou sevseg.setNumber... pour éviter un appel à getDateTime
      for(unsigned long debut = millis(); millis() - debut < 500;){
        sevseg.refreshDisplay();
      }

      pour attendre 500ms mais en rafraîchissant l'affichage en continu. 

      • Partager sur Facebook
      • Partager sur Twitter
        8 février 2018 à 22:23:02

        Merci pour cette réponse aussi rapide. Je pense avoir compris le problème. J'essaierai de modifier le code dès demain.

        Merci encore, cela m'aide beaucoup

        Après reupload du code, tout fonctionne parfaitement.

        Merci encore, je clos le sujet.

        -
        Edité par PCov3r 9 février 2018 à 8:51:28

        • Partager sur Facebook
        • Partager sur Twitter
          20 décembre 2019 à 21:22:30

          Bonjour,

          Je voudrais faire un réveil avec un module RTC et un afficheur 7 segements 4 digit et d'un arduino uno.J'ai vu sur un autre site qu'il fallait deux microcontrôleurs.

          Pourriez vous m'aider s'il vous plait ?

          Merci d'avance.

          • Partager sur Facebook
          • Partager sur Twitter

          Reveil arduino : afficheur 7 segments

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown