Différences entre versions de « Mon-Reveil-Programmer »

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche
Ligne 81 : Ligne 81 :
 
* '''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'' qui doit se trouver dans la racine de votre projet.
  
{{ambox | text = Il est important d'activer la résistance PULLUP sur le microcontrôlleur pour éviter de le sur alimenter}}
+
== Setup ==
 
 
== blah ==
 
  
 
<syntaxhighlight lang="c">
 
<syntaxhighlight lang="c">
Ligne 90 : Ligne 88 :
 
  */
 
  */
 
void setup() {
 
void setup() {
 
 
  // Communication RS232
 
  Serial.begin( 9600 );
 
  
  // EXEMPLE SERVO
+
}
  monServo.attach(  SERVO_MOTEUR );
+
</syntaxhighlight>
 
 
  // Initialisation des boutons
 
  pinMode( BOUTON_OK, INPUT_PULLUP );
 
  pinMode( BOUTON_MOINS, INPUT_PULLUP );
 
  pinMode( BOUTON_PLUS, INPUT_PULLUP );
 
  pinMode( BOUTON_LUMINOSITE, INPUT_PULLUP );
 
  pinMode( BOUTON_ALARME_CONTROLE, INPUT_PULLUP );
 
  pinMode( BOUTON_SNOOZE, INPUT_PULLUP );
 
  for( int i=0 ; i<NBRALARMES ; i++ )
 
    pinMode( BOUTON_ALARME[i], INPUT_PULLUP );
 
  
  // Initialisation des leds et du piezo
+
Dans le setup se trouvent différentes routines :
  pinMode( LED_BOUTON_OK, OUTPUT );
 
  pinMode( LED_BOUTON_SNOOZE, OUTPUT );
 
  pinMode( PIEZO_BUZZER, OUTPUT );
 
 
 
  // Addresse I2C des afficheurs
 
  afficheurs.begin( 0x70 );
 
  
  // Démarrer le lien avec l'RTC en I2C
+
* 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.
  rtc.begin();
+
<syntaxhighlight lang="c">
 
+
Serial.begin( 9600 );
  // Configuration de l'heure par l'utilisateur si ce n'a pas été encore fait
+
</syntaxhighlight>
  if ( !rtc.isrunning() ){
 
    int h = 0;
 
    int m = 0;
 
    changerHeureVisuel( &h, &m );
 
    rtc.adjust( DateTime(2018, 2, 20, h, m, 0) ); // Change l'heure de l'RTC
 
  }
 
  
   // 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
+
* Configuration des broches des boutons pour qu'elles se comportent comme des entrées.
  if( EEPROM.read(0) != 255 || EEPROM.read(1) != VERSION )
+
<syntaxhighlight lang="c">
    eepromConfiguration();
+
// Initialisation des boutons
 
+
pinMode( BOUTON_OK, INPUT_PULLUP );
  // Définir la luminosité des afficheurs
+
pinMode( BOUTON_MOINS, INPUT_PULLUP );
  afficheurs.setBrightness( EEPROM.read(2) );
+
pinMode( BOUTON_PLUS, INPUT_PULLUP );
 
+
pinMode( BOUTON_LUMINOSITE, INPUT_PULLUP );
 
+
pinMode( BOUTON_ALARME_CONTROLE, INPUT_PULLUP );
 +
pinMode( BOUTON_SNOOZE, INPUT_PULLUP );
 +
// Boucles pour les broches utilisées pour activer/désactiver les alarmes
 +
for( int i=0 ; i<NBRALARMES ; i++ )
 +
   pinMode( BOUTON_ALARME[i], INPUT_PULLUP );
 +
</syntaxhighlight>
 +
{{ambox | text = Il est important d'activer la résistance PULLUP sur le microcontrôlleur 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.
 +
<syntaxhighlight lang="c">
 +
// Initialisation des leds et du piezo
 +
pinMode( LED_BOUTON_OK, OUTPUT );
 +
pinMode( LED_BOUTON_SNOOZE, OUTPUT );
 +
pinMode( PIEZO_BUZZER, OUTPUT );
 +
</syntaxhighlight>
 +
* Démarrer la connection I2C avec l'afficheur en lui insérant une addresse (0x70 par défaut)
 +
<syntaxhighlight lang="c">
 +
// Addresse I2C des afficheurs
 +
afficheurs.begin( 0x70 );
 +
</syntaxhighlight>
 +
* Démarrer la connection I2C avec l'RTC
 +
<syntaxhighlight lang="c">
 +
// Démarrer le lien avec l'RTC en I2C
 +
rtc.begin();
 +
</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.
 +
<syntaxhighlight lang="c">
 +
// Configuration de l'heure par l'utilisateur si ce n'a pas été encore fait
 +
if ( !rtc.isrunning() ){
 +
  int h = 0;
 +
  int m = 0;
 +
  changerHeureVisuel( &h, &m );
 +
  rtc.adjust( DateTime(2018, 2, 20, h, m, 0) ); // Change l'heure de l'RTC
 +
}
 +
</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
 +
<syntaxhighlight lang="c">
 +
if( EEPROM.read(0) != 255 || EEPROM.read(1) != VERSION )
 +
  eepromConfiguration();
 +
</syntaxhighlight>
 +
* Définir la luminosité par rapport à la luminosité enregistré dans l'EEPROM
 +
<syntaxhighlight lang="c">
 +
// Définir la luminosité des afficheurs
 +
afficheurs.setBrightness( EEPROM.read(2) );
 +
</syntaxhighlight>
 +
* Copier les alarmes enregistré dans l'EEPROM dans la structure du programme
 +
<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();

Version du 13 mars 2018 à 11:33


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Si vous désirez obtenir le code complet directement, cliquez ici

Environnement de travail

Dans ce tutoriel, nous travaillons sur l'environnement d'ArduinoIDE. Si vous ne l'avez pas encore installé, vous pouvez le télécharger ici.

Passons au vif du sujet.

  • Premièrement télécharger le fichier compressé du réveil, se trouvant ici.
  • Décompressé le fichier zip.
  • Dans le dossier "Mon Reveil", ajoutez-y les fichiers Adafruit_LEDBackpack.h et Adafruit_LEDBackpack.cpp (disponible ici).
  • Ouvrez le projet sur ArduinoIDE :
  Menu -> Ouvrir -> "où_le_fichier_décompressé_est/Mon-Reveil-1-master/Mon-Reveil/Mon-Reveil.ino"

640px
Contenu du projet - cliquez pour agrandir

Explication du code

Pour mieux comprendre le code, je vais vous expliquez chaque parties du code ainsi que les différentes procédures à suivre.

Les inclusions de bibliothèques

#include "Adafruit_LEDBackpack.h" // Afficheurs
#include <RTClib.h>               // RTC
#include <EEPROM.h>               // Mémoire non-volatile pour stocker les paramètres
#include "pitches.h"              // Notes de musique
#include "melodies.h"             // Playlists de musiques
  • 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

Définir la position des boutons, des leds et du buzzer

Ci-dessous, se trouve l'ensemble des entrées des boutons et piezzo buzzer.

// Boutons Piggrl
#define BOUTON_ALARME_CONTROLE 2 // Digitale
#define BOUTON_PLUS            3 // Digitale
#define BOUTON_MOINS           4 // Digitale
#define BOUTON_LUMINOSITE      5 // Digitale

// Boutons Arcade
#define BOUTON_OK             14 // Analogue 0
#define BOUTON_SNOOZE         15 // Analogue 1
#define LED_BOUTON_OK         16 // Analogue 2
#define LED_BOUTON_SNOOZE     17 // Analogue 3

// Piezzo Buzzer
#define PIEZO_BUZZER          13 // Digitale

Personnaliser les paramètres par défaut

Il est possible de personnaliser les paramètres par défaut des alarmes.

// ================================================
// =============== Personnalisation ===============
// ================================================
const int SNOOZE_ATTENTE     = 10;               // Durant combien de temps l'utilisateur va t'il encore dormir ? (en secondes)
const int DUREE_ALARME       = 20;               // Durant combien de temps l'alarme va t'elle sonner (en secondes) 
const int BOUTON_ALARME[]    = {8, 7, 9, 10};    // Quelles pins pour activer/désactiver chaques alarmes
const float VITESSE_LECTURE  = 1;                // Vitesse sonore des alarmes (par défaut 1)
const int MELODIE[][ 2 ]     = MARIO;            // Sélectionner la musique que vous désirez pour vos alarmes (voir melodies.h)
// ================================================
  • SNOOZE_ATTENTE permet de définir combien de secondes le snooze va encore attendre avant de se remettre à sonner.
  • DUREE_ALARME permet de définir combien de secondes les alarmes vont sonner.
  • 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.
  • 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.

Setup

/*
 *  Configuration avant lancement de la routine
 */
void setup() {

}

Dans le setup se trouvent différentes routines :

  • 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.
Serial.begin( 9600 );
  • Configuration des broches des boutons pour qu'elles se comportent comme des entrées.
// Initialisation des boutons
pinMode( BOUTON_OK, INPUT_PULLUP );
pinMode( BOUTON_MOINS, INPUT_PULLUP );
pinMode( BOUTON_PLUS, INPUT_PULLUP );
pinMode( BOUTON_LUMINOSITE, INPUT_PULLUP );
pinMode( BOUTON_ALARME_CONTROLE, INPUT_PULLUP );
pinMode( BOUTON_SNOOZE, INPUT_PULLUP );
// Boucles pour les broches utilisées pour activer/désactiver les alarmes
for( int i=0 ; i<NBRALARMES ; i++ )
  pinMode( BOUTON_ALARME[i], INPUT_PULLUP );
  • Configuration des broches des leds des boutons et du piezo buzzer pour qu'elles se comportent comme des sorties.
// Initialisation des leds et du piezo
pinMode( LED_BOUTON_OK, OUTPUT );
pinMode( LED_BOUTON_SNOOZE, OUTPUT );
pinMode( PIEZO_BUZZER, OUTPUT );
  • Démarrer la connection I2C avec l'afficheur en lui insérant une addresse (0x70 par défaut)
// Addresse I2C des afficheurs 
afficheurs.begin( 0x70 );
  • Démarrer la connection I2C avec l'RTC
// Démarrer le lien avec l'RTC en I2C
rtc.begin();
  • Réglage de l'heure si elle n'a pas encore été initialisé dans l'RTC ou si elle n'est plus présente.
// Configuration de l'heure par l'utilisateur si ce n'a pas été encore fait
if ( !rtc.isrunning() ){
  int h = 0;
  int m = 0;
  changerHeureVisuel( &h, &m );
  rtc.adjust( DateTime(2018, 2, 20, h, m, 0) ); // Change l'heure de l'RTC 
}
  • 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
if( EEPROM.read(0) != 255 || EEPROM.read(1) != VERSION )
  eepromConfiguration();
  • Définir la luminosité par rapport à la luminosité enregistré dans l'EEPROM
// Définir la luminosité des afficheurs
afficheurs.setBrightness( EEPROM.read(2) );
  • Copier les alarmes enregistré dans l'EEPROM dans la structure du programme
  
  // Configuration des dates/heures sur les alarmes
  DateTime maintenant = rtc.now();
  int j = 0;
  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].programme = EEPROM.read(i+2);
    j++;
  }
}

Créer votre mélodie

Il est possible d'ajouter facilement une mélodie à la bibliothèque melodie.h.

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.

A quoi sert l'antislash ?

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) :

#define ALARM1{  \
  {NOTE_A4,  20},\
  {NOTE_C4,  20}}

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.

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.

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.

Que contiennent les define ?

Le define est un tableau 2 dimensions contenant des nombres entiers (int).

#define ALARM1{  \
  {NOTE_A4,  20},\
  {NOTE_C4,  20}}
  • La première colonne contient les notes a jouer
    • 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 GitHub de nseidle.
  • La deuxièmre colonne contient la durée de chaques notes en milisecondes

Comment convertir une musique en mélodie ?

Malheureusement, nous avons pas trouvé un outil capable de convertir une musique (en entière) en mélodie polyphonique.



Créé par Stefan pour MCHobby.be

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.