Bonjour
Je suis en train de réaliser une horloge avec afficheur 7 segments et un module DS1307.
J'arrive correctement à récupérer l'heure du module et l'afficher sur les 7 segments, par contre je bloque pour pouvoir modifier l'heure manuellement avec 4 boutons poussoirs.
Merci d'avance.
Voici mon code
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc;
word DateHeure[6] = {0, 0, 0, 0, 0};
// définition des broches du décodeur 7 segments des Unités des Afficheur_minutes
const int bit_A1 = 2;
const int bit_B1 = 3;
const int bit_C1 = 4;
const int bit_D1 = 5;
// définition des broches du décodeur 7 segments des Dizaines des Afficheur_minutes
const int bit_A2 = 6;
const int bit_B2 = 7;
const int bit_C2 = 8;
const int bit_D2 = 9;
// définition des broches du décodeur 7 segments des Unités des Afficheur_heures
const int bit_A3 = 10;
const int bit_B3 = 11;
const int bit_C3 = 12;
const int bit_D3 = 13;
// définition des broches du décodeur 7 segments des Dizaines des Afficheur_heures
const int bit_A4 = 14;
const int bit_B4 = 15;
const int bit_C4 = 16;
const int bit_D4 = 17;
int d1; //afficheur Unités des Afficheur_minutes
int d2; //afficheur Dizaines des Afficheur_minutes
int d3; //afficheur Unités des Afficheur_heures
int d4; //afficheur Dizaines des Afficheur_heures
int Afficheur_minute; // Affichage des Afficheur_minutes à l'allumage
int Afficheur_heure; // Affichage des Afficheur_heures à l'allumage
// les broches des boutons
int btn_minute_plus = A1;
int btn_minute_moins = A2;
int btn_heure_plus = A3;
int btn_heure_moins = A4; //periode 15 / 45
// les mémoires d'état des boutons
int mem_minute_plus = HIGH;
int mem_minute_moins = HIGH;
int mem_heure_plus = HIGH;
int mem_heure_moins = HIGH;
int state = HIGH;
void setup ()
{
Serial.begin(115200);
if (! rtc.begin())
{
Serial.println("Le module RTC non disponible");
while (1); // Attente RESET
}
else
{
Serial.println("Le module RTC est OK");
rtc.writeSqwPinMode(DS1307_SquareWave4kHz);
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Date du PC
//rtc.adjust(DateTime(2020,1,24,10,10,10)); // Ajustement manuelle
// Ex: 10 Janvier 2020 à 10:00:00:
// rtc.adjust(DateTime(2020, 1, 10, 10, 0, 0));
// Les broches sont toutes des sorties
pinMode(bit_A1, OUTPUT);
pinMode(bit_B1, OUTPUT);
pinMode(bit_C1, OUTPUT);
pinMode(bit_D1, OUTPUT);
pinMode(bit_A2, OUTPUT);
pinMode(bit_B2, OUTPUT);
pinMode(bit_C2, OUTPUT);
pinMode(bit_D2, OUTPUT);
pinMode(bit_A3, OUTPUT);
pinMode(bit_B3, OUTPUT);
pinMode(bit_C3, OUTPUT);
pinMode(bit_D3, OUTPUT);
pinMode(bit_A4, OUTPUT);
pinMode(bit_B4, OUTPUT);
pinMode(bit_C4, OUTPUT);
pinMode(bit_D4, OUTPUT);
// Les broches sont toutes des entrées
pinMode(btn_minute_plus, INPUT);
pinMode(btn_minute_moins, INPUT);
pinMode(btn_heure_plus, INPUT);
pinMode(btn_heure_moins, INPUT);
// Les broches sont toutes mises à l'état bas
digitalWrite(bit_A1, LOW);
digitalWrite(bit_B1, LOW);
digitalWrite(bit_C1, LOW);
digitalWrite(bit_D1, LOW);
digitalWrite(bit_A2, LOW);
digitalWrite(bit_B2, LOW);
digitalWrite(bit_C2, LOW);
digitalWrite(bit_D2, LOW);
digitalWrite(bit_A3, LOW);
digitalWrite(bit_B3, LOW);
digitalWrite(bit_C3, LOW);
digitalWrite(bit_D3, LOW);
digitalWrite(bit_A4, LOW);
digitalWrite(bit_B4, LOW);
digitalWrite(bit_C4, LOW);
digitalWrite(bit_D4, LOW);
}
}
void loop ()
{
// on test maintenant si les boutons ont subi un appui (ou pas)
// d'abord le bouton minute plus
state = digitalRead(btn_minute_plus);
if ((state != mem_minute_plus) && (state == LOW))
Afficheur_minute += 1;
mem_minute_plus = state; // on enregistre l'état du bouton pour le tour suivant
// et maintenant pareil pour le bouton minute moins
state = digitalRead(btn_minute_moins);
if ((state != mem_minute_moins) && (state == LOW))
Afficheur_minute -= 1;
mem_minute_moins = state; // on enregistre l'état du bouton pour le tour suivant
// et maintenant pareil pour le bouton heure plus
state = digitalRead(btn_heure_plus);
if ((state != mem_heure_plus) && (state == LOW))
Afficheur_heure += 1;
mem_heure_plus = state; // on enregistre l'état du bouton pour le tour suivant
// et maintenant pareil pour le bouton heure moins
state = digitalRead(btn_heure_moins);
if ((state != mem_heure_moins) && (state == LOW))
Afficheur_minute -= 1;
mem_heure_moins = state; // on enregistre l'état du bouton pour le tour suivant
// Lecture du module RTC
GetDateHeure(DateHeure);
int Afficheur_minute = (DateHeure[0]);
int Afficheur_heure = (DateHeure[1]);
d1=Afficheur_minute%10;
d2=Afficheur_minute/10;
d3=Afficheur_heure%10;
d4=Afficheur_heure/10;
disp1(d1);
disp2(d2);
disp3(d3);
disp4(d4);
// Affichage de l'heure
Serial.print(DateHeure[2]), DEC; //Affichage Heures
Serial.print(':');
Serial.print(DateHeure[1], DEC); //Affichage Minutes
Serial.print(':');
Serial.print(DateHeure[0], DEC); //Affichage Secondes
Serial.println();
// Délai
delay(1000);
}
void GetDateHeure(word *DateHeure)
{
// Lecture du module RTC
DateTime now = rtc.now();
// Récupérration de l'heure
DateHeure[2] = now.hour(); // Heures
DateHeure[1] = now.minute(); // Minutes
DateHeure[0] = now.second(); // Secondes
}
// fonction permettant d'afficher un nombre sur deux afficheurs
void disp1(int Afficheur_minute)
{
// on met à zéro tout les bits du décodeur
digitalWrite(bit_A1, LOW);
digitalWrite(bit_B1, LOW);
digitalWrite(bit_C1, LOW);
digitalWrite(bit_D1, LOW);
// On allume les bits nécessaires
if (Afficheur_minute >= 8)
{
digitalWrite(bit_D1, HIGH);
Afficheur_minute = Afficheur_minute - 8;
}
if (Afficheur_minute >= 4)
{
digitalWrite(bit_C1, HIGH);
Afficheur_minute = Afficheur_minute - 4;
}
if (Afficheur_minute >= 2)
{
digitalWrite(bit_B1, HIGH);
Afficheur_minute = Afficheur_minute - 2;
}
if (Afficheur_minute >= 1)
{
digitalWrite(bit_A1, HIGH);
Afficheur_minute = Afficheur_minute - 1;
}
}
void disp2(int Afficheur_minute)
{
// on met à zéro tout les bits du décodeur
digitalWrite(bit_A2, LOW);
digitalWrite(bit_B2, LOW);
digitalWrite(bit_C2, LOW);
digitalWrite(bit_D2, LOW);
// On allume les bits nécessaires
if (Afficheur_minute >= 8)
{
digitalWrite(bit_D2, HIGH);
Afficheur_minute = Afficheur_minute - 8;
}
if (Afficheur_minute >= 4)
{
digitalWrite(bit_C2, HIGH);
Afficheur_minute = Afficheur_minute - 4;
}
if (Afficheur_minute >= 2)
{
digitalWrite(bit_B2, HIGH);
Afficheur_minute = Afficheur_minute - 2;
}
if (Afficheur_minute >= 1)
{
digitalWrite(bit_A2, HIGH);
Afficheur_minute = Afficheur_minute - 1;
}
}
void disp3(int Afficheur_heure)
{
// on met à zéro tout les bits du décodeur
digitalWrite(bit_A3, LOW);
digitalWrite(bit_B3, LOW);
digitalWrite(bit_C3, LOW);
digitalWrite(bit_D3, LOW);
// On allume les bits nécessaires
if (Afficheur_heure >= 8)
{
digitalWrite(bit_D3, HIGH);
Afficheur_heure = Afficheur_heure - 8;
}
if (Afficheur_heure >= 4)
{
digitalWrite(bit_C3, HIGH);
Afficheur_heure = Afficheur_heure - 4;
}
if (Afficheur_heure >= 2)
{
digitalWrite(bit_B3, HIGH);
Afficheur_heure = Afficheur_heure - 2;
}
if (Afficheur_heure >= 1)
{
digitalWrite(bit_A3, HIGH);
Afficheur_heure = Afficheur_heure - 1;
}
}
void disp4(int Afficheur_heure)
{
// on met à zéro tout les bits du décodeur
digitalWrite(bit_A4, LOW);
digitalWrite(bit_B4, LOW);
digitalWrite(bit_C4, LOW);
digitalWrite(bit_D4, LOW);
// On allume les bits nécessaires
if (Afficheur_heure >= 8)
{
digitalWrite(bit_D4, HIGH);
Afficheur_heure = Afficheur_heure - 8;
}
if (Afficheur_heure >= 4)
{
digitalWrite(bit_C4, HIGH);
Afficheur_heure = Afficheur_heure - 4;
}
if (Afficheur_heure >= 2)
{
digitalWrite(bit_B4, HIGH);
Afficheur_heure = Afficheur_heure - 2;
}
if (Afficheur_heure >= 1)
{
digitalWrite(bit_A4, HIGH);
Afficheur_heure = Afficheur_heure - 1;
}
}