Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // DFR0075 ======================================================================
- // Code fabricant modifié du module 5 boutons DFR0075
- // https://wiki.dfrobot.com/ADKeyboard_Module__SKU__DFR0075_
- // Permet le simple clic (clic court), le clic long, et le double-clic
- // une version sans commentaire de ce code se trouve ici :
- // https://pastebin.com/uWBVLtGx
- // une version du code fabricant hyper commentée aussi se trouve ici :
- // https://pastebin.com/JXRjZ4G3
- // ===============================================================================
- // Ollivier JULLIEN || aout 2020
- // 100% libre de droit
- // (en cas de copie, merci de citer l'auteur...
- // il a travaillé dur pour vous le donner ;) )
- // ===============================================================================
- // Fonctionnement du module DFR 0075
- /* Si on appuie sur le bouton 0 (S1), la valeur analogique reçue est inférieure à 600
- * Si on appuie sur le bouton 1 (S2), la valeur analogique reçue est supérieure à 600 et inférieure à 650
- * Si on appuie sur le bouton 2 (S3), la valeur analogique reçue est supérieure à 650 et inférieure à 700
- * Si on appuie sur le bouton 3 (S4), la valeur analogique reçue est supérieure à 700 et inférieure à 800
- * Si on appuie sur le bouton 4 (S5), la valeur analogique reçue est supérieure à 800 et inférieure à 900
- * Si on appuie pas la valeur analogique reçue est supérieure à 900 (1023, normalement)
- * Ces valeurs sont celles fixée par le tableau
- * Si un bouton ne fonctionne pas ou active le suivant (ou précédent), faire un Serial.print(valeurLue); ,
- * juste en dessous de valeurLue = analogRead(0); pour connaitre sa valeur, et modifier la valeur correspondante
- * dans le tableau valLimiteHauteModule[] de manière à ce que la limite correspondant à ce bouton dans le tableau
- * soit supérieure à la valeur du bouton (perso j'ai eu à le faire
- */
- // VARIABLES
- int valLimiteHauteModule[5] = {600, 700, 760, 850, 900}; // on crée un tableau qui contient les valeurs limites
- // qui permettent de déterminer quel bouton est enfoncé (ou pas)
- const int nombreBoutons = 5; // on donne le nombre de bouton du module (sert pour attribuer un numéro
- // à un bouton à partir de la valeur lue)
- const int pinModule5BP = 0; // numero de la borche analogique sur laquelle est branchée
- // le module 5 boutons
- int valeurLue; // Valeur qui sera lue sur le pin analogique sur lequel est branché
- // le module (0 < valeurLue < 1023)
- int valeurLueDebug;
- int numBouton = -1; // numero du bouton correspondant à la valeur reçue
- // (-1 pas de bouton enfoncé)
- int derniereLue = -1; // dernière valeur reçue du module (-1 pas de bouton enfoncé)
- int memoireNumBouton = -1; // numero du dernier bouton à avoir été enfoncé
- // (-1 pas de bouton enfoncé avant)
- unsigned long debutPression; // repère temporel : valeur du chrono au moment où on presse le bouton
- // sert à faire la différence qui détermine la durée de la pression
- unsigned long debutEntreDeux;
- unsigned long dureePression; // durée de la pression (différence entre "maintenant" et le moment
- // où on a commencé à appuyer pour avoir la durée de la pression)
- // sera utilisée au moment du relachement
- // (numBouton passe de X(dernierLu!=-1) à -1)
- unsigned long dureeEntreDeux;
- // FONCTIONS
- // Fonction servant à transformer la valeur reçu (comprise entre 0 et 1023) en valeur de bouton (comprise entre -1 et 4)
- int recupNumBouton (unsigned int lecture) {
- int boucleLecture; // Rang de comptage
- for (boucleLecture = 0; boucleLecture < nombreBoutons; boucleLecture ++) { // on part de 0 (boucleLecture = 0),
- // et on ajout 1 (boucleLecture ++) à chaque tour (for)
- // jusqu'à la valeur (boucleLecture)
- // juste avant le nombre de bouton :
- // (boucleLecture < nombreBoutons)
- // (boucleLecture < 5)
- // donc jusquà ce que boucleLecture = 4
- // 4 est la derniere valeur à laquelle on ajoute 1
- // donc le maximum possible pour boucleLecture est 5 ("4 ++")
- //
- if (lecture < valLimiteHauteModule[boucleLecture]) { // Si la valeur lue (lecture) est inférieure à la valeur du tableau
- // du rang de lecture auquel on se trouve.
- // Si lecture (valeur reçue) inférieure à 600 (valLimiteHauteModule[0])
- // Si lecture (valeur reçue) inférieure à 650 (valLimiteHauteModule[1])
- // Si lecture (valeur reçue) inférieure à 700 (valLimiteHauteModule[2])
- // Si lecture (valeur reçue) inférieure à 800 (valLimiteHauteModule[3])
- // Si lecture (valeur reçue) inférieure à 900 (valLimiteHauteModule[4])
- return boucleLecture; // on retourne la valeur de boucleLecture
- }
- }
- if (boucleLecture >= nombreBoutons) { // si la valeur lue (lecture) n'est pas inférieur à une valeur du tableau
- boucleLecture = -1; // valLimiteHauteModule[] alors on impose la valeur -1 à boucleLecture
- }
- return boucleLecture; // on retourne la valeur de boucle lecture
- // seul un cas peut se présenter soit inférieur à toutes les valeurs
- // du tableau soit supérieur à toutes ("pas inférieur" à toutes les
- // valeurs du tableau)
- }
- /*
- Remarque sur la fonction : je pensais qu'on ne pouvait pas le faire tourner sur une valeur de tableau qui n'existe pas :
- on arrive à un moment où on lui demande de vérifier que lecture est inférieure à valLimiteHauteModule[boucleLecture]
- avec boucleLecture = 5, mais valLimiteHauteModule[5] n'existe pas. Je ne savais pas qu'on pouvait demander une lecture
- (ici pour uine comparaison) d'un rang de tableau qui n'existe pas
- */
- // SET UP
- void setup() {
- Serial.begin(9600); // on ouvre la communication avec l'ordinateur (port série) à 9600 baud
- }
- void loop() {
- valeurLue = analogRead(pinModule5BP); // on lit la valeur sur le port analogique
- // c'est pa obligatoire vu qu'on la refait dessous, mais bon je laisse
- delay(20); // on laisse un peut de temps au cas pour être sur du résultat
- valeurLue = analogRead(pinModule5BP); // on lit la valeur sur le port analogique
- numBouton = recupNumBouton(valeurLue); // on transforme cette valeur de tension en numero de bouton
- // avec la fonction ci-dessus
- if (numBouton != derniereLue && numBouton != -1) { // si on vient d'enfoncer le bouton
- // c'est à dire qu'il n'a pas -1 comme valeur (enfoncé)
- // et que sa valeur est différente de celle de la précédente lecture
- // (on vient de...)
- dureeEntreDeux = (millis() - debutEntreDeux); // on mesure le temps qui s'est écoulé depuis le dernier clic (enfoncé)
- // la période entre le moment ou on relache et le moment ou on appuie
- debutPression = millis(); // on "démarre le chrono" qui sert à mesurer le temps de pression
- // en fait on repere le moment debutPression pour faire une
- // sourstraction plus tard, avec le moment où on relache
- derniereLue = numBouton; // on enregistre que c'est la dernière valeur de bouton lue "connue"
- memoireNumBouton = numBouton; // on enregistre que c'est la dernière valeur de bouton enfoncé "connue"
- } else if (numBouton != derniereLue && numBouton == -1) { // si on vient de relacher le bouton
- // c'est à dire qu'il n'a pas -1 comme valeur (enfoncé)
- // et que sa valeur est différente de celle de la précédente lecture
- // (on vient de...)
- debutEntreDeux = millis(); // on "démarre le chrono" qui sert à mesurer le temps entre deux clics
- // en fait on repere le moment debutEntreDeux pour faire une
- // sourstraction plus tard, avec le moment où on rappuie
- dureePression = millis() - debutPression; // on lit la valeur du "chrono"
- // en fait on fait la fameuse soustraction pour avoir le temps écoulé
- // depuis qu'on a appuyé sur le bouton
- derniereLue = numBouton; // on enregistre que c'est la dernière valeur de bouton lue "connue"
- if (dureeEntreDeux > 350) { // si il s'est passé assez de temps entre les deux pressions
- // de boutons pour que ce ne soit pas un double clic
- // alors on mesure la durée du dernier clic
- if (dureePression < 250 ) { // si cette durée est comprise entre 0 et 0.5s
- Serial.print("clic court sur le bouton "); // => Action du clic long : ici on affiche simplement sur le moniteur série
- // "clic court sur le bouton "
- Serial.println(memoireNumBouton); // et on rajoute la valeur du bouton qu'on a en mémoire
- // avant de retourner à la ligne
- } else if (dureePression >= 250) { // si cette durée est comprise entre 0.5s et 1s
- Serial.print("clic long sur le bouton "); // => Action du clic long : ici on affiche simplement sur le moniteur série
- // "clic long sur le bouton "
- Serial.println(memoireNumBouton); // et on rajoute la valeur du bouton qu'on a en mémoire
- // avant de retourner à la ligne
- }
- } else {
- if (dureePression < 250 ) {
- if (memoireNumBouton == ancienneMemoireNumBouton){// on vérifie que le dernier bouton enfoncé soit le même que
- // l'avant dernier bouton enfoncé (double clic sur le même bouton)
- Serial.print("double clic sur le bouton "); // => Action du clic long : ici on affiche simplement sur le moniteur série
- // "double clic sur le bouton "
- Serial.println(memoireNumBouton); // et on rajoute la valeur du bouton qu'on a en mémoire
- // avant de retourner à la ligne
- }
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment