Go Down

Topic: [RESOLU]Dans l'exemple "Adafruit clock_sevenseg_gps" Gestion des zéros à minuit (Read 231 times) previous topic - next topic

JackyNiew

Bonjour,

Je viens de réaliser une horloge à partir d'un Arduino UNO et de l'afficheur 7Segment 1.2" LED Adafruit et du module Adafruit GPS.
Tout fonctionne correctement. J'ai modifié le "sketch" de façon à obtenir un affichage format 24h et le fuseau horaire +1

Mais lorsque l'affichage arrive à minuit l'affichage devient 0: 1 il manque le zéro des dizaines.
J'ai joint à ce message le code en question. Vers la fin du "sketch" il me semble qu'il est question de ce défaut d'affichage. Mais étant vraiment très novice dans le codage de l'Arduino, je ne comprends pas tout et surtout je ne veux pas provoquer des erreurs en faisant n'importe quoi.

Quelqu'un pourrait-il m'expliquer ce qui est à modifier pour avoir un affichage correcte?
Et si possible 00:01

D'avance merci.

Jacky

rjnc38


tu as un exemple pour les minutes :
 
Code: [Select]
 if (minutes < 10) {
     clockDisplay.writeDigitNum(2, 0);
   }

tu devrais trouver ce qu'il faut changer pour les heures (variable et emplacement)
tu rajoutes ces lignes après celles ci :
Code: [Select]
// Now print the time value to the display.
 clockDisplay.print(displayValue, DEC);



JackyNiew

Bonjour et merci de ta réponse.

Mais je l'ai précisé dans mon message, je suis vraiment nul en programmation.

donc j'ai essayé de trouver un Tuto concernant la logique appliquée pour la programmation des "digits" pour cette afficheur.
Et pour l'instant il me manque toujours le zéro des dizaines pour les minutes après minuit, j'ai 0: 1
au lieu de 0:01

Lorsque tu me dis que j'ai un exemple pour les minutes:

 if (minutes < 10) {
     clockDisplay.writeDigitNum(2, 0);
   }

Je traduit par si les minutes sont inférieur à 10 on doit afficher "clockDiplay.writeDigitNum(2, 0)" Mais je ne comprend pas vraiment le sens de la valeur (2, 0)

Merci d'avance.
Jacky

rjnc38

Mais je l'ai précisé dans mon message, je suis vraiment nul en programmation.
on commence tous comme ça, et il n'y a pas de raisons pour le rester

Quote
Lorsque tu me dis que j'ai un exemple pour les minutes:
 if (minutes < 10) {
     clockDisplay.writeDigitNum(2, 0);
   }
Je traduit par si les minutes sont inférieur à 10 ...
c'est bien ça, si tu regardes un peu ton code tu vas facilement trouver ce qu'il faut modifier pour tester si les heures sont inférieur à 10 (remplacer minutes par ....)

Quote
"clockDiplay.writeDigitNum(2, 0)" Mais je ne comprend pas vraiment le sens de la valeur (2, 0)
en réflechissant un peu on peu imaginer qu'on cherche a écrire un 0 dans les dizaines de minutes donc le deuxième chiffre représente ce qu'on veut écrire. si tu regardes dans ton code tu dois trouver un endroit ou dans certains cas on force les unités des heures avec (1, 0) donc on peut penser que  les dizaines d'heures se trouvent en emplacement 0

tu vas y arriver  ;)

JackyNiew

Merci pour la réponse.

Je me doute que mes questions doivent te sembler débiles pour un initié, mais en vérité je suis pilote, je sais calculer par rapport à la masse totale de la machine qu'elle sera la vitesse de rotation pour le décollage, mais il est vrai que je suis vraiment nul pour ce qui est d'interpréter, les subtilités du langage de prog de l'Arduino.

Je vais essayer de comprendre ce que tu m'expliques si gentiment.

Merci pour tout.

Jacky

JackyNiew

Faut-il donc que je considère que le rang des dizaines d'heures et 0, les unités d'heures 1, les dizaines de minutes 2, les unités de minutes 3 ???

H  H  :  min  min

0  1  :    2     3


Si c'est le cas, le Code d'origine:

 if (minutes < 10) {
     clockDisplay.writeDigitNum(2, 0);
   }

ne m'affiche pas un zéro pour les dizaines de minutes, lorsque les minutes sont <10
puisqu'à minuit j'ai 0H 0  au lieu de 0H00

Ensuite il me semble que tu me parles du zéro pour les dizaines d'heures, (moins important pour moi pour l'instant)
Car ce que je cherche à corriger en priorité c'est le zéro des dizaines de minutes à minuit lorsque les minutes sont <10.

Merci de ta patience...
Jacky

rjnc38

tu travaille en mode 12h (#define TIME_24_HOUR      false) et la correction des dizaines de minutes n'est faite que pour le mode 24h dans cette partie de code
Code: [Select]

  // Now print the time value to the display.
  clockDisplay.print(displayValue, DEC);

  // Add zero padding when in 24 hour mode and it's midnight.
  // In this case the print function above won't have leading 0's
  // which can look confusing.  Go in and explicitly add these zeros.
  if (TIME_24_HOUR && hours == 0) {
    // Pad hour 0.
    clockDisplay.writeDigitNum(1, 0);
    // Also pad when the 10's minute is 0 and should be padded.
    if (minutes < 10) {
      clockDisplay.writeDigitNum(2, 0);
    }
  }

il faut donc sortir le if (minutes ...) des accolades du if (TIME_24_HOUR ....)
comme ceci
Code: [Select]
  // Now print the time value to the display.
  clockDisplay.print(displayValue, DEC);

  // Add zero padding when in 24 hour mode and it's midnight.
  // In this case the print function above won't have leading 0's
  // which can look confusing.  Go in and explicitly add these zeros.
  if (TIME_24_HOUR && hours == 0) {
    // Pad hour 0.
    clockDisplay.writeDigitNum(1, 0);
  }
    // Also pad when the 10's minute is 0 and should be padded.
  if (minutes < 10) {
      clockDisplay.writeDigitNum(2, 0);
  }
  // et pareil pour les heures
  if (hours < 10) {
      clockDisplay.writeDigitNum(0, 0);
  }

JackyNiew

Merci encore de tes précisions.

Non je travail en mode 24h, car comme je l'avais précisé dans le début de mon 1er message j'avais effectué les modifs pour en mode 24 h "true" et sur le bon fuseau horaire +1, ça je savais quand même le faire ;)

Ce qui bien sûr n'est pas modifié dans le fichier .ino d'origine que j'ai joint.

Voici donc mon fichier, celui que j'ai transféré dans l'Arduino UNO:

Code: [Select]
// Clock example using a seven segment display & GPS for time.
//
// Must have the Adafruit GPS library installed too!  See:
//   https://github.com/adafruit/Adafruit-GPS-Library
//
// Designed specifically to work with the Adafruit LED 7-Segment backpacks
// and ultimate GPS breakout/shield:
// ----> http://www.adafruit.com/products/881
// ----> http://www.adafruit.com/products/880
// ----> http://www.adafruit.com/products/879
// ----> http://www.adafruit.com/products/878
// ----> http://www.adafruit.com/products/746
//
// Adafruit invests time and resources providing this open source code,
// please support Adafruit and open-source hardware by purchasing
// products from Adafruit!
//
// Written by Tony DiCola for Adafruit Industries.
// Released under a MIT license: https://opensource.org/licenses/MIT
#include <SoftwareSerial.h>
#include <Wire.h>
#include "Adafruit_LEDBackpack.h"
#include "Adafruit_GFX.h"
#include "Adafruit_GPS.h"


// Set to false to display time in 12 hour format, or true to use 24 hour:
#define TIME_24_HOUR      true

// Offset the hours from UTC (universal time) to your local time by changing
// this value.  The GPS time will be in UTC so lookup the offset for your
// local time from a site like:
//   https://en.wikipedia.org/wiki/List_of_UTC_time_offsets
// This value, -7, will set the time to UTC-7 or Pacific Standard Time during
// daylight savings time.
#define HOUR_OFFSET       +1

// I2C address of the display.  Stick with the default address of 0x70
// unless you've changed the address jumpers on the back of the display.
#define DISPLAY_ADDRESS   0x70


// Create display and GPS objects.  These are global variables that
// can be accessed from both the setup and loop function below.
Adafruit_7segment clockDisplay = Adafruit_7segment();
SoftwareSerial gpsSerial(8, 7);  // GPS breakout/shield will use a
                                 // software serial connection with
                                 // TX = pin 8 and RX = pin 7.
Adafruit_GPS gps(&gpsSerial);


void setup() {
  // Setup function runs once at startup to initialize the display and GPS.

  // Setup Serial port to print debug output.
  Serial.begin(115200);
  Serial.println("Clock starting!");

  // Setup the display.
  clockDisplay.begin(DISPLAY_ADDRESS);

  // Setup the GPS using a 9600 baud connection (the default for most
  // GPS modules).
  gps.begin(9600);

  // Configure GPS to onlu output minimum data (location, time, fix).
  gps.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY);

  // Use a 1 hz, once a second, update rate.
  gps.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ);
 
  // Enable the interrupt to parse GPS data.
  enableGPSInterrupt();
}

void loop() {
  // Loop function runs over and over again to implement the clock logic.

  // Check if GPS has new data and parse it.
  if (gps.newNMEAreceived()) {
    gps.parse(gps.lastNMEA());
  }
 
  // Grab the current hours, minutes, seconds from the GPS.
  // This will only be set once the GPS has a fix!  Make sure to add
  // a coin cell battery so the GPS will save the time between power-up/down.
  int hours = gps.hour + HOUR_OFFSET;  // Add hour offset to convert from UTC
                                       // to local time.
  // Handle when UTC + offset wraps around to a negative or > 23 value.
  if (hours < 0) {
    hours = 24+hours;
  }
  if (hours > 23) {
    hours = 24-hours;
  }
  int minutes = gps.minute;
  int seconds = gps.seconds;
 
  // Show the time on the display by turning it into a numeric
  // value, like 3:30 turns into 330, by multiplying the hour by
  // 100 and then adding the minutes.
  int displayValue = hours*100 + minutes;

  // Do 24 hour to 12 hour format conversion when required.
  if (!TIME_24_HOUR) {
    // Handle when hours are past 12 by subtracting 12 hours (1200 value).
    if (hours > 12) {
      displayValue -= 1200;
    }
    // Handle hour 0 (midnight) being shown as 12.
    else if (hours == 0) {
      displayValue += 1200;
    }
  }

  // Now print the time value to the display.
  clockDisplay.print(displayValue, DEC);

  // Add zero padding when in 24 hour mode and it's midnight.
  // In this case the print function above won't have leading 0's
  // which can look confusing.  Go in and explicitly add these zeros.
  if (TIME_24_HOUR && hours == 0) {
    // Pad hour 0.
    clockDisplay.writeDigitNum(1, 0);
    // Also pad when the 10's minute is 0 and should be padded.
    if (minutes < 10) {
      clockDisplay.writeDigitNum(2, 0);
    }
  }

  // Blink the colon by turning it on every even second and off
  // every odd second.  The modulus operator is very handy here to
  // check if a value is even (modulus 2 equals 0) or odd (modulus 2
  // equals 1).
  clockDisplay.drawColon(seconds % 2 == 0);

  // Now push out to the display the new values that were set above.
  clockDisplay.writeDisplay();

  // Loop code is finished, it will jump back to the start of the loop
  // function again! Don't add any delays because the parsing needs to
  // happen all the time!
}

SIGNAL(TIMER0_COMPA_vect) {
  // Use a timer interrupt once a millisecond to check for new GPS data.
  // This piggybacks on Arduino's internal clock timer for the millis()
  // function.
  gps.read();
}

void enableGPSInterrupt() {
  // Function to enable the timer interrupt that will parse GPS data.
  // Timer0 is already used for millis() - we'll just interrupt somewhere
  // in the middle and call the "Compare A" function above
  OCR0A = 0xAF;
  TIMSK0 |= _BV(OCIE0A);
}


Merci

rjnc38

Un principe de base : lire la doc (et ne pas faire confiance aveugle au code trouve)
Et la on trouve que les minutes sont en position 3 & 4 donc pour mettre un 0 dans le dizaines de minutes il faut mettre (3,0)

JackyNiew

Bonjour et merci.

Effectivement c'est ce que j'avais trouvé après quelques tests.

Voici donc cette partie du Code corrigé:

Code: [Select]
// Now print the time value to the display.
  clockDisplay.print(displayValue, DEC);

  // Add zero padding when in 24 hour mode and it's midnight.
  // In this case the print function above won't have leading 0's
  // which can look confusing.  Go in and explicitly add these zeros.
  if (TIME_24_HOUR && hours == 0) {
    // Pad hour 0.
    clockDisplay.writeDigitNum(1, 0);
  }
    // Also pad when the 10's minute is 0 and should be padded.
    // Affichage du zéro des dizaines de minutes après minuit

    if (minutes < 10) {
      clockDisplay.writeDigitNum(3, 0);
  }

    // Affichage du Zéro pour les dizaines d'heures < 10h

    if (hours < 10) {
      clockDisplay.writeDigitNum(0, 0);
  }


Encore merci de ton aide. J'ai dû te sembler complètement ignare. Mais cela faisait que 4 jours que je touchais un Arduino, pour réaliser une horloge digitale à partir de l'afficheur Adafruit LED 1.2" 7 segments.
Comme je te l'aie précisé je suis pilote (747-400) donc pas souvent utilisateur du code employé pour l'Arduino. Donc tu m'as aidé sur le coup là.
Chacun son truc. Lorsque tu voyageras en avion, tu pourras penser que tu as aidé un membre du PNT qui est dans le cockpit ... ;)

Amicalement,
Jacky

rjnc38

parfait, le principal est que tu ai compris ce que tu modifiais
très heureux d'avoir pu aider un pilote de 747  ;)

Go Up