Bonjour ASSM,
Mes conseils ne vont, pas forcément agir selon mes prévisions. En effet, la technique qui consiste à ne pas mettre d'accolade avec les if est piégeuse!
if ((state != mem_minute_moins) && (state == LOW))
Afficheur_minute -= 1;
rtc.adjust(DateTime(2022, 11, 07, Afficheur_heure, Afficheur_minute, 0));
Je t'ai fait rajouter rtc.adjust(DateTime....cette instruction est tout le temps exécutée vu que, sans accolades, seul l'instruction suivant le if est dépendant de ce if.
C'est mieux d'écrire:
if ((state != mem_minute_moins) && (state == LOW))
{
Afficheur_minute -= 1;
rtc.adjust(DateTime(2022, 11, 07, Afficheur_heure, Afficheur_minute, 0));
}
Je te livre le résultat de mes cogitations, je n'ai pas le temps, cet après midi, de te détailler mes modifications, mais essaies, chez moi ça fonctionne.
Les principales modifications, sont la lecture des boutons, pour ça, il serait meilleur d'en confier la gestion à une bibliothèque comme Button.h, ça simplifie nettement la chose.
Assures toi que tes boutons sont d'un côté à GND et de l'autre sur la pin de l'Arduino (PULL_UP)
J'ai, aussi, remplacé
delay(1000);
Par une temporisation avec millis, non bloquante. Ainsi, tes boutons agissent immédiatement.
Le programme:
#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;
// 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;
int rtcAnneeParDefaut = 2022;
int rtcMoisParDefaut = 11;
int rtcJourParDefaut = 2022;
unsigned long affichageTempo = 1000; // Affichage toutes les secondes
unsigned long affichageMillis = millis(); // Affichage chrono
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_PULLUP);
pinMode(btn_minute_moins, INPUT_PULLUP);
pinMode(btn_heure_plus, INPUT_PULLUP);
pinMode(btn_heure_moins, INPUT_PULLUP);
// 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);
}
DateTime now = rtc.now();
rtcAnneeParDefaut = now.year();
rtcMoisParDefaut = now.month();
rtcJourParDefaut = now.day();
Afficheur_heure = now.hour(); // Heures
Afficheur_minute = now.minute(); // Minutes
}
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);
//--------------------------------- Minures plus
if (digitalRead(btn_minute_plus) == LOW)
{
Serial.println("btn_minute_plus");
DateTime now = rtc.now();
Afficheur_minute = now.minute(); // Minutes
Afficheur_minute += 1;
rtc.adjust(DateTime(rtcAnneeParDefaut, rtcMoisParDefaut, rtcJourParDefaut, Afficheur_heure, Afficheur_minute, 0));
delay(20);
while(digitalRead(btn_minute_plus) == LOW){} // Attendre le relâchement du bouton
}
//--------------------------------- Minutes moins
if (digitalRead(btn_minute_moins) == LOW)
{
Serial.println("btn_minute_moins");
DateTime now = rtc.now();
Afficheur_minute = now.minute(); // Minutes
Afficheur_minute -= 1;
rtc.adjust(DateTime(rtcAnneeParDefaut, rtcMoisParDefaut, rtcJourParDefaut, Afficheur_heure, Afficheur_minute, 0));
delay(20);
while(digitalRead(btn_minute_moins) == LOW){} // Attendre le relâchement du bouton
}
//--------------------------------- Heures plus
if (digitalRead(btn_heure_plus) == LOW)
{
Serial.println("btn_heure_plus");
DateTime now = rtc.now();
Afficheur_heure = now.hour(); // Heures
Afficheur_heure += 1;
rtc.adjust(DateTime(rtcAnneeParDefaut, rtcMoisParDefaut, rtcJourParDefaut, Afficheur_heure, Afficheur_minute, 0));
delay(20);
while(digitalRead(btn_heure_plus) == LOW){} // Attendre le relâchement du bouton
}
//--------------------------------- Heures moins
if (digitalRead(btn_heure_moins) == LOW)
{
Serial.println("btn_heure_moins");
DateTime now = rtc.now();
Afficheur_heure = now.hour(); // Heures
Afficheur_heure -= 1;
rtc.adjust(DateTime(rtcAnneeParDefaut, rtcMoisParDefaut, rtcJourParDefaut, Afficheur_heure, Afficheur_minute, 0));
delay(20);
while(digitalRead(btn_heure_moins) == LOW){} // Attendre le relâchement du bouton
}
//int Afficheur_minute = (DateHeure[0]);
//int Afficheur_heure = (DateHeure[1]);
// Affichage de l'heure
if (millis() - affichageMillis >= affichageTempo)
{
// Lecture du module RTC
GetDateHeure(DateHeure);
d1=Afficheur_minute%10;
d2=Afficheur_minute/10;
d3=Afficheur_heure%10;
d4=Afficheur_heure/10;
disp1(d1);
disp2(d2);
disp3(d3);
disp4(d4);
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();
affichageMillis = millis();
}
// 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;
}
}
A ta disposition pour toutes questions.
PS: Regardes du côté des tableaux, ils simplifieraient l'écriture et la gestion de ton programme.
A+
Cordialement
jpbbricole