Agora que já temos nossa placa de desenvolvimento montada, com ESP8266 vamos explorar os periféricos, aproveitando os recursos do MicroPython.
Como de costume, vamos iniciar pelos pinos de entrada e saída.
A seguir são apresentados as funções para escrita e leitura dos pinos de I/O do ESP8266 com o MicroPython.
Pinos de I/O da placa nodeMCU
Antes de iniciarmos a manipulação dos pinos através do MicroPython, é importante entender como os pinos estão mapeados na placa nodeMCU (ou na placa que você está usando).
A figura a seguir exibe o pinout da nodeMCU:
Os pinos são nomeados GPIOX, ou seja, GPIO0, GPIO1, GPIO2, … e assim por diante.
No código MicroPython, vamos usar apenas o número: 0, 1, 2,..etc.
É importante também, caso você esteja usando a placa de desenvolvimento do artigo anterior, saber onde os pinos estão ligados através do esquemático da placa:
Pronto, agora que já sabemos como usar os pinos e onde os mesmos estão ligados, vamos para a programação.
Classe para manipulação de pinos de Entradas e Saídas digitais no MicroPython
Para manipulação dos pinos de I/O vamos usar a classe machine.Pin. Essa classe irá nos ajudar a ler os pinos de entrada e saídas digitais do ESP8266. Os pinos podem operar como entrada ou saída, conforme a sua configuração. Quando o pino está configurado como saída ele fornecerá uma tensão de saída, 0 ou 3,3 V no caso do ESP8266. A corrente máxima de saída no pino é de 12 mA e a corrente de entrada máxima é de 20 mA. Quando o pino é configurado como entrada, ele fica em alta impedância e a tensão presente no pino é lida pelo periférico de I/O.
A classe pino possui os métodos para configuração, escrita, leitura, etc, que facilitam a manipulação dos pinos. A seguir são apresentadas a funções:
# importa a biblioteca para trabalhar com os pinos: from machine import Pin # cria um pino de saída no GPIO0 p0 = Pin(0, Pin.OUT) # coloca o pino em nível baixo(0V) p0.value(0) # coloca o pino em nível alto(3,3V) p0.value(1) # cria uma entrada no pino GPIO2 com resistor de pull up interno habilitado p2 = Pin(2, Pin.IN, Pin.PULL_UP) # Lé e imprime o valor presente no pino GPIO2 print(p2.value()) # reconfigura o pino GPIO0 como uma entrada digital p0.mode(p0.IN) # configura uma interrupção(irq) para o pino GPIO0 com uma função de callback p0.irq(lambda p:print(p))
Exemplos de manipulação de pinos de Entradas e Saídas digitais com scripts MicroPython
Para nosso primeiro exemplo, vamos piscar o LED do módulo ESP-12E em intervalos de 1 segundo, o famoso blink:
from machine import Pin #importa biblioteca para trabalhar com os pinos from time import sleep #importa biblioteca para delay led = Pin(2, Pin.OUT) #define o pino do LED(2) como saída while True: #loop infinito led.value(not led.value()) #inverte o estado do LED sleep(1.0) #aguarda 1 segundo
Podemos definir uma função para inverter o estado do pino passado como parâmetro:
from machine import Pin #importa biblioteca para trabalhar com os pinos from time import sleep #importa biblioteca para delay #função para inverter estado de um pino definido como saída def toggle(p): p.value(not p.value()) #inverte o estado do pino led = Pin(2, Pin.OUT) #define o pino do LED(2) como saída while True: #loop infinito toggle(led) #inverte o estado do LED sleep(1.0) #aguarda 1 segundo
Outra forma de alterar o estado do pino é usar os métodos on() e off():
from machine import Pin #importa biblioteca para trabalhar com os pinos from time import sleep #importa biblioteca para delay #função para inverter estado de um pino definido como saída def toggle(p): p.value(not p.value()) #inverte o estado do pino led = Pin(2, Pin.OUT) #define o pino do LED(2) como saída while True: #loop infinito led.on(); #coloca o pino em nivel alto sleep(1.0) #aguarda 1 segundo led.off(); #coloca o pino em nivel baixo sleep(1.0) #aguarda 1 segundo
Agora vamos criar uma função beep() que usaremos em nossas aplicações para emitir um beep quando alguma tecla for pressionada ou para alguma sinalização.
from machine import Pin #importa biblioteca para trabalhar com os pinos
from time import sleep #importa biblioteca para delay
#função para beep p é o pino do buzzer e t é tempo de intervalo de beep
def beep(p,t):
p.on()
sleep(t)
p.off()
led = Pin(2, Pin.OUT) #define o pino do LED(2) como saída
buzzer = Pin(15, Pin.OUT) #define o pino do buzzer(15) como saída
beep(buzzer,0.2) #beep inicial ao ligar a placa
while True: #loop infinito
for i in range(5):
led.on(); #coloca o pino em nivel alto
sleep(0.5) #aguarda 1 segundo
led.off(); #coloca o pino em nivel baixo
sleep(0.5) #aguarda 1 segundo
beep(buzzer,0.5) #aciona o beep a cada 5 piscadas do LED
Infelizmente a nossa placa de testes não tem um dispositivo para entrada digital, para testarmos. As teclas estão ligadas ao expansor de I/O PcF8574 e serão lidas de outra forma, como veremos em um artigo futuro. De qualquer forma, deixo a seguir um exemplo para leitura de uma tecla, caso você precise dessa rotina em algum projeto.
Para leitura do estado de um pino usamos o método value(). O exemplo a seguir exibe a leitura de uma tecla e acionamento de um LED quando ela for pressionado:
from machine import Pin #importa biblioteca para trabalhar com os pinos
led = Pin(2, Pin.OUT) #define o pino do LED(2) como saída
tecla = Pin(5,Pin.IN, Pin.PULL_UP) #define o pino da TECLA (5) e habilita resistor de PULL_UP
while True: #loop infinito
if tecla.value() == 0:
led.off(); #coloca o pino em nivel baixo (liga o LED)
else:
led.on(); #coloca o pino em nivel alto (apaga o LED)
Conclusão
Os exemplos apresentados exibem como fazer a manipulação de pinos de entrada e saídas usando o MicroPython. Altere os exemplos ou crie novos exemplos para a leitura e escrita de valores digitais em sua placa ou projeto.
Caso tenha ficado alguma dúvida ou sugestão, deixe seu comentário abaixo.












Há um erro na linha 10 do último script
Olá Nilson. Obrigado por avisar. Fiz a correção
é possível criar um arquivo .py e executar no boot?
Sim