Modifications

Sauter à la navigation Sauter à la recherche
7 221 octets ajoutés ,  9 avril 2018 à 15:58
Ligne 1 : Ligne 1 :  
{{Mon-Reveil-NAV}}
 
{{Mon-Reveil-NAV}}
   −
Si vous désirez obtenir le code complet directement, cliquez [https://github.com/mchobby/Mon-Reveil-1/archive/master.zip ici]
+
== Introduction ==
 +
Cette partie du tutoriel reprend le chargement du code du réveil... et s'attarde sur les éléments principaux du code.
   −
{{ambox | text = N'hésitez pas à [[Mon-Reveil-Tester|tester]] vos connectiques si ce n'a pas été encore réalisé !}}
+
== Environnement de travail ==
 +
Vous pouvez obtenir la totalité du code sur le lien suivant:
   −
== Environnement de travail ==
+
{{download-box|Télécharger l'intégralité du code|https://github.com/mchobby/Mon-Reveil-1/archive/master.zip}}
   −
''Dans ce tutoriel, nous travaillons sur l'environnement d'ArduinoIDE. Si vous ne l'avez pas encore installé, vous pouvez le télécharger [https://www.arduino.cc/en/Main/Software ici].''
+
Si se n'a pas été encore fait, pensez à [[Mon-Reveil-Tester|tester vos connectiques]] avec le programme de test!
   −
Passons au vif du sujet.
+
Dans ce tutoriel, nous travaillons Avec l'environnement d'ArduinoIDE. Si vous ne l'avez pas encore installé, vous pouvez le télécharger [https://www.arduino.cc/en/Main/Software ici].
   −
* Premièrement télécharger le fichier compressé du réveil, se trouvant [https://github.com/mchobby/Mon-Reveil-1/archive/master.zip ici].
+
Passons au vif du sujet:
* Décompressé le fichier zip.
+
* Il faut installer le bibliothèque de [[Mon-Reveil-Lib|l'afficheur 4x7 segments]]
* Dans le dossier ''"Mon Reveil"'', ajoutez-y les fichiers '''Adafruit_LEDBackpack.h''' et '''Adafruit_LEDBackpack.cpp''' (disponible [https://github.com/adafruit/Adafruit_LED_Backpack ici]).
+
* Il faut télécharger les sources du projet [https://github.com/mchobby/Mon-Reveil-1/archive/master.zip ici].
* Ouvrez le projet sur ArduinoIDE :
+
* Décompresser le fichier zip téléchargé.
 +
* Vous trouverez les sources du projet dans le dossier "'''Mon-Reveil'''".<br />Ouvrez le projet sur ArduinoIDE :
   −
  Menu -> Ouvrir -> "où_le_fichier_décompressé_est/Mon-Reveil-1-master/Mon-Reveil/Mon-Reveil.ino"
+
Menu -> Ouvrir -> "../Mon-Reveil-1-master/Mon-Reveil/Mon-Reveil.ino"
   −
[[Fichier:Mon-Reveil-60.jpg|640px]]<small><br />''Contenu du projet - cliquez pour agrandir''</small>
+
[[Fichier:Mon-Reveil-60b.jpg]]<small><br />''Contenu du projet - cliquez pour agrandir''</small>
   −
== Explication du code ==
+
== L'entête du programme ==
   −
Pour mieux comprendre le code, je vais vous expliquez chaque parties du code ainsi que les différentes procédures à suivre.
+
Dans l'entête se trouvent l'ensemble des variables globales et autres éléments utiles.
    
=== Les inclusions de bibliothèques ===  
 
=== Les inclusions de bibliothèques ===  
 +
 +
Il est nécessaire d'ajouter ces bibliothèques pour le bon fonctionnement du code.
 +
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
#include "Adafruit_LEDBackpack.h" // Afficheurs
 
#include "Adafruit_LEDBackpack.h" // Afficheurs
Ligne 33 : Ligne 39 :  
</syntaxhighlight>
 
</syntaxhighlight>
   −
* Le fichiers pitches.h contient les notes sous forme d'impulsions
+
* Le fichiers '''pitches.h''' contient les notes sous forme d'impulsions.
* Le fichier melodies.h contient plusieurs mélodies que vous pouvez définir comme sonnerie d'alarmes
+
* Le fichier '''melodies.h''' contient plusieurs mélodies que vous pouvez définir comme sonneries d'alarmes.
   −
=== Définir la position des boutons, des leds et du buzzer ===
+
=== Définir les broches utilisés ===
   −
Ci-dessous, se trouve l'ensemble des entrées des boutons et piezzo buzzer.
+
Ci-dessous, se trouve l'ensemble des entrées des boutons et du piezzo buzzer.
 +
 
 +
Vous pouvez les modifier si vous n'uilisez pas les mêmes entrées que dans l'assemblage.
 
   
 
   
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
Ligne 57 : Ligne 65 :  
</syntaxhighlight>
 
</syntaxhighlight>
   −
{{ambox | text =Les boutons Arcades utilisent les entrées analogiques comme entrées digitales}}
+
{{ambox | text = Les boutons d'arcades utilisent les entrées analogiques comme entrées digitales. Pour plus d'informations, voir si dessous.}}
 +
[[Fichier:Mon-Reveil-65.png|640px]]
 +
<small><br />''Connectiques de l'Arduino UNO - cliquez pour agrandir''<br />Source: [http://www.pighixxx.com/test/wp-content/uploads/2017/05/uno.png Pighixxx]</small>
   −
=== Personnaliser les paramètres par défaut ===
+
=== Personnaliser les paramètres ===
 +
Il est possible de personnaliser les paramètres par défaut du projet (ex: les alarmes).
   −
Il est possible de personnaliser les paramètres par défaut des alarmes.
+
{{ambox|text=Nous recommandons de tester le projet avec ses paramètres par défaut avant de les modifiers}}
    
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
Ligne 75 : Ligne 86 :  
</syntaxhighlight>
 
</syntaxhighlight>
   −
* '''SNOOZE_ATTENTE''' permet de définir combien de secondes le snooze va encore attendre avant de se remettre à sonner.
+
* '''SNOOZE_ATTENTE''' permet de définir combien de secondes le "bouton snooze" va mettre l'alarme en veille avant de se remettre à sonner. <font color="red">La valeur par défaut est de 10 secondes. '''Nous recommandons 5 minutes, soit 300 secondes'''.</font>
* '''DUREE_ALARME''' permet de définir combien de secondes les alarmes vont sonner.
+
* '''DUREE_ALARME''' permet de définir combien de secondes MAX les alarmes vont sonner si le bouton d'arrêt n'est pas pressé. <font color="red">La valeur par défaut est de 20 secondes. '''Nous recommandons 60 minutes, soit 3600 secondes'''.</font>
* '''BOUTON_ALARM''' permet de définir sur quel broche l'alarme va être activer/désactiver. Il permet aussi de savoir combien d'alarmes vont être utilisés.
+
* '''BOUTON_ALARM''' permet de définir sur quelles broches les boutons d'alarme 1 à 4 sont branchés. Presser un bouton permet d'activer l'alarme correspondante. Re-presser le bouton une seconde fois permet de désactive l'alarme. Cette constante permet aussi de savoir combien d'alarmes doit être géré par le croquis.
 
* '''VITESSE_LECTURE''' permet de définir a quelle vitesse la mélodie va être jouée.
 
* '''VITESSE_LECTURE''' permet de définir a quelle vitesse la mélodie va être jouée.
* '''MELODIE''' permet de définir la mélodie jouée. L'ensemble des mélodies se trouvent dans le fichier ''melodies.h'' qui doit se trouver dans la racine de votre projet.
+
* '''MELODIE''' permet de définir la mélodie jouée. L'ensemble des mélodies se trouvent dans le fichier ''melodies.h''.
 
  −
== Setup ==
     −
Dans le setup se trouvent différentes routines :
+
== setup() ==
 +
La fonction setup() permet d'initialiser les éléments matériels du réveil.
   −
* Ouverture du port série et définition du débit de données à 9600 bps pour permettre la communication de l'arduino à un ordinateur via usb.
+
=== Port série ===
 +
Ouverture du port série au débit de données de 9600 bauds, pour permettre la communication entre un arduino et un ordinateur via usb à des fins de débogages.
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
Serial.begin( 9600 );
 
Serial.begin( 9600 );
 
</syntaxhighlight>
 
</syntaxhighlight>
   −
* Configuration des broches des boutons pour qu'elles se comportent comme des entrées.
+
=== Les entrées ===
 +
Configuration des broches en entrées (pour les boutons).
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
// Initialisation des boutons
 
// Initialisation des boutons
Ligne 99 : Ligne 111 :  
pinMode( BOUTON_ALARME_CONTROLE, INPUT_PULLUP );
 
pinMode( BOUTON_ALARME_CONTROLE, INPUT_PULLUP );
 
pinMode( BOUTON_SNOOZE, INPUT_PULLUP );
 
pinMode( BOUTON_SNOOZE, INPUT_PULLUP );
// Boucles pour les broches utilisées pour activer/désactiver les alarmes
+
// Boucle pour les broches utilisées pour activer/désactiver les alarmes
 
for( int i=0 ; i<NBRALARMES ; i++ )
 
for( int i=0 ; i<NBRALARMES ; i++ )
 
   pinMode( BOUTON_ALARME[i], INPUT_PULLUP );
 
   pinMode( BOUTON_ALARME[i], INPUT_PULLUP );
 
</syntaxhighlight>
 
</syntaxhighlight>
{{ambox | text = Il est important d'activer la résistance PULLUP sur le microcontrôlleur pour éviter de le sur alimenter}}
+
{{ambox-stop | text = Il est important d'activer la résistance PULLUP sur le microcontrôleur pour éviter de le sur alimenter.}}
* Configuration des broches des leds des boutons et du piezo buzzer pour qu'elles se comportent comme des sorties.
+
 
 +
=== Les sorties ===
 +
Configuration des broches en sortie pour:
 +
* Les leds des boutons "snooze" et "OK" (Alarme Stop)
 +
* Le piezo buzzer
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
// Initialisation des leds et du piezo
 
// Initialisation des leds et du piezo
Ligne 111 : Ligne 127 :  
pinMode( PIEZO_BUZZER, OUTPUT );
 
pinMode( PIEZO_BUZZER, OUTPUT );
 
</syntaxhighlight>
 
</syntaxhighlight>
* Démarrer la connection I2C avec l'afficheur en lui insérant une adresse (0x70 par défaut).
+
 
 +
=== Initialiser l'afficheur ===
 +
Initialisation de l'afficheur I2C (sur son adresse I2C par défaut, 0x70).
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
// Adresse I2C des afficheurs
   
afficheurs.begin( 0x70 );
 
afficheurs.begin( 0x70 );
 
</syntaxhighlight>
 
</syntaxhighlight>
* Démarrer la connection I2C avec l'RTC
+
 
 +
=== RTC ===
 +
Initialisation de l'horloge RTC I2C.
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
// Démarrer le lien avec l'RTC en I2C
+
// Démarrer le lien avec le RTC en I2C
 
rtc.begin();
 
rtc.begin();
 
</syntaxhighlight>
 
</syntaxhighlight>
* Réglage de l'heure si elle n'a pas encore été initialisé dans l'RTC ou si elle n'est plus présente dans l'RTC.
+
 
 +
Réglage d'une heure par défaut si elle n'a pas encore été initialisé dans le RTC ou si elle n'est plus présente dans le RTC.
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
// Configuration de l'heure par l'utilisateur si ce n'a pas été encore fait
 
// Configuration de l'heure par l'utilisateur si ce n'a pas été encore fait
Ligne 128 : Ligne 148 :  
   int m = 0;
 
   int m = 0;
 
   changerHeureVisuel( &h, &m );
 
   changerHeureVisuel( &h, &m );
   rtc.adjust( DateTime(2018, 2, 20, h, m, 0) ); // Change l'heure de l'RTC  
+
   rtc.adjust( DateTime(2018, 2, 20, h, m, 0) ); // Change l'heure de le RTC  
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
* Formattage de l'EEPROM si rien dedans (vérification si fanion égale à 255) et si la version est égale à ce qu'il y a dans l'EEPROM.
+
 
 +
=== EEPROM-Setup ===
 +
L'EEPROM est formattée automatiquement si le fanion (magic key) n'est pas égale à 255 ou si la version dans l'EEPROM n'est pas égale à la version attendue par le croquis (ps: permet d'éviter tout soucis de compatibilité).
 +
 
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
if( EEPROM.read(0) != 255 || EEPROM.read(1) != VERSION )
 
if( EEPROM.read(0) != 255 || EEPROM.read(1) != VERSION )
 
   eepromConfiguration();
 
   eepromConfiguration();
 
</syntaxhighlight>
 
</syntaxhighlight>
* Définir la luminosité par rapport à la luminosité enregistré dans l'EEPROM.
+
{{ambox | text = La valeur du fanion (magic key) à été choisie par le développer.}}
 +
 
 +
=== Luminosité ===
 +
Changer la luminosité des afficheurs avec celle enregistrée enregistré dans l'EEPROM.
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
 
// Définir la luminosité des afficheurs
 
// Définir la luminosité des afficheurs
 
afficheurs.setBrightness( EEPROM.read(2) );
 
afficheurs.setBrightness( EEPROM.read(2) );
 
</syntaxhighlight>
 
</syntaxhighlight>
* Copier les alarmes enregistré dans l'EEPROM dans la structure du programme.
+
 
<syntaxhighlight lang="c">
+
=== Initialisation des variables des alarmes ===
 +
Copier les heures des alarmes enregistrées dans l'EEPROM vers la structure de données des alarmes en mémoire.
 +
<syntaxhighlight lang="c">
 
// Configuration des dates/heures sur les alarmes
 
// Configuration des dates/heures sur les alarmes
 
DateTime maintenant = rtc.now();
 
DateTime maintenant = rtc.now();
 +
 
int j = 0;
 
int j = 0;
 +
 
for( int i=3 ; i< ( NBRALARMES*2 )+6 ; i+=3 ){
 
for( int i=3 ; i< ( NBRALARMES*2 )+6 ; i+=3 ){
 
   alarme[j].heureSonne = DateTime( maintenant.year(), maintenant.month(), maintenant.day(), EEPROM.read(i), EEPROM.read(i+1), 0);
 
   alarme[j].heureSonne = DateTime( maintenant.year(), maintenant.month(), maintenant.day(), EEPROM.read(i), EEPROM.read(i+1), 0);
Ligne 153 : Ligne 183 :  
</syntaxhighlight>
 
</syntaxhighlight>
   −
== Loop ==
+
On commence à la position 3, car les 3 premières valeurs de l'EEPROM sont utilisées pour :
 +
* Le fanion (Magic Key)
 +
* La version de la structure de donnée stockée dans l'EEPROM.
 +
* La luminosité
 +
 
 +
On utilise des incrémentations par 3 (et non par 1) de manière à lire un enregistrement tous les 3 octets en EEPROM.
 +
 
 +
Chaque enregistrement de 3 octets contient:
 +
* Heure
 +
* Minute
 +
* Alarme activée ?
   −
Dans la routine, différentes tâches tournent en boucle pour permettre au code de faire tourner l'ensemble des fonctions nécessaire.
+
Pour plus d'informations logiques, voir [[Mon-Reveil-Programmer#EEPROM|ici]].
   −
Voici la routine au complet, les commentaires sont explicite à la compréhension.
+
== loop() ==
 +
La fonction loop() exécutée régulièrement par Arduino Uno prend en charge les différentes tâches au fonctionnement du réveil.
   −
<syntaxhighlight lang="c">
+
Voici la fonction complète, les commentaires décrivent le fonctionnement.
 +
 
 +
<syntaxhighlight lang="c">
 
/*
 
/*
 
  * Routine du code
 
  * Routine du code
Ligne 194 : Ligne 237 :  
</syntaxhighlight>
 
</syntaxhighlight>
   −
== Contenu de l'EEPROM ==
+
== Affichage ==
 +
=== Comment afficher des valeurs ? ===
 +
 
 +
Voir un [[ADF-LED-BACKPACK-I2C-Adresse|ancien wiki]].
 +
 
 +
Ci-dessous, nous vous proposons un petit exemple démontrant l'usage de l'afficheur 4x7 segments.
 +
<syntaxhighlight lang="c">
 +
#include "Adafruit_LEDBackpack.h"
 +
 
 +
// Initialisation de l'afficheur 7 segments
 +
Adafruit_7segment afficheurs = Adafruit_7segment();
 +
 
 +
boolean separateur = false;
 +
 
 +
void setup() {
 +
 
 +
  // Adresse I2C des afficheurs
 +
  afficheurs.begin( 0x70 );
 +
 
 +
  // Changer la luminosité des afficheurs
 +
  // 0 à 15
 +
  afficheurs.setBrightness( 13 );
 +
 
 +
  // Afficher 1 2 3 4
 +
  afficher1234();
 +
 
 +
  delay( 1000 );
 +
}
 +
 
 +
void loop() {
 +
  // Changer l'état des 2 points
 +
  separateur = !separateur;
 +
  // Afficher les 2 points
 +
  afficheurs.drawColon( separateur );
 +
  // Envoyer les modifications aux afficheurs
 +
  afficheurs.writeDisplay();
 +
  delay( 500 );
 +
 
 +
  // Afficher directement sur les 4 afficheurs (4321)
 +
  afficheurs.print(4321, DEC);
 +
  // Envoyer les modifications aux afficheurs
 +
  afficheurs.writeDisplay();
 +
 
 +
  delay( 500 );
 +
}
 +
 
 +
void afficher1234(){
 +
  // Afficheur 1 (droite à gauche) (point éteind)
 +
  afficheurs.writeDigitNum( 0, 1, false );
 +
  // Afficheur 2 (droite à gauche) (point éteind)
 +
  afficheurs.writeDigitNum( 1, 2, false );
 +
  // Afficheur 3 (droite à gauche) (point éteind)
 +
  afficheurs.writeDigitNum( 3, 3, false );
 +
  // Afficheur 4 (droite à gauche) (point allumé)
 +
  afficheurs.writeDigitNum( 4, 4, true );
 +
 
 +
  // Envoyer les modifications aux afficheurs
 +
  afficheurs.writeDisplay();
 +
}
 +
</syntaxhighlight>
 +
 
 +
=== Fonctions utilitaires d'affichage ===
 +
Les 2 fonctions ci-dessous permettent d'afficher facilement l'heure et les minutes.
 +
 
 +
Elles permettent aussi de ne rien afficher (affichageNombre = false).
 +
 
 +
<syntaxhighlight lang="c">
 +
/*
 +
* Afficher les minutes
 +
*/
 +
void affichageMinutes( int minutesT, boolean affichageNombre ){
 +
  if( affichageNombre ){
 +
    afficheurs.writeDigitNum( 3, minutesT/10, false );
 +
    afficheurs.writeDigitNum( 4, minutesT - ((int)(minutesT/10))*10, false );
 +
  }
 +
  else{
 +
    afficheurs.writeDigitNum( 3, 16, false );
 +
    afficheurs.writeDigitNum( 4, 16, false );
 +
  }
 +
  // Change les afficheurs
 +
  afficheurs.writeDisplay();
 +
}
 +
 +
/*
 +
* Afficher les heures
 +
*/
 +
void affichageHeures( int heuresT, boolean affichageNombre ){
 +
  // On affiche les heures
 +
  if( affichageNombre ){
 +
    afficheurs.writeDigitNum( 0, heuresT/10, false );
 +
    afficheurs.writeDigitNum( 1, heuresT - ((int)(heuresT/10))*10, false );
 +
  }
 +
  // On cache les heures
 +
  else{
 +
    afficheurs.writeDigitNum( 0, 16, false );
 +
    afficheurs.writeDigitNum( 1, 16, false );
 +
  }
 +
  // Change les afficheurs
 +
  afficheurs.writeDisplay();
 +
}
 +
</syntaxhighlight>
 +
 
 +
== Fonctions utilitaires générales ==
 +
 
 +
'''Fonction qui vérifie si un bouton est appuyé.'''
 +
 
 +
Elle compare si la première fois le bouton est appuyé et si la deuxième fois il l'est aussi.
 +
Si ils sont tout 2 appuyé alors on renvoie vrai, au sinon false.
 +
 
 +
<syntaxhighlight lang="c">
 +
boolean estAppuye( int pinAppuye ){
 +
  int val1 = digitalRead( pinAppuye );   
 +
  delay( 10 );                   
 +
  int val2 = digitalRead( pinAppuye );   
 +
  if ( val1 == val2 && val1 == 0 ) // 0 pour GND
 +
    return true;
 +
  else
 +
    return false;
 +
 +
</syntaxhighlight>
 +
 
 +
'''Fonction qui vérfie si la seconde est passée.'''
 +
 
 +
Elle compare le temps précédent (ms) et le temps ''maintenant''.
 +
Si ok, on vérifie si on peut changer la valeur précédente à maintenant.
 +
 
 +
Passer uniquement false comme argument quand vous faites appel à cette fonction (sauf dans le cas des 2 points au milieu de l'afficheur).
 +
<syntaxhighlight lang="c">
 +
boolean clignote( boolean changerPeriode ){
 +
  unsigned long maintenant = millis();
 +
 
 +
  if( maintenant - avantClignote >= 1000 ){
 +
    if( changerPeriode )
 +
      avantClignote = maintenant;
 +
    return true;
 +
  }
 +
  return false;
 +
}   
 +
</syntaxhighlight>
 +
 
 +
== EEPROM ==
 +
La mémoire EEPROM (Electrically-Erasable Programmable Read-Only Memory) est une mémoire permanente de type ROM (Read-Only Memory: une mémoire qui ne perd pas ces données lors d'une mise hors tension) que l'on peut modifier via des impulsions électriques.
 +
 
 +
Cette mémoire permet de stocker des données même lorsque l'Arduino n'est plus alimenté.
   −
L'EEPROM de l'arduino UNO est capable d'enregistrer 1024 octets, ce qui offre 1024 entrées de données sous 8bits !
+
=== Contenu de l'EEPROM ===
 +
L'EEPROM de l'arduino UNO est capable d'enregistrer 1024 octets!
   −
Pour rendre plus compréhensible l'organisation de l'EEPROM, voici l'EEPROM sous forme de tableau :
+
Les enregistrements contenu dans l'EEPROM sont représentés dans le tableau ci-dessous pour faciliter la compréhension:
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Ligne 208 : Ligne 395 :  
| align="center" | 0
 
| align="center" | 0
 
| align="center" | 255
 
| align="center" | 255
| align="center" | Fanion
+
| align="center" | Fanion (Magic Key)
 
|- style="font-size: 90%"
 
|- style="font-size: 90%"
 
| align="center" | 1
 
| align="center" | 1
Ligne 227 : Ligne 414 :  
|- style="font-size: 90%"
 
|- style="font-size: 90%"
 
| align="center" | 5
 
| align="center" | 5
 +
| align="center" | 0
 +
| align="center" | Programmé Alarme 1
 +
|- style="font-size: 90%"
 +
| align="center" | 6
 
| align="center" | 0
 
| align="center" | 0
 
| align="center" | Heure Alarme 2  
 
| align="center" | Heure Alarme 2  
 
|- style="font-size: 90%"
 
|- style="font-size: 90%"
| align="center" | 4
+
| align="center" | 7
| align="center" | 6
+
| align="center" | 0
 
| align="center" | Minute Alarme 2  
 
| align="center" | Minute Alarme 2  
 +
|- style="font-size: 90%"
 +
| align="center" | 8
 +
| align="center" | 0
 +
| align="center" | Programmé Alarme 2
 
|- style="font-size: 90%"
 
|- style="font-size: 90%"
 
| align="center" | ...
 
| align="center" | ...
Ligne 239 : Ligne 434 :  
|}
 
|}
   −
== Créer votre mélodie ==
+
Le fanion (ou Magic Key) est une valeur arbitraire choisie par le développeur et écrite dans le premier octet de l'EEPROM par le croquis Arduino.
 +
 
 +
En lisant le premier octet de l'EEPROM et en vérifiant s'il contient le fanion (Magic Key) il est possible de savoir si l'EEPROM à déjà initialisée par le croquis Arduino.
   −
Il est possible d'ajouter facilement une mélodie à la bibliothèque '''melodie.h'''.
+
=== Lecture / Ecriture dans l'EEPROM ===
   −
Je vous invite à lire la bibliothèque de manière à comprendre son fonctionnement et si vous ne comprenez pas tout, je vous invite à lire le contenu suivant.  
+
Premièrement, il est nécessaire d'ajouter la bibliothèque nécessaire au fonctionnement de l'EEPOM.
   −
=== A quoi sert l'antislash ? ===
+
<syntaxhighlight lang="c">
 +
#include <EEPROM.h>
 +
</syntaxhighlight>
   −
Comme vous pouvez voir dans la bibliothèque, chacune des mélodies contiennent un antislash à la fin de chaques lignes de code (excepté la dernière) :
+
Pour écrire une donnée dans l'EEPROM, il suffit de définir une position et un nombre entier
    
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
#define ALARM1{  \
+
// On écrit à la première position, la valeur 255
  {NOTE_A4,  20},\
+
EEPROM.write( 0 , 255 );  
  {NOTE_C420}}
   
</syntaxhighlight>
 
</syntaxhighlight>
 +
Pour lire une donnée dans l'EEPROM, il suffit de définir une position où se trouve une information
   −
L'antislash ('''\''') sert de remise à la ligne pour le define et son contenu. Si cet antislash n'est pas mit, il sera impossible de compiler le code.  
+
<syntaxhighlight lang="c">
 +
// On lit la première entrée de 8 bits se trouvant dans la première position
 +
EEPROM.read( 0 );
 +
</syntaxhighlight>
   −
Si vous ne désirez pas mettre d'antislash, il vous sera obligatoire d'écrire tout le contenu du define en une ligne de code.
+
=== Formater de l'EEPROM ===
 +
Il est important que cette EEPROM soit formatée et initialisé avec des valeurs par défaut avant toute utilisation.
   −
Pour des raisons de mise en page, nous avons préféré mettre l'antislash à fin de chaques lignes de façon à rendre le code plus lisible.
+
Pour se faire, une fonction existe dans le croquis de "Test" (celui qui teste les boutons).  
   −
=== Que contiennent les define ? ===
+
Normalement, si vous avez exécutez le [[Mon-Reveil-Tester|test des boutons]] alors l'EEPROM est déjà pré-formatté.
   −
Le define est un tableau 2 dimensions contenant des nombres entiers (int).
+
Si l'EEPROM n'est pas encore formatée et initialisée alors saisissez le code suivant:
    
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
#define ALARM1{ \
+
#include <EEPROM.h>
   {NOTE_A4, 20},\
+
 
   {NOTE_C4, 20}}
+
void setup() {
 +
   Serial.begin( 9600 );
 +
  eepromConfiguration();
 +
}
 +
 
 +
void loop() {
 +
  delay( 10000 ); // Attendre 10 secondes
 +
}
 +
 
 +
/*
 +
* Formatter l'EEPROM
 +
*/
 +
void eepromConfiguration(){
 +
   
 +
  // Formatter l'EEPROM
 +
  for (int i = 0 ; i < EEPROM.length() ; i++)
 +
    EEPROM.write( i, 0 );
 +
  Serial.println( "EEPROM formatté !" );
 +
 
 +
  // Valeur par défaut pour savoir si l'EEPROM est formatté
 +
  EEPROM.write( 0, 255 );
 +
  Serial.println( "Valeur par défaut définie !" );
 +
 
 +
  // Définir une version
 +
  EEPROM.write( 1, 10 );
 +
  Serial.println( "Version définie !" );
 +
   
 +
  // Définir une luminosité
 +
   EEPROM.write( 2, 15 );
 +
  Serial.println( "Valeur par défaut pour la luminosité est définie !" );
 +
}
 
</syntaxhighlight>
 
</syntaxhighlight>
   −
* La première colonne contient les notes a jouer
+
== Faire sonner le piezo buzzer ==
** La note (exemple: NOTE_A4) fait référence à un nombre entier se trouvant dans la bibliothèque ''pitches.h''. Cette bibliothèque provient du [https://github.com/nseidle/AxelF_DoorBell/blob/master/pitches.h GitHub de nseidle].
+
 
{{ambox | text = Pour plus de précisons sur le fonctionnement de ''pitches.h'', visitez le [https://github.com/nseidle/AxelF_DoorBell/wiki/How-to-convert-sheet-music-into-an-Arduino-Sketch wiki de nseidle] (en anglais).}}
+
Pour produire un son avec un piezo buzzer, c'est assez simple avec l'outil '''tone'''.
* La deuxièmre colonne contient la durée de chaques notes en milisecondes
+
 
 +
* Emettre un son : '''tone( PIN_BUZZER, FREQUENCE );'''
 +
* Arrêter le son : '''noTone( PIN_BUZZER );'''
 +
<syntaxhighlight lang="c">
 +
#define PIEZO_BUZZER 13
   −
=== Comment convertir une musique en mélodie ? ===
+
void setup() {
 +
  pinMode( PIEZO_BUZZER, OUTPUT );
 +
}
   −
Malheureusement, nous avons pas trouvé un outil capable de convertir une musique (en entière) en mélodie polyphonique.
+
void loop() {
 +
  // Emettre un son de fréquence 2000
 +
  tone( PIEZO_BUZZER, 2000 );
 +
  delay( 1000 ); // Atendre 1 secondes
 +
 
 +
  // Emettre un son de fréquence 2000
 +
  tone( PIEZO_BUZZER, 1000 );
 +
  delay( 1000 );
   −
+
  // Ne plus émettre de son
 +
  noTone( PIEZO_BUZZER );
 +
  delay( 3000 );
 +
}
 +
</syntaxhighlight>
    
{{Mon-Reveil-TRAILER}}
 
{{Mon-Reveil-TRAILER}}

Menu de navigation