Définition | Utilisation | Exemple | Côté technique |
3 Boutons RadioZone Voir RadioZone: Exemple-940-RadioZone.ino
Premier exemple: 3 boutons, 6 fonctions externesPecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-940-RadioZone\Exemple-940-RadioZone.ino (dans votre fichier téléchargé): // Mise em place de 3 boutons de type RadioZone (bouton radio, 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 RadioZone boutonHaut(200,40,240,80); // Bouton en haut RadioZone boutonCentre(200,100,240,140); // Bouton au centre RadioZone boutonBas(200,160,240,200); // Bouton en bas // Déclaration de fonctions qui redessinent les boutons // Ces fonctions ne doivent pas avoir de paramètres et ne doit rien retourner // Les noms peuvent être quelconques // On peut avoir 6 fonction comme c'est le cas ici // On peut aussi n'avoir qu'une fonction qui fait tout, deux fonctions,l'une // pour dessiner, l'autre pour effacer, ou 3 fonctions, une par bouton. // Pour savoir ce qu'il faut faire, si il y a moins de 6 fonctions, on peut // utiliser: // - isSelect() pour savoir si il faut dessiner ou effacer // - getTouchY() pour savoit quel bouton vient d'être activé // - on peut aussi tout redessiner sans chercher // Pour effacer les cercle, on peut utiliser: // - un fillCircle() comme cela a étéfait dans d'autres programmes de démo // - un fillRect() qui va plus vite comme ici void onSelectActionHaut() { fillCircle(100,60,20,WHITE); } void onUnselectActionHaut() { fillRect(80,40,120,80,BLACK); } void onSelectActionCentre() { fillCircle(100,120,20,WHITE); } void onUnselectActionCentre() { fillRect(80,100,120,140,BLACK); } void onSelectActionBas() { fillCircle(100,180,20,WHITE); } void onUnselectActionBas() { fillRect(80,160,120,200,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 boutonHaut.onUnselectFunction=&onUnselectActionHaut; // Fonction appelée le bouton du haut de l'écran est désactivé boutonCentre.onSelectFunction=&onSelectActionCentre; // Fonction appelée si on active le bouton au milieu de l'écran boutonCentre.onUnselectFunction=&onUnselectActionCentre; // Fonction appelée si le bouton au milieu de l'écran est désactivé boutonBas.onSelectFunction=&onSelectActionBas; // Fonction appelée si on active le bouton en bas de l'écran boutonBas.onUnselectFunction=&onUnselectActionBas; // Fonction appelée si le bouton en bas de l'écran est désactivé } void loop() { scanEvent(); // Gestion des boutons et des horloges, le plus souvent seul dans le loop } Deuxième exemple: 3 boutons RadioZonePecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-941-Maison-RadioZone-Volet\Exemple-941-Maison-RadioZone-Volet.ino (dans votre fichier téléchargé): // L'intérieur d'une maison est dessinée. Trois boutons de type Radio // permettent d'ouvrir ou de fermer les volets roulants #include <PecheuxGraph.h> // Equivalece des constantes const byte MONTE = 0; const byte STOP = 2; const byte DESCEND = 1; // Définition des contrôles, doit se faire avant setup Clock horloge(100); // Le volet se déplace toutes les 100ms RadioZone boutonMonte(184, 115, 210, 127, MONTE); // Définit une zone cliquable, notre bouton monte RadioZone boutonStop(184, 129, 210, 141, STOP); // Définit une zone cliquable, notre bouton stop RadioZone boutonDescend(184, 143, 210, 155, DESCEND); // Définit une zone cliquable, notre bouton descend // Variables et constantes pour le volet roulant const word BLEU_CIEL = 0x755E; // Couleur du ciel const byte HAUT = 55; // Le haut de la fenêtre const byte BAS = 155; // le bas de la fenêtre byte position = HAUT - 1; // Position du volet (plus haut que HAUT, donc complètement rentré) // Fonction appelée tous les 100 ms pour redessiner les volets void onTimeVolets(void) { switch (getRadioValeur()) // Gestion du mouvement { case MONTE: if (position >= HAUT) position--; // Monte le volet d'un pixel si il n'est pas en haut else // on vient d'arriver en haut { // Désactivation du bouton haut, choisir une des trois possibilités (une seule sans commentaires) // getRadioPointeur()->unselect(); // Désactive le bouton haut unselectRadio(); // Désactive tous les boutons //static_cast <RadioZone *> (premierControle())->select(); // Active le bouton stop, cela fonctionne car il a été défini en dernier fill(160, 30, BLACK); // On éteint la lampe } break; case DESCEND: if (position < BAS) position++; // Descend le volet d'un pixel si il n'est pas en haut else // on vient d'arriver en bas { // Désactivation du bouton bas, choisir une des trois possibilités (une seule sans commentaires) // getRadioPointeur()->unselect(); // Désactive le bouton bas unselectRadio(); // Désactive tous les boutons // static_cast <RadioZone *> (premierControle())->select(); // Active le bouton stop, cela fonctionne car il a été défini en dernier fill(160, 30, YELLOW); // On allume la lampe } // case STOP: // On ne fait pas bouger le volet, rien à faire. } // Dessin du volet if ((getRadioValeur() == MONTE) || (getRadioValeur() == DESCEND)) // Sinon cela clignotte aussi à l'arrêt { // Dessine toutes les lattes en marron fillRect(50, HAUT, 107, position, DARK_RED); fillRect(114, HAUT, 170, position, DARK_RED); // dessine une latte sur 16 en noir for (byte latte = 0; latte <= position - HAUT; latte += 16) // N° des lattes à dessiner { // Une latte sur 16 est noire hLine(50, 107, position - latte, BLACK); // Pour la vitre de gauche hLine(114, 170, position - latte); // Pour la vitre de droite } // Efface la latte en dessous (au cas ou on remonte le volet) if (position != BAS) // Seulement si on n'est pas tout en bas, sinon on dessinerait dans le cadre { hLine(50, 107, position + 1, BLEU_CIEL); // Pour la vitre de gauche hLine(114, 170, position + 1); // Pour la vitre de droite } } } void setup() { horloge.onTimeFunction = &onTimeVolets; // Action à faire quand l'horloge donne son tip setGraphMode(PAYSAGE); // Initialisation setTextCursor(10, 200); // Consigne text(F(" Appuyez sur les boutons,\n près de la porte")); maison(0, 3); // Avec 3 boutons à droite fillRect(50, 55, 107, 155, BLEU_CIEL); // Vitre de gauche, fond uni fillRect(114, 55, 170, 155); // Vitre de droite, fond uni } void loop() { scanEvent(); // Gestion des boutons et des horloges, le plus souvent seul dans le loop } Troisième exemple: 6 boutons avec 2 groupesPecheuxGraph.zip\PecheuxGraph\examples\Documentation\Exemple-942-Maison-RadioZone_Volets\Exemple-942-Maison-RadioZone_Volets.ino (dans votre fichier téléchargé): // L'intérieur d'une maison est dessinée. Trois boutons de type Radio // permettent de fermer le volet gauche, trois autres permetent de fermer le // volet droit #include <PecheuxGraph.h> // Equivalece des constantes const byte MONTE = 0; const byte STOP = 2; const byte DESCEND = 1; // Définition des contrôles dynamiques, peut se faire avant ou après setup // On peut panacher, cela n'a pas d'importance. Normalement, on ne le fait pas. // Si c'est fait ici, c'est à titre d'exemple. // Bouton de droite, groupe 0 (pas nécessaire de le préciser, c'est par défaut) RadioZone *monteDroite = new RadioZone(184, 115, 210, 127, MONTE); // Définit une zone cliquable, notre bouton monte de droite // Notez que monteDroite est un nom qui ne nous servira pas, mais on en a besoin pour la déclaration // Boutons de gauche, groupe 1, il faut le dire RadioZone *stopGauche = new RadioZone(7, 129, 35, 141, STOP, GROUPE_1); // Définit une zone cliquable, notre bouton stop de gauche RadioZone *descendGauche = new RadioZone(7, 143, 35, 155, DESCEND, GROUPE_1); // Définit une zone cliquable, notre bouton descend de gauche // On va garder l'horloge satique. Le panachage est complet. Clock horloge(100); // Le volet se déplace toutes les 100ms // Variables et constantes pour les volets roulants const word BLEU_CIEL = 0x755E; // Couleur du ciel const byte HAUT = 55; // Le haut de la fenêtre const byte BAS = 155; // le bas de la fenêtre byte positionDroite = HAUT - 1; // Position du volet droit (plus haut que HAUT, donc complètement rentré) byte positionGauche = HAUT - 1; // Position du volet gauche (plus haut que HAUT, donc complètement rentré) void onTimeVolets(void) // Fonction appelée tous les 100 ms pour redessiner les volets { //------------ Volet de droite ---------------- switch (getRadioValeur()) // Gestion du mouvement { case MONTE: if (positionDroite >= HAUT) positionDroite--; // Monte le volet d'un pixel si il n'est pas en haut else // on vient d'arriver en haut { // Désactivation du bouton haut, choisir une des deux possibilités (une seule sans commentaires) // getRadioPointeur()->unselect(); // Désactive le bouton activé, c'est le bouton haut unselectRadio(); // Désactive tous les boutons if (positionGauche == HAUT - 1) // si l'autre volet est aussi en haut fill(160, 30, BLACK); // On éteint la lampe } break; case DESCEND: if (positionDroite < BAS) positionDroite++; // Descend le volet d'un pixel si il n'est pas en haut else // on vient d'arriver en bas { // Désactivation du bouton haut, choisir une des deux possibilités (une seule sans commentaires) // getRadioPointeur()->unselect(); // Désactive le bouton activé unselectRadio(); // Désactive tous les boutons if (positionGauche == BAS) // si l'autre volet est aussi en bas fill(160, 30, YELLOW); // On allume la lampe } } // Dessin du volet if ((getRadioValeur() == MONTE) || (getRadioValeur() == DESCEND)) // Sinon cela clignotte aussi à l'arrêt { // Dessine toutes les lattes en marron fillRect(114, HAUT, 170, positionDroite, DARK_RED); // dessine une latte sur 16 en noir for (byte latte = 0; latte <= positionDroite - HAUT; latte += 16) hLine(114, 170, positionDroite - latte, BLACK); // Une latte sur 16 est noire // Efface la latte en dessous (au cas ou on remonte le volet) if (positionDroite != BAS) hLine(114, 170, positionDroite + 1, BLEU_CIEL); // Seulement si on n'est pas tout en bas, sinon on dessinerait dans le cadre } //------------ Volet de gauche ---------------- switch (getRadioValeur(GROUPE_1)) // Gestion du mouvement { case MONTE: if (positionGauche >= HAUT) positionGauche--; // Monte le volet d'un pixel si il n'est pas en haut else // on vient d'arriver en haut { // Désactivation du bouton haut, choisir une des deux possibilités (une seule sans commentaires) // getRadioPointeur()->unselect(); // Désactive le bouton activé, c'est le bouton haut unselectRadio(GROUPE_1); // Désactive tous les boutons if (positionDroite == HAUT - 1) // si l'autre volet est aussi en haut fill(160, 30, BLACK); // On éteint la lampe } break; case DESCEND: if (positionGauche < BAS) positionGauche++; // Descend le volet d'un pixel si il n'est pas en haut else // on vient d'arriver en bas { // Désactivation du bouton haut, choisir une des deux possibilités (une seule sans commentaires) // getRadioPointeur()->unselect(); // Désactive le bouton activé unselectRadio(GROUPE_1); // Désactive tous les boutons if (positionDroite == BAS) // si l'autre volet est aussi en bas fill(160, 30, YELLOW); // On allume la lampe } } // Dessin du volet if ((getRadioValeur(GROUPE_1) == MONTE) || (getRadioValeur(GROUPE_1) == DESCEND)) // Sinon cela clignotte aussi à l'arrêt { // Dessine toutes les lattes en marron fillRect(50, HAUT, 107, positionGauche, DARK_RED); // dessine une latte sur 16 en noir for (byte latte = 0; latte <= positionGauche - HAUT; latte += 16) hLine(50, 107, positionGauche - latte, BLACK); // Une latte sur 16 est noire // Efface la latte en dessous (au cas ou on remonte le volet) if (positionGauche != BAS) hLine(50, 107, positionGauche + 1, BLEU_CIEL); // Seulement si on n'est pas tout en bas, sinon on dessinerait dans le cadre } } void setup() { setGraphMode(PAYSAGE); // Initialisation // Définition des contrôles dynamiques, après setup // Comme on n'a pas besoin de changer un comportement, on n'a pas besoin de garder une trace // de l'objet. On se moque de ce que retourne new // Boutons de droite, groupe 0 (pas nécessaire de le préciser, c'est par défaut) new RadioZone(184, 129, 210, 141, STOP); // Définit une zone cliquable, notre bouton stop de droite new RadioZone(184, 143, 210, 155, DESCEND); // Définit une zone cliquable, notre bouton descend de droite // Boutons de gauche, groupe 1, il faut le dire new RadioZone(7, 115, 35, 127, MONTE, GROUPE_1); // Définit une zone cliquable, notre bouton monte de gauche horloge.onTimeFunction = &onTimeVolets; // Action à faire quand l'horloge donne son tip // Consigne setTextCursor(10, 200); text(F("Appuyez sur les boutons,\n de chaque côté de la porte")); maison(3, 3); // avec 3 boutons de chaque côté fillRect(50, 55, 107, 155, BLEU_CIEL); // Vitre de gauche, ciel uni fillRect(114, 55, 170, 155); // Vitre de droite, ciel uni } void loop() { scanEvent(); // Gestion des boutons et des horloges, le plus souvent seul dans le loop }
Voir aussi: |