/* ex0086_lecture_bouton_frequence_variable_ameliore_bis Amélioration de "ex0085_lecture_bouton_frequence_variable_ameliore" qui est une amélioration de "ex0055_lecture_bouton_frequence_variable" en ayant une fréquence beaucoup plus précise, en utilisant la fonction "micros()". Pour éviter les rebonds des boutons pressoirs, tout un traitement de temps est fait. Lecture de l'état du bouton connecté à la PIN 12 S'il est pressé, augmente la valeur d'un compteur. Lecture de l'état du bouton connecté à la PIN 11 S'il est pressé, diminue la valeur d'un compteur. Affiche dans le "moniteur série" (Ctrl+Maj+M) la valeur du compteur. En plus, fait clignoter une LED a une fréquence égale à (1/2) de celle du compteur. Évite que le compteur soit plus petit que 1. */ int nCompteur = 5; int nEtatLast12 = 0; // mémorise le dernier état du bouton 12 int nEtatLast11 = 0; // mémorise le dernier état du bouton 11 int nEtatBouton = 0; // pour la lecture de l'état pressé ou non d'un bouton byte bEtatLED = LOW; // L'état de la LED unsigned long lwTimeNow = 0; // Temps actuel en micros secondes unsigned long lwTimeNext = 0; // Temps définissant le prochain changement d'état en micros secondes // qui aura lieu lorsque (lwTimeNow - lwTimeNext >= lwTimeDelta= unsigned long lwTimeDelta = 200000; // Temps en micros secondes à attendre avant le prochain changement d'état unsigned long lwTimeBouton12 = 0; // Temps en micros secondes de la dernière pression sur le bouton 12 unsigned long lwTimeBouton11 = 0; // Temps en micros secondes de la dernière pression sur le bouton 11 void setup() { //============ // Initialise la PIN digital 13 comme OUTPUT // La PIN 13 a une LED connectée sur la plupart des cartes Arduino // Initialise les PINs digitals 12 et 11 comme INPUT pinMode(13, OUTPUT); pinMode(12, INPUT); pinMode(11, INPUT); digitalWrite(13, LOW); // set the LED off Serial.begin(115200); // Initialise la communication série à une haute vitesse. // La vitesse de 9600 bauds est souvent utilisée par défaut. lwTimeNow = micros(); lwTimeNext = micros(); } // setup void loop() { //=========== // Test s'il faut changé l'état de la LED lwTimeNow = micros(); if (lwTimeNow - lwTimeNext >= lwTimeDelta) { // Change l'état de la LED bEtatLED = 1 - bEtatLED; // change son état digitalWrite(13, bEtatLED); lwTimeNext = lwTimeNow; // Temps définissant le prochain changement d'état } if ((lwTimeNow - lwTimeNext < lwTimeDelta - 500) || (nCompteur > 800)) { // Ne lit sur un bouton que si le temps pour le traitement est suffisant. if (lwTimeNow - lwTimeBouton12 >= 50000) { // Cela fait plus de 1/20 de secondes que le bouton 12 a eu un changement d'état // Pour éviter les rebonds, on ne traite les changements d'états pas trop souvent nEtatBouton = digitalRead(12); if (nEtatBouton != nEtatLast12) { // L'état "pressé" ou "non pressé" a changé. Mémorise le nouvel état et quand il a changé nEtatLast12 = nEtatBouton; lwTimeBouton12 = lwTimeNow; // mémorise quand on a pressé sur le bouton 12 if (nEtatBouton == 1) { // On a pressé sur le bouton qui met la PIN 12 à l'état haut (HIGH) nCompteur = nCompteur + 1; Serial.println(nCompteur); lwTimeDelta = 1000000 / nCompteur; // Temps en micros secondes à attendre avant le prochain changement d'état } } } if (lwTimeNow - lwTimeBouton11 >= 50000) { // Cela fait plus de 1/20 de secondes que le bouton 11 a eu un changement d'état // Pour éviter les rebonds, on ne traite les changements d'états pas trop souvent nEtatBouton = digitalRead(11); if (nEtatBouton != nEtatLast11) { // L'état "pressé" ou "non pressé" a changé. Mémorise le nouvel état et quand il a changé nEtatLast11 = nEtatBouton; lwTimeBouton11 = lwTimeNow; // mémorise quand on a pressé sur le bouton 12 if (nEtatBouton == 1) { // On a pressé sur le bouton qui met la PIN 11 à l'état haut (HIGH) nCompteur = nCompteur - 1; Serial.println(nCompteur); lwTimeDelta = 1000000 / nCompteur; // Temps en micros secondes à attendre avant le prochain changement d'état } } } } // if ((lwTimeNow - lwTimeNext < lwTimeDelta - 500) || (nCompteur > 800)) { } // loop