CheckZone

Définition Utilisation Exemple Côté technique
 

3 Boutons CheckZone Voir CheckZone: Exemple-920-CheckZone-3-onSelectFunction.ino
3 fonctions externes Voir CheckZone: Exemple-920-CheckZone-3-onSelectFunction.ino
1 fonction externe indiférenciée Voir CheckZone: Exemple-921-CheckZone-1-onSelectFunction.ino
1 fonction tri sur l'ordonnée Voir CheckZone: Exemple-922-CheckZone-Suivant-ordonnee.ino
loop() fait le travail Voir CheckZone: Exemple-923-CheckZone-loop.ino
loop() fait le travail, avec mémorisation Voir CheckZone: Exemple-924-CheckZone-Memoire.ino
Pour se détendre, utilisation de CheckZone Voir CheckZone: Exemple-925-Maison-CheckZone.ino

 


 

Dans les exemples qui suivent trois boutons sont placées à droite de l'écran. Leur définition est statique, on peut aussi les passere en dynamiques, cela ne change rien. Il y a plusieurs implantations possibles pour lire l'état des boutons et l'afficher. J'en montre ici 5, il y en a d'autres, par exemple par la lecture de la liste des contrôles. Le programme affiche l'état des boutons.

Premier exemple: 3 fonctions externes

PecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-920-CheckZone-3-onSelectFunction\Exemple-920-CheckZone-3-onSelectFunction.ino (dans votre fichier téléchargé):

// Mise em place de 3 boutons de type CheckZone (zone à cocher, pas de dessin
// dans le bouton). Quand on appuie sur un bouton, un disque blanc montre son
// activité

// Version 1:
// - Les boutons ont une définition statique
// - Utilise onSelectFunction pour exécuter l'action à faire
// - Une action différente pour chaque bouton

#include <PecheuxGraph.h> // Appel de la bibliothèque 


// Déclaration statique des instances, doit se faire en dehors du setup
// Dans ce cas les boutons sont accessibles partout
CheckZone boutonHaut(200,40,240,80); // Bouton en haut
CheckZone boutonCentre(200,100,240,140); // Bouton au centre
CheckZone boutonBas(200,160,240,200); // Bouton en bas


// Déclaration de 3 fonctions, une par bouton, qui feront ce qu'il faut
// faire à chaque changement
// Ces fonctions ne doivent pas avoir de paramètres et ne doit rien retourner
// Les noms peuvent être quelconques
void onSelectActionHaut() // Action à faire quand on appuie sur le bouton du haut
{
  if (boutonHaut.isSelected()) fillCircle(100,60,20,WHITE);
  else fillCircle(100,60,20,BLACK);
}


void onSelectActionCentre() // Action à faire quand on appuie sur le bouton du centre
{
  if (boutonCentre.isSelected()) fillCircle(100,120,20,WHITE);
  else fillCircle(100,120,20,BLACK);
}


void onSelectActionBas() // Action à faire quand on appuie sur le bouton du bas
{
  if (boutonBas.isSelected()) fillCircle(100,180,20,WHITE);
  else fillCircle(100,180,20,BLACK);
}


void setup()
{
  setGraphMode(PAYSAGE); // Initialisation de la carte
  rect(200,40,240,80,GREEN); // Carré du haut
  rect(200,100,240,140,GREEN); // Carré au centre de l'écran
  rect(200,160,240,200,GREEN); // Carré du bas
  text(F("Appuyez sur un carré"));
  
  boutonHaut.onSelectFunction=&onSelectActionHaut; // Fonction appelée si on active le bouton du haut de l'écran
  boutonCentre.onSelectFunction=&onSelectActionCentre; // Fonction appelée si on active le bouton au milieu de l'écran
  boutonBas.onSelectFunction=&onSelectActionBas; // Fonction appelée si on active le bouton en bas de l'écran
  boutonHaut.onUnselectFunction=&onSelectActionHaut; // Fonction appelée si on désactive le bouton du haut de l'écran
  boutonCentre.onUnselectFunction=&onSelectActionCentre; // Fonction appelée si on désactive le bouton au milieu de l'écran
  boutonBas.onUnselectFunction=&onSelectActionBas; // Fonction appelée si on désactive le bouton en bas de l'écran
}


void loop() 
{
  scanEvent(); // Gestion des boutons et des horloges, le plus souvent seul dans le loop
}

Deuxième exemple: 1 fonction externe indiférenciée

PecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-921-CheckZone-1-onSelectFunction\Exemple-921-CheckZone-1-onSelectFunction.ino (dans votre fichier téléchargé):

// Mise em place de 3 bouton de type CheckZone (zone à cocher, pas de dessin
// dans le bouton). Quand on appuie sur un bouton, un disque blanc montre son
// activité

// Version 2:
// - Les boutons ont une définition statique
// - Utilise onSelectFunction pour exécuter l'action à faire
// - Une seule action pour les trois boutons, qui ne fait pas de différence entre les boutons

#include <PecheuxGraph.h> // Appel de la bibliothèque 


// Déclaration statique des instances, doit se faire en dehors du setup
// Dans ce cas les boutons sont accessibles partout
CheckZone boutonHaut(200,40,240,80); // Bouton en haut
CheckZone boutonCentre(200,100,240,140); // Bouton au centre
CheckZone boutonBas(200,160,240,200); // Bouton en bas


// Déclaration d'une fonction qui fera ce qu'il faut faire à chaque changement
// Cette fonction ne doit pas avoir de paramètres et ne doit rien retourner
// Le nom peut être quelconque
void onSelectAction() // Action à faire quand on appuie sur un bouton
{
  if (boutonHaut.isSelected()) fillCircle(100,60,20,WHITE); // On s'occupe du premier bouton
    else fillCircle(100,60,20,BLACK);
  if (boutonCentre.isSelected()) fillCircle(100,120,20,WHITE); // Puis du deuxème
    else fillCircle(100,120,20,BLACK);
  if (boutonBas.isSelected()) fillCircle(100,180,20,WHITE); // Puid du troisième
    else fillCircle(100,180,20,BLACK);
}


void setup()
{
  setGraphMode(PAYSAGE); // Initialisation de la carte
  rect(200,40,240,80,GREEN); // Carré du haut
  rect(200,100,240,140,GREEN); // Carré au centre de l'écran
  rect(200,160,240,200,GREEN); // Carré du bas
  text(F("Appuyez sur un carré"));
  
  // Ici j'utilise pour l'exemple la triple affectation. Au lieu d'écrire a=1; b=1; c=1; on peut
  // écrire a=b=c=1 Cela doit se lire j'affecte 1 à c, cette affectation prned la valeur 1 et c'est
  // cette valeur que j'afffecte à b. Cettenouvelle afectation retourne 1 que j'affecte à a.
  boutonHaut.onSelectFunction= // Fonction appelée si on active le bouton du haut de l'écran
  boutonCentre.onSelectFunction= // Fonction appelée si on active le bouton au milieu de l'écran
  boutonBas.onSelectFunction=&onSelectAction; // Fonction appelée si on active le bouton en bas de l'écran
  boutonHaut.onUnselectFunction= // Fonction appelée si on désactive le bouton du haut de l'écran
  boutonCentre.onUnselectFunction= // Fonction appelée si on désactive le bouton au milieu de l'écran
  boutonBas.onUnselectFunction=&onSelectAction; // Fonction appelée si on désactive le bouton en bas de l'écran
}


void loop() 
{
  scanEvent(); // Gestion des boutons et des horloges, le plus souvent seul dans le loop
}

Troisième exemple: 1 fonction tri sur l'ordonnée

PecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-922-CheckZone-Suivant-ordonnee\Exemple-922-CheckZone-Suivant-ordonnee.ino (dans votre fichier téléchargé):

// Mise em place de 3 bouton de type CheckZone (zone à cocher, pas de dessin
// dans le bouton). Quand on appuie sur un bouton, un disque blanc montre son
// activité

// Version 3:
// - Les boutons ont une définition statique
// - Utilise onSelectFunction pour exécuter l'action à faire
// - Une seule action pour les trois boutons, différence faites sur les coordonnées

#include <PecheuxGraph.h> // Appel de la bibliothèque 


// Déclaration statique des instances, doit se faire en dehors du setup
// Dans ce cas les boutons sont accessibles partout
CheckZone boutonHaut(200,40,240,80); // Bouton en haut
CheckZone boutonCentre(200,100,240,140); // Bouton au centre
CheckZone boutonBas(200,160,240,200); // Bouton en bas


// Déclaration d'une fonction qui fera ce qu'il faut faire à chaque changement
// Cette fonction ne doit pas avoir de paramètres et ne doit rien retourner
// Le nom peut être quelconque
void onSelectAction() // Action à faire quand on appuie sur un bouton
{
  int y=getTouchY();
  if (y<90) // On a touché sur le bouton du haut
  {
    if (boutonHaut.isSelected()) fillCircle(100,60,20,WHITE); // On s'occupe du premier bouton
    else fillCircle(100,60,20,BLACK);
  }
  else if (y>150) // On a touché sur le bouton du bas
  {
    if (boutonBas.isSelected()) fillCircle(100,180,20,WHITE); // Puid du troisième
    else fillCircle(100,180,20,BLACK);
  }
  else // on a donc forcément touché sur le bouton du milieu
  { // (Accolades inutiles pour le dernier cas)
    if (boutonCentre.isSelected()) fillCircle(100,120,20,WHITE); // Puis du deuxème
    else fillCircle(100,120,20,BLACK);
  }  
}


void setup()
{
  setGraphMode(PAYSAGE); // Initialisation de la carte
  rect(200,40,240,80,GREEN); // Carré du haut
  rect(200,100,240,140,GREEN); // Carré au centre de l'écran
  rect(200,160,240,200,GREEN); // Carré du bas
  text(F("Appuyez sur un carré"));
  
  boutonHaut.onSelectFunction=  // Fonction appelée si on active le bouton du haut de l'écran
  boutonCentre.onSelectFunction= // Fonction appelée si on active le bouton au milieu de l'écran
  boutonBas.onSelectFunction= // Fonction appelée si on active le bouton en bas de l'écran
  boutonHaut.onUnselectFunction= // Fonction appelée si on désactive le bouton du haut de l'écran
  boutonCentre.onUnselectFunction= // Fonction appelée si on désactive le bouton au milieu de l'écran
  boutonBas.onUnselectFunction=&onSelectAction; // Fonction appelée si on désactive le bouton en bas de l'écran
}


void loop() 
{
  scanEvent(); // Gestion des boutons et des horloges, le plus souvent seul dans le loop
}

Quatrième exemple: 3 boutons, loop() fait le travail

PecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-923-CheckZone-loop\Exemple-923-CheckZone-loop.ino (dans votre fichier téléchargé):

// Mise em place de 3 bouton de type CheckZone (zone à cocher, pas de dessin
// dans le bouton). Quand on appuie sur un bouton, un disque blanc montre son
// activité

// Version 4:
// - Les boutons ont une définition statique
// - Teste dans le loop sans utiliser onSelectFunction

#include <PecheuxGraph.h> // Appel de la bibliothèque 


// Déclaration statique des instances, doit se faire en dehors du setup
// Dans ce cas les boutons sont accessibles partout
CheckZone boutonHaut(200,40,240,80); // Bouton en haut
CheckZone boutonCentre(200,100,240,140); // Bouton au centre
CheckZone boutonBas(200,160,240,200); // Bouton en bas


void setup()
{
  setGraphMode(PAYSAGE); // Initialisation de la carte
  rect(200,40,240,80,GREEN); // Carré du haut
  rect(200,100,240,140,GREEN); // Carré au centre de l'écran
  rect(200,160,240,200,GREEN); // Carré du bas
  text(F("Appuyez sur un carré"));
  }


void loop() 
{
  scanEvent(); // Gestion des boutons et des horloges, d'habitude seul dans le loop


  // On va tester systématiquement l'état des boutons. Dans la vraie vie, on ne ferai le
  // test que si on en a besoin. Si c'est pour faire le test systématique, autant passer
  // par onSelectFunction. Ici c'est pour montrer que cela est possible.
  // Ici on surcharge beaucoup la boucle loop(), le dessin est fait systématiquement.
  // On manque des inforlmations rapides sur les boutons
  if (boutonHaut.isSelected()) fillCircle(100,60,20,WHITE); // On s'occupe du premier bouton
    else fillCircle(100,60,20,BLACK);
  
  if (boutonBas.isSelected()) fillCircle(100,180,20,WHITE); // Puis du troisième
    else fillCircle(100,180,20,BLACK);
  
  if (boutonCentre.isSelected()) fillCircle(100,120,20,WHITE); // Puis du deuxème
    else fillCircle(100,120,20,BLACK);
}

Cinquième exemple: 3 boutons, loop() fait le travail, avec mémorisation

PecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-924-CheckZone-Memoire\Exemple-924-CheckZone-Memoire.ino (dans votre fichier téléchargé):

// Mise em place de 3 bouton de type CheckZone (zone à cocher, pas de dessin
// dans le bouton). Quand on appuie sur un bouton, un disque blanc montre son
// activité

// Version 5:
// - Les boutons ont une définition statique
// - Teste dans le loop sans utiliser onSelectFunction
// - On mémorise les actions faites pour ne pas surcharger loop()

#include <PecheuxGraph.h> // Appel de la bibliothèque 


// Déclaration statique des instances, doit se faire en dehors du setup
// Dans ce cas les boutons sont accessibles partout
CheckZone boutonHaut(200,40,240,80); // Bouton en haut
CheckZone boutonCentre(200,100,240,140); // Bouton au centre
CheckZone boutonBas(200,160,240,200); // Bouton en bas


// Pour mémoriser les actions faites, on a recours à trois variables
// qui vont permettre de savoir si un bouton a changé
boolean ancienEtatBoutonHaut; // ancien état du bouton du haut
boolean ancienEtatBoutonCentre; // ancien état du bouton du centre
boolean ancienEtatBoutonBas; // ancien état du bouton du bas


void setup()
{
  setGraphMode(PAYSAGE); // Initialisation de la carte
  rect(200,40,240,80,GREEN); // Carré du haut
  rect(200,100,240,140,GREEN); // Carré au centre de l'écran
  rect(200,160,240,200,GREEN); // Carré du bas
  text(F("Appuyez sur un carré"));
  }


void loop() 
{
  scanEvent(); // Gestion des boutons et des horloges, d'habitude seul dans le loop

  // On va tester systématiquement l'état des boutons pour savoir si l'un d'eux a changé.
  // Si c'est le cas, on agit.
  // Ici on surcharge peu la boucle loop(), le dessin est fait que si nécessaire.
  if (boutonHaut.isSelected()!=ancienEtatBoutonHaut)
  { // Le bouton haut a changé d'état, on le redessine
    if (boutonHaut.isSelected()) fillCircle(100,60,20,WHITE); // On s'occupe du premier bouton
    else fillCircle(100,60,20,BLACK);
    ancienEtatBoutonHaut=boutonHaut.isSelected(); // Et on met à jour la mémoire
  }
  
  if (boutonCentre.isSelected()!=ancienEtatBoutonCentre)
  { // Le bouton du centre a changé d'état, on le redessine
    if (boutonCentre.isSelected()) fillCircle(100,120,20,WHITE); // Puid du troisième
    else fillCircle(100,120,20,BLACK);
    ancienEtatBoutonCentre=boutonCentre.isSelected(); // Et on met à jour la mémoire
  }
  
  if (boutonBas.isSelected()!=ancienEtatBoutonBas)
  { // Le bouton bas a changé d'état, on le redessine
    if (boutonBas.isSelected()) fillCircle(100,180,20,WHITE); // Puis du deuxème
    else fillCircle(100,180,20,BLACK);
    ancienEtatBoutonBas=boutonBas.isSelected(); // Et on met à jour la mémoire
  }
}

Sixième exemple: 3 boutons, 3 fonctions externes

PecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-925-Maison-CheckZone\Exemple-925-Maison-CheckZone.ino (dans votre fichier téléchargé):

// L'intérieur d'une maison est dessinée. Deux boutons de type CheckZone 
// permettent d'allumer la lumière. Ce sont des va et vient (boutons à 2
// positions comme les cases à cocher)

#include <PecheuxGraph.h>

// Déclaration statique des instances, doit se faire en dehors du setup
// Dans ce cas les boutons sont accessibles partout
CheckZone bouton1(186, 124, 212, 152); // Définit une zone cliquable à droite
CheckZone bouton2(8, 124, 34, 152); // Définit une zone cliquable à droite

// Déclaration d'une fonction qui fait ce qu'il faut faire à chaque changement
// Cette fonction ne doit pas avoir de paramètres et ne doit rien retourner
// Le nom peut être quelconque
// Cette fonction allume ou éteint la lampe. Elle est allumée si un seul des
// deux boutons est actif. C'est pour celaqu'on utilise le ou-exclusif ^
void lampe()
{
  fill(160, 30+1, bouton1.isSelected() ^ bouton2.isSelected() ? YELLOW : BLACK); // La lampe copie l'état des boutons
}


void setup()
{
  bouton1.onSelectFunction = &lampe; // Change l'état de la lampe si on active le bouton de droite
  bouton2.onSelectFunction = &lampe; // Change l'état de la lampe si on active le bouton de gauche
  bouton1.onUnselectFunction = &lampe; // Change l'état de la lampe si on désactive le bouton de droite
  bouton2.onUnselectFunction = &lampe; // Change l'état de la lampe si on désactive le bouton de gauche

  setGraphMode(PAYSAGE); // Initialisation

  // Consigne
  setTextCursor(10, 200);
  text(F("Appuyez sur un bouton de\n  chaque côté de la fenêtre"));

  maison(1,1); // avec 2 boutons
}

void loop()
{
  scanEvent(); // Gestion des boutons et des horloges, le plus souvent seul dans le loop
}

 

Voir aussi:
- scanEvent(); Moteur de la gestion des évènements
- PushZone; Bouton poussoir sans dessin
- CheckCoche; Bouton bistable (va vient) case à cocher
- CheckCircle; Bouton bistable (va vient) rond
- RadioZone; Bouton radio (un seul bouton actif parmi plusieurs) sans dessin