Suite aux conclusions précédentes, voici un programme de réveil open source :
Cette 1ére version permet de régler l’heure et l’alarme. Elle offre aussi la possibilité d’activer ou non l’alarme.
L’alarme s’éteint au bout d’une minute. On peut aussi arrêter l’alarme plus tôt par appuie sur le bouton BP4.
Voici l’affichage du programme sur l’écran LCD :
Nous souhaitons utiliser la fonction « tone » qui se sert du timer2 et un allumage progressif d’une LED 3 Watt qui permet de se réveiller en douceur mais qui utilise le timer0. Donc, le programme devra se passer de la fonction « delay » car celle-ci utilise le timer0.
Par conséquent, nous utilisons le timer1 pour l’horloge.
Voici une photo de la simulation de ISIS ou il y a le réveil à partir de 5 minutes.
Voici le programme
// include the library code:
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
#include <TimerOne.h>
#define SERIAL_PORT_LOG_ENABLE 1
#define Led13 13 // 13 pour la led jaune sur la carte
#define buzzer A5 // A5 pour le buzzer
#define BP1 11 // Bouton Poussoir
#define BP2 10
#define BP3 9
#define BP4 12
#define LEDV A4 // A4 pour la led verte
#define horloge 2
#define LEDPWM 5
LiquidCrystal lcd(3, 8, 4, A1, 6, 7); // LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Configuration des variables
unsigned int temps=0;
byte seconde=50;
byte minute=4;
byte heure=0;
int tempsbruit=1;
byte periode=1;
byte tempsperiode=1;
byte Alarm_ON=0;
byte heure_Alarm=0;
byte minute_Alarm=5;
int tempsdelay=0;
byte luminosite=0;
void setup()
{
pinMode(Led13, OUTPUT); //led carte arduino
pinMode(LEDV, OUTPUT);
pinMode(LEDPWM, OUTPUT);
Timer1.initialize(1000); // initialize timer1, and set a 0,1 second period => 100 000 pour 0.01s 10 000
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
lcd.begin(16, 2); // modifier pour un afficheur 20x4
}
// Interruptions tous les 0.001s fait par le timer1
void callback()
{
temps++;
tempsdelay++;
}
//fin routine
void loop()
{
//gestion de l'heure avec routine d'interruption timer 0.001 seconde
if (temps>=1000)
{
seconde++; temps=0; // Gestion temps : heure, minute, seconde
if (seconde>=60) {minute++; seconde=0; }
if (minute>=60) {heure++;minute=0; }
if (heure>=24) {heure=0;}
if (minute_Alarm >= 60) {heure_Alarm++; minute_Alarm=0;} // Gestion temps alarme : heure, minute
if (heure_Alarm>=24) {heure_Alarm=0;}
// Affichage heure
lcd.setCursor(4,0); //colonne, ligne
if (heure<10) {lcd.print(" "); } //decalage
lcd.print(heure);
lcd.print("h");
if (minute<10) {lcd.print(" "); }
lcd.print(minute);
lcd.print("m");
if (seconde<10) {lcd.print(" "); }
lcd.print(seconde);
lcd.print("s");
lcd.print(" ");
lcd.setCursor(0,1); // Affichage heure de l'alarme
if (heure_Alarm<10) {lcd.print(" "); } //decalage
lcd.print(heure_Alarm);
lcd.print("h");
if (minute_Alarm<10) {lcd.print(" "); }
lcd.print(minute_Alarm);
lcd.print("m");
lcd.print(" ");
if (Alarm_ON==1) // Gestion affichage Alarm_ON / OFF
{
lcd.setCursor(7,1);
lcd.print("Alarm_ON ");
}
else
{
lcd.setCursor(7,1);
lcd.print("Alarm_OFF");
}
if ((digitalRead(Led13))==1) {digitalWrite(Led13, 0);} else {digitalWrite(Led13, 1);} //test que le programme tourne
} //fin if temps>1000
if ((digitalRead(BP1))==1 && (digitalRead(BP2))==1) // Gestion incrémentation heure
{
minute++;
tempsdelay=0;
while (tempsdelay<=100) { lcd.setCursor(0,0); lcd.print(" "); }
}
if ((digitalRead(BP1))==1 && (digitalRead(BP3))==1) // Gestion décrémentation heure
{
if (minute==0 && heure==0)
{
heure=23;
minute=59;
}
if (minute==0)
{
minute=59;
heure--;
tempsdelay=0;
while (tempsdelay<=100) { lcd.setCursor(0,0); lcd.print(" "); }
}
minute--;
tempsdelay=0;
while (tempsdelay<=100) { lcd.setCursor(0,0); lcd.print(" "); }
}
if ((digitalRead(BP4))==0 && (digitalRead(BP2))==1) // Gestion incrémentation heure de l'alarme
{
minute_Alarm++;
tempsdelay=0;
while (tempsdelay<=100) { lcd.setCursor(0,0); lcd.print(" "); }
}
if ((digitalRead(BP4))==0 && (digitalRead(BP3))==1) // Gestion décrémentation heure de l'alarme
{
if (minute_Alarm==0 && heure_Alarm==0)
{
heure_Alarm=23;
minute_Alarm=59;
}
if (minute_Alarm==0)
{
minute_Alarm=59;
heure_Alarm--;
}
minute_Alarm--;
tempsdelay=0; // tempsdelay : permet d'eviter l'utilisation de delay
while (tempsdelay<=100) { lcd.setCursor(0,0); lcd.print(" "); }
}
if ((digitalRead(BP4))==0) // Gestion ativation alarme par appuie sur BP4
{
if (Alarm_ON==0) { Alarm_ON=1; }
else { Alarm_ON=0; }
tempsdelay=0;
while (tempsdelay<=500) { lcd.setCursor(0,0); lcd.print(" "); }
noTone(A5);
}
if (heure==heure_Alarm && minute==minute_Alarm && Alarm_ON==1) // Gestion Alarme d'une durée de 1 minute, s'arrete avant si appuie bouton BP4
{
//tone(A5, 1000); //tone(pin, frequency)
analogWrite(LEDPWM, luminosite);
luminosite++;
tempsdelay=0;
while (tempsdelay<=100) { lcd.setCursor(0,0); lcd.print(" "); } // Luminosite de la led passe de 0 à 255 en 5 minutes
}
}
Conclusions :
Dans le programme précédent, la PWM de la LED 3 watt est à 100%.
Une PWM progressive de 5 minutes pour se réveiller en « douceur » serait plus pertinente.
Perspectives :
La mélodie est à finaliser. De plus, à la place d’utiliser un buzzer, il serait plus intéressant d’avoir un petit haut-parleur avec un ampli pour avoir un meilleur son.