Fáciles medidas de c.a. con Arduino

Por Soloelectronicos @soloelectronico

Medir la tensión de ca de la red de suministro con Arduino puede ser una labor compleja dado el rango de tensiones que manejamos ,pero gracias a los transformadores de tensión vamos a ver cómo medir voltaje CA hasta 250 V, tanto en 50 Hz como en 60 Hz, usando el ZMPT101B, (ese es el nombre del transformador solamente, pero lo encontrará con este nombre o "sensor de voltaje CA").

Este módulo basado en un transformador de precisión para medidas (el zMPT101B) y un circuito operacional (el LM358) con la electronica asociada

Hemos de dicir que ,usado el código correcto, es mucho mejor esta electronica para las medidas, que los otros métodos que usan transformador + rectificador + divisor de voltaje....que no siempre dan los valores correctos. Puede que otros sistemas muestren la señal cuadrada o triangular,lo cual afecta seriamente el RMS, pues el RMS es lo que queremos medir, y para ello debemos mantener la misma forma de la señal asi que al adaptarlo para el Arduino,y aquí es cuando el módulo es útil.

Debemos advertir nuevamente que este tipo de circuitos pueden ser peligrosas si no se extrema las medidas pues en los bornes atornillados debemos conectar la carga de ca de 220V

El módulo toma la señal que queremos medir, aquí una potencia doméstica de 220V, tiene alrededor de 311V como pico.

El transformador del módulo lo devuelve al pico de 2.5V

Luego agrega un desplazamiento de 2.5V para adaptarlo al Arduino.

Y aquí preste atención, algunos códigos se usan con este módulo, solo hacen una muestra de la señal y miden los picos, luego una pequeña multiplicación, y puede mostrarle el "RMS" de esta señal, pero esos códigos funcionan solo para señal de onda sinusoidal perfecta, si está midiendo otra forma de la señal sería falsa.

Y, por ejemplo, aquí utilizamos un atenuador de luz(dimmer), que se basa en un Triac y ya conoces la forma "extraña" de la señal que hace un Triac.

Aquí puede ver que para medir el RMS no solo debe medir los picos y hacer los mismos cálculos para la señal de onda sinusoidal.

Pero debe hacerlo de la manera correcta y es muy difícil de codificar, por eso usaremos una biblioteca simple que como siempre hará el trabajo por nosotros.

Visualización de la información

Para mostrar las medidas se puede usar por ejemplo una pantalla OLED en lugar de las tipicas basadas en LCD con el controlador de Toshiba HD44780,

LCD es el acrónimo de Liquid Crystal Display (en español Pantalla de Cristal Líquido). No podemos considerar que se trate de una tecnología novedosa. El LCD lleva con nosotros mucho tiempo, solo tenemos que echar la mirada hacia atrás y recordar esos relojes Casio o las calculadoras que llevamos a clase de matemáticas.

Estamos acostumbrados a que la materia pueda estar en estado sólido, líquido o gaseoso, los llamados estados de la materia. Pero ya en el siglo XIX se descubrió que había más estados en los que podía encontrarse la materia. El cristal líquido se encuentra en algún lugar entre el sólido y líquido.No es el objetivo de este post la física involucrada detrás de los LCD, solo decir que utiliza las propiedades de la luz polarizada para mostrarnos la información en una pantalla. A partir de una serie de filtros, se consigue mostrar la información gracias a la iluminación de fondo.

Hay una amplia gama de pantallas LCDs que podemos utilizar con Arduino. Aparte de las funcionalidades extra que nos puedan dar cada una de ellas, las podemos diferenciar por el número de filas y columnas, su tamaño.

Por ejemplo, una pantalla LCD de 16×1 tendrá una fila de 16 caracteres es decir, solo podremos mostrar 16 caracteres simultáneamente, al igual que un LCD de 20×4 tendrá 4 filas de 20 caracteres cada una.

En este artículo vamos a trabajar con un LCD típico, de 16×2. Esto significa que vamos a poder mostrar 16 caracteres en la primera fila y los mismos en la segunda fila.

La mayoría de las pantallas LCD que se están haciendo ahora, vienen con una fila de dieciséis pines. Los primeros catorce pines se utilizan para controlar la visualización. Los dos últimos son para la iluminación de fondo.

Aunque el dato se puede enviar en 8 bits , lo normal es usarlo partido en "trozos" de 4 bits, labor que será transparente al usuario gracias a las librería LiquidCrystal.h y que como es obvio se emplea para ahorrarnos 4 lineas de datos del GPIO de modo que necesitaríamos 4 para datos + 3 de control =7 pines de datos lógicamente mas 2 mas para la alimentación de 5v DC

En la siguiente imagen vemos la correspondencia con los pines físicos del LCD.

Esta imagen muestra la parte de abajo del LCD. Cuando lo conectes a la protoboard los pines estarán invertidos horizontalmente.

Otra alternativa es usar una pantalla OLED i2c de 128 * 32 , cuyo coste es irrisorio. Este tipo de pantallas esde reducidasa dimensiones y , puede usarlas en algunos proyectos pequeños de bricolaje y también les brinda muchas posibilidades para hacer (diferentes fuentes y tamaños de textos, diferentes formas, desplazamiento, imágenes bmp ...) Tenga en cuenta que este tipo de pantalla no es una pantalla a color, las "nornales " solo imprimen en azul (Izquierda) pero las hay en blanco, y algunos pueden tener amarillo + uno de los colores anteriores .

Este es un ejemplo cableado con una pantalla OLED .Este cableado depende de su versión de pantalla ,( el que vemos usa 4 pines : dos para la alimentacion con 3,3V DC y los dos de datos no cableando el pin RST).

Este es todo el cableado y, como se mencionó, estamos usando una pantalla OLED de 128 × 32, puede usarla o no, el módulo está alimentado por 5v y entrega una señal analógica.

Lo primero que debe hacer es calibrar el módulo con su potenciómetro, cablear el módulo, enchufar el Arduino y cargar este simple código, y no olvide colocar las sondas de medición en la toma de corriente (¡¡¡CUIDADO !!! ) y ya conoce el voltaje.

El código para probar esto es realmente simple , usando eso si, el Serial Plotter de Arduino IDE:

void setup() { Serial.begin(9600); } void loop() { Serial.println(analogRead(A0)); }

Abra el trazador de serie del IDE de Arduino:

Verá algo como esto en su trazador de serie, significa que no adquiere toda la señal, ajuste el potenciómetro hasta que tenga algo que parezca una onda sinusoidal. Sé que esa no es la señal de onda sinusoidal de CA.

Cuando tenga algo como esto, puede agregar un retraso para ver una buena onda sinusoidal, aquí es porque estoy midiendo justo después de mi atenuador de luz, verá un pequeño pico antes del pico de señal si mide el enchufe directamente, no lo hará

Ahora que su módulo está calibrado, las calibraciones del código se basarán en él, así que trate de no cambiarlo.

La biblioteca que usamos es Filters.h, reduce la cantidad de trabajo para usted, descargue aquí o desde Github .

Bibliotecas de pantallas OLED de Adafruit

 /* This code works with ZMPT101B AC voltage sensor module and 128x32 OLED display * It permits you to measure any AC voltage up to 250V, BE CAREFUL !!! * The functions from Filters library permits you to calculate the True RMS of a signal * Refer to www.surtrTech.com or SurtrTech YouTube channel for more details */ #include <Filters.h> //Easy library to do the calculations #include <SPI.h> //Libraries for the OLED display #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels #define OLED_RESET -1 // Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Declaring the display name (display) float testFrequency = 50; // test signal frequency (Hz) float windowLength = 40.0/testFrequency; // how long to average the signal, for statistist int Sensor = 0; //Sensor analog input, here it's A0 float intercept = -0.04; // to be adjusted based on calibration testing float slope = 0.0405; // to be adjusted based on calibration testing float current_Volts; // Voltage unsigned long printPeriod = 1000; //Refresh rate unsigned long previousMillis = 0; void setup() { Serial.begin( 9600 ); // start the serial port display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Start the OLED display display.clearDisplay(); display.setTextSize(2); display.setTextColor(WHITE); display.setCursor(1,1); display.print("SurtrTech"); display.setCursor(1,20); display.setTextSize(1); display.print("AC Voltmeter"); display.display(); delay(5000); } void loop() { RunningStatistics inputStats; //Easy life lines, actual calculation of the RMS requires a load of coding inputStats.setWindowSecs( windowLength ); while( true ) { Sensor = analogRead(A0); // read the analog in value: inputStats.input(Sensor); // log to Stats function if((unsigned long)(millis() - previousMillis) >= printPeriod) { previousMillis = millis(); // update time every second Serial.print( "\n" ); current_Volts = intercept + slope * inputStats.sigma(); //Calibartions for offset and amplitude current_Volts= current_Volts*(40.3231); //Further calibrations for the amplitude Serial.print( "\tVoltage: " ); Serial.print( current_Volts ); //Calculation and Value display is done the rest is if you're using an OLED display display.clearDisplay(); display.setTextSize(3); //size of the text that will follow display.setTextColor(WHITE); //its color display.setCursor(1,1); //position from where you want to start writing display.print(current_Volts,1); display.setCursor(115,00); display.setTextSize(2); display.print("V"); display.setCursor(115,15); display.setTextSize(1); display.print("AC"); display.display(); } } }

Pruebas:

Los valores seguramente no son perfectos y 100% precisos, pero como ve, necesita calibraciones muy precisas para hacerlo perfecto, y no olvide que está usando un módulo de 10 $ o menos, y allí se compara con un multímetro que usa TRMS. , Verdadero valor eficaz.

Un multímetro que no sea TRMS también le dará una lectura falsa para una señal que no sea de onda sinusoidal,

Fuente: https://surtrtech.com/