Horometro con Arduino (varios motores).

Junto con saludar y recién integrándome a esta linda comunidad Arduinolovers, estoy desarrollando un proyecto el cual consta de un monitoreo de funcionamiento de motores trifasicos, mas que nada una cuenta de tiempo de uso de los motores para luego determinar las mantenciones del motor en base al tiempo de actividad del motor. para esto estoy pensando en usar sensores no invasivos de corriente los cuales irán en una de las fase del motor solo para detectar cuando hay alimentación sobre el motor(asumiendo que ya esta en funcionamiento). este pulso de información sera leída en algún puerto de entrada analógica e iniciara la cuenta.

Mis dudas son las siguientes:

Pensé en ocupar un Arduino mega ya que tiene mas entradas análogas y de esta forma puedo montar mas de un sensor para cada motor que requiera, entonces en base a esto , por lo que tengo entendido el Arduino posee un reloj interno el cual me ayudara a establecer un relación de tiempos para poder determinar el tiempo de uso del motor, todo esto en base al código que creare.

Pregunta:

¿ Es posible ocupar este reloj interno del arduino para realizar más de una cuenta personalizada para cada motor que quiera montar en las entradas analogas? o simplemente puedo realizar solo una cuenta para conteo de tiempo para un motor?.

Si la respuesta es "no es posible", que me recomiendan ustedes? ( he pensado en ocupar horometros inteligentes con salidas A/D y luego de eso montarlos en alguna entrada Digital o análoga del arduino).

Estoy atento a sus comentarios y agradeciendo anticipadamente su tiempo.

ElectronicoLoco:
Pregunta:

¿ Es posible ocupar este reloj interno del arduino para realizar más de una cuenta personalizada para cada motor que quiera montar en las entradas analogas? o simplemente puedo realizar solo una cuenta para conteo de tiempo para un motor?.

Sí, se puede.

Saludos

Usando el reloj interno es viable pero si se corta la energía que pasará con tu sistema de mantenimiento, Lo has considerado?

Amplio: Tendras que considerar un sistema de backup de energía o sea una batería que mantenga el Arduino funcionando o bien en sleep, tmb podrias regristrar el evento corte de energía para tu sistema.

Un simple ACS-712 de la corriente adecuada para cada máquina podría funcionar pero hay muchos sensores capaces para medir corriente. Digo corriente, no tensión.

En relación a un posible corte de energía, tengo considerado baterías para energizar el arduino y el sensor que ocupare es el siguiente :

Ahora bien no logro pensar un código en el cual pueda ocupar todas las entradas analógicas par cada motor necesario.

Moderador: No repitas lo que se lee arriba

ElectronicoLoco:
Ahora bien no logro pensar un código en el cual pueda ocupar todas las entradas analógicas par cada motor necesario.

Pero si todavía no nos has dicho cuántos motores quieres monitorizar ...

Saludos.

¿No valdría simplemente con controlar un contacto del contactor de los motores (para saber si están andando o no)?
Saludos

1 Like

vffgaston:
Pero si todavía no nos has dicho cuántos motores quieres monitorizar ...

¿No valdría simplemente con controlar un contacto del contactor de los motores (para saber si están andando o no)?
Saludos

Saludos.

Son bastantes con tan solo mencionar que ocupare todas la entradas Análogas del Arduino mega 2560 que son 16.

La idea es no intervenir en él tablero, es por aquello que usare un sensor no invasivo.

Aunque no descarto controlar un contacto del contactor de los motores, y me imagino algún octocoplador que me genere un pulso hacia alguna entrada digital o algún rele?, tengo trabajo en ese sentido jejeje.

Gracias por su respuesta

Tienes mas trabajo logrando que tu arduino funcione sin que se resetee o cuelgue. No olvides eso!!

Ve pensando o leyendo los hilos que tenemos sobre snubbers y como proteger al Arduino de las interferencias electricas.

@surbyte en cuanto a las interferencias y cortes de energías es un tema que puedo solucionar, lo que me complica es como generare un código para 16 motores ocupando tan solo un reloj base del arduino mega :frowning:

Bueno eso es mas o menos simple.
Muestrea los 16 canales digamos a 1mseg, luego verifica con cada muestra si su valor esta en dentro de cierta ventana dada por dos umbrales, uno POSITIVO y otro NEGATIVO.
Los que esten fuera de la ventana no les prestas atención hasta el siguiente semiperíodo pero al que este dentro lo monitoreas mas seguido con cada muestreo.
Deberías poner el ADC en modo free wheeling o sea de muestreo libre o bien indicarle una tasa de muestreo de 1Khz o mejor. Tal vez un multiplo de 16 sería mas apropiado.
Trabaja todo en elementos enteros no uses conversion a flotante porque no será eficiente.

ElectronicoLoco:
Son bastantes con tan solo mencionar que ocupare todas la entradas Análogas del Arduino mega 2560 que son 16.

Sigo sin entender para que quieres entradas analógicas si solo se trata de saber cuántas horas está el motor en marcha.

Saludos.

1 Like

@vffgaston La idea no es intervenir con el tablero donde este conectado al motor y como mencione anteriormente pensé en ocupar sensores de corriente no invasivos que trabajan con señales analógicas, pero como ultimo recurso no niego otra opción.

Gracias por su respuesta.

@surbyte Si me diera una idea de un código se lo agradecería en el alma así puedo entender su idea como soy nuevo en esto aun me cuesta un poco...

Saludos y gracias, quedo atento a su respuesta.

ElectronicoLoco:
Junto con saludar y recién integrándome a esta linda comunidad Arduinolovers, estoy desarrollando un proyecto el cual consta de un monitoreo de funcionamiento de motores trifasicos, mas que nada una cuenta de tiempo de uso de los motores para luego determinar las mantenciones del motor en base al tiempo de actividad del motor. para esto estoy pensando en usar sensores no invasivos de corriente los cuales irán en una de las fase del motor solo para detectar cuando hay alimentación sobre el motor(asumiendo que ya esta en funcionamiento). este pulso de información sera leída en algún puerto de entrada analógica e iniciara la cuenta.

...

Francamente: el problema de medir los tiempos (y todo lo que dice Surbyte en cuanto a interferencias y cortes de energía hay que tenerlo muy en cuenta. El resto también) NO es muy complicado. Ahora bien (para que te podamos ayudar de forma consistente): ¿qué conocimientos tienes de programación en "C"?, ¿y en el entorno arduino?.

Saludos.

@vffgaston Francamente no es mucho, pero logro entender los códigos,entrada,salidas,estructuras condicionales y ahora me tope con este tipo de proyecto en cual desconozco el tema de un contador por tiempo de uso de un motor por eso me vi en la necesidad de solicitar orientación de los mas experimentados en este foro.

Saludos.

ElectronicoLoco:
@vffgaston Francamente no es mucho, pero logro entender los códigos,entrada,salidas,estructuras condicionales y ahora me tope con este tipo de proyecto en cual desconozco el tema de un contador por tiempo de uso de un motor por eso me vi en la necesidad de solicitar orientación de los mas experimentados en este foro.

Saludos.

Sí, hombre, pero es necesario saber lo que sabes ..
¿Tienes el arduino a mano?. ¿Entiendes los programas de ejemplo más sencillos?.
Saludos

@vffgaston claro que entiendo, el lunes me llega una placa arduino mega, por ahora simulo en proteus con simulino.

@surbyte @vffgaston

Hasta el momento he ido creando un código para la lectura de un solo motor:

les agradecería cualquier tipo de inquietud, se que a este código le faltan algunas cosas...

//***********Hometro***********//


//** Definiciones **//
#include <TimeLib.h> //Incluimos la librería Time
#include "EmonLib.h"// Incluimos la libreria EmonLib para ver el consumo de Corriente.


EnergyMonitor energyMonitor;// Crear una instancia EnergyMonitor.
float voltajeRed = 230.0;//posible voltaje de la fase de alimentación del motor.
int sensorPin = A0;
int sensor = 0;// Varible iniciada en 0.


                                                  //** Programa **//
void setup()

{
  Serial.begin(9600);//Inicializamos el puerto serie.
  
  setTime(16,02,40,04,05,2018);//Anotamos la hora y la fecha desde la que nuestro programa empezará a contar,
                               //Formato: hora, minutos, segundos, días, mes, año
  energyMonitor.current(0, 2.6); // instancia para energyMonitor.
}

void loop() 
{
  double Irms = energyMonitor.calcIrms(1484);// Obtenemos el valor de la corriente eficaz.
                                             // Pasamos el número de muestras que queremos tomar.
                                             
  double potencia =  Irms * voltajeRed;     // Calculamos la potencia aparente.
  
  time_t t = now();//Declaramos la variable time_t t.
  
  sensor = analogRead( sensorPin );  //lee el estado de la entrada analoga.

  while(sensor==HIGH)// pregunta si la lectura de la entrada del sensor es un valor alto,
                     // Si es Verdadero imprime(monitor Serial) en tiempo fecha y hora de uso del motor.
                     // Ademas muestra valores de corriente y potencia.
                     
  {        
  Serial.print(day(t));
  Serial.print(+ "/") ;
  Serial.print(month(t));
  Serial.print(+ "/") ;
  Serial.print(year(t)); 
  Serial.print( " ") ;
  Serial.print(hour(t));  
  Serial.print(+ ":") ;
  Serial.print(minute(t));
  Serial.print(":") ;
  Serial.println(second(t));
  delay(3000);//Esperamos 3 segundos

  Serial.print("Potencia = ");
  Serial.print(potencia);
  Serial.print("    Irms = ");
  Serial.println(Irms);
  delay(1000);//Esperamos 1 segundos

   if(hour(t)==19 && minute(t)==30)
  {
    Serial.println("Alarma") ; // Tiempo de Mantencion motor.
  }
  }
  }

A ver, tu quieres saber si la máquina esta funcionando o no. NADA MAS.
Para ello tienes 2 caminos. O miras si esta conecada monitoreando tensión o miras si circula corriente.

Si monitoreas tensión puedes usar un RELE por ejemplo o el contacto abierto de un contactor de la propia máquina o un auxiliar. Al accionarse te diría si esta ON/OFF.
Con el rele lo mismo. Si la máquina es trifasica ya eso es mas costoso y digamos que no es buena opción pero si lo del contacto del contactor.

Para el caso de medir la corriente solo debes saber si circula o no.
No entiendo para que quieres el RTC? o llevar la hora de cuando se activó. Eso solo genera problemas de programación posteriores. Ej. si tienes que arranco a las 16:23:40 y se detiene a las 17:34:20 debes calcular el tiempo que estuvo accionada. Por supuesto que se puede pero no es tan simple.

Asi que nada mejor que usar millis(). Solo detecta si funciona/no funciona y con millis() llevas la cuenta.
Solo almacenas millis() en 16 contadores que en caso de perdida de energia serán almacenados en la EEPROM y solucionado.

Supongamos que el tipo de variable de millis() que seguro no lo sabes, del tipo unsigned long o sea 32 bits no te resulta suficiente pues puedes usar unsigned long long o sea 64 bits no tengo ganas de hacer las cuentas pero te aseguro te acanzará.
Otra cosa. un contador de esto puede llevarse con motivos de contabilidad o bien para tareas de mantenimiento. Si fuera mantenimiento los 2^32 = 49,71 dias no serán suficientes pero si es para una cuenta mensual sobran.

Esperaré tu respuesta.

Viendo tu código

sensor = analogRead( sensorPin );  //lee el estado de la entrada analoga.while(sensor==HIGH)// pregunta si la lectura de la entrada del sensor es alta,
                     // Si es Verdadero imprime en tiempo fecha y hora de uso del motor.
                     // Ademas muestra valores de corriente y potecia.

Simplemente no se que es eso?
Si lees un AD jamás te devuelve un valor LOW/HIGH sino algo entre 0-1023 correspondiente a un ADC de 10 bits.

Debes leer un poco me parece!!
Ya te preguntó vffgaston

Sí, hombre, pero es necesario saber lo que sabes ..
¿Tienes el arduino a mano?. ¿Entiendes los programas de ejemplo más sencillos?.

@surbyte Después de haber leído un poco más pude entender ciertas cosas que tratabas de explicarme e hice algunas modificaciones para mi código, ademas pensé en una solución para el tema de cuando el motor este energizado y el sensor de corriente lea una cierta cantidad de intensidad traspasar ese valor con el comando map
así genero un rango en el cual con una instrucción while y luego la condición( x >= y) me permita contar siempre y cuando este dentro de ese rango asumiendo que el motor esta funcionando. Esto es lo que he pensado y me gustaría saber si es una idea valida con respecto a esto.

Saludos y espero atento su respuesta.

//***********Hometro***********//


//** Definiciones **//
#include <TimeLib.h> //Incluimos la librería Time
#include "EmonLib.h"// Incluimos la libreria EmonLib para ver el consumo de Corriente.

HardwareSerial &pc = Serial;
unsigned int totalSeconds, hours, minutes, seconds;
EnergyMonitor energyMonitor;// Crear una instancia EnergyMonitor.
float voltajeRed = 230.0;//posible voltaje de la fase de alimentación del motor.
int sensorPin = A0;
int sensor = 0;// Varible iniciada en 0.


                                                  //** Programa **//
void setup()

{
  pc.begin(9600);
  while(!pc);
  pc.println("Contador de tiempo (H:M:S)");
  
  Serial.begin(9600);//Inicializamos el puerto serie.
  energyMonitor.current(0, 2.6); // instancia para energyMonitor.
}

void loop() 
{
  double Irms = energyMonitor.calcIrms(1484);// Obtenemos el valor de la corriente eficaz.
                                             // Pasamos el número de muestras que queremos tomar.
  double potencia =  Irms * voltajeRed;     // Calculamos la potencia aparente.
  
  totalSeconds = millis()/1000;
  hours        = totalSeconds / 3600;
  minutes      = totalSeconds % 3600 / 60;
  seconds      = totalSeconds % 60; 

  sensor = analogRead( sensorPin );  //lee el estado de la entrada analoga.



    pc.print(hours < 10 ? "0" : "");
    pc.print(hours);
    pc.print(":");
    pc.print(minutes < 10 ? "0" : "");
    pc.print(minutes);
    pc.print(":");
    pc.print(seconds < 10 ? "0" : "");
    pc.println(seconds);
    delay(1000);
                    
    Serial.print("Potencia = ");
    Serial.print(potencia);
    Serial.print("    Irms = ");
    Serial.println(Irms);
    delay(1000);//Esperamos 1 segundos

  }