Ligne 1 : |
Ligne 1 : |
| {{Mon-Reveil-NAV}} | | {{Mon-Reveil-NAV}} |
| + | |
| + | == Introduction == |
| + | Cette partie du tutoriel reprend le chargement du code du réveil... et s'attarde sur les éléments principaux du code. |
| | | |
| == Environnement de travail == | | == Environnement de travail == |
| + | Vous pouvez obtenir la totalité du code sur le lien suivant: |
| | | |
− | '''Si vous désirez obtenir le code complet, cliquez [https://github.com/mchobby/Mon-Reveil-1/archive/master.zip ici]''' | + | {{download-box|Télécharger l'intégralité du code|https://github.com/mchobby/Mon-Reveil-1/archive/master.zip}} |
| | | |
− | {{ambox | text = N'hésitez pas à [[Mon-Reveil-Tester|tester]] vos connectiques si ce n'a pas été encore réalisé !}}
| + | Si se n'a pas été encore fait, pensez à [[Mon-Reveil-Tester|tester vos connectiques]] avec le programme de test! |
| | | |
− | ''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].''
| + | 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]. |
| | | |
− | Passon au vif du sujet.
| + | Passons au vif du sujet: |
| + | * Il faut installer le bibliothèque de [[Mon-Reveil-Lib|l'afficheur 4x7 segments]] |
| + | * Il faut télécharger les sources du projet [https://github.com/mchobby/Mon-Reveil-1/archive/master.zip ici]. |
| + | * 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 : |
| | | |
− | * Premièrement télécharger le projet [https://github.com/mchobby/Mon-Reveil-1/archive/master.zip ici].
| + | Menu -> Ouvrir -> "../Mon-Reveil-1-master/Mon-Reveil/Mon-Reveil.ino" |
− | * Décompressé le fichier zip.
| |
− | * 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]).
| |
− | * Ouvrez le projet sur ArduinoIDE :
| |
| | | |
− | Menu -> Ouvrir -> "../Mon-Reveil-1-master/Mon-Reveil/Mon-Reveil.ino"
| + | [[Fichier:Mon-Reveil-60b.jpg]]<small><br />''Contenu du projet - cliquez pour agrandir''</small> |
| | | |
− | [[Fichier:Mon-Reveil-60.jpg|640px]]<small><br />''Contenu du projet - cliquez pour agrandir''</small>
| + | == L'entête du programme == |
| | | |
− | == Entête ==
| + | Dans l'entête se trouvent l'ensemble des variables globales et autres éléments utiles. |
− | | |
− | Dans l'entête se trouvent l'ensemble des variables globales. | |
| | | |
| === 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 | + | Il est nécessaire d'ajouter ces bibliothèques pour le bon fonctionnement du code. |
| | | |
| <syntaxhighlight lang="c"> | | <syntaxhighlight lang="c"> |
Ligne 36 : |
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 les broches utilisés === | | === Définir les broches utilisés === |
Ligne 62 : |
Ligne 65 : |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | {{ambox | text = Les boutons d'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 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 80 : |
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. |
| | | |
| === Port série === | | === Port série === |
− | Ouverture du port série et définition du débit de données à 9600 bps pour permettre la communication entre un arduino et un ordinateur via usb. | + | 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> |
| | | |
− | === Entrées === | + | === Les entrées === |
− | Configuration des broches des boutons pour qu'elles se comportent comme des entrées. | + | Configuration des broches en entrées (pour les boutons). |
| <syntaxhighlight lang="c"> | | <syntaxhighlight lang="c"> |
| // Initialisation des boutons | | // Initialisation des boutons |
Ligne 106 : |
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-stop | 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.}} |
| | | |
− | === Sorties === | + | === Les sorties === |
− | Configuration des broches des leds des boutons et du piezo buzzer pour qu'elles se comportent comme des 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 121 : |
Ligne 128 : |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | === Afficheur === | + | === Initialiser l'afficheur === |
− | Démarrer la connection I2C avec l'afficheur en lui insérant une adresse (0x70 par défaut).
| + | 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> |
| | | |
| === RTC === | | === RTC === |
− | Démarrer la connection I2C avec le RTC
| + | Initialisation de l'horloge RTC I2C. |
| <syntaxhighlight lang="c"> | | <syntaxhighlight lang="c"> |
| // Démarrer le lien avec le RTC en I2C | | // Démarrer le lien avec le RTC en I2C |
Ligne 135 : |
Ligne 141 : |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | Réglage de l'heure si elle n'a pas encore été initialisé dans le RTC ou si elle n'est plus présente dans le 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 146 : |
Ligne 152 : |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | === EEPROM === | + | === EEPROM-Setup === |
− | L'EEPROM est formatté automatiquement si le fanion n'est pas égale à 255 ou si la version dans l'EEPROM n'est pas égale à la version du code pour éviter tout soucis de comptabilité. | + | 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é). |
| | | |
− | ''La valeur du fanion a été choisie aléatoirement.''
| |
| <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> |
| + | {{ambox | text = La valeur du fanion (magic key) à été choisie par le développer.}} |
| | | |
| === Luminosité === | | === Luminosité === |
− | Changer la luminosité des afficheurs par rapport à la luminosité enregistré dans l'EEPROM. | + | 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 |
Ligne 163 : |
Ligne 169 : |
| | | |
| === Initialisation des variables des alarmes === | | === Initialisation des variables des alarmes === |
− | Copier les données des alarmes enregistrées venant de l'EEPROM vers la structure des alarmes se trouvant dans le programme. | + | Copier les heures des alarmes enregistrées dans l'EEPROM vers la structure de données des alarmes en mémoire. |
| <syntaxhighlight lang="c"> | | <syntaxhighlight lang="c"> |
| // Configuration des dates/heures sur les alarmes | | // Configuration des dates/heures sur les alarmes |
Ligne 177 : |
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 ? |
| + | |
| + | Pour plus d'informations logiques, voir [[Mon-Reveil-Programmer#EEPROM|ici]]. |
| | | |
− | Dans la routine, différentes tâches tournent en boucle pour permettre au code de faire tourner l'ensemble des fonctions nécessaire.
| + | == 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. |
| | | |
− | Voici la routine au complet, les commentaires sont explicite à la compréhension. | + | Voici la fonction complète, les commentaires décrivent le fonctionnement. |
| | | |
| <syntaxhighlight lang="c"> | | <syntaxhighlight lang="c"> |
Ligne 223 : |
Ligne 242 : |
| Voir un [[ADF-LED-BACKPACK-I2C-Adresse|ancien wiki]]. | | Voir un [[ADF-LED-BACKPACK-I2C-Adresse|ancien wiki]]. |
| | | |
− | Ci-dessous, je vous propose une démo. | + | Ci-dessous, nous vous proposons un petit exemple démontrant l'usage de l'afficheur 4x7 segments. |
| <syntaxhighlight lang="c"> | | <syntaxhighlight lang="c"> |
| #include "Adafruit_LEDBackpack.h" | | #include "Adafruit_LEDBackpack.h" |
Ligne 279 : |
Ligne 298 : |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | === Fonctions utiles pour l'afficheur === | + | === Fonctions utilitaires d'affichage === |
| + | Les 2 fonctions ci-dessous permettent d'afficher facilement l'heure et les minutes. |
| | | |
− | Ces 2 fonctions permettent d'afficher facilement les heures et les minutes. Elles permettent aussi de ne rien afficher (affichageNombre = false).
| + | Elles permettent aussi de ne rien afficher (affichageNombre = false). |
| | | |
| <syntaxhighlight lang="c"> | | <syntaxhighlight lang="c"> |
Ligne 319 : |
Ligne 339 : |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | == Fonctions utiles == | + | == Fonctions utilitaires générales == |
| | | |
| '''Fonction qui vérifie si un bouton est appuyé.''' | | '''Fonction qui vérifie si un bouton est appuyé.''' |
Ligne 337 : |
Ligne 357 : |
| } | | } |
| </syntaxhighlight> | | </syntaxhighlight> |
− |
| |
− | <syntaxhighlight lang="c">
| |
| | | |
| '''Fonction qui vérfie si la seconde est passée.''' | | '''Fonction qui vérfie si la seconde est passée.''' |
| | | |
− | Elle compare le temps précédent (ms) et le temps maintenant. | + | 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. | | Si ok, on vérifie si on peut changer la valeur précédente à maintenant. |
| | | |
Ligne 360 : |
Ligne 378 : |
| | | |
| == EEPROM == | | == 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. |
| | | |
− | La mémoire EEPROM (Electrically-Erasable Programmable Read-Only Memory) est une mémoire 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é. |
− | | |
− | Cette mémoire a pour potentiel, de stocker des données même lorsque l'Arduino n'est plus alimenté. | |
| | | |
| === Contenu de l'EEPROM === | | === Contenu de l'EEPROM === |
− | L'EEPROM de l'arduino UNO est capable d'enregistrer 1024 octets, ce qui offre 1024 entrées de données en 8bits ! | + | 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 378 : |
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 416 : |
Ligne 433 : |
| | align="center" | ... | | | align="center" | ... |
| |} | | |} |
| + | |
| + | 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. |
| | | |
| === Lecture / Ecriture dans l'EEPROM === | | === Lecture / Ecriture dans l'EEPROM === |
Ligne 438 : |
Ligne 459 : |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | === Fromattage de l'EEPROM === | + | === 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 se faire, une fonction existe dans le croquis de "Test" (celui qui teste les boutons). |
| | | |
− | Il est important que cette EEPROM soit formattée avant toute utilisation. Pour se faire, une fonction existe dans la version test. Normalement, si vous avez effectué le [[Mon-Reveil-Tester|test des boutons]], l'EEPROM doit être déjà pré-formatté.
| + | Normalement, si vous avez exécutez le [[Mon-Reveil-Tester|test des boutons]] alors l'EEPROM est déjà pré-formatté. |
| | | |
− | Si le formattage de l'EEPROM n'a pas été effectué, téléversez ce code : | + | Si l'EEPROM n'est pas encore formatée et initialisée alors saisissez le code suivant: |
| | | |
| <syntaxhighlight lang="c"> | | <syntaxhighlight lang="c"> |