Go Down

Topic: Contar horas de trabajo en un motor diesel (Read 3729 times) previous topic - next topic

aguilar976

Apr 14, 2016, 05:10 am Last Edit: Apr 14, 2016, 05:16 am by aguilar976
Amigos, tengo el siguiente interrogante, tengo un motor diesel que la carga de combustible le dura X cantidad de horas, necesito medir el tiempo que este funcionando y llegada esa cantidad de horas se me encienda una baliza y sirena.
La pregunta del millon si ocupo un rtc o me servira el reloj interno de arduino.
acepto sujerencias, Busque en el foro como horometro pero no encontre mucho de hecho nada
saludos desde el helado y lluvioso sur de chile

surbyte

Yo usaría un DS3231, aunque no se de cuanto tiempo hablas. Supongo que tienes una estimación de máxima de funcionamiento.
También puedes usar millis() del arduino para llevar el tiempo. 
Depende de cuan preciso quieras que sea la cuenta de horas de marcha.


aguilar976

el motor cada diez horas necesita una mantencion, (Carga de combustible y revision de niveles) aparte de con que contar el tiempo como seria la forma mas segura de medir tiempo de operacion... me servira una funcion de boton presionado?

surbyte

para 10 horas usaria millis() que tiene precisión suficiente ya que cuenta en milisegundos

usas un boton que incia la cuenta
Presionas y cargas una variable con el valor de millis() y accionas algo como un rele que pone en marcha el encendido del motor
Luego cuando se acabe el combustible tendras algun modo que lo indique y detienes la cuenta. 
Haces la diferencia entre la variable de arranque y el valor de millis() y tienes el teimpo transcurrido.
10 horas = 10 * 60 min * 60 seg * 1000 mseg = 36.000.000 mseg aprox

Entonces un pulsador inicia la cuenta y pone en marcha el motor
Un contacto detecta el final del funcionamiento del motor y detiene la cuenta efectuano la resta entre millis() y esa variable del momento de encendido.
Respuesta tu tiempo de marcha.

aguilar976

ye estoy entendiendo la idea
1° Al ser colocado en marcha el motor por el operador o tablero de transferencia en el caso de un generador, este activara y enviara una señal a arduino (funcion Pulsein) esta me entrega valor en mills, los cuales seran transformados a minutos y horas respectivamente.
2° las lecturas en mills deveran sumarse conforme se vallan obteniendo.
3° al cumplirse las 10 horas de trabajo (esporadico a pausas no de forma ininterrumpida) activaran la valiza o señal audditiva.

Ahora estoy buceando en el foro buscando ejemplos de como sumar los tiempos acumulados

surbyte

No con PulseIN. No tiene nada que ver. 
El pulsador por ejemplo asi

Code: [Select]
//defines globales
const byte pinArranque = 2; // cambia al que gustes.
const byte pinApagar   = 3; // supongoamos que 3 ese conectado a un contacto que le dice
                            // que se quedó sin combustible
unsigned long tstart, tmotor;
bool valor, valorAnt = LOW;
bool apagar, apagarAnt = LOW;

// setup
void segup() {
   Serial.begin(9600);
   pinMode(pinArranque, INPUT);
   pinMode(pinApagar, INPUT);
}

// en el loop
void loop() {
   valor = digitalRead(pinArranque);
   if (valor == HIGH && valorAnt == LOW) {
      tstart = millis();  // esto carga start con el valor de millis()
   }
   valorAnt = valor;

   apagar = digitalRead(pinApagar);
   if (apagar == HIGH && apagarAnt == LOW) {
      tmotor = millis()-tstart; // aca obtuve el tiempo de marcha en milisegundos
      // calulo horas minutos segundos
      Serial.println(TimeToString(tmotor));
   }
   valorAnt = valor;   // me falta el envento que lo detiene
   
}

// t is time in seconds = millis()/1000;
char * TimeToString(unsigned long t) {
static char str[8];
unsigned long h = t / 3600;
t = t % 3600;
int m = t / 60;
int s = t % 60;
sprintf(str, "%02d:%02d:%02d", h, m, s);
return str;
}

carlosjq10

Buenas noches, según entiendo al amigo aguilar, lo que necesita es saber cuando el motor acumule por ejemplo 10 horas de operación de manera continua o interrumpida no importa ya que lo que se quiere es hacer mantenimiento. Asumiendo que se trata de un generador, yo diría que utilice la señal de encendido y si quiere hacer algo mas preciso que utilice el voltaje generado por el alternador del motor para utilizarlo como referencia de que el motor esta encendido. Por ejemplo, si genera 12 voltios (ojo estoy hablando del alternador, mas no del generador como tal) esos 12 voltios pueden alimentar un rele y este le da la señal de entrada al pin 2 del arduino en 5 voltios. con eso aseguras que el motor al estar encendido ya el arduino lo sabrá.
Con respecto al combustible, recordemos que por ser un generador, éste puede estar sometido a diferentes cargas y esto se traduce en RPM distintas y consumos de combustibles distintos. NO podemos saber con certeza cuando se agotara el combustible pero lo que si podemos utilizar son flotadores en el tanque de combustible que alerten con suficiente tiempo al operador que el nivel de combustible esta bajo. Por cuestiones de salud para el sistema de inyección no es recomendable dejar bajar tanto el nivel de combustible ya que el sucio que se acumula en el fondo va a llegar hasta los filtros y se van a tapar.

Saludos...

Lucario448

Yo también les quiero sugerir algunas cosas.

Primero: tal y como dice carlosjq10:
Asumiendo que se trata de un generador, yo diría que utilice la señal de encendido y si quiere hacer algo mas preciso que utilice el voltaje generado por el alternador del motor para utilizarlo como referencia de que el motor esta encendido.
hay que utilizar el alternador o la señal del tacómetro (si posee y no es mecánico) para confiablemente decirle al Arduino cuando el motor está realmente en marcha.
Hallo más fiable la señal de un tacómetro, porque un alternador puede fallar que eso no detendría a un motor diesel (recuerden que el motor diesel no necesita de chispas para funcionar). Si el generador carece de tacómetro electrónico, pues no quedará de otra que usar el alternador.

Segundo: con qué piensan alimentar el Arduino? Con los 12 voltios directos de la batería? Si es así, yo preferiría usar un convertidor Buck entre batería y Arduino; esto debido a que cuando el motor está en marcha, el voltaje de la batería asciende a los 14.5 voltios; y tal voltaje no lo soportaría el regulador del Arduino.

Tercero: De verdad tendrían encendido el Arduino todo el tiempo? Digo, qué pasa si la batería está defectuosa y la tienen que reemplazar? Perderían el conteo de horas?
Por eso también propongo que el tiempo de trabajo sea periódicamente grabado en la EEPROM (o cada vez que el motor tenga que pararse); pero no con demasiada frecuencia ya que la vida útil de la EEPROM es limitada.

efect2000

#8
May 10, 2016, 05:22 pm Last Edit: May 10, 2016, 05:23 pm by efect2000
hola, para que el arduino detecte que el motor está en marcha, en algun lugar del generador o del motor habrá 12 voltios provenientes de la orden en marcha, de ahí un rele (o un transistor u optoacoplador) que cierre por masa la entrada "2" e inicie el conteo.
sobre lo de la memoria, si cada hora guarda los datos, al dia 10 horas, al año 3650 veces, según mís calculos 27 años puede durar la memoria, antes se acaba el mundo, por lo que, lo que menos importa es esto xD

Lucario448

hola, para que el arduino detecte que el motor está en marcha, en algun lugar del generador o del motor habrá 12 voltios provenientes de la orden en marcha, de ahí un rele (o un transistor u optoacoplador) que cierre por masa la entrada "2" e inicie el conteo.
Correcto, solo que esa señal debe ser una que se active sólo si el motor en verdad está en marcha.

Quote
sobre lo de la memoria, si cada hora guarda los datos, al dia 10 horas, al año 3650 veces, según mís calculos 27 años puede durar la memoria, antes se acaba el mundo, por lo que, lo que menos importa es esto xD
Guau! Y saber que en caso de agotar la vida útil, todavía quedan 255 espacios más para usar (el tiempo de trabajo es un unsigned long; por tanto, son 4 bytes los que se tendrían que grabar en la EEPROM).

surbyte

36000 seg son las 10 hs aprox 36.000.000 es en milisegundos que no creo sean necesarios.
Asi que 36000 segundos se pueden guardar como enteros o sea 2 bytes.
Cantidad de horas en segundos tienes sufiente precisión para malgastar 2 bytes extra y conocer los milis. Pero eso es lo que yo haría. Si uno quiere.. usar lo que esta disponible, adelante.

Ahora si se va a llevar un acumulado, es otro tema.
Ahi si unsigned long.

Lucario448

Asi que 36000 segundos se pueden guardar como enteros o sea 2 bytes.
Si se reinicia el acumulado cada 10 horas, entonces tendríamos 511 espacios disponibles en la EEPROM. Tal parece que esta memoria tardaría casi una eternidad para "desgastarse" del todo... :o

surbyte

En otro hilo hablamos de que hay 100k ciclos de lectura/escritura
Supongamos que guardas un mes.. son 60 bytes? te alcanza para casi 6 meses sin que descargues los datos.
No es suficiente?
Ahora si haces esto y nunca descargas los datos para que lo haces?
Otra cosa.. hace falta saber si son 10 hs o estar cerca o llevar el acumulado? Ahora me entro la duda

Lucario448

Ahora si haces esto y nunca descargas los datos para que lo haces?
De hecho, yo había propuesto (aunque no explícitamente) que la parte de la lectura era solo cuando el Arduino se reiniciaba o se le cortaba la fuente de poder.
El corte de corriente podría ocurrir cuando se requiera retirar/cambiar la batería, o cuando esta se descargue hasta tener menos de 8 voltios.

aguilar976

Muchas gracias amigos me quedo mas clara la idea ahora manos a la obra.

Go Up