Réglage heure par bouton

Bonjour à vous, j’aimerais pouvoir régler l’heure de mon réveil grâce à 3 boutons : Il y a 3 boutons, le BP1 pour accéder au menu du réglage de l’alarme, BP2 pour avancer les heures, min, sec et BP2 pour les reculer. Pour passer des heures aux minutes, on pourrait appuyer par exemple 3 sec sur le BP2 puis on passerait aux réglages des minutes, et la même pour passer aux réglages des secondes. Et pour finaliser il faudrait r’appuyer sur le BP1 lorsque l’on aura fini de régler l’heure.

J’aimerais réaliser un programme qui effectuerait ce que j’ai écris ci-dessus.

Voici mon programme actuelle qui me permet d’afficher l’heure grâce à une horloge en temps réel (DS1307) et j’y est ajouté à la fin une petite partie pour avancer les heures.

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
RTC_DS1307 RTC;

int buttonPin = 10;
int buttonState = LOW;
int a;
int b;
int c;
int d;
int e;
int f;
int heure;

void setup () {
Serial.begin(9600);
Wire.begin();
RTC.begin();
lcd.begin(16,2);

pinMode(8,OUTPUT);

if (! RTC.isrunning()) {
Serial.println ("RTC is NOT running!");
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(__DATE__, __TIME__));
}
}


void loop () {



DateTime now = RTC.now();
a = now.hour();
b = now.minute();
c = now.second();

lcd.clear();
lcd.setCursor(0,0);
lcd.print("Heure:");
lcd.setCursor(6,0);
if (a<10)
{
lcd.print("0");
}
lcd.print(now.hour(), DEC);
lcd.print(":");

if (b<10)
{
lcd.print("0");
}
lcd.print(now.minute(), DEC);
lcd.print(":");

if (c<10)
{
lcd.print("0");
}
lcd.print(now.second(),DEC);
lcd.print("s");
lcd.setCursor(0,1);

lcd.print("Date:");
lcd.setCursor(6,1);
d = now.day();
e = now.month();
f = now.year();
if (d<10)
{
lcd.print("0");
}

lcd.print(now.day(),DEC);
lcd.print("/");

if (e<10)
{
lcd.print("0");
}
lcd.print(now.month(),DEC);
lcd.print("/");


if (f<10)
{
lcd.print("0");
}
lcd.print(now.year(),DEC);
lcd.print(" ");
lcd.print(" ");

delay(1000);


{
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH); 
lcd.clear();
a=a+1;
}

}

Lorsque je compile tout ça, aucune erreur n’est trouvée mais lorsque je veux tester cela sur ma simulation ISIS, l’appuie sur le bouton poussoir ne fait rien.

Quelqu’un aurait-il un exemple de programme de bouton pour régler l’heure afin que je vois mes erreur ou bien quelqu’un pourrait m’expliquer ce qui est faux s’il vous plaît ?

Cordialement.

Dans un premier temps il faudrait essayer ton programme à l'aide du moniteur série. Peut être que le problème viens de la simulation ISIS qui n'accepte pas forcément le programme

Je pense pas que cela vienne de la simulation, cela doit surement venir du programme il doit y avoir une erreur qui fait que cela ne marche pas.

Je n'est jamais utilisé cette outils de simulation j'ai toujours compilé sur l'arduino donc c'est pour ça que l'idée m'est venu à l'esprit

D'accord je vais voir tout ça demain, je vous tiens au courant. Sinon le programme pour le bouton vous semble correcte ?

Comment je peux essayer mon programme dans le moniteur série car je ne connais pas les commandes s'il vous plaît.

Oui désolé je ne m'y connais pas vraiment en programmation, j'ai modifié cela mais ça ne marche toujours pas, j'ai relue le programme et je ne vois vraiment pas quelles sont les erreurs et m'on professeur n'en voit pas non plus.

Ce que j'essaye de faire est sois-disant impossible car il me faudrait utiliser des interruptions afin de modifier l'heure.

Ah bon ? mais qu’est-ce que je devrais changer alors, j’ai modifié quelques lignes du programme et cela aurait du fonctionner mais ça ne marche toujours pas.

Nickelriri:

#include <Wire.h>

#include <RTClib.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
RTC_DS1307 RTC;

int buttonPin = 10;
int buttonState = LOW;
int a;
int b;
int c;
int d;
int e;
int f;

void setup () {
Serial.begin(9600);
Wire.begin();
RTC.begin();
lcd.begin(16,2);

pinMode(10,INPUT);

if (! RTC.isrunning()) {
Serial.println (“RTC is NOT running!”);
// following line sets the RTC to the date & time this sketch was compiled
RTC.adjust(DateTime(DATE, TIME));
}
}

void loop () {

DateTime now = RTC.now();
a = now.hour();
b = now.minute();
c = now.second();

//Modifier l’heure

buttonState = digitalRead(buttonPin);
{
if (buttonState == LOW)
a=a+1;
}

//Affichage heure LCD
lcd.clear();
lcd.setCursor(0,0);
lcd.print(“Heure:”);
lcd.setCursor(6,0);
if (a<10)
{
lcd.print(“0”);
}
lcd.print(now.hour(), DEC);
lcd.print(":");

if (b<10)
{
lcd.print(“0”);
}
lcd.print(now.minute(), DEC);
lcd.print(":");

if (c<10)
{
lcd.print(“0”);
}
lcd.print(now.second(),DEC);
lcd.print(“s”);
lcd.setCursor(0,1);

lcd.print(“Date:”);
lcd.setCursor(6,1);
d = now.day();
e = now.month();
f = now.year();
if (d<10)
{
lcd.print(“0”);
}

lcd.print(now.day(),DEC);
lcd.print("/");

if (e<10)
{
lcd.print(“0”);
}
lcd.print(now.month(),DEC);
lcd.print("/");

if (f<10)
{
lcd.print(“0”);
}
lcd.print(now.year(),DEC);
lcd.print(" “);
lcd.print(” ");

delay(1000);

}

J’ai modifié les états car sur la simulation, lorsque le bouton est appuyé, l’état est bas.
Quelqu’un ma dit que ça ne pourra pas marcher car le RTC met l’heure automatiquement à l’heure et le fait de vouloir augmenter l’heure de 1 rentrerais en conflit avec ça.

Bonjour,

Quelqu’un ma dit que ça ne pourra pas marcher car le RTC met l’heure automatiquement à l’heure et le fait de vouloir augmenter l’heure de 1 rentrerais en conflit avec ça.

Ah oui ??

Le “RTC” est un simple compteur independant pilote par un quartz d’une precision relative.

Le micro via des instructions, par exemple en I2C, lit les registres internes, les modifie, inscrit des nouvelles valeurs quand bon lui semble.
C’est egalement le micro qui, via une routine d’affichage te “donne” l’heure.

Il est parfaitement realisable d’aller chercher l’heure, de l’afficher, d’incrementer ou decrementer une valeur sur ton affichage, puis de sauver cette nouvelle valeur dans le RTC. Tout cela en une fraction de seconde.

Cherches un peu, il y a une foultitude d’exemple via Google.

Jacques

Merci de vos réponses, mais je ne vois pas ce que vous voulez dire quand vous dites "Il faut utiliser des commandes de réglage de l'appareil".

pepe: Le programme n'est toujours pas indenté. Il est pénible à lire.

Je vais essayer de le rendre plus lisible, désolé.

Non je n'est pas de liste.

J'ai vu que pour régler l'heure je devais déjà ajouter cette ligne : RTC . ajuster ( DateTime ( DATE , TIME ));

D'accord je vais chercher tout ça.

Il est dit que pour le réglage il faudrait utiliser : RTC.stop(); RTC.set(DS1307_SEC,1); //set the seconds RTC.set(DS1307_MIN,23); //set the minutes RTC.set(DS1307_HR,12); //set the hours RTC.set(DS1307_DOW,4); //set the day of the week RTC.set(DS1307_DATE,5); //set the date RTC.set(DS1307_MTH,3); //set the month RTC.set(DS1307_YR,9); //set the year RTC.start();

Est-ce vrai ?

Cela me semble assez compliquer et mon niveau de programmation est vraiment bas, je ne sais pas du tout par ou commencer si j'utilise cette façons.

D'accord je vais essayer, merci pour ton aide.

Comment je peux vérifier si les fonctions présentées au-dessus appartiennent bien à la bibliothèque que je possède ?

D'accord.

#include <LiquidCrystal.h>

int buton1 = 5;
int buton2 = 6;
int buton3 = 7;
int var;
int var2;
int var3;
int heure = 00;
int minute = 00;
int seconde = 00;

void setup()
{
 Serial.begin(9600);
 pinMode(buton1, INPUT);
 pinMode(buton2, INPUT);
 pinMode(buton3, INPUT);
}
void loop()
{
 
 Serial.print(heure);
 Serial.print(":");
 Serial.print(minute);
 Serial.print(":");
 Serial.print(seconde);
 
 var = digitalRead(buton1);
 while(var != 0)
 {
   var2 = digitalRead(buton2);
   if(buton2=HIGH)
   heure = heure+1;
   
   var3 = digitalRead(buton3);
   if(buton3=HIGH)
   heure = heure-1;   
  }
}

J’ai fais ce petit programme isolé du reste du code, il ne ferait que l’avancement et le reculement de l’heure. Mais comme vous m’aviez dis précèdement cela ne devrait donc pas marchais puisqu’il faut que j’intègre les fonctions de réglage du RTC DS1307 c’est bien ça ? ou cela pourrait marcher ?

Bon voilà j’ai mieux arranger le programme, mis le code en utilisant les fonctions du RTC, cependant déjà une erreur de compilation :confused:

#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal.h>
#include <DS1307.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
RTC_DS1307 RTC;

int buttonPin = 10;
int rtcHour;
int rtcMinute;
int rtcSeconds;
int rtcDay;
int rtcMonth;
int rtcYear;


void setup() 
{
	Serial.begin(9600);
	Wire.begin();
	RTC.begin();
	lcd.begin(16,2);
	pinMode(10, INPUT);

	if (!RTC.isrunning()) {
		Serial.println ("RTC is NOT running!");
		RTC.adjust(DateTime(__DATE__, __TIME__));
	}
}


void loop () 
{
	DateTime now = RTC.now();
	rtcHour = now.hour();
	rtcMinute = now.minute();
	rtcSeconds = now.second();

	//Modifier l'heure
	if(digitalRead(buttonPin) == LOW)
		RTC.set(DS1307_HR, rtcHeure+1);


	//Affichage heure LCD
	lcd.clear();
	lcd.setCursor(0,0);
	lcd.print("Heure:");
	lcd.setCursor(6,0);

	if (rtcHour < 10)
		lcd.print("0");

	lcd.print(now.hour(), DEC);
	lcd.print(":");

	if (rtcMinute < 10)
		lcd.print("0");

	lcd.print(now.minute(), DEC);
	lcd.print(":");

	if (rtcSeconds < 10)
		lcd.print("0");

	lcd.print(now.second(),DEC);
	lcd.print("s");
	lcd.setCursor(0,1);

	lcd.print("Date:");
	lcd.setCursor(6,1);
	rtcDay = now.day();
	rtcMonth = now.month();
	rtcYear = now.year();

	if (rtcDay < 10)
		lcd.print("0");

	lcd.print(now.day(),DEC);
	lcd.print("/");

	if (rtcMonth < 10)
		lcd.print("0");

	lcd.print(now.month(),DEC);
	lcd.print("/");


	if (rtcYear < 10)
		lcd.print("0");

	lcd.print(rtcYear, DEC);
	lcd.print(" ");
	lcd.print(" ");

	delay(1000);
}

fatal error: DS1307.h: No such file or directory.

Cela veut dire que je n’est pas la bonne bibliothèque non ? cependant je pense avoir la bonne, je l’es téléchargé ici : DS1307RTC Library, For Accessing Real Time Clock (RTC) Chips

Quelqu'un sait comment je pourrais résoudre ce problème ? J'ai bien mis cette bibliothèque dans le dossier "librairie" de arduino pourtant.