O ESP8266-01 é o módulo Wi-Fi de menor custo da família, em contrapartida, é o módulo com a menor quantidade de recursos disponíveis. Em termos de GPIO, temos apenas 4 pinos que podem ser usados para isso, GPIO0, 1, 2 e 3. Destes, GPIO1 e GPIO3 são compartilhados com os pinos TX e RX respectivamente, usa-los como GPIO impossibilita o uso de comunicação serial em nosso programa. Assim ficamos apenas com 2 pinos disponíveis para GPIO, correto? Não é bem assim que as coisas funcionam. Neste artigo iremos configurar GPIO do ESP8266-01, abordando as particularidades desses dois pinos, o que acaba limitando sua utilização.
Opções de Boot do ESP
Os módulos da família ESP podem ser inicializados de formas diferentes de acordo com o estado lógico de alguns de seus pinos. A tabela a seguir demonstra essa lógica de inicialização:
Como podemos perceber na imagem, os pinos GPIO0 e GPIO2, que são os dois disponíveis no ESP-01, são usados para o sistema de boot (GPIO15 também é utilizado, mas no ESP-01 ele é mantido em nível 0 por um resistor de pull down). Isso impacta na forma como podemos utiliza-los em nossos circuitos, pois temos que manter os estados deles em nível alto na inicialização e reset do sistema.
Para manter o nível alto, devemos ter resistores de pull up nesses dois pinos, o valor deste resistores pode variar entre 2KR a 10KR.
GPIO0 e GPIO2 como Output
Com os resistores de pull up, devemos fazer o acionamento de nossos dispositivos externos em nível baixo, mantendo os resistores em paralelo. A imagem abaixo mostra como podemos acionar um rele através de um optoacoplador e um led com do ESP-01.
Utilizamos resistores de 3K3R para manter o nível dos pinos no reset, quando o firmware do ESP subir, mantemos o nível alto destes pinos e quando desejarmos acionar a carga enviamos nível baixo para o respectivo pino.
GPIO0 e GPIO2 como Input
Para utilizarmos os pinos como entrada, a princípio, a lógica seria a mesma. Mante-los em nível alto na inicialização através de resistores e após o firmware iniciar passarmos a ler nível baixo como acionamento. Isso é verdade quando podemos afirmar que na inicialização as entradas não estarão acionadas.
Imagine um interruptor/botão que envia nível 0 quando ligado/pressionado, se o ESP, por algum motivo, reiniciar com o interruptor ligado, o módulo não ira inicializar o firmware e o projeto ira travar.
Para evitar esse problema podemos fazer um truque que nos garante que o módulo sempre ira inicializar corretamente. Em contrapartida iremos perder uma entrada. Veja o circuito a seguir.
No circuito utilizamos uma chave ligada entre os GPIO0 e 2, nesse caso, independente da posição da chave, na inicialização do ESP os resistores de pull up irão garantir o boot corretamente.
O truque está após o boot, quando nosso firmware for executado não precisamos se preocupar mais com o estado dos pinos, então na função setup() (caso estiver usando a IDE do Arduino) configuramos o GPIO0 como saída e escrevemos 0 nele. Assim, se a chave estava fechada, só neste momento ela irá enviar nível 0 para o GPIO2. Na função loop() podemos fazer a leitura do GPIO2 sem nenhum problema.
Conclusão
O ESP-01 é muito útil e fácil de ser encontrado mas é preciso estar atento para não travar em alguns obstáculos que ele nos impõe. Aprendi por experiência própria e aqui está a dica para que você não caia nessa também. Tem alguma dúvida ou alguma dica que gostaria de passar? Deixe seu comentário e compartilhe seu conhecimento conosco.
Referências
Créditos para a imagem de destaque.








Boa tarde Josemar Estou tentando usar o GPIO0 e o GPIO2 do ESP 01 com um circuito que montei da seguinte forma: GPIO0 como INPUT e GPIO2 como OUTPUT que vai acionar um relé que abrirá uma fechadura elétrica, porém na inicialização do ESP o GPIO2 dá um pulso que quer dizer que se faltar energia e após a volta da energia o portão abrirá, estou usando a biblioteca SINRIC e já inseri o valor LOW para este pio no setup, mas ainda assim o pulso continua. Tem alguma idéia do que pode estar ocorrendo? Obs: estou usando resistor de… Leia mais »
Pelo que vi no datasheet, o GPIO0 corresponde ao pino 15 e GPIO2 ao pino 14. Como na programação na IDE Arduino colocam PinMode(0, OUTPUT) e DigitalWrite(0, LOW). Que zero é esse? Não seria 14 ou 15?
Desde já, Agradeço!
Parabéns pelo excelente artigo!
Reginaldo Assis, Bahia
Obrigado pelo comentário Reginaldo.
As funções PinMode e digitalWrite manipulam os GPIOs do esp.
Sendo assim PinMode(0, OUTPUT) manipula o GPIO 0 (que está no pino 15).
PinMode(2, OUTPUT) manipula o GPIO 2 (que está no pino 14).
Ótimo! Parabéns!
Como faço ligaçoes nos pinos 0 1 2 e 3 do esp 01?
Ola, qual é a corrente max dos GPIO?
Bom dia.
Estou iniciando nesse mundo….e comprei o esp8266 é juntantamente com um conjunto rele aciona duas lâmpadas via comando blink. Porém quando cai a energia …e o ESP reinicia ele liga a lampadas . Tem algum comando de programação para eu reset as output imediatamente quando a energia e restabelecida? Obrigado
Bom dia Alexandre. Coloque no sketch (definições) que GPIO 0 e 2 fiquem em estado de desligado (LOW ou HIGH dependendo do hardware).
No caso dos relés tambem resolve-se usar os contatos NORMALMENTE FECHADOS ou ABERTOS (NO ou NC). Abs.
Bom dia, gostaria de utilizar um dos pinos GPIO como interrupção isso é possivel ?
Boa noite. Como faço para gravar códigos no arduino sem utilizar o cabo USB? Este módulo permite fazer isso? Obrigado.
Gostaria de usar o GPIO 2 como INPUT_PULLUP para ao pressionar um botao ligar meu dispositivo em um modo de configuração e aprendizagem dentro do meu algoritmo. O GND por ser ligado direto ao GPIO 2 ou precisa de um resistor de 10k?
Diego, pelo que entendi já irá ligar um resistor de pullup no GPIO2, nesse casa pode ligar o botão no GND, e ao pressionar o botão o GND vai ser ligado ao GPIO2.
Se estiver falando de usar um resistor interno ao ESP, teria que dar uma olhada no manual do ESP8266. Eu não sei se ele possui.
Bom dia Josemar!
No meu circuito, o GPIO0 faz o acionamento de um relé através de um transistor.
Quando ligo o circuito na rede, a GPIO0 do ESP emite uma pequena corrente e isso faz a luz que está conectada no rele piscar. Após o boot, funciona perfeitamente. Existe alguma forma de fazer com que quando dê o boot no circuito eu “jogue fora” essa corrente inicial do GPIO0?
Muito obrigado!