Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Mida cualquier corriente CA con ACS712

Componentes y suministros

Arduino UNO
× 1
OLED i²c 128x32
× 1
ACS712 30A
× 1
LCD 16x2 i²c
× 1

Acerca de este proyecto

TENGA CUIDADO SI ESTÁ UTILIZANDO LA LÍNEA ELÉCTRICA

Hola, y bienvenido a otro tutorial, este trata sobre la medición de corriente alterna (CA), usando ACS712 Estoy usando la versión de 30Amps que es ACS712 30A, y nuestra hermosa placa Arduino Uno, intenté agregar una pantalla OLED pero desafortunadamente terminé rompiéndolo mientras filmaba el tutorial, así que cambié a la pantalla LCD, pero a continuación encontrará el cableado y los códigos para ambas versiones.

Y por "Cualquier CA ..." quiero decir que veremos un código / biblioteca que funciona para todos los tipos de señales, no solo para ondas sinusoidales, y nuestro amperímetro podrá calcular el CUADRADO MEDIO DE LA RAÍZ VERDADERA. Y tenga en cuenta que el sensor utiliza el efecto Hall (producción de una diferencia de voltaje a través de un conductor eléctrico, transversal a una corriente eléctrica en el conductor y a un campo magnético aplicado perpendicular a la corriente)

Puede combinar este proyecto con este:Medición sencilla de voltaje CA usando Arduino y ZMPT101B

Las pruebas se realizarán en una bombilla incandescente, controlada por un atenuador de luz en serie con un multímetro de referencia y el módulo sensor de corriente ACS712.

Este es el plan:

  • Primero necesitamos conectar nuestro módulo con la placa Arduino y verificar la forma de la señal cuando el atenuador está ENCENDIDO - Ciclo completo - Medio ciclo.
  • Luego, comprobaremos un código simple que no requiere ninguna biblioteca, pero que solo funciona con la señal de ondas sinusoidales (se probará).
  • Después de eso, veremos el código que medirá el TRMS del AC y usaremos el LCD.

Piezas

Tenga cuidado al elegir el ACS712, no intente ir a lo seguro como lo hice yo (comprando una versión de 30 amperios), esto solo dará una gran fluctuación cuando intente usarlo para un uso doméstico o aplicaciones de pequeños amperios, así que aquí para mí, una versión 5A o 10A habría estado bien. También tenga en cuenta que 30A o 20A ... también afectarán sus calibraciones, pero se explica cómo calibrar en video y en comentarios de códigos.

Esas son las partes que utilicé, puedes reemplazar el UNO con cualquier placa compatible, o ese LCD i²c con un OLED o cualquier pantalla que prefieras.

Prueba 1

Cableado y código

El cableado para la prueba 1 se puede encontrar a continuación (Cableado 1), junto con el código (Código 1).

Resultados

Cargue el código y ejecute el trazador en serie, debería poder ver una señal de onda sinusoidal, la línea roja se muestra cuando apagué el atenuador y la corriente comenzó a tener esa forma que normalmente se encuentra en un triac.

Prueba 2

Ahora, si desea medir la corriente utilizando solo el código anterior, obtendrá valores entre 512 y 511, no reflejan el valor RMS en absoluto. Entonces, para medir el valor RMS de la señal, mantendremos el mismo cableado que el anterior, pero ahora necesitamos otro código que pueda calcular el RMS.

Cableado y código

El cableado es el mismo que (Cableado 1), pero con un código diferente se puede encontrar a continuación (Código 2).

Resultados

Como puede ver, los valores de la izquierda (RMS) son los mismos que el valor medido por el multímetro, a la derecha son valores de pico a pico, y tenga en cuenta que el atenuador está en ciclo completo ya que estoy usando una bombilla de 75 W y 230VAC / 50Hz.

!!!!!!!!!!!!!!!! PERO !!!!!!!!!!!!!!!!!!!!!

Aquí bajé completamente mi atenuador de luz, lo que significa que tengo aproximadamente 1/4 de ciclo, el multímetro me da 0.21A pero mi código me da 0.36A, el código todavía mide de pico a pico, pero como puede ver arriba, mi señal no es lineal cuando bajo el atenuador por completo.

Y esa es la diferencia entre una medición TRMS y una medición que solo funciona con señales de ondas sinusoidales.

Prueba 3

Ahora ves el problema del código anterior, pero afortunadamente hay una biblioteca al rescate, realmente aprecio esa biblioteca por todo el trabajo que hace porque, como sabes, si quieres calcular un valor RMS necesitas usar Cálculo integral, y eso es muy difícil de lograr en una placa de desarrollo electrónica, puede consultar el archivo cpp de la biblioteca para ver qué métodos se utilizan como el "Promedio" "Sigma" ... Cosas relacionadas con estadísticas / probabilidades ...

Cableado código y biblioteca

El cableado es el mismo que el utilizado anteriormente (Cableado 1) y, a continuación, puede encontrar el código (Código 3).

Y aquí puede descargar la biblioteca de filtros:Descargue la biblioteca aquí

Resultados

Los resultados correctos están en el medio, los de la izquierda sin calibración y los de la derecha se utilizan para demostrar cómo calibrar (ver el video).

Como vio la gran diferencia entre la respuesta de los dos códigos a una señal no lineal, pero el segundo actúa como un multímetro TRMS.

Prueba con LCD / OLED

Aquí mantenemos las mismas cosas, todo lo que hacemos es que, en lugar de usar el monitor en serie, podemos usar LCD u OLED

Cableado, códigos y bibliotecas

Los cables se pueden encontrar a continuación (Wiring_LCD) y (Wiring_OLED), códigos también debajo (Code_ACS712_LCD) y (Code_ACS712_OLED).

Aquí están las bibliotecas OLED

https://github.com/adafruit/Adafruit_SSD1306https://github.com/adafruit/Adafruit-GFX-Library

Y aquí está la LCD_i2c_library

https://drive.google.com/file/d/1Oc56q2GPs5SOA-PdbVHHSxKCnI9KY5xd/view

Resultado

Esta es la única prueba que pude hacer porque rompí mi pantalla OLED mientras intentaba grabar el video tutorial. En general, esto funciona de la misma manera que vimos antes, simplemente lo muestra en una pantalla LCD i²c. (Sí, los valores de TRMS no son el método pico a pico).

Eso es todo amigos, espero que les guste este tutorial, no olviden darle me gusta al tutorial en video y suscribirse al canal SurtrTech si quieren mostrar su apoyo, muchas gracias.

Cualquier duda déjala en los comentarios.

Código

  • Code_1.ino
  • Code_2.ino
  • Code_3.ino
  • Code_ACS712_LCD.ino
  • Code_ACS712_OLED.ino
Code_1.ino Arduino
Este código sirve para probar el módulo y visualizar la forma de la señal
 / * Este código funciona con el sensor de corriente ACS712, permite leer los datos brutos Es mejor usarlo con Serial Plotter Más detalles en www.surtrtech.com * / #define Current_sensor A0 // La entrada analógica del sensor pinfloat i; void setup () {Serial.begin (9600); pinMode (Current_sensor, INPUT);} void loop () {i =analogRead (Current_sensor); Serial.println (i); retraso (100); // Modificar o eliminar el retardo cambiará la forma en que se muestra la señal // configúrelo hasta que obtenga la forma de onda sinusoidal correcta} 
Code_2.ino Arduino
Este código utiliza el método de medición pico a pico para calcular el RMS de una señal de onda sinusoidal
 / * Este código funciona con el sensor de corriente ACS712, permite calcular el RMS de una corriente alterna de onda sinusoidal * utiliza el pico a pico método para calcular el RMS * Para obtener más información, visite www.surtrtech.com * / # define SAMPLES 300 // Número de muestras que desea tomar cada vez que realiza un bucle # define ACS_Pin A0 // Pin de datos ACS712 entre inputfloat High_peak, Low_peak; // Variables para medir o calcularfloat Amps_Peak_Peak, Amps_RMS; void setup () {Serial.begin (9600); pinMode (ACS_Pin, ENTRADA); // Definir el modo pin} void loop () {read_Amps (); // Ejecuta la función read_Amps Amps_RMS =Amps_Peak_Peak * 0.3536 * 0.06; // Ahora tenemos el valor pico a pico, normalmente la fórmula solo requiere multiplicar por 0.3536 // pero como los valores serán muy grandes, debes multiplicar por 0.06, primero no puedes usarlo, // haz tus cálculos y compáralos con valores reales medidos por un amperímetro. ej .:0.06 =valor real / valor medido Serial.print (Amps_RMS); // Aquí muestro el valor RMS y el valor pico a pico, puedes imprimir lo que quieras y agregar el símbolo "A" ... Serial.print ("\ t"); Serial.println (Amps_Peak_Peak); delay (200);} void read_Amps () // función read_Amps calcular la diferencia entre el pico alto y el pico bajo {// obtener el valor pico a pico int cnt; // Contador High_peak =0; // Primero asumimos que nuestro pico alto es igual a 0 y el pico bajo es 1024, sí invertido Low_peak =1024; for (cnt =0; cnt  High_peak) // Si ese valor es más alto que el pico alto (al principio es 0) {High_peak =ACS_Value; // El pico alto cambiará de 0 al valor encontrado} if (ACS_Value  
Code_3.ino Arduino
Este código utiliza fórmulas estadísticas para calcular el TRMS de una señal cualquiera que sea el sape y lo muestra en el monitor serial
 / * Este código funciona con el sensor de corriente ACS712, permite el cálculo de la señal TRMS * Visite www.surtrtech.com para más detalles * / # include  // Esta biblioteca hace un trabajo masivo verifica su archivo .cpp # define ACS_Pin A0 // Pin de datos del sensor en A0 inputfloat analógico ACS_Value; // Aquí mantenemos los valores de los datos brutos sfloat testFrequency =50; // frecuencia de la señal de prueba (Hz) float windowLength =40.0 / testFrequency; // cuánto tiempo promediar la señal, para statististfloat intercept =0; // se ajustará en función de las pruebas de calibración, pendiente de flotación =0,0752; // para ser ajustado en base a las pruebas de calibración // Por favor, consulte el video tutorial ACS712 de SurtrTech para ver cómo obtenerlos porque depende de su sensor, o mire debajo de flotador Amps_TRMS; // corriente real estimada en ampsunsigned long printPeriod =1000; // en milisegundos // Seguimiento del tiempo en milisegundos desde la última lectura unsigned long previousMillis =0; void setup () {Serial.begin (9600); // Inicie el puerto serie pinMode (ACS_Pin, INPUT); // Definir el modo pin} void loop () {RunningStatistics inputStats; // crea estadísticas para ver la señal de prueba sin procesar inputStats.setWindowSecs (windowLength); // Establezca la longitud de la ventana while (verdadero) {ACS_Value =analogRead (ACS_Pin); // lee el valor analógico:inputStats.input (ACS_Value); // iniciar sesión en la función Stats if ((unsigned long) (millis () - previousMillis)> =printPeriod) {// cada segundo hacemos el cálculo previousMillis =millis (); // tiempo de actualización Amps_TRMS =intersección + pendiente * inputStats.sigma (); Serial.print ("\ t Amps:"); Serial.print (Amps_TRMS); }}} / * Acerca de la pendiente y la intersección * Primero necesita saber que todas las calculaciones de TRMS se realizan mediante funciones de la biblioteca, es el valor "inputStats.sigma ()" * Al principio puede mostrar que "inputStats.sigma () "como su valor TRMS, luego intente medir usándolo cuando la entrada sea 0.00A * Si el valor medido es 0 como lo obtuve, puede mantener la intersección como 0; de lo contrario, deberá agregar o restar para hacer eso valor igual a 0 * En otras palabras "elimine el desplazamiento" * Luego encienda la energía a un valor conocido, por ejemplo, use una bombilla o un LED que conozca su potencia y ya conozca su voltaje, así que un poco de matemáticas obtendremos los amperios teóricos * divides ese valor teórico por el valor medido y aquí tienes la pendiente, ahora colócalos o modifícalos * / 
Code_ACS712_LCD.ino Arduino
Este código utiliza el método de cálculo TRMS y lo muestra en la pantalla LCD i²c
 / * Este código funciona con ACS712 y LCD ic * Mide el TRMS de una corriente alterna y muestra el valor en la pantalla * Visite www.SurtrTech.com para más detalles * / # include  // Esta biblioteca hace un gran trabajo verifique su archivo .cpp # include  // LCD ic library # define ACS_Pin A0 // ACS712 data pin # define I2C_ADDR 0x27 // Dirección I2C, debe usar el código para escanear la dirección primero (0x27) aquí # define BACKLIGHT_PIN 3 // Declarando Pines LCD # define En_pin 2 # define Rw_pin 1 # define Rs_pin 0 # define D4_pin 4 # define D5_pin 5 # define D6_pin 6 # define D7_pin 7LiquidCrystal_I2C lcd (I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin); // Declarando lcdfloat testFrequency =50; // frecuencia de la señal de prueba (Hz) float windowLength =40.0 / testFrequency; // cuánto tiempo promediar la señal, para statististfloat intercept =0; // se ajustará en función de las pruebas de calibración, pendiente de flotación =0,0752; // para ser ajustado en base a las pruebas de calibración // Por favor, consulte el video tutorial ACS712 de SurtrTech para ver cómo obtenerlos porque depende de su sensor, o mire debajo de flotador Amps_TRMS; float ACS_Value; unsigned long printPeriod =1000; unsigned long previousMillis =0; void setup () {digitalWrite (2, HIGH); lcd. comienzo (16,2); lcd.setBacklightPin (BACKLIGHT_PIN, POSITIVO); lcd.setBacklight (ALTO); // Iluminación de fondo lcd.home (); } bucle vacío () {EstadísticaEjecutando inputStats; // crea estadísticas para ver la señal de prueba sin procesar inputStats.setWindowSecs (windowLength); while (verdadero) {ACS_Value =analogRead (ACS_Pin); // lee el valor analógico:inputStats.input (ACS_Value); // iniciar sesión en la función Stats if ((unsigned long) (millis () - previousMillis)> =printPeriod) {// cada segundo hacemos el cálculo previousMillis =millis (); // tiempo de actualización Amps_TRMS =intersección + pendiente * inputStats.sigma (); // Calibrar los valores lcd.clear (); // limpia la pantalla lcd e imprime en una posición determinada lcd.setCursor (2,0); lcd.print (Amps_TRMS); lcd.print ("A"); }}} / * Acerca de la pendiente y la intersección * Primero necesita saber que todas las calculaciones de TRMS se realizan mediante funciones de la biblioteca, es el valor "inputStats.sigma ()" * Al principio puede mostrar que "inputStats.sigma () "como su valor TRMS, luego intente medir usándolo cuando la entrada sea 0.00A * Si el valor medido es 0 como lo obtuve, puede mantener la intersección como 0; de lo contrario, deberá agregar o restar para hacer eso valor igual a 0 * En otras palabras "elimine el desplazamiento" * Luego encienda la energía a un valor conocido, por ejemplo, use una bombilla o un LED que conozca su potencia y ya conozca su voltaje, así que un poco de matemáticas obtendremos los amperios teóricos * divides ese valor teórico por el valor medido y aquí tienes la pendiente, ahora colócalos o modifícalos * / 
Código_ACS712_OLED.ino Arduino
Este código utiliza el método de cálculo TRMS y muestra el valor en el OLED.
 / * Este código funciona con ACS712 y OLED ic * Mide el TRMS de una corriente alterna y muestra el valor en la pantalla * Visite www.SurtrTech. com para más detalles * / # include  // Esta biblioteca hace un gran trabajo verifique su archivo .cpp # include  // Bibliotecas OLED # include  #define ACS_Pin A0 # define SCREEN_WIDTH 128 // Ancho de la pantalla OLED, en píxeles # define SCREEN_HEIGHT 32 // Altura de la pantalla OLED, en píxeles # define OLED_RESET -1 // Restablecer el pin # (o -1 si se comparte el pin de restablecimiento de Arduino) float testFrequency =50; // frecuencia de la señal de prueba (Hz) float windowLength =40.0 / testFrequency; // cuánto tiempo promediar la señal, para statististfloat intercept =0; // se ajustará en función de las pruebas de calibración, pendiente de flotación =0,0752; // para ser ajustado en base a las pruebas de calibración // Por favor, consulte el video tutorial ACS712 de SurtrTech para ver cómo obtenerlos porque depende de su sensor, o mire debajo de flotador Amps_TRMS; float ACS_Value; unsigned long printPeriod =1000; unsigned long previousMillis =0; pantalla Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // Declarar el nombre de visualización (display) void setup () {display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // Inicie la pantalla OLED display.clearDisplay (); display.display ();} void loop () {RunningStatistics inputStats; // crea estadísticas para ver la señal de prueba sin procesar inputStats.setWindowSecs (windowLength); while (verdadero) {ACS_Value =analogRead (ACS_Pin); // lee el valor analógico:inputStats.input (ACS_Value); // iniciar sesión en la función de estadísticas if ((unsigned long) (millis () - previousMillis)> =printPeriod) {// Hacer los cálculos cada 1s previousMillis =millis (); // tiempo de actualización Amps_TRMS =intersección + pendiente * inputStats.sigma (); display.clearDisplay (); display.setTextSize (3); display.setTextColor (BLANCO); display.setCursor (15,10); display.print (Amps_TRMS); display.println ("A"); display.display (); }}} / * Acerca de la pendiente y la intersección * Primero necesita saber que todas las calculaciones de TRMS se realizan mediante funciones de la biblioteca, es el valor "inputStats.sigma ()" * Al principio puede mostrar que "inputStats.sigma () "como su valor TRMS, luego intente medir usándolo cuando la entrada sea 0.00A * Si el valor medido es 0 como lo obtuve, puede mantener la intersección como 0; de lo contrario, deberá agregar o restar para hacer eso valor igual a 0 * En otras palabras "elimine el desplazamiento" * Luego encienda la energía a un valor conocido, por ejemplo, use una bombilla o un LED que conozca su potencia y ya conozca su voltaje, así que un poco de matemáticas obtendremos los amperios teóricos * divides ese valor teórico por el valor medido y aquí tienes la pendiente, ahora colócalos o modifícalos * / 

Esquemas

Cableado utilizado de las pruebas 1, 2 y 3 Utilice LCD i²c Utilice OLED 128x32

Proceso de manufactura

  1. Cómo medir la calidad del aire en OpenSensors
  2. Monitoreo de CO2 con sensor K30
  3. Comunicación para personas sordociegas con 1Sheeld / Arduino
  4. Controlar el aceptador de monedas con Arduino
  5. ¡Arduino con Bluetooth para controlar un LED!
  6. Sensor capacitivo de huellas dactilares con Arduino o ESP8266
  7. Jugando con Nextion Display
  8. Brazo robótico controlado por Nunchuk (con Arduino)
  9. Animar una boca de Billy Bass con cualquier fuente de audio
  10. Medición de la radiación solar con Arduino
  11. Mini radar con Arduino