Interagir com o circuito é quase sempre uma necessidade. E a forma mais fácil de fazer isso é por meio de botões e ou usando um potenciômetro. Sendo assim, vamos aprender a fazer leituras das portas digitais e da porta analógica do esp8266.

Na aula anterior, aprendemos a acionar os pinos digitais do esp.

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 básicas

Antes de sair colocando tensões nos pinos digitais do NodeMcu, é crucial conhecer qual é a tensão máxima de entrada de cada um. No caso, a faixa de valores adequados de tensão para usar nos pinos digitais e analógicos é de 0 a 3,3 V. Entretanto, a real tensão limite para não danificar a placa é 3,6 V.

Assim como foi dito em aulas anteriores, o pino analógico do módulo esp8266 (CI) suporta apenas tensões de 0 a 1 V, mas o divisor de tensão presente no NodeMcu é quem permite a leitura de tensões de 0 a 3,3 V.

Então, temos que tomar muito cuidado se formos ler alguma tensão externa. 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 do esp8266

Para entender a leitura digital, vamos utilizar 2 botões físicos para cada um ser responsável por acionar 1 LED.

Circuito

Circuito esp8266 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 pull-up 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

Não tem mistério na programação, pois o processo para ler um pino digital é o mesmo feito no Arduino UNO. Primeiro definimos o pino como entrada ativando o pull-up interno:

pinMode(pino, INPUT_PULL_UP);

Em seguida, para ler o pino, é só usar o comando:

digitalRead(pino);

Onde pino é o número do GPIO.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// Duas formas de definir os pinos:
// Pela numeração do NodeMCU:
#define LED_1   D0
#define LED_2   D1
#define BOTAO_1 D2
#define BOTAO_2 D3

// Pela numeração do GPIO:
//#define LED_1   16
//#define LED_2   5
//#define BOTAO_1 4
//#define BOTAO_2 0

void setup()
{
  // Configura LEDs como saída
  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);

  // Configura botões como entrada
  pinMode(BOTAO_1, INPUT_PULLUP);
  pinMode(BOTAO_2, INPUT_PULLUP);
}

void loop()
{
  // Leitura do botão 1
  if(digitalRead(BOTAO_1) == 0)
  {
    digitalWrite(LED_1, HIGH);
    delay(200); // debounce do botão
  }
  else // Se não está pressionado
  {
    digitalWrite(LED_1, LOW);
  }

  // Leitura do botão 2
  if(digitalRead(BOTAO_2) == 0)
  {
    digitalWrite(LED_2, HIGH);
    delay(200); // debounce do botão
  }
  else // Se não está pressionado
  {
    digitalWrite(LED_2, LOW);
  }
}

Leitura analógica do esp8266

Para o caso da leitura analógica, vamos utilizar um potenciômetro para variar a tensão que enviaremos à porta analógica. E o valor lido será printado no monitor serial.

Circuito

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

Programação

Novamente, o comando é o mesmo que o do Arduino UNO e afins:

analogRead(A0);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#define POTENCIOMETRO   A0


void setup()
{
  // Inicializa a comunicação serial
  Serial.begin(115200);
}

void loop()
{
  // O valor lido varia de 0 a 1023, portanto devemos
  // usar uma variável de 16 bits
  uint16_t valor_lido = analogRead(POTENCIOMETRO);

  Serial.println("Leitura da porta analógica:" + String(valor_lido));

  // Delay entre leituras
  delay(1000);
}