Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // DFR0075 ======================================================= COMMENTAIRES =
- // Code fabricant commenté module 5 boutons DFR0075
- // https://wiki.dfrobot.com/ADKeyboard_Module__SKU__DFR0075_
- // une version sans commentaire de ce code modifié (revu) qui
- // permet le simple clic (clic court), le clic long, et le double-clic
- // se trouve ici :
- // https://pastebin.com/uWBVLtGx
- // une version hyper commentée de ce code se trouve ici :
- // https://pastebin.com/gVZBu2Wg
- // ===============================================================================
- // Ollivier JULLIEN || aout 2020
- // commentaires 100% libre de droit
- // (en cas d'utilisation de ces explications, merci de citer l'auteur...
- // il a travaillé dur pour vous le donner ;) )
- // ===============================================================================
- //ADKeyboard Module
- //Developed by DFRobot.com
- //Last modified 30/11/2011
- //Version 1.0
- //https://wiki.dfrobot.com/ADKeyboard_Module__SKU__DFR0075_
- int adc_key_val[5] = {600, 650, 700, 800, 900 }; // Les valeurs de tension limite haute des bouton
- int NUM_KEYS = 5; // Le nombre de bouton
- int adc_key_in; // valeur reçue par la broche analogique
- int key = -1; // numero de bouton, défini à "pas de bouton enfoncé
- int oldkey = -1; // numero mémoire de bouton, défini comme pas de bouton enfoncé
- void setup()
- {
- Serial.begin(9600); // 9600 bps
- }
- void loop() {
- // Ce module avec ce code execute les fonctions au moment ou on enfonce le bouton
- /* 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, faire un Serial.print(adc_key_in); , juste en dessous de
- * adc_key_in = analogRead(0); pour connaitre sa valeur, et modifier la valeur correspondante
- * dans le tableau adc_key_val[] de manière à ce que la limite correspondant à ce bouton dans le tableau
- * soit supérieure à la valeur du bouton
- */
- adc_key_in = analogRead(0); // Lit la valeur à la borne du senseur
- key = get_key(adc_key_in); // on converti cette valeur en numero de clé (bouton)
- if (key != oldkey) { // Si on appuie (la nouvelle valeur est différente de l'ancienne)
- /* ===================================================================================================== */
- delay(50); // on fait une pause pour vérifier qu'il est bien enfoncé
- adc_key_in = analogRead(0); // on reelit la valeur à la borne du senseur
- key = get_key(adc_key_in); // on converti cette valeur en numero de clé (bouton)
- if (key != oldkey) { // Si on appuie (la nouvelle valeur est différente de l'ancienne)
- /* ===================================================================================================== */
- // pourquoi on refait la manip ? Vérification que le bouton soit enfoncé plus de 50 ms, je pense
- // pour eviter d'agir sur une "interférence"
- /* ===================================================================================================== */
- oldkey = key; // on redéfini la valeur de oldkey en lui donnant la valeur de key
- if (key >= 0) { // Si key positif ou nul ( != -1 "aucune touche enfoncée
- switch (key) { // Suivant les valeurs de key
- case 0: Serial.println("S1 OK"); // key = 0 => on affiche "S1 OK"
- break; // on passe direct au delay(100); en dessous
- case 1: Serial.println("S2 OK"); // key = 0 => on affiche "S1 OK"
- break; // on passe direct au delay(100); en dessous
- case 2: Serial.println("S3 OK"); // key = 0 => on affiche "S1 OK"
- break; // on passe direct au delay(100); en dessous
- case 3: Serial.println("S4 OK"); // key = 0 => on affiche "S1 OK"
- break; // on passe direct au delay(100); en dessous
- case 4: Serial.println("S5 OK"); // key = 0 => on affiche "S1 OK"
- break; // on passe direct au delay(100); en dessous
- }
- }
- }
- }
- delay(100); // on fait une pause de 0.1s
- }
- /* ===================================================================================================== */
- // Valeur qui converti la valeur de la tension à la borne analogique en numero de bouton
- /* ===================================================================================================== */
- int get_key(unsigned int input) {
- int k;
- for (k = 0; k < NUM_KEYS; k++) { // on fait tourner sur le nombre de bouton
- // une boucle qui vérifie que la valeur lue est inférieure
- // ou non a la limite qui correspond au tour dans le tableau
- if (input < adc_key_val[k]) { // si la valeur est inférieur à sa limite
- return k; // on renvoie la valeur du bouton
- } // si la valeur est supérieur, on n'envoie rien
- } // du coup en fin de bouble c'est la dernière valeur qui ait été inférieur,
- // qui est la dernière retournée, qui sera retenue
- if (k >= NUM_KEYS)k = -1; // No valid key pressed // Si la valeur est au dela de la derniere limite 900,
- // aucun bouton sélectionné, on attribue la valeur -1 au bouton
- return k; // et on retourne la valeur
- }
Add Comment
Please, Sign In to add comment