MTradioButton: Exemple 1

Ce programme va simuler un choix MW-LW-FM. On choisit la gamme par des boutons câblés sur A0, A1, et A2. La console nous indique les changements

Ici, on a trois boutons, on va les déclarer simplement et on fera 3 déclarations complètes.

Les boutons

On va commencer par donner des noms symboliques aux broches utilisées. Ici, il y en a trois, une pour chaque bouton:

const uint8_t PIN_BUTTON_MW = A0; // Bouton câblé entre GND et A0
const uint8_t PIN_BUTTON_LW = A1; // Bouton câblé entre GND et A1
const uint8_t PIN_BUTTON_FM = A2; // Bouton câblé entre GND et A2

Définissons notre premier bouton:

On a trois boutons, quand on appuie sur l'un d'eux cela désactive les deux autres. On va donc utiliser la classe MTradioButton:

MTradioButton BoutonMW( ...

Quand on appuie sur le bouton, on va écrire la phrase "On vient de choisir MW" Quand un autre bouton s'active on écrira la phrase "On vient d'annuler MW". Pour écrire ces deux phrases, on va utiliser deux fonctions qui seront appelées, l'une lors de l'activation du bouton, l'autre lors de sa désactivation. On donne donc le nom de ces deux fonctions:

MTradioButton BoutonMW( ... choixMW, choixMWfini, ... );

On va aussi régulièrement (par exemple toutes les deux secondes) afficher quelle gamme est choisie. Pour cela il va falloir utiliser la fonction globale getMTradioButtonValeur() qui va retourner la "valeur" du bouton sélectionné. Il faut donc que chaque bouton ait une valeur différente. Il faut donc spécifier ce paramètre. Le paramètre juste avant ne peut donc être implicite, il faut aussi le préciser. C'est l'état de repos du bouton. Si on a câblé le bouton entre A0 et GND, par défaut, l'entrée sera HIGH à cause de la résistance de rappel insérée automatiquement avec la déclaration HIGH:

MTradioButton BoutonMW( ... HIGH si_non_appuye, ... );

A été rajouté ici un mot commentaire si_non_appuye qui indique la raison du HIGH. Les mots commentaires de MTobjets sont ignorés par le compilateur. On les reconnaît car il y a la présence du caractère "_" au milieu et qu'ils ne commencent pas par "_".

On peut maintenant spécifier la valeur. On a trois boutons, les valeurs peuvent être 0, 1 et 2. Pour éviter de mettre un chiffre sans explication, on va utiliser la constante 0:

MTradioButton BoutonMW( ... RADIO_BUTTON_0);

La définition complète du bouton est donc:

MTradioButton BoutonMW(PIN_BUTTON_MW, choixMW, choixMWfini, HIGH si_non_appuye, RADIO_BUTTON_0);

On va maintenant définir les deux fonction qui vont afficher les deux messages:

void choixMW(void)
{
  Serial.println("On vient de choisir MW");
}

void choixMWfini(void)
{
  Serial.println("On vient d'annuler MW");
}

Pas plus de commentaires avec des noms explicites. Notez que l'on peut définir ces deux fonctions dans l'ordre qui nous convient, mais il faut les mettre avant la définition du bouton car leur nom figure dans la définition du bouton.

Enfin, il faut comme dans tous les programmes qui utilisent MTobjets, inclure la bibliothèque utile. Ici on utilise comme seul objet un bouton radio (le nom de l'objet est MTradioButton):

#include "MTradioButton.h" // V1.0.0 Voir http://arduino.dansetrad.fr/MTobjects

Je conseille fortement de laisser le commentaire, si une autre personne voulait essayer le programme, elle aurait directement un lien de téléchargement. C'est valable pour toutes les bibliothèques que vous utilisez.

On va utiliser 3 boutons radios, la ligne ci dessus n'est à mettre qu'une fois seulement.

Deuxième bouton

Le code est semblable à celui du premier bouton, il suffit de remplacer les MW par LW et donner comme valeur 1 au lieu de 0:

void choixLW(void)
{
  Serial.println("On vient de choisir LW");
}

void choixLWfini(void)
{
  Serial.println("On vient d'annuler LW");
}

MTradioButton BoutonLW(PIN_BUTTON_LW, choixLW, choixLWfini, HIGH si_non_appuye, RADIO_BUTTON_1);

Troisième bouton

void choixFM(void)
{
  Serial.println("On vient de choisir FM");
}

void choixFMfini(void)
{
  Serial.println("On vient d'annuler FM");
}

MTradioButton BoutonLW(PIN_BUTTON_FM, choixFM, choixLWfini, HIGH si_non_appuye, RADIO_BUTTON_2);

setup()

Comme on écrit sur la console, il faut l'initialiser:

void setup()
{
  Serial.begin(115200);
  ...

Quand le programme va démarrer, aucun bouton n'est sélectionné. La fonction getMTradioButtonValeur() qui doit nous donner la valeur du bouton va donc retourner 128 qui correspond à "aucun bouton actif". Il faudrait alors regarder la valeur retournée par cette fonction et afficher "aucun bouton sélectionné" si on a 128, sinon on affiche le numéro du bouton. L'autre solution, qui correspond plus à la réalité est de présélectionner un bouton, par exemple le MW:

void setup()
{
  ...
  BoutonMW.select();
  ...

Un petit problème se pose, le bouton peut être pris en compte avec un délai 16ms. Cette sélection peut donc être prise trop tard, car un court instant après loop va nous afficher qu'aucun bouton n'est actif. Il faut donc attendre un peu, on peut dans loop attendre et afficher au lieu de faire l'inverse, ou attendre 16ms dans le setup. Choisissons cette solution:

void setup()
{
  ...
  BoutonMW.select();
  delay(16);
}

loop()

Dans loop(), nous allons afficher la gamme choisie. Pour cela, la fonction globale getMTradioButtonValeur() nous retourne la valeur du bouton actif. Si on ne précise rien, c'est le bouton du groupe 0 qui compte. Comme nous n'avons pas non plus spécifié le groupe lors de la définition des boutons, ils appartiennent tous au groupe 0. On n'a donc pas besoin de spécifier ce paramètre. Comme nous avons choisi des valeurs 0, 1 ou 2, il suffit de transformer ce nombre en chaîne de caractères:

String noms[3] = {"MW", "LW", "FM"};

void loop()
{
  ...
  noms[getMTradioButtonValeur()] // MW, LW ou FM
  ...
}

Il suffit d'afficher cette chaîne. Bien entendu, il va falloir ralentir l'affichage pour que cela ne défile pas trop vite. On peut par exemple rajouter un petit delay(2000 milli_secondes);. Notez au passage que le delay ne gêne pas du tout la prise en compte des boutons. Si on appuie sur plusieurs boutons pendant ce temps, on observera qu'ils sont tous pris en compte grâce aux phrases d'activation et de désactivations. Cela donne finalement pour loop:

String noms[3] = {"MW", "LW", "FM"};

void loop()
{
  Serial.print("La gamme actuelle est ");
  Serial.println(noms[getMTradioButtonValeur()]); // Affiche le nom du bouton sélectionné
  delay(2000); // Pour avoir un affichage qui ne défile pas trop vite
}

Programme complet

Voici donc le programme complet:

// Ce programme va simuler un choix MW-LW-FM. On choisit la gamme par des
// boutons câblés sur A0, A1, et A2. La console nous indique les changements 

#include "MTradioButton.h" // V1.0.0 Voir http://arduino.dansetrad.fr/MTobjects

const uint8_t PIN_BUTTON_MW = A0; // Bouton câblé entre GND et A0
const uint8_t PIN_BUTTON_LW = A1; // Bouton câblé entre GND et A1
const uint8_t PIN_BUTTON_FM = A2; // Bouton câblé entre GND et A2


//Définition du bouton MW
void choixMW(void)
{
  Serial.println("On vient de choisir MW");
}

void choixMWfini(void)
{
  Serial.println("On vient d'annuler MW");
}

MTradioButton BoutonMW(PIN_BUTTON_MW, choixMW, choixMWfini, HIGH si_non_appuye, RADIO_BUTTON_0);



//Définition du bouton LW
void choixLW(void)
{
  Serial.println("On vient de choisir LW");
}

void choixLWfini(void)
{
  Serial.println("On vient d'annuler LW");
}

MTradioButton BoutonLW(PIN_BUTTON_LW, choixLW, choixLWfini, HIGH si_non_appuye, RADIO_BUTTON_1);



//Définition du bouton FM
void choixFM(void)
{
  Serial.println("On vient de choisir FM");
}

void choixFMfini(void)
{
  Serial.println("On vient d'annuler FM");
}

MTradioButton BoutonFM(PIN_BUTTON_FM, choixFM, choixFMfini, HIGH si_non_appuye, RADIO_BUTTON_2);



void setup()
{
  Serial.begin(115200);
  BoutonMW.select(); // Pour qu'il y ait au moins une gamme sélectionnée
  delay(16); // Ainsi on est sûr que le bouton est sélectionné (retard possible de la prise en compte 16ms)
}


String noms[3] = {"MW", "LW", "FM"};

void loop()
{
  Serial.print("La gamme actuelle est ");
  Serial.println(noms[getMTradioButtonValeur()]); // Affiche le nom du bouton sélectionné
  delay(2000); // Pour avoir un affichage qui ne défile pas trop vite
}