Utilizando o ADC do ESP8266

Não são apenas sinais digitais que compõem um sistema embarcado. Sinais analógicos são bastante utilizados, principalmente mas não limitados, em sensores. Alguns sensores geram sinais analógicos, como sensores de temperatura, luminosidade e até mesmo alguns acelerômetros.

O ESP8266 possui apenas uma entrada analógica, e vamos neste artigo demonstrar o uso desta funcionalidade para leitura de sinais analógicos.

ADC

O ADC, ou Conversor Analógico Digital, é um circuito que transforma um sinal analógico, normalmente dado pela variação da tensão ou corrente, em uma representação digital, que pode variar de acordo com a resolução do conversor.

Por exemplo, um ADC com resolução de 10 bits, terá um valor de 0 a 1023, representado por 2^10, ou seja, se estamos medindo um valor de 0 a 1 Volt, sua representação será 1V/1023 níveis ou 0,9mV de resolução (no melhor dos casos).

Quanto maior a resolução do ADC, mais sucessível a ruido ele será, sendo necessário em alguns casos, aplicar filtros ou desprezar as últimas casas de precisão. Isso se aplica em casos específicos.

ADC no ESP

O ESP possui apenas um canal ADC de resolução de 10 bits, e aceita a amplitude máxima de 1 Volt, limitando bastante o seu uso, ou sendo necessário adequar o sinal para o valor máximo de 1V. O pino do ADC é chamado de TOUT e corresponde ao pino número 6 do chip.

O ADC do ESP é do tipo SAR (Successive Approximation), sendo um dos tipos mais comuns de ADC no mercado de ADC de média para alta resolução. Para quem quiser entender mais deste tipo de ADC, recomendo esta leitura.

Para a maioria das aplicações, o ADC do ESP dá conta, dependendo apenas de algumas adequações no circuito para o sinal de entrada não ultrapassar o 1V.

Em alguns casos, uma resolução maior ou um número maior de canais é necessário, sendo recomendado o uso de um ADC externo, como o MCP3008 de 10 bits e 8 canais ou MCP3208 de 12 bits e também 8 canais.

No ESP, o ADC tem duas funções, mas não de forma simultânea. Na primeira função é a leitura do sinal de tensão do pino 6 (TOUT) e a segunda função é a leitura da tensão dos pinos de alimentação do ESP.

No caso do uso da segunda opção, a leitura dos pinos de alimentação, o pino 6 TOUT não pode estar conectado em nada, devendo permanecer aberto para que o funcionamento ocorra sem problemas e não cause nenhum dano. Essa função é comumente utilizada para o monitoramento da tensão do ESP, principalmente em casos de alimentação por bateria.

Utilizando o ADC na IDE Arduino

Leitura do TOUT

Para realizar a leitura, no pino TOUT na IDE Arduino, utilizamos a seguinte função:

Onde o valor lido pode variar, de acordo com o sinal, de 0 a 1023, correspondendo aos 10 bits de resolução.

Código Exemplo

Leitura da alimentação do ESP

Para ler o valor de alimentação do ESP, lembrando que TOUT nesse caso deve ser desconectado, utilizamos as seguintes funções:

Antes da inicialização, logo após os #includes:

E para a leitura dos valores de tensão

Se for o caso, dividir o valor por 1000 já que o valor lido está em mV.

Outras plataformas

O funcionamento nas outras plataformas é o mesmo, mudando apenas a forma de leitura, como no nodeMCU.

ou

Conclusão

O ADC do ESP atende em muitos casos, sendo a sua maior limitação a quantidade de canais. Dá para utilizar o ESP facilmente em muitos projetos e ainda utilizar para o monitoramento da alimentação do ESP, ideal para determinar se a bateria do ESP está em boas condições, por exemplo.

Em casos em que o ADC do ESP não pode atender, ainda dá para usar um externo, como já citado.

 

Happy Hacking!!!

 

[1] http://bbs.espressif.com/viewtopic.php?f=21&t=412&p=1545#p1545

12 Comments

  1. Euler Oliveira

    Boa tarde Pedro.

    Primeiramente meus parabéns por mais um artigo com um conteúdo bastante interessante.

    Nos testes que fiz do potenciômetro junto ao NodeMCU e no monitor serial da IDE do Arduino, percebi que quando giro o potenciômetro todo no sentido anti-horário a leitura no ADC fica oscilando entre 0 e 23 bits como se fosse uma espécie de ruído. Nunca estabiliza em 0. Com LDR foi a mesma coisa. Pesquisei a respeito e não encontrei uma solução, apenas debates sem uma conclusão. Testei em 3 NodeMCUs e em ambos tive este problema com o ADC. Você já passou por isso também? Se sim, conseguiu resolver?

    Obrigado!

    Reply
    1. Pedro Minatel (Post author)

      Euler, isso é ruido, já que corresponde a cerca de 20mV se analisar da seguinte forma:

      (1V/1023)*23 = 0.02V ou 20mV

      Se tiver um osciloscópio, talvez você consiga analisar esse ruido.
      A solução seria utilizar um limiar que considere valores acima de 23 para “filtrar”.

      Reply
      1. Euler Oliveira

        Muito obrigado pela resposta Pedro.

        Foi justamente o que fiz para contornar este ruído. Deixei definido no código que qualquer valor abaixo de 23 será igual a 0. De qualquer forma sua resposta confirmou o que eu já imaginava que poderia estar causando esta oscilação.

        Reply
        1. Pedro Minatel (Post author)

          20mV é um valor bem baixo, e dependendo do circuito pode ser até maior o ruído.

          Reply
          1. Euler Oliveira

            Certo. Vou me atentar a isso nos testes que eu for fazendo com o ADC do NodeMCU / ESP8266.

            Obrigado!

  2. Charles Ferreira

    Olá!! Qual a taa de amostragem do ADC do ESP8266? Estou trabalhando em uma aplicação com transmissão de dados sem fio onde os sinais capturados pelo ADC estão na faixa de 1 kHz (max). Obrigado pela atenção! =)

    Reply
    1. Pedro Minatel (Post author)

      Charles, a Espressif não coloca essa informação nas documentações, é muito complicado achar informações a respeito disso. Tem alguns casos, dizendo que conseguem 2.5kHz de taxa de amostragem, mas nunca consegui ir muito além de 1kHz na programação nativa.
      Acredito que teria que testar os limites dele na pratica.

      Reply
      1. Bruno Scherer

        Esse valor não está muito baixo Pedro? O arduino usa um cristal de clock de 16MHz o ESP8266 tem um clock de 2.4GHz… Se for esse valor mesmo, fiquei meio na mão agora com o ESP… Precisava de ao menos 25KHz no ADC.

        Reply
        1. Bruno Scherer

          Depois de umas pesquisas verifiquei que é esse mesmo o valor da taxa de amostragem do adc do esp8266, porem eu cometi um pequeno erro nos meus cálculos e descobri que ainda vou poder usar o esp8266 nesse taxa de amostragem mesmo.. kkk VLW

          Reply
  3. Alexandre Magno

    A plaquinha ESP-01 pode fazer leitura analógica?

    Reply
    1. Robson
  4. R

    Legal pessoal, vou tentar fazer um medidor de nível de som, com um microfone. O mais legal de tudo, é que outro dia um cara perguntou se alguém conhecia alguma placa pequena tipo um Raspberry Pi Zero, e eu postei ESP12, e o cara me disse que não serve porque ele queria uma placa embarcada, falar o que né!

    Reply

Deixe seu comentário