ADS1115 Conversor Analógico Digital com ESP8266
Se você precisa efetuar leituras analógicas de forma precisa e confiável, confira neste post como usar o módulo conversor analógico digital ADS1115 em conjunto com o ESP8266 NodeMCU, uma das placas mais utilizadas em projetos de IoT.
O ADS1115 funciona com ESP8266 mas também pode ser usado por exemplo em projetos com Arduino ou Raspberry Pi, onde seja necessário um maior número de portas analógicas ou a leitura de sensores com precisão, já que o módulo possui resolução de 16 bits.
O módulo conversor analógico digital ADS1115
O módulo conversor analógico digital (ADC) ADS1115 que vamos usar é esse da imagem abaixo, que tem 4 canais (4 entradas analógicas) e comunicação I2C, o que permite a sua ligação com a maioria das placas e microcontroladores do mercado.

A alimentação do módulo é de 2 à 5.5 VDC e em um mesmo barramento I2C você pode ligar até 4 módulos, já que é possível mudar o endereço I2C do ADS1115 por meio do pino ADDR. No módulo que estamos usando, foram detectados os endereços I2C mostrados na tabela abaixo.
Você consegue setar os diferentes endereços conectando o pino ADDR do módulo aos pinos Vcc, GND, SDA ou SCL. Confira:
| CONEXÃO PINO ADDR | ENDEREÇO I2C |
| VDD | 0x49 |
| GND | 0x48 |
| SDA | 0x4A |
| SCL | 0x4B |
Como outras características podemos destacar também a taxa de amostragem (de 8 a 860 samples por segundo) e o PGA interno, um amplificador de ganho programável com controle digital.
Conexão do conversor ADS1115 no ESP8266 NodeMCU
Como sabemos, o ESP8266 NodeMCU tem apenas uma porta analógica, e com o ADS1115 vamos expandir esse número de portas, adicionando mais 4 delas.
A porta analógica nativa do NodeMCU suporta tensões entre 0 e 1V, e no caso do módulo conversor analógico digital a tensão máxima suportada pelas portas analógicas será aquela com a qual alimentamos o módulo, ou seja, se usarmos alimentação de 5V, podemos enviar até 5V nas portas analógicas.
No caso do NodeMCU que estamos usando vamos alimentar o módulo ADS1115 com 3.3V, logo essa será a tensão máxima suportada nos pinos A0, A1, A2 e A3. Isso é especialmente importante (e interessante) se usarmos sensores “próprios” para o ESP8266, que trabalham com nível de sinal de 3.3V.
Nosso circuito de teste fica assim:

Usamos trimpots de 1K nos testes, mas você pode usar outros valores ou potenciômetros, se preferir.
Programa e configuração NodeMCU com ADS1115
Antes de mandar o programa para o NodeMCU, vamos apenas relembrar como adicionar essa placa na IDE Arduino.
Dentro da IDE, acesse o menu Arquivo e em seguida Preferências. No campo URLs Adicionais para Gerenciadores de placas, coloque a URL abaixo:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
Clique em OK e agora acesse o menu Ferramentas -> Placa -> Gerenciador de Placas. Na tela seguinte procure por ESP8266 e selecione esp8266 by ESP8266 Community, clicando em seguida em instalar:

As placas da linha ESP8266 aparecerão na lista de placas disponíveis e agora basta você selecionar NodeMCU 1.0 (ESP-12E Module) como mostra a imagem abaixo:

Vamos precisar também carregar na IDE a biblioteca ADS1115_WE.
Para isso, acesse o menu Sketch -> Incluir Biblioteca -> Gerenciar Bibliotecas. No gerenciador, procure por ADS1115 e selecione a biblioteca ADS1115_WE, clicando em seguida em Instalar:

Dúvidas na instalação da biblioteca? Confira o post Como instalar uma biblioteca na IDE Arduino.
Feito isso, carregue o programa abaixo no NodeMCU. Na linha 8 definimos o endereço do nosso módulo (0x48, com o pino ADDR conectado ao GND do circuito).
O programa faz uma varredura contínua das portas analógicas, mostrando os valores (em volts) no serial monitor.
//Programa: Conversor Analogico Digital ADS1115 com ESP8266 NodeMCU
//Autor: Arduino e Cia
#include<ADS1115_WE.h>
#include<Wire.h>
//Endereco do modulo ADS1115
#define I2C_ADDRESS 0x48
ADS1115_WE adc(I2C_ADDRESS);
void setup()
{
Wire.begin();
Serial.begin(9600);
if(!adc.init())
{
Serial.println("ADS1115 nao conectado!");
}
adc.setVoltageRange_mV(ADS1115_RANGE_6144);
adc.setCompareChannels(ADS1115_COMP_3_GND);
adc.setMeasureMode(ADS1115_CONTINUOUS);
Serial.println("ADS1115 com ESP8266 NodeMCU - Leitura continua");
Serial.println("Todos os valores em volts!");
Serial.println();
}
void loop() {
float voltage = 0.0;
Serial.print("Pino A0: ");
voltage = readChannel(ADS1115_COMP_0_GND);
Serial.print(voltage);
Serial.print(", Pino A1: ");
voltage = readChannel(ADS1115_COMP_1_GND);
Serial.print(voltage);
Serial.print(", Pino A2: ");
voltage = readChannel(ADS1115_COMP_2_GND);
Serial.print(voltage);
Serial.print(", Pino A3: ");
voltage = readChannel(ADS1115_COMP_3_GND);
Serial.println(voltage);
delay(1000);
}
float readChannel(ADS1115_MUX channel)
{
float voltage = 0.0;
adc.setCompareChannels(channel);
voltage = adc.getResult_V(); // alternative: getResult_mV for Millivolt
return voltage;
}
Abra o serial monitor e confira os valores lidos das portas analógicas:

Recomendo abrir os exemplos da biblioteca ADS1115_WE e checar os parâmetros utilizados no programa. Existem vários ajustes que podem ser feitos e que serão úteis para o seu projeto.
Gostou? Confira outros posts usando ESP8266 aqui mesmo no Arduino e Cia!
Boa tarde,
Uma dúvida. Quero usar o ads1114 com a voltagem de 5 volts de alimentação para poder usar a maior precisão possível. No datasheet a tensão nos pinos sda, scl pode chegar a 5.5v que poderia danificar o esp32. Este meu entendimento seria correto? já vi projetos usando 5 volts no vref e mesmo assim conectando os pinos sdae scl diretamente no esp32
desde já agradeço a atenção
Oi Sérgio,
Eu também já vi dessa maneira e também já testei assim, sem problemas. Mas eu recomendo o uso de um conversor de tensão para conectar os pinos da interface I2C.
Abraço!
Adilson