Appui sur BP allume LED une durée voulue (minuteur) sans delay

Pour comprendre

Nous avons vu précédemment comment réaliser un minuteur par appui sur le bouton poussoir : par contre la solution utilisée est bloquante car utilise une instruction delay().

Ici, une alternative non bloquante basée sur la fonction millis()

Le montage :

Connecter :

  • une LED via une résistance de 270 Ohms sur la broche 0 (=X1) de la pyboard
  • un bouton poussoir entre la broche 1 (=X2) de la pyboard et le 0V

Le code

Le point important ici est de réaliser le rappel au PLUS de la broche sur laquelle est connecté le bouton poussoir. La LED s'allume une certaine durée lors d'un appui sur le bouton poussoir (effet minuteur)

! Remarquer l'utilisation très pratique de digitalRead() sur la LED : cela permet de se passer d'une variable d'état supplémentaire, la LED étant elle-même la variable d'état.

from upyduino import *

LED=0 # broche LED
BP=1 # broche BP
appui=LOW # état BP appuyé

millis0=0 # mémorise dernier 0 survenu
delayOn=5 # durée en seconde

def setup():
    pinMode(BP, INPUT_PULLUP) # broche en entrée
    pinMode(LED, OUTPUT) # broche en sortie

def loop():

    global millis0

    if digitalRead(BP)==appui: # si appui - ICI SERA ACTIF MEME SI DELAI EN COURS !
        millis0=millis() # RAZ millis0
        print("Appui BP") # atteste appui
        if digitalRead(LED)==LOW: digitalWrite(LED, HIGH) # allume la LED si éteinte
        delay(500) # entre 2 appuis


    if millis()-millis0>(delayOn*1000) and digitalRead(LED)==HIGH : # si le délai est écoulé et LED allumée
        millis0=millis() # RAZ millis0
        digitalWrite(LED, LOW) # éteint la LED


# exécution 
setup()
while True:loop()