Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino] Allumer une LED en fonction de l'heure actuelle.

15 mai 2012 à 0:06:18

Bonjour à tous :)
Afin de réaliser une simulation pour mon PPE, j'ai besoin d'allumer une LED à une certaine heure.

J'ai donc essayer ce code là, en incluant la librairie DateTime :

#include <Time.h>

const int led_rouge = 2;   //définition de la broche 2 de la carte en tant que variable
int time = hour(); // variable time contient l'heure actuel

void setup()          //fonction d'initialisation de la carte
{
	
   pinMode(led_rouge, OUTPUT); //initialisation de la broche 2 comme étant une sortie
		

}

void loop()           //fonction principale, elle se répète (s’exécute) à l'infini
{
	if (time == 23) { // Si l'heure est 23
   digitalWrite(led_rouge, LOW); // écriture en sortie (broche 2) d'un état BAS
	}
	else {
   digitalWrite(led_rouge, HIGH); // écriture en sortie (broche 2) d'un état BAS
	}
}


Donc là, théoriquement, la LED devrait s'allumer entre 23h00 et 23h59.
Mais ça ne marche pas, la LED reste éteinte.

J'ai aussi remarquer que la LED s'allume lorsque l'on change la condition à :

if (time == 00)


alors qu'il est 23h30 !
Je pense donc que l'heure est inactive.

Donc voilà je vous demande à vous, comment est t-il possible de faire fonctionner ce code ?

Merci d'avance pour vos réponses.





  • Partager sur Facebook
  • Partager sur Twitter
15 mai 2012 à 9:50:06

Bonjour !

LA librairie DateTime est bien pour manipuler facilement ds variables avec le temps mais ce n'est pas suffisant !
Contrairement à ton PC qui possède une carte mère avec une pile et une mémoire, ton arduino elle n'a pas tout ca !

Si tu veux pouvoir observer le temps, il te faut rajouter un composant qui s'appelle "RTC" (Real Time Clock, horloge temps réel). Ce composant électronique permet d'avoir une mesure du temps, mais il faudra aussi ajouter une pile (genre pile de montre) pour que le composant soit toujours alimenté et se souvienne toujours de l'heure.
  • Partager sur Facebook
  • Partager sur Twitter

Retrouvez moi sur mon blog et ma chaine Youtube !

16 mai 2012 à 16:47:24

Merci de ta réponse, j'ai été bête de croire que l'Arduino pouvait lire l'heure sans module complémentaire.

J'ai une autre question, en cherchant sur internet, j'ai trouvé qu'il fallait inclure les librairies RTClib.h et Wire.h pour pouvoir utiliser ce module.

Il y a t-il d'autre manœuvre à faire (mis à part le câblage) pour pouvoir l'utiliser ?

Je demande donc si ce code là marcherait (par manque de moyen et de temps, je n'ai pas pu acheter le module donc je ne peux pas tester moi même, désolé) ?

include <RTClib.h>
include <Wire.h>
include <Time.h>

const int led_rouge = 2;   //définition de la broche 2 de la carte en tant que variable
const int interrupteur1 = 3; //définition de la broche 3 de la carte en tant que variable
const int interrupteur2 = 4; //définition de la broche 4 de la carte en tant que variable


int date_heure = hour();  // variable date_heure contient l'heure actuelle 
int date_minute = minute(); // variable date_minute contient la minute actuelle 
int date_seconde = second(); // variable date_seconde contient la minute actuelle

int valeur1;
int valeur2;


void setup()          //fonction d'initialisation de la carte
{
	
   pinMode(led_rouge, OUTPUT); //initialisation de la broche 2 comme étant une sortie
   pinMode(interrupteur1, INPUT); //initialisation de la broche 3 comme étant une sortie 
   pinMode(interrupteur2, INPUT); //initialisation de la broche 4 comme étant une sortie
   valeur1 = HIGH;
   valeur2 = HIGH;
	
}


void loop()           //fonction principale, elle se répète (s’exécute) à l'infini
{
	valeur1 = digitalRead(interrupteur1);
	valeur2 = digitalRead(interrupteur2);

	if (date_heure == 8 || date_heure == 20 && date_minute == 30 && date_seconde == 00 && valeur1 == HIGH && valeur2 == HIGH) // Si il est 8h30 ou 20h30 et que les interrupteurs sont en position basse.
	{ 
   digitalWrite(led_rouge, LOW); // écriture en sortie (broche 2) d'un état BAS
	}
	

	else if (date_heure == 8 || date_heure == 20 && date_minute == 30 && date_seconde == 00 && valeur1 == LOW && valeur2 == HIGH) // Si il est 8h30 ou 20h30 et que l'interrupteur 1 est en position haute.
	{
	digitalWrite(led_rouge, HIGH); // écriture en sortie (broche 2) d'un état HAUT
	delay(10000); // On attend 10 seconde
	digitalWrite(led_rouge, LOW);  // écriture en sortie (broche 2) d'un état BAS
	}

	
	else {
   digitalWrite(led_rouge, HIGH); // écriture en sortie (broche 2) d'un état HAUT
	}
}


Comme vous pouvez le voir, j'ai rajouté aussi un système d'interrupteur qui intervient sur le fonctionnement de la LED.

Merci d'avance pour vos réponses, et merci de m'éclairer si j'ai zappé quelque chose concernant le module RTC.
  • Partager sur Facebook
  • Partager sur Twitter
16 mai 2012 à 21:55:52

C'est un début mais c'est pas suffisant... inclure des librairies c'est bien, mais utilisé ce qu'il y a dedans (des fonctions) c'est mieux ^^
En effet, le module il faudra communiquer avec, les infos ne tomberont pas toute seule comme ca. C'est un peu comme si je te disais "voila Internet" (traduction arduino "voila une librairie de communication"), si tu ne te sers pas des fonctions "naviguer", "cicker", "surfer", ca te fait une belle jambe !

Je ne sais pas a quel composant tu fais référence donc dur de te renseigner sur l'utilisation des librairies. Cependant, sache que Wire permet d'utiliser le protocole de communication I²C et RTC je suppose que c'est pour utiliser des fonctions toute faite lié à une horloge RTC
  • Partager sur Facebook
  • Partager sur Twitter

Retrouvez moi sur mon blog et ma chaine Youtube !

18 mai 2012 à 21:20:11

Bonsoir, merci pour ta réponse.
J'ai réussi à trouver ce que je cherchais.

Si j'ai un problème lors de la simulation, je vous fait signe.
Merci en tout cas.
  • Partager sur Facebook
  • Partager sur Twitter
20 mai 2012 à 22:35:33

Hop ! Dernière question pour vous.

Voici le code source final de ma production :

const int led_rouge = 13;   //définition de la broche 13 de la carte en tant que variable
const int interrupteur = 2; //définition de la broche 2 de la carte en tant que variable

int date_heure = 8;  // variable date_heure contient 8 par défaut
int date_minute = 30; // variable date_minute contient 30 par défaut 
int date_seconde = 00; // variable date_seconde contient 00 par défaut

int compteur = 1; // On pose la variable compteur à 1 (obligatoirement car la division par 0 n'existe pas)


int etat_bouton; // on pose la variable etat_bouton
int etat_defaut = HIGH; // Par défaut, l'état de l'interrupteur est haut (relaché).


void setup()          //fonction d'initialisation de la carte
{
   pinMode(led_rouge, OUTPUT); //initialisation de la broche 13 comme étant une sortie
   pinMode(interrupteur, INPUT); //initialisation de la broche 2 comme étant une entrée 
}


void loop()           //fonction principale, elle se répète (s’exécute) à l'infini
{
etat_bouton = digitalRead(interrupteur); // On lit la position de l'interrupteur1 et on le stocke dans la variable etat_bouton1.


if (etat_bouton != etat_defaut && etat_bouton == LOW) { // Si l'interrupteur est en position basse et qu'il y a eu un changement par rapport à sa position précédente. 
  compteur++; // On incrémente la variable compteur
  }

float modulo_compteur = compteur % 2; // On définit une variable qui stocke la valeur du compteur divisé par 2
int modulo2_compteur = compteur % 2; // On définit une variable qui stocke la partie entière du compteur divisé par 2

if (date_heure == 8 || date_heure == 20 && date_minute == 30 && date_seconde == 00 && etat_bouton == HIGH) // Si il est 8h30 ou 20h30 et que l'interrupteur est en position haute (relaché).
	{ 
digitalWrite(led_rouge, LOW); // écriture en sortie (broche 2) d'un état BAS, c'est à dire on allume la LED.
	}
	

else if (date_heure == 8 || date_heure == 20 && date_minute == 30 && date_seconde == 00 && etat_bouton != etat_defaut && etat_bouton == LOW && modulo_compteur == modulo2_compteur) // Si il est 8h30 ou 20h30, que l'interrupteur est passé en position basse (appuyé) et que c'est la nième fois qu'il passe avec n pair.
	{
digitalWrite(led_rouge, HIGH); // écriture en sortie (broche 2) d'un état HAUT, c'est à dire on éteint la LED
delay(10000); // On attend 10 seconde
digitalWrite(led_rouge, LOW);  // écriture en sortie (broche 2) d'un état BAS, c'est à dire on allume la LED
	}

else if (date_heure == 8 || date_heure == 20 && date_minute == 30 && date_seconde == 00 && etat_bouton != etat_defaut && etat_bouton == LOW && modulo_compteur != modulo2_compteur) // Si il est 8h30 ou 20h30, que l'interrupteur est passé en position basse (appuyé) et que c'est la nième fois qu'il passe avec n impair.
	{
digitalWrite(led_rouge, HIGH); // écriture en sortie (broche 2) d'un état HAUT, c'est à dire on éteint la LED
	}

	else { // Sinon on ne fait rien.
	}

etat_defaut = etat_bouton; // On enregistre l’état de l’interrupteur pour le tour suivant.

}


et le câblage électrique qui va avec :

Image utilisateur

Théoriquement, la LED devrait être allumé et s’éteindre lorsque l'on appui une première fois sur l'interrupteur, puis s'allumer au bout de 10 secondes et s'arrêter lorsque l'on appui une deuxième fois sur le bouton.

Malheureusement, j'ai réalisé le montage et la LED est éteinte, et s'allume lorsque l'on appuie sur l'interrupteur... Ce n'est pas vraiment le résultat attendu :(

Merci d'avance pour vos idées (et merci Eskimon de m'aider depuis le début).
  • Partager sur Facebook
  • Partager sur Twitter
21 mai 2012 à 0:44:39

J'ai l'impression que tu te compliques beaucoup trop la vie dans ton code. En ce moment le résultat que tu attend c'est qu'au départ ta DEL est allumée, elle s'éteint la première fois que tu appuies sur l’interrupteur, s'allume et s'éteint au bout de 10 sec à chaque fois que tu appuies sur l'interrupteur ? Si oui, tu peux faire beaucoup plus simple...
Aussi, le câblage que tu as fais pour l'interrupteur ne m'a pas l'air bon. C'est une résistance de tirage à côté c'est ça ? Alors l'interrupteur n'est pas à la bonne place : tu devrais le mettre dans la maille qui va vers le GND et non dans la maille qui va vers l'entrée.
  • Partager sur Facebook
  • Partager sur Twitter
21 mai 2012 à 21:31:05

Bonjour, pour le code, c'est pas vraiment l'action que je souhaite.
Je ne pense pas pouvoir simplifier + le code car lorsque l'on appuie deux fois sur l'interrupteur, les actions sont différentes dans chacun des cas, les cycles se répétant par 2.

Pour le montage, j’ai corrigé et voilà ce que j’obtiens :

Image utilisateur*

Je ne peux pas le tester actuellement mais pensez vous qu'il est bon ?
merci d'avance.

PS : Oui en effet il s'agit bien d'une résistance de tirage.
  • Partager sur Facebook
  • Partager sur Twitter
21 mai 2012 à 22:54:31

Montage toujours faux... La LED est toujours à l'envers et le montage bouton aussi...
Pour le bouton :
5V --- Résistance --- bouton --- masse
_______________|
_______________|
_________Entrée Arduino
  • Partager sur Facebook
  • Partager sur Twitter

Retrouvez moi sur mon blog et ma chaine Youtube !

24 mai 2012 à 20:25:37

Effectivement, c'est toujours faux. Tu risques le court circuit avec ce montage...
  • Partager sur Facebook
  • Partager sur Twitter
24 mai 2012 à 20:37:29

C'est même pas un risque, plutôt un fait :D
  • Partager sur Facebook
  • Partager sur Twitter

Retrouvez moi sur mon blog et ma chaine Youtube !

15 mars 2017 à 19:30:12

moi jai un probleme je veux etiendre mes lamps a temps que je veux avec rtc et arduino

  • Partager sur Facebook
  • Partager sur Twitter
12 novembre 2018 à 11:42:23

bonjours je n'arrive pas a activer mon moteur a une heur précise est ce vous pouvez m'aider svp 
  • Partager sur Facebook
  • Partager sur Twitter
12 novembre 2018 à 11:53:50

C'est quoi exactement le problème avec ton moteur?
  • Partager sur Facebook
  • Partager sur Twitter
Le 25 juillet 2016, j'ai essayé une Ford Mustang.
23 mars 2020 à 18:31:42

bonjour j ai le même problème j aimerai allumé une LED a 7h30 du matin et 19h30 du soir tout les jours. et qu une  impulsion sur un bp m éteigne la LED . c'est pour faire un rappel journalier . j'ai fait le montage j'ai bien la carte ds3132 pour avoir l'horloge mais je bloque sur la programmation .

  • Partager sur Facebook
  • Partager sur Twitter
31 mars 2020 à 19:55:03

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter