Horloge réglable avec TM1637 + DS3231

Portrait de Halzote

Bonjours à tous,

Alors voilà j'ai cherché depuis quelques jours un code pour aller avec mon écran 7 segments TM1637 et mon RTC DS3231 que je pourrais réglé avec trois boutons et j'ai eu plusieurs soucis.

Pour commencé j'ai cru que mon écran 7 segments était foutu parce que le TM1637 test ne fait pas fonctionné mon écran mais par contre ce code là : https://www.ordinoscope.net/index.php/Electronique/Hardware/Ecrans/TM1637 me prouve que mon écran fonctionne ( même si je ne connecte pas le VCC et ça me perturbe un peu )

Du coup j'ai trouvé ce code qui a exactement le même écrans : http://arduinolab.pw/index.php/2016/06/23/chasy-na-arduino/ mais là comme pour le code test mon ecran ne s'allume pas alors que j'ai suivi le schéma et du coup est-ce qu'une personne pourrait m'expliquer pourquoi ça ne fonctionne pas ou me conseiller un autre code svp ? 

Merci d'avance et très bonne journée à tous. =)

Portrait de brossden

Bonjour Halzote

Juste ce post pour te dire que je ne peux pas t'aider ne possédant pas ce TM1637.

Désolé mais juste un truc peux tu essayer ce code et me donner le résultat ?

#include <Wire.h>
#include "TM1637.h"
#define CLK 6
#define DIO 7
#define brightness 6
#define keyHor 5
#define keyMin 4
#define keyPL  3

TM1637 tm1637(CLK, DIO);
#define DS3231_I2C_ADDRESS 0x68

volatile boolean flag;
byte decToBcd(byte val) {
  return ( (val / 10 * 16) + (val % 10) );
}

byte bcdToDec(byte val) {
  return ( (val / 16 * 10) + (val % 16) );
}

void setDateDs3231(byte second,
                   byte minute,
                   byte hour,
                   byte dayOfWeek,
                   byte dayOfMonth,
                   byte month,
                   byte year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0);
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(dayOfWeek));
  Wire.write(decToBcd(dayOfMonth));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.endTransmission();
}

void getDateDs3231(byte *second,
                   byte *minute,
                   byte *hour,
                   byte *dayOfWeek,
                   byte *dayOfMonth,
                   byte *month,
                   byte *year)
{

  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);

  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}

void setINT() {
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0x0E);
  Wire.write(0x0);
  Wire.endTransmission();
}

void blink() {
  digitalWrite(13, !digitalRead(13));
  flag = !flag;
  tm1637.point(flag);
}

void setup() {
  //  Serial.begin(9600);
  Wire.begin();
  pinMode(13, OUTPUT);
  pinMode(keyHor, INPUT_PULLUP);
  pinMode(keyMin, INPUT_PULLUP);
  pinMode(keyPL, INPUT_PULLUP);

  tm1637.init();
  tm1637.set(brightness);

  setINT();
  attachInterrupt(0, blink, CHANGE);
}

void loop() {

  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  int8_t TimeDisp[4];

  TimeDisp[0] = hour / 10;
  TimeDisp[1] = hour % 10;
  TimeDisp[2] = minute / 10;
  TimeDisp[3] = minute % 10;

  if (!digitalRead(keyHor) && !digitalRead(keyPL)) {
    second = 0;
    hour++;
    if (hour > 23) hour = 0;
    setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
    delay(200);
  }
  if (!digitalRead(keyMin) && !digitalRead(keyPL)) {
    second = 0;
    minute++;
    if (minute > 59) minute = 0;
    setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
    delay(200);
  }

  for (int n = 0; n < 5; n++)
    tm1637.display(n, TimeDisp[n]);
}

Portrait de Halzote

Coucou Brossden ^^,

Alors pour l'écran il affiche 45: 5 (l'espace entre le : et le dernier 5 est respecté)

Mais j'ai pas pu tout branché parce que je ne comprend pas ce morceau de code :

#define CLK 6
#define DIO 7
#define brightness 6

Alors CLK et DIO j'ai branché l'écran ok mais #define brightness 6 je ne comprend pas :/ Et puis plus bas je vois que tu incorpores le code pour le DS3231 mais je dois le relier à quoi ? 

Merci d'encore essayer de m'aider j'apprécie beaucoup :D

Portrait de brossden

Pour le module TM1637 raccorder gnd et 5v puis CLK sur la pin 6 et  DIO sur la pin 7

"#define brightness 6 " c'est pour régler la luminosité de "0" éteint à "7" luminosité maximale.

pour DS3231 raccorder gnd et 5v puis SDA sur la pin A4 et SCL sur la pin A5 (ports analogiques)

Portrait de Halzote

Voilà ça me donne le même résultat que quand le DS3231 n'était pas branché. J'ai rechargé le code pour être sûr mais rien n'y fait. Les boutons n'ont aucun effet visible. 

9a3c1969-074c-4543-bd4c-3aefeac9527a.jpeg

Portrait de Walter

#define CLK 6
#define DIO 7
#define brightness 6

Sont des constantes, chaîne représentant une valeur fixe, tu peux alors utiliser cette chaîne comme tu le fait avec une variable.
Lors de la compilation(pré-compilation) la chaîne sera automatiquement remplacé par sa valeur.
A la différence d'une variable, cette chaîne n'occupe aucune place en mémoire.

TM1637 tm1637(CLK, DIO);
tm1637.set(brightness);