Entradas e Saídas digitais no MicroPython com ESP8266

Entradas e Saídas digitais
Este post faz parte da série MicroPython com ESP8266. Leia também os outros posts da série:

Agora que já temos nossa placa de desenvolvimento montada, 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.off();                    #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.

Outros artigos da série

<< Placa de testes para MicroPython com ESP8266Entrada analógica com MicroPython no ESP8266 >>
Este post faz da série MicroPython com ESP8266. Leia também os outros posts da série:
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Fábio Souza
Engenheiro com experiência no desenvolvimento de projetos eletrônicos embarcados. Hoje é diretor de operações do portal Embarcados, onde trabalha para levar conteúdos de eletrônica, sistemas embarcados e IoT para o Brasil. Também atua no ensino eletrônica e programação pelo Brasil. É entusiastas do movimento maker, da cultura DIY e do compartilhamento de conhecimento, publica diversos artigos sobre eletrônica e projetos open hardware, como o projeto Franzininho Participou da residência hacker 2018 no Redbull Basement. Quando não está ministrando palestras, cursos ou workshops, dedica seu tempo “escovando bits” ou projetando placas eletrônicas.

1
Deixe um comentário

avatar
 
1 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
1 Comment authors
Fabio Roberto Vieira da Silva Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Fabio Roberto Vieira da Silva
Visitante
Fabio Roberto Vieira da Silva

é possível criar um arquivo .py e executar no boot?