Clavier et fonction millis

Bonjour,

J'utilise un clavier pour un digicode. Le système fonctionne mais si dans mon code, je lance une fonction avec une temporisation, je dois attendre le fin de millis pour pouvoir saisir un nouveau code clavier.

C'est pas très pratique. Avez-vous une solution ?

J'avais lu que delay, bloquait le code pendant son délai alors qu'il fallait utiliser millis ?

[u]Voilà un extrait du code avec la partie saisie clavier :[/u]

if (ClavierSaisie == 0)
          { }
           
        else if (ClavierSaisie == Code1 || ClavierSaisie == Code2 || ClavierSaisie == Code3 || ClavierSaisie == Code4 || ClavierSaisie == Code5 || ClavierSaisie == Code6 || ClavierSaisie == Code7 || ClavierSaisie == Code8 || ClavierSaisie == Code9 || ClavierSaisie == Code10)
            {
            Serial.println("Code bon ouverture de la porte");
           
            NombreEssai =4;  
            ClavierSaisie = 0;
            
            FonctionOuverture();
            
            }
            
        else 
            {
            ClavierSaisie = 0;
            Serial.print("Erreur de code, encore : ");
            Serial.println(NombreEssai);
            
            NombreEssai --;
            
                if (NombreEssai ==0 ) //break
                    {
                    Serial.println("Trop d'essai code bloque");
                    NombreEssai =4;         
                    
                    }
            }
      }

[u]Un exemple de fonction avec millis[/u]

void FonctionSortie()
    {
     
        if ((millis() - TimeRef) >= Tempo)       
                    {

                       digitalWrite(Sortie,HIGH); 
                             
                    }
                    
          else 
                 {   

                 digitalWrite(Sortie,LOW); 
                 } 
      }
    }

Bonjour,

Ce n’est pas trés explicite. Je ne comprends pas où se situe exactement le problème.

A quoi te sert la temporisation ? As-tu essayé de diminuer les délais ?

@+

Zoroastre.

Bonjour Zoroastre,

En fait, dans mon code, j’ai plusieurs fonctions qui utilisent fois des délais.
Par exemple, c’est pour un digicode et il me faut une tempo pour l’ouverture de la porte.

Une autre, c’est pour gestion de la plage horaire, encore une autre pour le clignotement d’une led.

Le problème c’est lorsqu’une des tempos est lancée, ma saisie clavier n’enregistre pas sa variable.
Il faut attendre la fin de la tempo.

J’ai une solution, c’est un second arduino qui gère l’ouverture de la porte et sa tempo.
Le premier arduino (celui avec le clavier) commande le second avec une tempo.

Yep!

Dans ce cas, la solution logique est d'utiliser pour ton clavier une interruption qui écoutera un changement d'état de celui-ci et lui donnera un temps donné la priorité.

https://itechnofrance.wordpress.com/2013/03/24/utilisation-des-interruptions-sur-larduino/

Dès un appui sur le clavier, le programme en cours stoppera pour passer à la gestion de ton digicode.

Par contre, je me demande si la première touche sera sauvegardée et si il existe une astuce pour la prendre en compte ??

@+

Zoroastre.

Bonjour,

tu ne dois pas "lancer" une tempo et attendre sa fin avant de faire autre chose.

Au debut d'une tempo tu dois fixer la valeur "millis" qui va mettre fin a la tempo simplement en changeant un etat.

Un exemple dans la vie de tous les jours :

mise en route de la chaudiere a 08h00 eteindre la chaudiere a 18h00

Tu allumes ta chaudiere a 8h00 puis tu vaques a tes occupations de la journee en regardant de temps en temps ta montre (c'est la "loop") Quand tu liras sur ta montre 18h00 ou plus tu coupes l'alim de la chaudiere.

Maintenant si tu allumes la chaudiere a 8h00 puis que tu pars en deplacement jusque 21h00 (fonction bloquante) alors, impossible d'eteindre la chaudiere (delai)

Suis-je clair ?

Jacques

Bonsoir zoroastre et Jacques,

Pour zoroastre :

L'idée est d'utiliser une interruption ok mais je ne trouve pas d'exemple avec un keypad. J'utilise ce genre de code : http://playground.arduino.cc/Main/PS2Keyboard

Pour Jacques ;

Si je comprends tes explications, dans le premier exemple, la fonction se termine normalement après 18h00. Dans le second, nous ne savons pas interrompre le délai.

Dans ce cas, je vais utiliser deux arduinos, un pour le clavier avec le code principal et un second avec la tempo qui gère l'ouverture de la porte ou simplement utiliser un relais temporisé.

Bonjour,

tu n'as pas compris l'utilisation de la fonction "millis". Pour revenir a mon exemple, c'est comme un agenda avec une multitude de choses a faire a differentes heures. La "loop" tourne rapidement en regardant l'heure qu'il est. Quand l'heure correspond a une chose a faire (ou est legerement depassee), la fonction est effectuee et eventuellement une nouvelle heure est fixee pour une nouvelle action.

Voici un petit exemple : attention je ne suis pas programmeur, jamais eu courage lire un livre de programmation. Les resultats sont obtenus en faisant des essais, corrections, nouvel essai, nouvelle correction etc etc

J'ai besoin d'une led qui s'allume pendant 20ms toutes les secondes. Led HD, c'est parfaitement visible. J'ai besoin de multiplexer l'affichage. 2 x 7seg J'ai besoin d'un decompteur de secondes. Pas besoin qu'il soit tres precis, c'est pour une temporisation avant extinction d'une TV. J'ai besoin de recevoir des ordres d'une telecommande IR .

if((currentMillis - previousMillis1) > interval1) // 10mS
    { 
    previousMillis1 = currentMillis; 
    dispunit = !dispunit; // multiplexage de l'affichage
    compteurpoursecondes = compteurpoursecondes + 1;
    if (ledon == true)
      {
      ledontimer = ledontimer + 1;
      if (ledontimer == timledon) { (ledon = false); ledontimer = 0; } //eteindre la led apres 20 ms
      }
    if (compteurpoursecondes == 100)
      { 
      compteurpoursecondes = 0; 
      newsecondoccurred = true;
      ledon = true; 
      }
    }

Le code pour recevoir IR est simplement place dans la boucle

J'espere que cela pourra t'aider

Jacques

Bonsoir Jacques,

Je vais reproduire ton exemple. Un grand merci avec ça je devrai m'en sortir ;)

Une bonne soirée à tous,

Pierre

Ps: je ne reçois pas de notification lorsqu'il y a une nouvelle réponse.