Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Arduino Yun] Compter le nbre de clics d'un inter

Nb de clics vers page web

Sujet résolu
    19 avril 2020 à 21:10:30

    Bonjour,

    J'essaie de rédiger le sketch pour compter (sur une page web) le nombre de fois où je clique sur un interrupteur branché sur l'entrée digitale 2 de mon arduino Yun.

    J'utilise la fonction digitalRead()

    J'ai rédigé ce sketch et page web pour déjà afficher "1" dans mon navigateur chaque fois que je clique sur l'interrupteur:

    Sketch .ino:

    void loop() {
      YunClient client = server.accept();
     
      if (client) {
        String command = client.readString();
        command.trim();
        if (command == "valeur") {
          int val = digitalRead(2);
          client.print(val);
        }
        client.stop();
      }
     
      delay(10);
    }

    Page index.html:

    <html>
    	<head>
    		<meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <!-- Encodage de la page  --> 
    		
    		<script type="text/javascript" src="zepto.min.js"></script>
    		<script type="text/javascript">
    			function refresh() {
    				$('#content').load('/arduino/valeur');
    			}
    		</script>
    	</head>
    	<body onload="setInterval(refresh, 1000);">
    		<h1>Valeur interrupteur:</h1>
    		<span id="content">Waiting for Arduino...</span>
    	</body>
    </html>

    (C'est du code que j'ai détourné de l’affichage d'un potentiomètre.)

    Mais qd j'appuie sur l'interrupteur, parfois le 0 se transforme en 1 mais des fois non et des fois tout seul.

    Pourriez-vous m'aider?

    Merci


    PS: dans mon répertoire www est joint le fichier "zepto.min.js" au fichier "index.html"

    -
    Edité par PierreAndrou 20 avril 2020 à 13:50:33

    • Partager sur Facebook
    • Partager sur Twitter
      20 avril 2020 à 21:46:51

      Je me permets de relancer, merci,
      • Partager sur Facebook
      • Partager sur Twitter
        20 avril 2020 à 22:54:26

        C'est peut-être un problème physique:

        - tu as mis une résistance de tirage lorsque le contact est ouvert?

        - tu as géré les rebonds mécaniques lors de la fermeture du contact?

        • Partager sur Facebook
        • Partager sur Twitter
          21 avril 2020 à 0:49:39

          Merci de m'avoir mi sur la voie

          • en utilisant pinMode(2,INPUT_PULLUP); j'ai supprimé les problèmes de "rebonds" et de faux signaux.

          Par contre je dois régler le soucis suivant:

          • si j’appuie rapidement sur le contact, le changement d'état (passage de 0 à 1 car pullup) n'est pris en compte. Je doit laisser le doigt au moins 3 secondes dessus pour que ce soit le cas.

          Avez vous une idée de la façon de régler cela? (Je vais chercher demain de mon côté.)

          -
          Edité par PierreAndrou 21 avril 2020 à 0:55:50

          • Partager sur Facebook
          • Partager sur Twitter
            21 avril 2020 à 11:50:35

            Mettre une pullup ne résout pas les problèmes de rebond.

            Mais je pense davantage à un problème lié au temps d'exécution de la boucle. Si le temps mis pour que la connexion soit effective est de 2 secondes, il faudra attendre ces 2 secondes pour que ton programme exécute la lecture de l'état du contact.

            Pour que la l'état du contact soit pris en temps réel, il faudrait mettre à jour une variable en lisant l'état dans un thread qui scruterait l'entrée toutes les x ms, soit déclencher une interruption au changement d'état, ce qui revient à peut près au même.

            • Partager sur Facebook
            • Partager sur Twitter
              22 avril 2020 à 15:19:30

              Bonjour et merci,

              Avec le mot "thread" dans les moteurs de recherche j'ai carrément trouvé ce que je cherchais:

              http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.ExempleButtonStateChange

              Mais pour essayer tout cela avec mon arduino yun avec un navigateur je galère: je n'arrive pas à mettre à jour ma page index qd elle est sur la carte sd dans le yun (croquis/afficher le dossier des croquis) et si je la sors du yun pour écraser le fichier, après l'avoir remise la page index n'est plus accessible (192.168.240.1/sd/).

              Pierre

              • Partager sur Facebook
              • Partager sur Twitter
                22 avril 2020 à 16:20:24

                Là tu sors de mon domaine de compétences car je ne pratique que très peu le monde arduino.
                • Partager sur Facebook
                • Partager sur Twitter
                  23 avril 2020 à 13:54:13

                  Sujet résolu.

                  Juste pour information, j'ai réglé mon soucis d'accès à ma carte sd: il ne faut surtout pas la sortir du Yun (il suffit de téléverser un sketch vide = loop et setup vide, dans le yun puis "Croquis/afficher le dossier des croquis" et travailler sur la fenêtre du navigateur qui s'ouvre).

                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 avril 2020 à 15:05:45

                    Tu peux le faire de manière plus efficace avec les interruptions.

                    https://simple-duino.com/interruption-et-arduino/

                    Dans le programme que tu présentes (lien "thread"), tu as juste une boucle continue. Donc tu ne peux rien exécuter à coté. Et si tu lances un calcul dans ta boucle, tu risques de passer à côté d'un clic de bouton.

                    Les interruption permettent de mettre ton programme en pause lorsqu'un évènement se produit, de traiter l'informations, puis de reprendre ton programme la ou il en était.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      17 juin 2020 à 23:08:22

                      Bonjour et merci raoullevert,

                      C'est intéressant, je viens de l'essayer.

                      Mais un pb classique: en fonction du temps où tu appuie sur l'interrupteur (ou s'il y a un mauvais contact), la fonction déclenchée par attachInterrupt peut s'exécuter plusieurs fois.

                      Savez-vous comment éviter cela?

                      Merci,

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 juin 2020 à 10:52:34

                        Un grand classique. Des solutions dans ce document.

                        Plus particulièrement dans la section "Software debouncing"

                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 juin 2020 à 17:22:01

                          Bonjour et merci,

                          J'ai utilisé un anti rebond logiciel en bloquant les interruptions durant un temps (cf. https://forums.futura-sciences.com/electronique/639171-arduino-anti-rebond-arduino.html ).

                          Ceci dit, mon programme fonctionne (il affiche une température en boucle et s'arrête qd appuie sur interrupteur = interruption) mais à un moment, sur une interruption, l'affichage série s'interrompt. 

                          Sauriez-vous pourquoi?

                          #include <SPI.h>
                          #include <Ethernet.h> //Inclure la bibliothèque Ethernet
                          
                          // Variables pour température
                          int CAPTEUR_TEMP_PIN = 0; // adressage du capteur de temperature (PIN) //
                          float temp = 0; 
                          EthernetClient client;
                          
                          // Variables pour l'inter
                          long debouncing_time = 1500; //Debouncing Time in Milliseconds
                          volatile unsigned long last_micros;
                          
                          void setup()
                          {
                          // On démarre la voie série pour déboguer
                            Serial.begin(9600);
                          // Inter
                            attachInterrupt(0, inter, CHANGE); // attache l'interruption externe n°0 
                          }
                          
                          
                          void loop()
                           {
                           temp = analogRead(CAPTEUR_TEMP_PIN); // lecture du capteur de température //
                           Serial.println(temp);
                           delay(300); // attente en millisecondes
                           }
                          
                          
                          void inter() // la fonction appelée par l'interruption externe n°0
                          {
                           if((long)(micros() - last_micros) >= debouncing_time * 1000) {       // Pour l'antirebond
                              Serial.println("Comptage+1");
                              last_micros = micros();   // Pour l'antirebond
                                                                                          }
                          }
                          
                          
                          



                          • Partager sur Facebook
                          • Partager sur Twitter

                          [Arduino Yun] Compter le nbre de clics d'un inter

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          • Editeur
                          • Markdown