Els sensors digitals proporcionen informació al microcontrolador en forma de senyals digitals d'entrada (0, False quan estan en repós, i 1, True quan estan activats), que en el cas de l'ESP32 corresponen a dos valors de tensió: 0V i 3.3V.
Entrades digitals de l'ESP32
Tots els GPIO de l'ESP32 es poden utilitzar com a entrades digitals, excepte els 6 a 11 (connectats a la memòria flash). Tot i això hi ha una sèrie de pins que proposo evitar com a entrades digitals, i reservar-los per altres usos.
El sensor digital més senzill és el polsador. Aquest és un dispositiu mecànic amb un sistema de retorn automàtic.
Quan s'exerceix pressió sobre ell, canvia d'estat. Si deixem d'exercir aquesta pressió, el polsador tornarà a l'estat de repòs de manera automàtica.
Nosaltres utilitzarem un mòdul polsador KY-004. Feu atenció a la serigrafia dels pins, perquè indica com s'ha de connectar a l'ESP32.
Pautes de connexió
L'exemple utilitza un botó connectat al pin 12 per controlar l'encesa d'un LED connectat al pin 13.
Per llegir una entrada digital cal:
Importar la classe Pin del mòdul machine de MicroPython, que permet interactuar amb els pins
Crear un objecte Pin, definint el GPIO i configurant-lo com a entrada amb el mètode Pin.IN
Desar la lectura del pin en una variable i definir les accions en funció del valor d'aquesta variable (0 o 1)
Som-hi, llegim l'estat d'un polsador:
from machine import Pin
from time import sleep
boto = Pin(12, Pin.IN) # configuracio del pin com a entrada
while True:
lectura = boto.value() # desa el valor en la variable lectura
print(lectura) # mostra el valor a la consola
sleep(0.01) # pausa mínima per comoditat de lectura
Si utilitzem un polsador estandar, per evitar distorsions en el senyal, haurem d'afegir una resistència externa (10 kΩ) connectada a GND, o programar la resistència interna del pin en mode pull-down o pull-up:
boto = Pin(12, Pin.IN, Pin.PULL_DOWN)
El mode pull-down provoca senyal 1 en prèmer el botó / pull-up provoca senyal 0 en prèmer el botó
Control de l'encesa d'un LED
Utilitzant l'estructura condicional if/else podem controlar el funcionament d'un LED o qualsevol altre actuador amb un polsador o qualsevol altre sensor digital.
Som-hi, fem que un LED s'encengui en prèmer el polsador, i s'apagui quan es deixi anar.
from machine import Pin
from time import sleep
led = Pin(13, Pin.OUT) # configuracio del pin com a sortida
boto = Pin(12, Pin.IN) # configuracio del pin com a entrada
while True:
lectura = boto.value() # desa el valor en la variable lectura
if lectura == 1: # la igualtat lògica s'expressa amb ==
led.value(1)
else:
led.value(0)
sleep(0.01) # pausa mínima per comoditat de lectura
Simplifiquem el codi
while True:
lectura = boto.value()
led.value(lectura)
sleep(0.01)
Polsador com a interruptor
Fem un botó multiestat per controlar actuadors.
Es tracta que, en prémer el polsador un LED canviï d'estat, és a dir s'encengui si estava apagat i s'apagui si estava encès.
Fem-ho utilitzant una variable booleana estat_led i cada cop que premem el polsador invertir el seu valor: not estat_led
Ara només caldrà definir que el valor de la sortida sigui == al valor de l'estat del led: led.value (estat_led)
from machine import Pin
from time import sleep
led = Pin(13, Pin.OUT)
boto = Pin(12, Pin.IN)
estat_led = False # variable booleana (True/False)
while True:
lectura = boto.value()
if lectura: # cada cop que premem el botó canviarà l'estat del led
estat_led = not estat_led
led.value(estat_led)
sleep(0.01)
Solucionem el problema de la resposta aleatòria
El funcionament del sensor com a interruptor de vegades funciona, de vegades no.
Això passa perquè el programa fa milers de voltes cada segon. Quan mantenim el botó premut, es detecta moltes vegades.
Per solucionar-ho actuarem només quan el botó passa de NO premut a premut.
if boto_actual == 1 and boto_anterior == 0:
boto_anterior = 0
estat_led = False
while True:
boto_actual = boto.value()
if boto_actual == 1 and boto_anterior == 0:
estat_led = not estat_led
led.value(estat_led)
boto_anterior = boto_actual
sleep(0.01)
Solucionem el problema dels rebots
Adoneu-vos que la resposta és aleatòria, perquè la entrada no canvia immediatament de valor (pels rebots, bounce).
La majoria de polsadors reboten: quan els premem i els deixem anar, les parts mecàniques oscil·len i produeixen diverses puntes de pujada i baixada. Per tant, si volem precisió de resposta, haurem de posar el controlador a dormir durant la fase dels rebots.
.
Utilitzant polsadors (o qualsevol altre sensor digital) podem ...