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