Uso de un ModeMCU como voltímetro

Modificado por última vez hace 10 meses

Medir voltios con un ESP8266

¿No tienes polímetro? ¡No hay problema! ¿Sabías que puedes utilizar tu NodeMCU (o cualquier ESP8266) como si fuera un voltímetro?

En ocasiones un voltímetro es casi imprescindible para poder solucionar algún problema que se presente cuando trabajamos con microcontroladores, o con cualquier circuito electrónico en general.

En este artículo vamos a ver cómo podemos utilizar el NodeMCU como un voltímetro básico, que nos pueda sacar del apuro si no tenemos polímetro.

¿Qué, qué es un Conversor Analógico a Digital (o ADC)?

Seguro que sabes que, en el mundo de la informática, y de los microcontroladores, lo que manejan estos extraños animales con patas de alambre son ceros y unos.

Entre las maravillas con las que cuenta el ESP8266 en tan poco espacio, hay un pin (el A0 o ADC0) que incluye un conversor analógico a digital o ADC (de Analog Digital Converter).

Un ADC es un circuito electrónico que convierte una señal analógica del mundo real y que puede tener cualquier valor, con un número de decimales infinito, en una secuencia de unos y ceros que el microcontrolador pueda entender.

Y, si, dentro del ESP8266 hay un circuito ADC.

El ADC del ESP8266

Quiero que este artículo del blog sea eminentemente práctico, para principiantes, por lo que no voy a entrar en los detalles de la letra pequeña del ADC (que es mucha, y muy pequeña). Simplemente comentaros lo básico, para que lo podáis utilizar:

El ACD del ESP8266, que es el microcontrolador que hay en las placas como NodeMCU, Wemos D1 Mini y otras similares, incluye un ADC de 10 bit y 1 voltio máximo.

¿Qué quiere decir que el ADC es de 10bit?

Que tiene esa «resolución«.

Los números en decimal que se puede representar con 10bits van del 0 al 1023 y eso quiere decir que, hagamos lo que hagamos, el ADC dará su salida en uno de esos 1023 saltos (sin posibilidad de decimales, o puntos intermedios, para que nos entendamos).

Dicho de otra forma, si quisiéramos medir de 0 a 1023 voltios, el ADC nos daría una resolución de 1 voltio (no podríamos medir 534.7 voltios, solo 534 o 535 voltios). Si quisiéramos medir un rango de 5 voltios, el ADC nos daría una resolución de 1024/5 = 0,00488 voltios.

¿Qué quiere decir que el ADC es de 1 voltio máximo?

Quiere decir que el voltaje máximo que podemos aplicar, de forma directa, al ADC es de 1 voltios (dicho de otra forma, tiene un rango que va desde 0 voltios hasta 1 voltio).

En la práctica, esto quiere decir que, si al ADC del ESP8266 le metemos exactamente 1 voltio, sin utilizar un divisor de tensión externo, él nos dará el valor máximo que son 1023.

¿Y si queremos medir voltajes de más de 1 voltio?

No pasa nada. Solamente tendremos que utilizar un divisor de tensión, que está formado por dos resistencias, poniendo las resistencias de los valores que más nos convengan (más adelante veremos cómo calcular esas resistencias, y te daré algunos ejemplos ya calculados para que no lo tengas que hacer tú).

Seguramente tú no estés usando un microcontrolador ESP8266 directamente, sino que lo más probable es que estés utilizando una placa como NodeMCU (en cualquiera de sus variantes) o Wemos D1 Mini y tengo una estupenda noticia para ti: Esas placas ya vienen con las resistencias puestas.

El problema con el que te vas a encontrar es que a la mayoría de esas placas el fabricante le ha puesto unas resistencias, para crear el divisor de tensión del que hablábamos antes, adecuadas para medir un máximo de 3.3V (o lo que es lo mismo, que nos dará un valor de 1023 cuando le metamos 3.3 voltios).

Lógicamente, en muchos casos esto no nos vale. Tú vas a querer medir muchas veces, más de 3.3 voltios. Querrás medir voltajes de 5 voltios, 12 voltios, o más.

La solución es fácil, solamente tenemos que modificar el divisor de tensión, poniéndole una resistencia externa para medir el voltaje que quieras.

Limitaciones del ADC del ESP8266

Existen en el mercado circuitos ADC con una precisión increíble, una resolución increíble y una repetibilidad increíble. El ADC del ESP8266 no está entre ellos, desgraciadamente, pero para nuestros propósitos es suficiente.

El ADC del ESP8266 tiene relativamente baja resolución (solo esos 1024 saltos, de los que hemos hablado antes), poca precisión (no sabemos con mucha exactitud si la medida que nos indica es la correcta) y lo peor es que tiene bastante ruido.

Que tenga bastante ruido provoca que el ADC del ESP8266 sea un poco «miope» y que el voltaje que le metemos no lo vea completamente claro, sino que lo ve como si lo estuviera mirando a través de un «cristal roto» y eso hace que a veces se pueda equivocar. Eso no tiene mayor importancia para la mayoría de los usos que le vamos a dar (medir voltajes) porque para eso estamos nosotros que, con nuestro cerebro privilegiado, vamos a poner ignorar las medidas erróneas muy fácilmente al verlas, casi sin darnos cuenta.

Existen algunas otras limitaciones como la linealidad y otras en las que no voy a entrar, pero, si es un tema que te interesa, en internet podrás encontrar mucha información al respecto.

A lo práctico: ¿Cómo hago para medir voltaje con el NodeMCU?

Para medir cualquier voltaje, necesitarás dos partes: El hardware y el software.

Como hardware, en esta primera explicación, vamos a utilizar solamente un NodeMCU sin ninguna resistencia adicional porque vamos a medir un máximo de 3.3 voltios ¿Recuerdas lo que te dije de qué el NodeMCU ya tiene en su placa el divisor de tensión necesario para poder medir hasta 3.3 voltios?

Cómo software, te voy a enseñar a hacerlo de dos formas:

Con ESP Easy, que no requiere ninguna programación y te permite hacer con ese voltaje un montón de cosas, como gráficas, cálculos, reglas, enviarlo a otros sistemas y más.

En C++ (el lenguaje de Arduino) que te da más flexibilidad sobre lo que puedes hacer y te permite incluirlo en otros proyectos.

Cómo medir voltaje con ESP Easy

Lo primero es instalar ESP Easy en tu NodeMCU (puedes ver cómo se hace en el artículo que escribí sobre ESP-Easy).

Ahora tienes que decirle a ESP Easy que quieres utilizar el pin del ADC (A0) para leer voltaje. Solamente tienes que ir a la pestaña «Devices» (Dispositivos) y añadir la entrada analógica y configurarla:

Añadir la entrada analógica en ESPEasy
Configurar entrada analógica ESPEasy

Y ahora fíjate en una cosa: ¿Ves que he escrito una fórmula que pone %value%*0.3125?

Esa fórmula la pongo para que me dé el valor real de voltaje que le aplico, en vez del número de 0 a 1023 del que hablamos antes (que usa el ESP8266 internamente).

Lo que hará ESPEasy será, antes de mostrar el valor interno de 0 a 1023 (ese %value% de la fórmula), multiplicarlo por el número 0.3125.

Imagínate que metemos a ESPEasy el voltaje de una pila de 1.5V, en vez de mostrarnos un número cómo 465 (que sería 1024 / 3.3 * 1.5) nos mostrará 1453,1 que es el voltaje real aproximado (en milivoltios, si quisiéramos verlo en voltios utilizaríamos en la formula 0.003125 en vez de 0.3125).

Luego hablaremos de esa aproximación al voltaje real y de la fórmula utilizada.

Por cierto, no te he dicho donde tienes que conectar la pila del ejemplo:

El voltaje a medir (la pila) tienes que conectarlo a GND (que es el negativo) y el pin A0 (que es la entrada analógica del NodeMCU).

Cómo medir voltaje con C++ (el lenguaje de Arduino)

La forma de leer el voltaje en Arduino, es mediante la instrucción analogRead()

Te dejo a continuación un código super simple de ESP8266 solo para que veas cómo se lee el voltaje del pin A0 y se imprime en una página web generada por el propio ESP8266.

   #include <ESP8266WiFi.h>
   #include <ESP8266WebServer.h>

   const char *ssid = "nombre_de_tu_red_wifi";
   const char *password = "contraseña_de_tu_red_wifi";

   ESP8266WebServer server(80);

   void setup() {
     Serial.begin(115200);

     // Conexión a la red WiFi
     WiFi.begin(ssid, password);
     while (WiFi.status() != WL_CONNECTED) {
       delay(250);
       Serial.print(".");
     }
     Serial.println("");

     Serial.println("Conectado a la red WiFi");

     // Definición de rutas del servidor web
     server.on("/", HTTP_GET, handleRoot);

     // Inicia el servidor web
     server.begin();
   }

   void loop() {
     // Maneja las solicitudes del servidor web
     server.handleClient();
   }

   void handleRoot() {
     // Lee el voltaje en A0
     int valorA0 = analogRead(A0);

     // Convierte el valor a voltaje (asumiendo una referencia de 3.3V)
     float voltaje = valorA0 * (3.3 / 1023.0);

     // Construye la respuesta HTML
     String html = "<html><body>";
     html += "<h1>Voltaje en A0</h1>";
     html += "<p>Valor en A0: " + String(valorA0) + "</p>";
     html += "<p>Voltaje: " + String(voltaje) + " V</p>";
     html += "</body></html>";

     // Envía la respuesta al cliente
     server.send(200, "text/html", html);
   } 

Medir más de 3.3 voltios con el NodeMCU

El ejemplo anterior te sirve para medir hasta un máximo de 3.3 voltios, porque el divisor de voltaje que trae el NodeMCU está calculado para eso.

Si queremos medir más de 3.3 voltios, tendremos que modificar el divisor de voltaje (recuerda que la función del divisor de voltaje existente en el NodeMCU es adaptar el voltaje que queramos medir a un rango de 0 a 1 voltio, que es el máximo que podemos meter al ESP8266).

Afortunadamente, modificarlo es muy sencillo. Te dejo aquí como modificarlo añadiendo solo una resistencia (vamos al grano y luego te digo por qué y cómo calcular esas resistencias).

Para medir hasta 5 voltios: Lo mejor es que pongas una resistencia de 270KΩ (270 kiloohmios). Con este valor el máximo que podrías medir sería de 5.7 voltios y la fórmula para ESPEasy sería %value%*0,0,05566 (5.5/1024 = 0,0556640625).

Para medir hasta 12 voltios: Lo mejor es que pongas una resistencia de 1MΩ (1 megaohmio). Con este valor el máximo que podrías medir sería de 13.2 voltios y la fórmula para ESPEasy sería %value%*0,1289 (13.2/1024 = 0,12890625).

¿Y cómo hacer un voltímetro con un Wemos D1 Mini?

Exactamente igual que lo hemos hecho para el NodeMCU. La única diferencia es que el pin que tienes que utilizar está en otro sitio:

¿Y si soy valiente y quiero medir voltios con un ESP8266, directamente?

Si quieres medir voltios con un ESP8266 directamente, un ESP-12E por ejemplo, tendrás que poner un divisor de tensión adecuado.

Para ello tendrás que calcular las resistencias necesarias para hacer tu propio divisor de tensión, teniendo en cuenta que el voltaje máximo que debes aplicar al ESP8266 es de 1 voltio, como se indica en el siguiente punto.

Ten en cuenta que, tendrás que comprobar cuál es el pin que corresponde a la entrada analógica, y que dependerá del módulo que estés utilizando (por ejemplo, un ESP12E como el de la imagen).

¿Y si los ejemplos que me has dado no me valen? ¿Cómo calcular las resistencias necesarias para hacer mi propio divisor de tensión?

Para medir más de 3.3 voltios, vamos a tener que modificar el divisor de voltaje, del que hemos hablado antes.

Veamos primero el medidor de voltaje que trae el NodeMCU, viendo esa parte del esquema:

Entrada analógica NodeMCU a ESP8266

Te explico este esquema, es muy sencillo: La parte de abajo va a negativo, la parte de arriba (donde pone ADC EX) va al pin del NodeMCU marcado como A0 (entrada analógica) y la parte izquierda (donde pone ADC) va al microcontrolador ESP8266.

Son esas dos resistencias las que forman el divisor de tensión, y en el punto central (de donde sale ADC) hay un valor proporcional a lo que metamos arriba (ADC EX) pero dividido siguiendo una formula.

Te dejo una fórmula que, si las matemáticas son lo tuyo, te dirá más que 1000 palabras y explicaciones:

V1023 = 1V * (100kΩ + 220kΩ + R) / 100kΩ
Donde R es la resistencia que pones en serie con el pin A0.

Te recomiendo que utilices un calculador de divisores de voltaje como este.

Más abajo tienes un ejemplo de cómo se utiliza para calcular la resistencia si queremos medir un máximo de 4.2V

Por si te queda alguna duda, te dejo un ejemplo claro, con el desarrollo de la fórmula, para que te resulte lo más sencillo posible de calcular tú mismo:

Simulación interactiva del divisor de tensión

Con este simulador interactivo del divisor de tensión podrás comprobar como varía la salida del divisor dependiendo del voltaje a su entrada y de las resistencias utilizadas.

Te animo a que juegues con él y que compruebes, antes de construir el circuito, si los valores que has seleccionado son válidos para tu aplicación.

Solo tienes que pulsar el botón «Iniciar simulación» y cambiar los valores que quieras.

Un detalle para los más "techies": Fíjate que he representado el ESP8266/ESP32/NodeMCU como una resistencia de 1GΩ para que la medida no se vea afectada.

La precisión de las resistencias del divisor de tensión

La precisión de las medidas que obtengas va a depender mucho de la precisión de las resistencias que utilices.

En los instrumentos de medida comerciales de calidad, se utilizan resistencias con una tolerancia del 0.1% e incluso menos.

Las resistencias comunes, baratas y fáciles de encontrar, suelen tener tolerancias de un 5% o 10%, lo que significa que si escoges una resistencia de 270KΩ y tiene un 10% de tolerancia no sabrás el valor exacto de la resistencia (a menos que la midas) y podrá estar entre 243KΩ y 297KΩ.

Esto supone que también la medida que obtengas tendrá una tolerancia relativamente grande.

Si necesitas obtener medidas de voltaje con mucha precisión, tendrás que tener esto en cuenta.

Otra cosa que tienes que tener en cuenta, es que no existen resistencias de todos los valores y tendrás que utilizar resistencias con los valores estándar (las disponibles comercialmente). Afortunadamente podrás ajustar fácilmente y en cualquier momento la fórmula del ESPEasy para corregirlo.

Calibración

Lo ideal es calibrar el medidor utilizando una fuente de voltaje de valor conocida para comprobar la exactitud de la medida, pero ¿y si no tienes una fuente de tensión de valor conocida?

Sorpresa: ¡Si que tienes una! El NodeMCU (y el Wemos D1 Mini y otras placas similares) incluye en la placa un regulador de voltaje de 3.3V bastante preciso, por lo que podrás utilizar uno de los pines de 3.3V para, midiéndolo, calibrar el medidor hasta la lectura marque exactamente 3.3V.

La calibración se compone de dos partes:

Ajuste de la fórmula: Para corregir las posibles desviaciones en los valores de las resistencias y cosas parecidas.

Ajuste de los puntos de calibración: Te permite calibrar en dos puntos intermedios del rango de medida para corregir errores de linealidad (para esto sí que necesitarás un voltímetro de referencia o un polímetro).

Pero yo no tengo resistencias, ¿tengo que comprarlas?

Si no tienes una resistencia, no te preocupes, todavía queda una solución

Lo bueno es que la resistencia que necesites estará dentro de un rango enorme, por lo que te será fácil localizar una válida en cualquier aparato estropeado o viejo que tengas por ahí. Simplemente tendrás que aprender a leer su valor, que es bastante fácil, y ajustar la fórmula según la resistencia que hayas podido encontrar. La desueldas del aparato viejo y la utilizas para medir.

Pronto te enseñaré a leer su valor. De momento pregunta en el chat y te ayudo.

Medir la batería que alimenta un NodeMCU

Esta es una utilidad muy utilizada de este tipo de aplicación. Si tienes un NodeMCU (u otra placa similar) alimentado por batería puedes utilizar esta misma técnica para medir el voltaje de la batería y, de esta forma, conocer la carga que le queda.

Por ejemplo, si lo estás alimentando con una batería Li-Po o Li-Ion que pueden dar hasta 4.2V, solamente tienes que conectar el positivo de la batería al pin A0 a través de una resistencia de 100Kohm, como te he indicado antes.

Con una resistencia de 100K el máximo que podrás medir será 4.2V, perfecto para medir una batería de este tipo utilizando el máximo rango posible del ADC.

Aquí puedes ver el cálculo de la resistencia necesaria hecho con la calculadora de divisor de voltaje online.

Recuerda que la resistencia que tenemos que poner es de 100K (y no de 320K) porque el NodeMCU ya tiene una de 220K instalada en la placa y esta la vamos a poner en serie.

Con este divisor de tensión cuando metas a la entrada 4.2V tendrás 1V a la salida y como el NodeMCU mide de 0 a 1020 = 0 a 1V, tendrás que poner una fórmula para que te dé el valor en voltios (en vez de un número que es 0=0V y 1023=1V), ¿recuerdas lo que hemos visto antes?

La fórmula será %value%*0,0041015625 (porque 4,2V/1024=0,0041015625V).

Piénsalo, cuando metas 4.2V a la salida 1V que te dará un valor de 1023. Si multiplicas 0,0041015625Vx1024= 4.2V ¡Justo el voltaje que tienes a la entrada!

Puedes comprobar el resto de valores, para confirmar que la fórmula es correcta, utilizando una regla de tres o usando la fórmula que tienes más arriba.

4 comentarios en «Uso de un ModeMCU como voltímetro»

  1. bastante bien, pero muchos numeros estan mal y confunden, como varias comas en un numero de una formula o habla de voltajes de mas de 140v que creo son errores de tipeo

    Responder
  2. tengo una duda el pin A0 del wemos dice max 3.3 v pero segun leo el Adc trabaja con 1 voltio osea cuando lo uso como adc debo siempre estar en el rango de 1 voltio?

    Responder

Deja un comentario