Source: https://programarfacil.com/blog/arduino-blog/ads1115-convertidor-analogico-digital-adc-arduino-esp8266/
Timestamp: 2020-04-01 08:03:41+00:00

Document:
Por ejemplo, un convertidor analógico digital (ADC) de 16-bit tiene una resolución de
Si el rango de entrada es de 5V,
Lo que viene a decir que podremos medir variaciones de 0,0763mV en la señal analógica de entrada.
Variaciones por debajo de este voltaje no serán detectados.
En general, cuando un convertidor analógico digital tiene una resolución más alta, proporciona más detalles de la señal anlógica que un convertidor analógico digital con resolución más baja.
¿Es mejor tener un ADC con mayor resolución?
Pues depende. Si sólo te interesan variaciones de temperatura de grado en grado a lo mejor con el propio convertidor analógico digital de Arduino es más que suficiente.
Siempre que se pueda hay que evitar añadir capas que hagan que el proyecto sea más complejo y costoso sin ninguna razón convincente.
Velocidad de un convertidor analógico digital
La otra características en la que nos debemos fijar en un convertidor analógico digital (ADC) es en la velocidad o frecuencia de muestreo.
Es el número de veces que el convertidor analógico digital (ADC) muestrea la señal analógica en 1 segundo. Su unidad se expresa en hercios (Hz).
Por ejemplo, para señales de audio se utilizan principalmente frecuencias de muestreo de 44 kHz, 22 kHz y 11 kHz. Si se utiliza la primera, 44 kHz quiere decir que el convertidor analógico digital muestrea la señal 44000 veces por segundo.
Cuanto mayor sea la frecuencia de muestreo mejor será la conversión de analógico a digital.
¿Qué es un ADS1115?
Ahora que tenemos claro qué es un convertidor analógico digital, vamos a pasar a ver el ADS1115.
El ADS1115 es un convertidor analógico digital externo ideal cuando se requiere de más resolución o de más pines analógicos.
Un caso típico es cuando quieres medir diferentes señales analógicas con un ESP8266. Este SoC solo incorpora un ADC.
En estos casos, es indispensable utilizar un convertidor analógico digital (ADC) externo como el ADS1115.
Como ocurre con muchos componentes de este tipo, el ADS1115 es el chip que da nombre al componente electrónico.
Lo vas a encontrar de diferentes formas y formatos según el fabricante.
Uno de los más famosos es el de Adafruit aunque puedes encontrar otros parecidos de otras marcas.
Yo voy a trabajar con el GY-ADS1115/ADS1015 cuyo precio es de unos 4€.
Todo lo que veas en este tutorial también te va a servir para cualquier otro ADS1115, da lo mismo el fabricante.
Lo más normal es que venga con los pines sin soldar. Así que prepara el soldador y el estaño porque hay que soldar.
Este mismo componente se utiliza tanto para el ADS1115 como para el ADS1015. Lo puedes diferenciar porque tiene una muesca indicando qué tipo de convertidor analógico digital utiliza.
A continuación vamos a ver las características principales del ADS1115.
Características principales del ADS1115
Lo primero es siempre acudir a la hoja de características técnicas donde vas a obtener la mejor y más fiable información de un componente electrónico.
En la web del fabricante del chip, Texas Instruments, la encuentras.
Voltaje de operación de 2V a 5,5V
Consumo de corriente 150 µA (modo continuo)
Velocidad de muestreo programable de 8 Hz a 860 Hz
Resolución 16-bit
Canales 4 canales de entrada o 2 diferenciales
Interfaz de comunicación I2C (4 direcciones)
Vamos a ir desgranando todas estas características del ADS1115 a lo largo de este tutorial.
Antes vamos a ver los pines.
Pines del ADS1115
El número de pines depende mucho del componente pero lo normal es que tengamos acceso a 10 pines.
Los pines VDD y GND son los pines de alimentación.
Los pines SCL y SDA son los pines de reloj y datos de I2C.
Los pines A0, A1, A2 y A3 son los 4 pines analógicos de entrada.
Los pines ADDR y ALERT son especiales y los vamos a ver con más detenimiento.
El convertidor analógico digital ADS1115 puede ser configurado con 4 direcciones I2C. Esto significa que puedes conectar hasta 4 ADS1115 en un mismo bus I2C.
Para seleccionar una dirección entre las 4 posibles se utiliza el pin ADDR. Dependiendo de a donde se conecte utilizará una dirección u otra.
Las posibles direcciones I2C son 0x48, 0x49, 0x4A y 0x4B.
En la siguiente tabla muestro las posibles conexiones con sus direcciones correspondientes.
Conexión ADDR Dirección
5V 0x49
Lo que quiere decir esta tabla es que el pin ADDR tiene que ser conectado al pin GND, 5V, SDA o SCL para obtener la dirección correspondiente.
Este tipo de direccionamiento permite conectar hasta 4 módulos ADS1115 a una misma placa.
El convertidor anlógico digital ADS1115 está equipado con un comparador personalizable que emite un alerta en el pin ALERT/RDY.
Esta característica es muy útil ya que puede reducir significativamente los circuitos externos en muchos proyectos.
Imagínate que tienes un sensor para detectar inundaciones. Gracias a un comparador como el del ADS1115 podrías hacer que cuando supere el umbral, en el pin ALERT emita una señal y despierte al microcontrolador.
Esto permite que el consumo del dispositivo sea muy bajo.
Puede funcionar de dos formas.
En el modo comparador tradicional, el pin ALERT se activa cuando la señal supera un umbral alto (TH_H) establecido y se desactiva cuando el umbral cae por debajo del umbral bajo (TH_L).
En el modo comparador de ventana, permite saber si la señal está entre los límites de una ventana establecida por el umbral alto (TH_H) y el umbral bajo (TH_L).
Esto quiere decir que se activa cuando se supera el umbral alto o cuando caen por debajo del umbral bajo.
Estos dos modos se pueden configurar a nivel de software.
Modos de conversión del ADS1115
El convertidor analógico digital ADS1115 puede funcionar en dos modos de conversión: modo disparo único y modo conversión continua.
En el modo disparo único, el convertidor analógico digital (ADC) realiza una conversión de la señal de entrada a demanda y almacena el resultado en un registro interno.
Enviando una señal al ADS1115 podemos indicar cuando hacer la conversión.
Luego el ADS1115 entra en modo ahorro de energía. Este modo se utiliza para ahorrar energía en sistemas que solo requieran de conversiones periódicas o hay largos periodos de inactividad entre conversiones.
En el modo conversión continua, el convertidor analógico digital (ADC) automáticamente comienza a convertir la señal de entrada tan pronto como la conversión previa se ha completado.
Es decir, convierte un valor de analógico a digital y cuando termina, coge otra muestra. ¿A qué velocidad?
La tasa de conversión, como hemos visto antes, es programable.
Los datos pueden ser leídos en cualquier momento y siempre reflejan la conversión más reciente.
Resolución del convertidor analógico digital ADS1115
Aunque ya he comentado que la resolución del ADS1115 es de 16-bit, la realidad es que no todos bits de los 16-bit se utilizan para expresar el valor de voltaje.
La salida que obtienes del ADS1115 se conoce como entero con signo es decir, uno de los bits de la palabra de 16-bit se utiliza para establecer el signo, positivo o negativo.
Por lo tanto, solo se utilizan 15-bit de los 16-bit lo que significa que hay 32.768 valores posibles (215).
El primer valor sería el 0 y el último sería el 32.767.
Amplificador de ganancia programable o PGA
Otra de las particularidades que dotan al ADS1115 de todavía mayor precisión y fiabilidad es el amplificador de ganancia programable o PGA que lleva incorporado.
Vale pero ¿qué es un amplificador de ganancia programable?
Básicamente es un amplificador operacional al que podemos modificar la ganancia a través del código, programando.
El amplificador de ganancia programable establece la escala completa es decir, indica el valor de referencia.
En Arduino este valor viene determinado por el voltaje de referencia que en el caso de Arduino UNO es 5V y en la gama Arduino MKR y el ESP8266 es de 3V3.
En el ADS1115 lo establece el PGA. Por defecto este valor de referencia es ±6,144 V. Esto quiere decir que el valor de 32.677 (valor máximo con 15-bit) corresponde a 6,144 V.
En Arduino UNO, con un ADC de 10-bit (1024 valores posibles), el valor 1023 corresponde a 5 V.
Si haces la conversión tienes que para el ADS1115
Y para un Arduino UNO
Lo que significa que con el ADS1115 se consigue una mejora significativa con respecto al ADC del Arduino UNO, entorno a 26 veces mejor.
Pero lo mejor es que el amplificador de ganancia es programable y podemos cambiar el valor de referencia a valores menores. El valor de 6,144 V es el peor de los casos.
En la siguiente tabla tienes un resumen de todos los valores posibles de la PGA.
PGA Referencia (V) Factor de escala
2/3 6,144 V 0,1875 mV
1 4,096 V 0,1250 mV
2 2,048 V 0,0625 mV
4 1,024 V 0,0312 mV
8 0,512 V 0,0156 mV
16 0,256 V 0,0078 mV
Fíjate bien que configurando la PGA con el valor 16, se consigue un factor de escala de 0,0078 mV es decir, se pueden detectar variaciones de voltaje muy pequeñas.
Pero cuidado, la referencia en voltios de la tabla anterior no quiere decir que podamos medir señales en ese rango de valores.
Rango máximo de las entradas analógicas del ADS1115
La anterior tabla puede ser muy engañosa ya que puede llevarnos a error. Aunque la mayor referencia sea de 6,1444 V, el ADS1115 sólo puede medir el valor de alimentación (VDD) más 0,3 V por sus pines analógicos.
¿Esto qué quiere decir? VDD es la tensión de alimentación y como hemos visto, puede ser de entre 2V y 5,5V.
Por lo tanto, si alimentamos el ADS1115 con 5V, sólo podremos medir tensiones por los pines analógicos hasta 5V + 0,3V es decir, 5,3V.
Lo mismo ocurriría si alimentamos con 3,3V. En este caso el máximo sería 3,6V.
Aplicar una tensión superior a VDD + 0,3V a un ADS1115, puede dañar el chip. No superes nunca este voltaje en ningún pin analógico.
Vuelvo a repetir que no es lo mismo la referencia del PGA (es el factor de escala) y el valor máximo que admiten las entradas analógicas.
Lo último que vamos a ver antes de ver los ejemplos son los modos de funcionamiento: modo de un solo extremo, modo diferencial y modo comparador.
Modos de funcionamiento ADS1115
El modo de un solo extremo hace que las 4 entradas analógicas del ADS1115 funcionen como las de un Arduino. El convertidor analógico digital (ADC) lee la diferencia entre cada entrada y tierra.
El modo diferencial sin embargo, mide la diferencia entre dos de las entradas analógicos del ADS1115 es decir, se realiza una medición en la que ninguno de los lados se encuentra en GND.
En este modo, se emparejan los pines de dos en dos, A0 con A1 y A2 con A3. Esto quiere decir que sólo vas a tener dos canales.
En canal 1 devuelve la diferencia entre los pines A0 y A1 y el canal 2 devuelve la diferencia entre los pines A2 y A3.
En el modo comparador se utiliza el pin ALERT que hemos visto antes para lanzar una señal cada vez que se supere un umbral establecido dentro del ADS1115.
Para probar cada modo vamos a hacer unos ejemplos. Lo primero que haremos será instalar la librería para poder programar el ADS1115.
Instalar librería para ADS1115
Lo primero es instalar la librería para controlar el ADS1115. La más famosa y popular es la de Adafruit.
En el tutorial de cómo instalar una librería con Arduino te muestro no sólo a instalarla, también cómo seleccionar la más adecuada para tu proyecto.
Sólo tienes que buscar la librería Adafruit ADS1X15 en el gestor de librerías.
La instalas y listo. Ahora puedes acceder tanto a la librería como al código de los ejemplos.
Esta librería permite controlar tanto la placa basada en el ADS1115 como la basada en el ADS1015. En este tutorial sólo hablaré del ADS1115.
Modo de un solo extremo
El primer modo que vamos a ver es el modo de un solo extremo. Este modo hace que el ADS1115 se comporte como un ADC normal.
Tiene 4 entradas analógicas numeradas como A0, A1, A2 y A3.
La idea es conectar un sensor analógico a una de esas entradas y medir su valor.
En este ejemplo utilizarás una fotoresistencia o LDR conectada al ADS1115.
A continuación te dejo el esquema eléctrico para conectar el ADS1115 a un Arduino UNO y a una placa NodeMCU basada en el ESP8266.
Conexión ADS1115 con Arduino UNO
La conexión del ADS1115 con el Arduino UNO es muy sencilla. Sigue el siguiente esquema.
El pin SDA del ADS1115 va al pin A4 del Arduino UNO y el pin SCL al pin A5.
La dirección I2C se configura conectando el pin ADDR del ADS1115 al pin GND.
A parte, he añadido una fotoresistencia o LDR para poder probar el convertidor analógico digital (ADC) ADS1115.
La resistencia va conectada a través de un divisor de tensión con otra resistencia de 10kΩ.
El pin analógico del ADS1115 que voy a utilizar es el A0.
La conexión con el ESP8266 es muy parecida a la de Arduino UNO. En este caso voy a utilizar una placa NodeMCU.
El pin SDA del ADS1115 va conectado al pin D2 de la placa NodeMCU ESP8266 y el pin SCL al pin D1.
Igual que en el esquema del Arduino UNO he conectado una fotoresistencia o LDR a través de un divisor de tensión con una resistencia de 10kΩ.
La LDR está conectada al pin A0 del ADS1115.
Programación modo un sólo extremo
Una vez tenemos todo conectado entre la placa y el ADS1115 vamos a ver la programación.
Comenzamos por las librerías y las variables.
Librerías y variables
#include <Wire.h> #include <Adafruit_ADS1015.h> // Crear objeto de la clase Adafruit_ADS1115 ads;
// Crear objeto de la clase
Lo primero es importar las librerías Wire.h y Adafruit_ADS1015.h. Aunque esta última librería se llame ADS1015 también contiene el código para controlar el ADS1115.
Luego crea un objeto de la clase Adafruit_ADS1115 al que llamamos ads.
Función setup()
void setup(void) { Serial.begin(9600); delay(200); // Iniciar el ADS1115 ads.begin(); }
// Iniciar el ADS1115
La función setup() comienza iniciando la comunicación serie para mostrar mensajes a través del monitor serie.
Luego inicia el ADS1115 llamando a la función ads.begin() que no admite ningún parámetro.
Función loop()
void loop(void) { // Obtener datos del A0 del ADS1115 short adc0 = ads.readADC_SingleEnded(0); Serial.print("A0: "); Serial.println(adc0); delay(1000); }
// Obtener datos del A0 del ADS1115
short adc0 = ads.readADC_SingleEnded(0);
En la función loop() es donde realmente hay que hacer la lectura del pin analógico.
Lo primero es declarar una variable del tipo short que se llama adc0. Esta variable almacenará el valor del pin digital A0.
Es de tipo short porque este tipo almacena números enteros de 16-bit con signo. Suficiente para almacenar el valor que devuelve un pin analógico, un número de 15-bit como hemos visto antes (de 0 a 32767).
Para obtener el valor del pin analógico del ADS1115 se utiliza la función ads.readADC_SingleEnded(0). El parámetro que se le pasa a esta función es el número de pin analógico.
0 devolverá el valor del pin analógico A0, 1 el del pin A1 y así sucesivamente.
Por último, en la función loop() se muestra la información obtenida por el monitor serie.
Ahora solo queda una cosa, cargar el código a la placa y abrir el monitor serie.
#include <Wire.h> #include <Adafruit_ADS1015.h> // Crear objeto de la clase Adafruit_ADS1115 ads; void setup(void) { Serial.begin(9600); delay(200); // Iniciar el ADS1115 ads.begin(); } void loop(void) { // Obtener datos del A0 del ADS1115 short adc0 = ads.readADC_SingleEnded(0); Serial.print("A0: "); Serial.println(adc0); delay(1000); }
El código para el Arduino UNO y la placa NodeMCU ESP8266 es el mismo, no hace falta hacer ningún cambio y es totalmente compatible.
Obtendrás algo parecido a esto.
Si pones la mano encima de la fotoresistencia disminuirá el valor y si pones la mano encima aumentará el valor.
Pero qué pasaría si quiero más precisión. Como hemos visto, el ADS1115 incluye un amplificador de ganancia programable o PGA que nos permite tener más precisión con el mismo número de bits.
¿Cómo lo hace? Cambiando el valor de referencia.
Por defecto, el ADS1115 utiliza el voltaje de referencia de 6,1444V lo que supone un factor de escala de 0,1875mV.
Si cambiamos el voltaje de referencia por ejemplo a 4,096V se obtiene un factor de escala de 0,125mV.
Para cambiar el factor de escala sólo tienes que añadir la llamada a la función ads.setGain(GAIN_ONE) justo antes de iniciar el ADS1115 con la función ads.begin() en la línea 13.
El código quedaría de la siguiente manera.
#include <Wire.h> #include <Adafruit_ADS1015.h> // Crear objeto de la clase Adafruit_ADS1115 ads; void setup(void) { Serial.begin(9600); delay(200); // Cambiar factor de escala ads.setGain(GAIN_ONE); // Iniciar el ADS1115 ads.begin(); } void loop(void) { // Obtener datos del A0 del ADS1115 short adc0 = ads.readADC_SingleEnded(0); Serial.print("A0: "); Serial.println(adc0); delay(1000); }
// Cambiar factor de escala
¿Qué es lo que sucede cuando cambias la referencia de voltaje? pues que se reduce el rango y por lo tanto el factor de escala disminuye.
Gracias a esto, ahora se pueden medir variaciones de luminosidad más pequeñas.
En la siguiente tabla muestro los diferentes valores que puede tomar esta función, el voltaje de referencia y el factor de escala correspondiente.
Parámetro Referencia Factor de escala
GAIN_TWOTHIRDS 6,144V 0,1875mV
GAIN_ONE 4.096V 0,125mV
GAIN_TWO 2,048V 0,0625mV
GAIN_FOUR 1,024V 0,03125mV
GAIN_EIGHT 0,512V 0,015625mV
GAIN_SIXTEEN 0,256V 0,0078125mV
Y así es como funciona el ADS1115 de forma normal, como cualquier otro convertidor analógico digital (ADC).
Ahora vamos a ver otro modo de funcionamiento, el modo diferencial.
Como ya he comentado, el modo diferencial del ADS1115, nos permite medir la diferencia entre dos pines analógicos de este módulo.
Puedes medir la diferencia de voltaje entre el A0 y el A1 o entre el A2 y A3. Por eso se llama diferencial.
Pero ¿para qué puede ser útil este tipo de medidas?
Si sueles hacer proyectos con Arduino en algún momento necesitarás alimentar tu proyecto con pilas o baterías.
El modo diferencial te va a permitir hacer una medición en la que ninguno de los lados de la medición esté conectado a GND como ocurre al medir una pila o batería con Arduino.
Además, otro beneficio de este modo es que puedes realizar mediciones de voltajes negativos.
En el siguiente ejemplo te voy a mostrar cómo puedes hacerlo.
Monta el circuito partiendo del siguiente esquema.
He utilizado un portapilas de dos pilas AA pero puedes utilizar otra clase de pilas como las AAA o incluso una única pila de 1,5V.
El extremo positivo del portapilas se conecta al A1 y el extremo negativo se conecta al A0 del ADS1115.
Al estar conectadas en serie las dos pilas, se suman los voltajes. Por lo tanto 1,5 + 1,5 = 3V. Esto será en el mejor de los casos.
La programación será la misma, lo que cambiará será el valor obtenido de la diferencia.
En el siguiente esquema te muestro cómo conectar el ADS1115 con una placa NodeMCU ESP8266 para hacer una medida diferencial.
Igual que en el esquema con el Arduino UNO, he utilizado un portapilas de pilas AA.
El extremo positivo del portapilas al A1 y el extremo negativo al A0.
Ten mucho cuidado si vas a medir un voltaje superior a los 3,3V con los que se alimenta el ADS1115. Recuerda que no se puede superar VDD + 0,3V es decir 3,3 + 0,3 = 3,6V
Programación en modo diferencial
La programación en modo diferencial del ADS1115 es muy sencilla y muy parecida a la que hemos visto en el modo de un solo extremo.
A continuación te dejo el código.
#include <Wire.h> #include <Adafruit_ADS1015.h> // Crear objeto de la clase Adafruit_ADS1115 ads; // Factor de escala. Por defecto el valor de referencia es 6,144V // El factor de escala de esta referencia es de 0,1875mV float factorEscala = 0.1875F; void setup(void) { Serial.begin(9600); // Factor de escala ads.setGain(GAIN_TWOTHIRDS); // Iniciar el ADS1115 ads.begin(); } void loop(void) { // Obtener el diferencial short diferencia_0_1 = ads.readADC_Differential_0_1(); // Convertir en voltios float voltios = (diferencia_0_1 * factorEscala)/1000.0; Serial.print("Diferencia 0-1 = "); Serial.println(diferencia_0_1); Serial.print("Voltage = "); Serial.println(voltios,4); Serial.println(); delay(2000); }
// Factor de escala. Por defecto el valor de referencia es 6,144V
// El factor de escala de esta referencia es de 0,1875mV
float factorEscala = 0.1875F;
// Factor de escala
// Obtener el diferencial
short diferencia_0_1 = ads.readADC_Differential_0_1();
// Convertir en voltios
float voltios = (diferencia_0_1 * factorEscala)/1000.0;
Serial.print("Diferencia 0-1 = ");
Serial.println(diferencia_0_1);
Serial.println(voltios,4);
Lo primero que hace el código es importar las librerías y crear una instancia a la clase Adafruit_ADS1115 que se llama ads.
Luego declaro una variable del tipo float para almacenar el factor de escala que se llama factorEscala.
El factor de escala depende de la referencia de voltaje que se haya seleccionado. Por defecto es 6,144V al que corresponde un factor de escala de 0,1875mV.
Si se modifica la referencia de voltaje, tendrás que modificar el factor de escala y poner el que corresponde según la tabla que hemos visto en el apartado anterior.
En la función setup() se inicia la comunicación serie, se establece el factor de escala con la función ads.setGain(GAIN_TWOTHIRDS) y se inicia el sensor ADS1115 con la función ads.begin().
Como ya he comentado si modificas el factor de escala con la función ads.setGain(…) tendrás que cambiar el valor inicial de la variable factorEscala al que corresponda.
En la función loop() lo primero es obtener la diferencia entre el pin A0 y A1 utilizando la función ads.readADC_Differential_0_1().
Esta función devuelve la diferencia entre A0 y A1 es decir, el valor que hay en A0 resta el valor de A1.
Si necesitas utilizar los otros dos pines puedes utilizar la función ads.readADC_Differential_2_3() que devolverá la diferencia entre A2 y A3.
Esta diferencia viene expresada como un número de 16-bit con signo es decir entre -32.768 y 32.767. Este valor hay que convertirlo en voltios.
Para hacerlo se multiplica por factorEscala y se obtienen milivoltios. Para obtener voltios hay que dividir entre 1.000. Esto mismo es lo que se hace en la línea 27 del código.
Por último se muestra la información por el monitor serie.
Ahora solo queda cargar el código a la placa y abrir el monitor serie. Obtendrás algo parecido a esto.
Como puedes comprobar salen números negativos. Esto se debe a que estamos restando el voltaje que tenemos en el pin A0 menos el pin A1.
Como hemos conectado el positivo del portapilas al A1, el resultado es negativo.
Puedes probar a cambiar de orden los cables (positivo al A0 y negativo al A1) y verás cómo aparece el voltaje positivo.
Por último vamos a ver cómo hacer que el ADS1115 lance una alerta cuando está funcionando en modo comparador.
Modo comparador
El modo comparador permite hacer una comparación del valor obtenido por uno de los pines analógicos con un umbral preestablecido.
Como hemos visto anteriormente, se pueden configurar dos tipos de comparaciones: la tradicional o por ventana.
Si se utiliza la tradicional, siempre que el valor supere el umbral máximo el pin ALERT se pondrá en estado LOW. Por defecto siempre está en estado HIGH.
Si utilizas el tipo por ventana, cambiará de estado siempre que se supere el umbral alto y siempre que caiga del umbral bajo.
Con la librería de Adafruit sólo se puede trabajar con un umbral, umbral alto, y el modo tradicional. No tiene implementado el otro modo.
Esto es precisamente lo que vamos a ver a continuación.
Conexión ADS1115 y Arduino UNO
El circuito que vamos a utilizar es igual que el que hemos visto en un apartado anterior.
Sigue el siguiente esquema para conectar los componentes.
La fotorresistencia o LDR se conecta al pin A0 y también conectamos un LED al pin ALERT.
La idea es configurar un umbral en el ADS1115 y cada vez que baje la luminosidad de ese umbral, encienda el LED.
Conexión ADS1115 y NodeMCU ESP8266
La conexión con la placa NodeMCU ESP8266 es prácticamente la misma. Sigue el siguiente esquema.
Igual que con la placa de Arduino, la fotorresistencia o LDR se conecta al pin A0 y el LED al pin ALERT.
Ahora sólo queda la programación.
Programación en modo comparador
A continuación tienes el código completo con el ejemplo del comparador.
#include <Wire.h> #include <Adafruit_ADS1015.h> // Crear objeto de la clase Adafruit_ADS1115 ads; void setup(void) { Serial.begin(9600); delay(200); // Factor de escala ads.setGain(GAIN_TWOTHIRDS); // Iniciar el ADS1115 ads.begin(); // Factor de escala. Por defecto el valor de referencia es 6,144V // El factor de escala de esta referencia es de 0,1875mV float factorEscala = 0.1875F; // Umbral comparador en 2,5V // Para calcular se divide el (voltaje/factor de escala) * 1.000 float umbral = (2.5 / factorEscala) * 1000.0F; Serial.print("Umbral = "); Serial.println(umbral); // Asignar el umbral al pin analógico A0 ads.startComparator_SingleEnded(0, umbral); } void loop(void) { // Solo se hará la comparación después de hacer una lectura short lecturaADC0 = ads.getLastConversionResults(); Serial.print("ADC0: "); Serial.println(lecturaADC0); delay(100); }
// Umbral comparador en 2,5V
// Para calcular se divide el (voltaje/factor de escala) * 1.000
float umbral = (2.5 / factorEscala) * 1000.0F;
Serial.print("Umbral = ");
Serial.println(umbral);
// Asignar el umbral al pin analógico A0
ads.startComparator_SingleEnded(0, umbral);
// Solo se hará la comparación después de hacer una lectura
short lecturaADC0 = ads.getLastConversionResults();
Serial.println(lecturaADC0);
La primera parte del código es igual que los códigos que hemos visto hasta ahora en este tutorial, importación de librerías e instancia a la clase Adafruit_ADS1115.
En la función setup() se inicia la comunicación serie, se establece el factor de escala y se inicia el ADS1115.
En la siguiente parte del código se establece el umbral alto del modo comparador desde la línea 20 a la línea 29.
Lo primero es declarar una variable con el factor de escala. Recuerda que por defecto el factor de escala es 0,1875mV que corresponden a 6.144V de referencia de voltaje.
La variable que almcena este valor es factorEscala del tipo float.
El umbral hay que establecerlo en un número que va de 0 a 32.767 (son los 15-bit de resolución). Lo lógico es establecer un voltaje umbral y luego pasarlo a número.
Para hacer esa conversión hay que aplicar la siguiente fórmula:
Hay que dividir el voltaje umbral entre el factor de escala. Se debe multiplicar por 1.000 ya que el factor de escara está en milivoltios, en el caso de que esté en Voltios no haría falta
Para asignar el umbral en el ADS1115 hay que utilizar la función ads.startComparator_SingleEnded(adc, umbral).
El primer parámetro de la función indica el pin analógico que se va a utilizar y el segundo parámetro indica el umbral que se quiere establecer.
Si por ejemplo se quiere establecer un umbral de 2,5V el número que hay que utilizar es el siguiente.
En la función loop() hay que consultar constantemente el valor que hay en el pin analógico con la función ads.getLastConversionResults() para que internamente el ADS1115 haga la comparación.
En el caso de que el voltaje en el A0 sea mayor que 2,5V, el pin ALERT del ADS1115 estará a estado LOW es decir se activará el pin.
En el caso de que el voltaje en el A0 sea menor que 2,5V, el pin ALERT estará a estado HIGH es decir, el pin estará desactivado.
Por defecto el pin ALERT funciona de forma invertida.
Ahora solo queda una cosa, subir el código a la placa y probar acercando y alejando una luz a la fotorresistencia o LDR.
Verás como cuando incide más luz se apaga el LED y cuando no incide tanta luz se apaga el LED.
Con esto doy por finalizado este tutorial sobre el convertidor analógico digital.
Conclusiones convertidor analógico digital ADS1115
El convertidor analógico digital ADS1115 puede ser un gran aliado cuando necesitamos más pines analógicos o más precisión en nuestros proyectos.
Es muy sencillo de usar con un Arduino o un ESP8266 gracias a su interfaz I2C.
Permite trabajar en diferentes modos de funcionamiento: modo un solo extremo, modo diferencial o modo comparador.
Utilizar uno u otro dependerá de los requerimientos de nuestro proyecto.
Gracias a la librería de Adafruit, su uso con cualquiera de estas dos placas es muy sencillo y además el código es 100% compatible entre ellas.
Espero haberte ayudado con este tutorial y cualquier duda o sugerencia la puedes dejar aquí abajo en los comentarios.
Coronadiario Maker Día 3: Alex Corvis
Alex Corvis no es la primera vez que viene al podcast. Ya me mandó un audio de un proyecto súper chulo que hizo hace tiempo. Un termostato tipo … [+ info...]
Jorge no es nuevo en este podcast. Ya ha estado con nosotros en otra ocasión hablándonos de Impresión 3D. Es un gran Maker y tiene mucha experiencia … [+ info...]
Hoy es el primer capítulo de esta nueva idea. No me gusta hablar de objetivos y si de sistemas. Y esto no es más que un sistema para dar voz a todos … [+ info...]
Copyright © 2020 · Programar Fácil · Aviso legal

References: resolución 
 resolución 
 resolución 
 resolución 

Resolución 

Resolución 
 resolución