Interagir com o circuito é quase sempre uma necessidade. Mas interagir usando a comunicação serial pode ser uma coisa complicada, ainda mais quando precisamos que o circuito funcione desacoplado do computador. Sendo assim, vamos aprender a fazer leituras das portas digitais e da porta analógica do NodeMcu.

Na aula passada, vimos que o modulo GPIO do NodeMcu é bem tranquilo de usar. As funções foram bem parecidas com as do Arduino, e, para leitura digital, não será diferente.

Recomendo este post que explico um pouco da teoria por trás da leitura digital. Além disso, vamos utilizar um potenciômetro em um dos circuitos, então, se você quiser conhecer melhor sobre esse componente, leia este post.


Informações importantes

Antes de sair colocando tensões nos pinos digitais do NodeMcu, é crucial conhecer qual é a tensão máxima de entrada de cada um. Tanto para os pinos digitais quanto para os analógicos, a tensão pode variar entre 0 e 3.3V. A tensão limite para não danificar a placa é 3.6V.

Então, temos que tomar muito cuidado se formos ler alguma tensão externa. Caso contrário, é mais tranquilo, porque a placa já funciona com 3.3V. Portanto, não tem como ter uma tensão maior que isso. Vale dizer que, em algumas versões da placa, todos os pinos possuem proteção contra sobretensão. Mas não é bom arriscar, né?


Leitura digital

Para entender a leitura digital, vamos utilizar 2 botões físicos para, cada um, comandar 1 LED.

Circuito

Circuito NodeMcu acendendo LEDs com botões

A ligação dos LEDs é a mesma que vimos na aula anterior. No caso dos botões, é bem simples: basta ligar o GND em uma ponta e conectar a outra ponta em uma porta digital do NodeMcu. Tem que ser no GND, pois vamos acionar o resistor de pullup interno do NodeMcu

Os LEDs estão sendo controlados pelos pinos D0 e D1. E os botões estão sendo lidos pelos pinos D2 e D3.

Programação

Assim como na aula anterior, começamos criando variáveis para nossos pinos de acordo com o circuito:

1
2
3
4
led1 = 0
led2= 1
bot1 = 2
bot2 = 3

Agora, configure os LEDs como saída (vimos na aula passada) e os botões como entrada. O comando é o mesmo:

gpio.mode(bot1, gpio.INPUT, gpio.PULLUP)

A diferença é que, no segundo parâmetro, utilizei INPUT, e adicionei um terceiro parâmetro. O fator gpio.PULLUP serve para acionar a resistência de pull-up interna do NodeMcu. Como queremos uma leitura estável, temos que acioná-lo.

E, para fazer a leitura das entradas digitais, temos o seguinte comando:

gpio.read(bot1)

Ele retorna o estado do pino: 1 ou True se o pino receber sinal de nível alto; 0 ou False se o pino receber sinal de nível baixo.

Por fim, basta comandar os LEDs a partir dos botões. Para isso, vou usar o comando gpio.write e o parâmetro de acionamento vai receber o próprio gpio.read():

gpio.write(led1, gpio.read(bot1)) 

O acionamento do botão fica dependente do estado do pino. Quando apertamos o botão, gpio.read() lê 0 e o LED é apagado. A última parte da programação é envolver os comandos em um while true e adicionar um delay. Se não houver delay, o código pode dar erro. Confira o código completo abaixo.

Código completo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
led1 = 0
led2 = 1
bot1 = 2
bot2 = 3

gpio.mode(led1, gpio.OUTPUT) -- Configura os leds como saida
gpio.mode(led2, gpio.OUTPUT)

gpio.mode(bot1, gpio.INPUT, gpio.PULLUP) -- Configura os botoes como entradas
gpio.mode(bot2, gpio.INPUT, gpio.PULLUP)

while true do -- Loop infinito
  gpio.write(led1, gpio.read(bot1)) -- O led 1 recebe o valor lido pelo botão 1

  gpio.write(led2, gpio.read(bot2)) -- O led 2 recebe o valor lido pelo botão 2
  tmr.delay(500*1000) --Delay de 500ms
end

Leitura analógica

Para o caso da leitura analógica, vamos utilizar um potenciômetro para variar a tensão que enviaremos à porta analógica.

Circuito

Circuito NodeMcu lendo potenciômetro

O circuito é bem simples: ligue o GND em uma extremidade do potenciômetro e o 3.3V na outra. Por fim, o pino central dele deve ser ligado ao único pino analógico da placa: A0.

Programação

Para fazer a leitura da porta analógica é bem direto, pois só existe uma. Basta usar o seguinte comando:

adc.read(0)

O parâmetro ‘0’ é justamente o pino para leitura. Como só existe 1 pino, é só deixar do jeito que está. E, para saber qual valor que está sendo lido, vamos apenas printar no console. Fazemos isso usando o comando:

print(leitura)

Agora é só envolver os códigos em um loop e adicionar um delay. Pronto, com esse código você já pode ver quais valores a placa está lendo.

Código completo

1
2
3
4
5
6
7
while true do -- Loop infinito
  val = adc.read(0) -- Variavel com a leitura analógica

  print(val) -- Printa no console

  tmr.delay(500*1000) -- Delay de 500ms
end

NodeMcu-Executar duas funções ao mesmo tempo – Aula 5 – NB