Select Page

Cómo medir el voltaje de corriente alterna hasta 250 V, tanto en 50Hz como en 60Hz, usando el ZMPT101B es una tarea fácil ahora.

Siempre fue fácil, pero ahora es más segura y más precisa.

Cómo medir tensión alterna con Arduino

Lo que se hace de forma ERRÓNEA, es aplicar un divisor resistivo a la onda de 220VAC y se mete directo al ADC o entrada analogica de un Arduino UNO o Arduino NANO.

ZMPT101B Voltímetro AC 2

¿Porque es erróneo? Si tiene perfecta lógica. El problema radica en que si viene un pico de tensión por la red o cae un rayo por ahí, ese exceso de tensión entrara directo al arduino y freiria todo. Sin mencionar que esa tensión no estaría aislada de tierra y eso trae problemas de corrientes internas sin mencionar que podría recibir un choque eléctrico y quedarnos pegados.

No se hace de esta forma, para más información al respecto te recomendamos buscar puesta a tierra, transformadores y temas relacionados con electricidad alterna.

La otra manera que tenemos para medir, es rectificar la onda de 220VAC con un puente de diodos por ejemplo, transformarla en continua con un capacitor y poner un divisor resistivo que entre directo al ADC del Arduino o microcontrolador.

ZMPT101B Voltímetro AC 3

La manera correcta de hacerlo es utilizando un transformador reductor de tensión que cumple 3 funciones.

  • La más obvia es que reduce la tensión de 220 a …. 5v por ejemplo.
  • El transformador tiene una respuesta en frecuencia que no deja pasar los picos de tensión. (obvio que esto tiene una tolerancia si cae un rayo en tu casa es probable que no lo filtre.
  • Aísla la conexión a tierra que hace la empresa eléctrica. Esto nos da la seguridad que si tocamos un cable u otro (nunca los dos al mismo tiempo) no nos quedemos pegados y muramos o PEOR.
ZMPT101B Voltímetro AC 4
ZMPT101B arduino

Cómo funciona el ZMPT101B

circuito zmpt101b
circuito zmpt101b

SIn meterse en el funcionamiento del circuito, el corazón de la placa es el transformador zmpt 107, que baja la tensión y aísla de tierra la placa.

Un amplificador diferencial amplifica la señal sacando el ruido y luego un potenciómetro nos permite modificar el offset que se le agregue.

Este offset agregado dependerá de la tensión de alimentación del módulo y tiene que ver con la calibración del mismo. Es decir, desde qué valor queremos que comience y hasta qué valor queremos que llegue.

El valor entregado por el sensor es pico a pico y para obtener la tensión RMS (110VAC o 220VAC segun tu pais) Se debe aplicar una cuenta matemática, que básicamente es dividir el valor pico por raiz de 2 o 1.41.

ZMPT101B Voltímetro AC 5
1- Tenemos la señal completa de alterna
2- El transformador reduce la tensión
3- Luego le aplica un offset

Consideraciones especiales

Como toda entrada analogica o ADC, lo que el Arduino hace es tomar muestras de la tensión cada cierto tiempo.

Tomar el valor máximo de cada lectura, no es la opción óptima, dado que solo vas a medir ruido en general. Probalo y vas a ver.

La correcta manera de utilizar este sensor es mediante un análisis de señales digitales y obtener los diferentes valores de las ecuaciones matemáticas correctas.

Tener en cuenta que la señal sampleada en el Arduino tendrá un offset proporcionado por el potenciómetro y hay que quitarlo.

La librería que te recomiendo que uses en Filters.h, que te reduce la cantidad de trabajo que tenes que hacer.

Download here, or from Github.

ZMPT101B Codigo ARduino

/* 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();
    }
  }

}
A %d blogueros les gusta esto: