74HC595 et 4 digit 7 segment création horloge

bonjour
Je souhaite fabriquer une horloge maison avec une carte arduino et des leds pour ceci je dispose pour le prototypage d'une carte arduino, d'un micro contrôleur 74HC595, d'un afficheur 4 digit 7 segment ainsi qu'un module Ds3231 rtc.
Pour ceci j'ai écrit ce code après des recherches mais il ne fonctionne pas pouvez vous m'aider a l’améliorer?

#include <Wire.h>
#include <ds3231.h>


const int D1 = 9;
const int D2 = 6;
const int D3 = 11;
const int D4 = 10;
const int pinphotoresistance = A3;
struct ts t; //déclaration variable t

byte uniheure;
byte dizheure;
byte unimins;
byte dizmins;

// Describe each digit in terms of display segments
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
const byte numbers[10] = {
  0b00000011,
  0b10011111,
  0b00100101,
  0b00001101,
  0b10011001,
  0b01001001,
  0b01000001,
  0b00011111,
  0b00000001,
  0b00001001,
  /*  0b00010001,
      0b11000001,
      0b01100011,
      0b10000101,
      0b01100001,
      0b01110001       lettres A à F     */
};

void setup()
{
  Serial.begin(9600);
  Wire.begin(); //D�marrage de la librairie wire.h
  DS3231_init(DS3231_INTCN);
  t.hour = 21; // données pour mettre à l'heure l'horloge
  t.min = 14;
  t.sec = 0;
  t.mday = 1;
  t.mon = 4;
  t.year = 2018;
  pinMode(SER, OUTPUT);
  pinMode(RCLK, OUTPUT);
  pinMode(SRCLK, OUTPUT);
  pinMode(D1, OUTPUT);
  pinMode(D2, OUTPUT);
  pinMode(D3, OUTPUT);
  pinMode(D4, OUTPUT);
}

void loop()
{
  byte valphotoresistance = analogRead(pinphotoresistance) / 4 + 1;
  Serial.println(valphotoresistance);
  DS3231_get(&t);
  dizmins = t.min / 10;          //récupère les dizaines de minutes
  unimins = t.min - dizmins * 10; //récupère les unités de minutes
  dizheure = t.hour / 10;           //récupère les dizaines des heures
  uniheure = t.hour - dizheure * 10; //récupère les unités des heures
}

merci de votre aide, je joint une photo du montage que j'ai effectuer.

Explique ce qui ne va pas STP : la compilation, l'exécution ?

Moi, pour la RTC, j'utilise la bibliothèque MD_DS3231.

#include <MD_DS3231.h>

Pour connaitre l'heure qu'il est :

  RTC.readTime();
  heures = RTC.h;
  minutes = RTC.m;

Merci du conseil, c'est l’exécution qui ne vas pas la compilation fonctionne mais rien ne s'affiche sur mon afficheur.

Bonjour,
C’est normal il n’y a aucune instruction dans ton programme pour afficher qqch !.
Il faut mettre une resistance en serie avec chaque segment.

pour le sujet des résistances j'ai essayer de brancher directement chaque segment et des digit et ils fonctionnent tous avec ou sans résistances, pour mois le soucis vient du code mais je ne sais pas d'oû

j’ai rebossé mon code et j'arrive maintenant à prétendre afficher quelque chose sur mon afficheur mais celui ci m’affiche "8.8.8.8." .
Voici les améliorations que j'ai apporter à mon programmes grâce a vos conseils et a quelques recherches.

#include <Wire.h>
#include <MD_DS3231.h>

const int SER = 7;    // DS: Serial data input (Data)
const int RCLK = 12;   // SH_CP: Shift register clock pin (Clock)
const int SRCLK = 8;  // ST_CP: Storage register clock pin (latch pin)  (Latch)
const int D1 = 9;
const int D2 = 6;
const int D3 = 11;
const int D4 = 10;
const int pinphotoresistance = A3;
byte heures;
byte minutes;
byte uniheure;
byte dizheure;
byte unimins;
byte dizmins;

// Describe each digit in terms of display segments
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
const byte numbers[10] = {
  0b00000011,
  0b10011111,
  0b00100101,
  0b00001101,
  0b10011001,
  0b01001001,
  0b01000001,
  0b00011111,
  0b00000001,
  0b00001001,
  /*  0b00010001,
      0b11000001,
      0b01100011,
      0b10000101,
      0b01100001,
      0b01110001       lettres A à F     */
};

void setup()
{
  Serial.begin(9600);
  Wire.begin(); //D�marrage de la librairie wire.h
  RTC.readTime();
  heures = RTC.h;
  minutes = RTC.m;
  pinMode(SER, OUTPUT);
  pinMode(RCLK, OUTPUT);
  pinMode(SRCLK, OUTPUT);
  pinMode(D1, OUTPUT);
  pinMode(D2, OUTPUT);
  pinMode(D3, OUTPUT);
  pinMode(D4, OUTPUT);
}

void loop()
{
byte valphotoresistance = analogRead(pinphotoresistance) / 4 + 1;
Serial.println(valphotoresistance);
dizmins = minutes / 10;          //récupère les dizaines de minutes
unimins = minutes - dizmins * 10; //récupère les unités de minutes
dizheure = heures / 10;           //récupère les dizaines des heures
uniheure = heures - dizheure * 10; //récupère les unités des heures
shiftIt(numbers[dizheure]);
analogWrite(D1, valphotoresistance);
delay(2);
analogWrite(D1, 0);
shiftIt(numbers[uniheure]);
analogWrite(D2, valphotoresistance);
delay(2);
analogWrite(D2, 0);
shiftIt(numbers[dizmins]);
analogWrite(D3, valphotoresistance);
delay(2);
analogWrite(D3, 0);
shiftIt(numbers[unimins]);
analogWrite(D4, valphotoresistance);
delay(2);
analogWrite(D4, 0);
}

void shiftIt (byte data)
{
  // Set latchPin LOW while clocking these 8 bits in to the register
  digitalWrite(RCLK, LOW);
  for (int k = 0; k <= 7; k++)     {
    // clockPin LOW prior to sending a bit
    digitalWrite(SRCLK, LOW);
    if ( data & (1 << k) ) {
      digitalWrite(SER, HIGH); // turn “On”
    }
    else {
      digitalWrite(SER, LOW); // turn “Off”
    }
    // and clock the bit in
    digitalWrite(SRCLK, HIGH);
  }
  //set latchPin to high to lock and send data
  digitalWrite(RCLK, HIGH);
  // put delay here if you want to see the multiplexing in action!
}

merci de votre aide.

Merci de ces conseils je vais donc y mettre des résistances (de 220 ohms c'est ce qui est conseillé pour une led rouge ) je n'en avait pas mise car j'avais entendu perler d'afficheur qui en comportait déjà.

je souhaite utiliser le registre à décalage car afficher l'heur est la fonctionnalité principale de mon projet donc je souhaite garder des ports libres (pour ajouter d'autres fonctionnalités) et ce programme sera dans le futur utiliser sur une arduino nano (en attente de livraison).

Le schéma est en pièce jointe dans le premier post.

merci des conseils.

oui la photorésistance a pour but de faire varier la luminosité.
l'afficheur est un afficheur a anode commune. ne serait pas cette partie qui est fausse car faite pour un afficheur a cathode?

// Describe each digit in terms of display segments
// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F
const byte numbers[10] = {
  0b00000011,
  0b10011111,
  0b00100101,
  0b00001101,
  0b10011001,
  0b01001001,
  0b01000001,
  0b00011111,
  0b00000001,
  0b00001001,

j'ai tenter de modifier les délai pour voir ce qui se passait et a ce moment j'ai vue que tous les digit affichait la même chose mais l'un deux a chaque fois avait une intensité moins élevé.

analogWrite(D1, valphotoresistance);
delay(2);
analogWrite(D1, 0);
shiftIt(numbers[uniheure]);
analogWrite(D2, valphotoresistance);
delay(2);
analogWrite(D2, 0);
shiftIt(numbers[dizmins]);
analogWrite(D3, valphotoresistance);
delay(2);
analogWrite(D3, 0);
shiftIt(numbers[unimins]);
analogWrite(D4, valphotoresistance);
delay(2);
analogWrite(D4, 0);