open source hardware electromenagers (four electrique, micro onde..... )

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.