A coisa mais simples para começar a programar o esp8266 é tentar acionar alguns LEDs. Portanto, neste post, vamos aprender a controlar as portas digitais para acionar um LED normalmente e com PWM.

Na aula anterior, vimos como instalar os drivers do esp na IDE do Arduino.

Em outros posts, já expliquei um pouco sobre o LED e o PWM. Então, recomendo a leitura caso você não conheça um dos termos.

Informações básicas

Acho importante mencionar que este site contém uma documentação explicando alguns dos comandos adicionais que podem ser usados para trabalhar com o esp8266. Então use ele como um complemento ao que será tratado no curso.

Pinos

Na programação, os pinos NÃO obedecem a numeração da placa. Isto é, o pino 0 não corresponde ao pino D0. Na realidade eles seguem a numeração do escrito GPIO mostrado na imagem abaixo:

Ou seja, para referenciar o pino D0 na programação, seria necessário escrever 16 (GPIO16). Entretanto, ainda é possível usar a numeração da placa, mas, para isso, é preciso escrever um D antes (exemplo: D0).

Estranhamente, na minha placa do NodeMcu, os pinos D1 e D2 estão com a mesma marcação, recebendo o nome de D2 (talvez um erro de fabricação). Apesar disso, o primeiro D2 é na verdade o D1 mesmo. Veja abaixo:

nodemcu e esp8266 pinos da minha placa

Escolhendo a placa na IDE e gravando o firmware

Antes de começar a programar, é preciso escolher a placa na IDE do Arduino. Para isso, vá em “Ferramentas” -> “Placa” -> “ESP8266 Boards” e escolha a “NodeMcu 1.0 (ESP12E Module)”. Se sua placa for outra, basta escolher outra opção apropriada. Não é necessário mexer em mais nenhuma configuração por enquanto.

Em aulas futuras, poderemos aprender sobre essas configurações, mas, por curiosidade, apenas observe o valor de duas configurações importantes: a velocidade do clock (“CPU Frequency”) e o tamanho da memória flash (“Flash Size”). Por padrão, a velocidade do clock fica em 80 MHz e o tamanho da flash do módulo instalado no NodeMcu é de 4 MB. É possível alterar a forma como a flash é usada permitindo mais ou menos espaço para armazenar arquivos internamente (FS de File System) ou então espaço para armazenar um firmware de uma atualização remota (OTA). Não preocupe em entender isso por enquanto.

Por fim, preciso citar que o processo de gravação é teoricamente igual ao do Arduino. Isto é, basta clicar no botão de “Upload” e esperar. A diferença é que a gravação do esp demora um pouco mais. Além disso, pode ser o caso da gravação não ser bem-sucedida e uma mensagem de erro pode aparecer. Se for o caso, na hora que aparecer a mensagem de que a gravação está sendo iniciada, tente apertar o botão de reset da placa.

Acionamento simples

Vamos começar com um simples acionamento de 2 LEDs. De forma que um fica acionado e o outro apagado, e, após um tempo, eles trocam de estado. Ou seja, eles ficam piscando de forma intercalada.

Circuito

Circuito esp8266 acendendo 2 LEDs

Basta ligar o ânodo dos LEDs nos pinos digitais D1 e D2 (ou em pinos da sua escolha). O cátodo deve ser ligado a um resistor (utilizei resistores de 220 Ω). E, a outra ponta do resistor deve ser ligada ao GND da placa.

Obs.: No meu caso, como o D1 recebe o nome de ‘D2’, eu liguei no ‘D2’ e D2 (pinos 1 e 2).

Programação

Conforme mencionei anteriormente, a programação para esse caso é igualzinha ao Arduino UNO e afins. Ou seja, inicialmente define-se o pino como saída:

pinMode(pino, OUTPUT);

Após isso, para acionar um pino digital basta usar o comando:

digitalWrite(pino, estado_pino);

Onde pino é o número do GPIO e estado_pino e o valor do acionamento (HIGH/LOW).

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
// Duas formas de definir os pinos:
// Pela numeração do NodeMCU:
#define LED_1   D1
#define LED_2   D2

// Pela numeração do GPIO:
//#define LED_1   5
//#define LED_2   4

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

void loop()
{
  // Pisca os LEDs de forma intercalada a cada 1 segundo
  digitalWrite(LED_1, HIGH);
  digitalWrite(LED_2, LOW);
  delay(1000);

  digitalWrite(LED_1, LOW);
  digitalWrite(LED_2, HIGH);
  delay(1000);
}

Acionamento por PWM

Vou utilizar o mesmo circuito do acionamento simples. Só que, neste caso, vou usar apenas o LED ligado ao pino D1 e tirar o outro. O objetivo agora é controlar o brilho do LED.

Programação

Novamente, o comando é o mesmo que o do Arduino UNO e afins. A diferença é que a resolução do PWM é de 10 bits, o que significa que o acionamento pode ir de 0 a 1023:

analogWrite(pino, valor);

Onde pino é o número do GPIO e valor é o valor do acionamento (0 a 1023).

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// Duas formas de definir o pino:
// Pela numeração do NodeMCU:
#define LED_1   D1

// Pela numeração do GPIO:
//#define LED_1   5

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

void loop()
{
  // Aumenta o brilho gradualmente
  for(uint16_t i = 0; i < 1023; i++)
  {
    analogWrite(LED_1, i);
    delay(10);
  }
  delay(1000);
}