problemas con relé Arduino, micro cortes

buenas tardes me presento, un verdadero novato, pido tengan a bien comprender mi desconocimiento total en esto, les cuento tengo una heladera LG inverter a la que tengo que reemplazar el compresor Lineal x uno convencional. solo puedo energizar por medio de un relé utilizando una placa Nano con chip mega 328p y un relé de un canal 12v, el fan del que me alimento es de cuatro cables con tención permanente de 12v y una respuesta feedback, copie un código, funciona pero tengo micro cortes no programados, dejo mi código para corregir de ser posible, Muchas Gracias.

/* Este es el codigo para este modelo en especifico

  • recuerda apoyanos con tu contribución a mejorar
  • este codigo para el uso comun y compartido a las personas
  • suscritas en esta comunidad
    */

int relay = 13;
int start = A0;

void setup()
{
Serial.begin(9600);
pinMode(start, INPUT);
}

void loop()
{
start = pulseIn(A0, LOW);
Serial.println (start);
delay (500);

if (1584 < start && start < 6000){
delay(10000); // TIEMPO PARA ESTABILIZAR ARRANQUE
digitalWrite(relay,HIGH);
Serial.println(" COMPRESOR ENCENDIDO");
Serial.println(start);

}

/*else{
digitalWrite(relay,LOW);
Serial.println(" COMPRESOR APAGADO");
Serial.println(start);

}

if (3581 < start && start < 1583){
delay(10000); // TIEMPO PARA ESTABILIZAR ARRANQUE
digitalWrite(relay,LOW);
Serial.println(" COMPRESOR APAGADO");
Serial.println(start);
}*/

else{
digitalWrite(relay,LOW);
Serial.println(" STAND BY");
Serial.println(start);

}

}

Hector Jara

Si hubiera pasado por la sección de NORMAS habrías descubierto dos cosas:

Una como postear correctamente código.

La segunda, que debes especificar muy bien todo porque no sabemos lo que te traes en manos y por lo tanto es díficil averiguar donde está la falla.

En ese aspecto, hay una heladera/frigorifico que lo quieres encender con un relé, pero no especificas como y la conexión esta muy al aire.

En el código sin entender lo que se pretende (porque dependera del hardware) solo veo que la variable "start" la declaras como entero y luego usas la función PulseIn para almacenar en ella un valor. "start" debe ser del tipo unsigned long para que cuando haga la conversión no trunce el valor devuelto por PulseIn.

Hola, pido las disculpas por lo mal detallado del problema, intentare ser mas explicito, tengo una heladera LG Inverter a la cual debo cambiar el compresor, en Argentina no los venden y no se pueden reemplazar por otro ya que la tarjeta no lo reconoce, la idea es reemplazar el motocompresor por uno convencional, al ser Inverter la placa no puedo alimentar con el voltaje necesario (220v) la única solución para conectarme y no perder parte de sus funciones es: tomar energía de 12v constantes de un C-FAN del evaporador , el cual trabaja con 4 cables =12CC+, GND, (F/B =FEEDBACK), PWM.
Conexión a una placa Nano con chip mega 328p y un relé de un canal 12v
conecto mi F/B al A0 analógico este seria el responsable de activar mi relé, para el funcionamiento de mi compresor.
El problema que tengo es el siguiente: micro cortes, y algunos no tan cortos al relé, el que provoca la parada del compresor, el mismo no puede sufrir esos cortes, ya que cuando sucede y energizamos nuevamente las presiones del gas no lo deja arrancar, hasta no estabilizar las mismas.
Comparto el código insertado, y de ser posible les pido la ayuda para corrección del mismo.

[color=#000000]/* Este es el codigo para este modelo en especifico [/color]

[color=#000000] *  recuerda apoyanos con tu contribución a mejorar[/color]

[color=#000000] *  este codigo para el uso comun y compartido a las personas[/color]

[color=#000000] *  suscritas en esta comunidad[/color]

[color=#000000] */[/color]


[color=#000000]int relay = 13;[/color]

[color=#000000]int start = A0;[/color]


[color=#000000]void setup()[/color]

[color=#000000]{[/color]

[color=#000000]  Serial.begin(9600);[/color]

[color=#000000]  pinMode(start, INPUT); [/color]

[color=#000000]}[/color]


[color=#000000]void loop()[/color]

[color=#000000]{[/color]

[color=#000000]  start = pulseIn(A0, LOW);[/color]

[color=#000000]  Serial.println (start);[/color]

[color=#000000]  delay (500);[/color]


[color=#000000]  if (1584 < start && start < 6000){[/color]

[color=#000000]    delay(10000);   // TIEMPO PARA ESTABILIZAR ARRANQUE[/color]

[color=#000000]    digitalWrite(relay,HIGH);[/color]

[color=#000000]   Serial.println(" COMPRESOR ENCENDIDO"); [/color]

[color=#000000]   Serial.println(start);[/color]

[color=#000000]   [/color]

[color=#000000]  }[/color]

[color=#000000]  [/color]

[color=#000000]  /*else{[/color]

[color=#000000]    digitalWrite(relay,LOW);[/color]

[color=#000000]  Serial.println(" COMPRESOR APAGADO");[/color]

[color=#000000]  Serial.println(start);[/color]

[color=#000000] [/color]

[color=#000000]  }[/color]


[color=#000000]   if (3581 < start && start < 1583){[/color]

[color=#000000]    delay(10000);   // TIEMPO PARA ESTABILIZAR ARRANQUE[/color]

[color=#000000]    digitalWrite(relay,LOW);[/color]

[color=#000000]   Serial.println(" COMPRESOR APAGADO"); [/color]

[color=#000000]   Serial.println(start);[/color]

[color=#000000]   }*/[/color]

[color=#000000]   [/color]

[color=#000000]  [/color]

[color=#000000]  [/color]

[color=#000000]  else{[/color]

[color=#000000]    digitalWrite(relay,LOW);[/color]

[color=#000000]  Serial.println(" STAND BY");[/color]

[color=#000000]  Serial.println(start);[/color]

[color=#000000] [/color]

[color=#000000]  }[/color]


[color=#000000]  [/color]

[color=#000000]  }[/color]

[color=#000000]
[/color]

Agradezco la predisposición y el interés volcado por todos ustedes.
Muchas gracias.
Héctor Jara.

Primero tienes que corregir el post quitando todas las etiquetas "color" que se han filtrado.
Te muestro como debe quedar y hago las modificaciones necesarias (abajo te explico)

/* Este es el codigo para este modelo en especifico 
 *  recuerda apoyanos con tu contribución a mejorar
 *  este codigo para el uso comun y compartido a las personas
 *  suscritas en esta comunidad
 */

int relay = 13;
unsigned long start;

void setup() {
  Serial.begin(9600);
  pinMode(A0, INPUT); 
}

void loop() {
  start = pulseIn(A0, LOW);
  Serial.println (start);
  delay (500);

  if (1584 < start && start < 6000) {
    delay(10000);   // TIEMPO PARA ESTABILIZAR ARRANQUE
    digitalWrite(relay, HIGH);
    Serial.println(" COMPRESOR ENCENDIDO"); 
    Serial.println(start);
  }

// Este bloque de código está comentado entonces no se usa, se puede eliminar.
// ------ desde acá --------------
/* 
  else{
    digitalWrite(relay,LOW);
    Serial.println(" COMPRESOR APAGADO");
    Serial.println(start);
  }
  if (3581 < start && start < 1583) {
    delay(10000);   // TIEMPO PARA ESTABILIZAR ARRANQUE
    digitalWrite(relay, LOW);
     Serial.println(" COMPRESOR APAGADO"); 
     Serial.println(start);
  }*/
// ------ hasta acá --------------   
// el código continua debajo
  
  else {
    digitalWrite(relay, LOW);
    Serial.println(" STAND BY");
    Serial.println(start);
  }
}

Bueno, te explico lo que hace el código a ver si es lo que realmente necesitas.

Cuando empieza el loop() testea si hay un pulso de "F/B" en la entrada A0, si lo hay devuelve la duración del pulso en useg (microsegundos), si no hay pulso devuelve 0 (y puede ser la causa de los cortes).

Ahora si el ancho del pulso (o sea start) es mayor a 1584 useg y menor a 6000 useg espera 10 seg y activa el relé.

En caso contrario (o sea, ancho de pulso fuera del rango anterior) apaga el relé.

Y vuelve a empezar con la lectura del ancho de pulso.

Hasta aquí lo que hace el código.

La pregunta es ¿cada cuánto tiempo llegan pulsos?
Porque luego de leer un pulso de ancho válido, si alrededor de los 3 minutos (que es lo máximo que mide pulseIn()) no llega otro, teóricamente start va a valer 0 y va a desconectarse el relé.

Por otro lado hice 2 modificaciones, una en la definición de la variable start que, como lo señaló @victorjam, debe ser unsigned long. La otra, como no tiene sentido usar start para definir un pin y solo usarlo en pinMode y encima después usarla para otra cosa, directamente no se usa en pinMode().

Me resta confirmar si efectivamente a los 3 minutos de no leer nada pulseIn() retorna 0 porque no me queda claro, viendo el código de la función en la librería, cuanto es el tiempo máximo que espera por un pulso. Más tarde lo pruebo en la práctica y te cuento.

Saludos

Moderador:
Por favor lee el privado que te enviaré y no lo pases por alto porque dos foreros te han pedido que postees bien el código y no lo has hecho.

El código resumido por @gatul en el post#3 dice que esperas un pulso que tiene que estar entre 1584 y 6000 useg, si ocurre, pierdo 500mseg sin hacer nada. Luego verifico si estuvo o no en ese rango.
Si estuvo me quedo 10000 mseg sin hacer nada y desactivo el rele y si no estuvo activo el rele, porque con LOW se activa un rele y con HIGH se desactiva a menos que lo hayas conectado de un modo poco habitual.
No puedo haber delay() en un código donde se esperan pulsos tan rapidos, aunque se la pase sin hacer nada. Pues pon el arduino a verificar todo el tiempo si ocurre o no lo que esperas.
Hubiera esta bueno que agregaras una documentación que explique que hace la heladera
Nada dices del período de la señal que se espera este entre 1584 y 6000 useg. eso cuando se pone en 1 y cuando va a 0 cuanto tiempo esta? Si durante ese tiempo no se detecta nada con pulseIN justametne tu le dices que ejecute la parte del else o sea
digitalWrite(rele, LOW) que como dije para mi eso es activar.

Una aclaración, usas el pin A0 no como analógico si no como entrada Digital.
PulseIn es para entradas digitales.

No entiendo por que afirmas que un relé se debe activar con un LOW.
Si excita el relé con un transistor NPN lo lógico es que dispare con un HIGH (salvo que sea un inversor y use el contacto normal cerrado).
Como en este caso (módulo Keyes KY-019) que cierra el contacto N/O cuando la entrada (S) está en HIGH, caso contrario el transistor esta en corte, no circula corriente significativa por la bobina y el relé está desactivado (y en este caso, por ser inversor, cierra el contacto N/C).
KY-019.jpg

KY-019.jpg

@hectorjara te cuento lo que he probado en un Nano.

pulseIn() por defecto tiene un timeout de 1 seg (1000 mseg ó 1000000 useg), el timeout máximo que se puede asignar es de poco más de 4 min. (exactamente 268435455 useg).
En todos los casos la espera por el inicio de un pulso es de aproximadamente el 70% del timeout, cumplido ese tiempo, si no hay pulso que medir, devuelve 0.

En tu caso, como pulseIn() tiene el timeout por defecto, la máxima espera es de unos 692 mseg, si en ese lapso no entra un pulso, como start tiene valor 0, te desconecta el relé.
Tenlo en cuenta.

Tal vez sea conveniente habilitar la resistencia interna del pin, si no tiene ya una externa a 5V, cambiando su definición por

pinMode(A0, INPUT_PULLUP);

Otra modificación que podrías probar es cambiar el timeout de pulseIn() para tratar de no perder pulsos si ese fuera el caso, por ej. llevarlo a 2 seg.

start = pulseIn(A0, LOW, 2000000);

Por supuesto descarto que la alimentación está debidamente estabilizada y filtrada.
Sería interesante que brindes más datos para ver que más puede llegar a ocasionar el problema.

Saludos

PD: pulseIn() trabaja con los pines A0 a A5 siempre que se definan como digitales con INPUT o INPUT_PULLUP.

Paso a explicarte, 2 cosas...
1- El compresor original, se consigue.. Sólo que sólo lo tiene el Service Oficial...
2- En tu planteo, de la toma de pulsos de FB, te olvidas de algo fundamental... Cada vez que abras cualquiera de las puertas, el forzador se detiene... O sea, el compresor también se detendrá.
No aclaras qué modelo de LG es la heladera. Si tiene o no, forzador exterior (condensador). Y si el motor inverter tiene placa controladora propia, o es integrada junto a la principal. Depende de esas cosas, se pueden plantear otras soluciones.

No entiendo por que afirmas que un relé se debe activar con un LOW.

Yo no vi ningún esquema y cuando no veo esquemas supongo que el rele mencionado es un módulo rele.
Los modulos relé para arduino se suelen conectar de tal modo que un LOW los activa y un HIGH los desactiva. Lo hemos planteado mil veces. No entiendo que te sorprende.
Ahora veo que te refieres a usar el NC pues pocos usan el NC, también es una suposicon tuya @gatul porque no veo que el diga uso el contacto NC del Relé.
De todas formas nos entendemos. Tu supones algo yo supongo otra cosa. El responsable de decirlo no eres ni vos ni yo.

pepelui:
Paso a explicarte, 2 cosas...
1- El compresor original, se consigue.. Sólo que sólo lo tiene el Service Oficial...
2- En tu planteo, de la toma de pulsos de FB, te olvidas de algo fundamental... Cada vez que abras cualquiera de las puertas, el forzador se detiene... O sea, el compresor también se detendrá.
No aclaras qué modelo de LG es la heladera. Si tiene o no, forzador exterior (condensador). Y si el motor inverter tiene placa controladora propia, o es integrada junto a la principal. Depende de esas cosas, se pueden plantear otras soluciones.

pepelui:
Paso a explicarte, 2 cosas...
1- El compresor original, se consigue.. Sólo que sólo lo tiene el Service Oficial...
2- En tu planteo, de la toma de pulsos de FB, te olvidas de algo fundamental... Cada vez que abras cualquiera de las puertas, el forzador se detiene... O sea, el compresor también se detendrá.
No aclaras qué modelo de LG es la heladera. Si tiene o no, forzador exterior (condensador). Y si el motor inverter tiene placa controladora propia, o es integrada junto a la principal. Depende de esas cosas, se pueden plantear otras soluciones.

Hola buenas tardes Pepelui, la heladera es una LG modelo GN-C702SGGU si! me estaría alimentando del forzador exterior (condensador) el cual tiene una energía constante de 12v mas dos cable 1 de respuesta F/B el cual alimento al A0 del nano v3 y el ultimo de frecuencia el cual no lo conecto, si tenes alguna sugerencia serán bien venidas.
Gracias

Ahora es otra cosa...Si estás usando el fan exterior, los 12 volts del mismo, son accionados por un relay de la placa main. Ese fan es accionado cuando tiene que encender el compresor inverter original. Después el control de velocidad del mismo, es otra cosa...
Yo buscaría ese relay, y a partir de ahí, usando es relay, accionaría lo que le agregues, para comandar el compresor on-off.

pepelui:
Ahora es otra cosa...Si estás usando el fan exterior, los 12 volts del mismo, son accionados por un relay de la placa main. Ese fan es accionado cuando tiene que encender el compresor inverter original. Después el control de velocidad del mismo, es otra cosa...
Yo buscaría ese relay, y a partir de ahí, usando es relay, accionaría lo que le agregues, para comandar el compresor on-off.

no se puede, en este modelo los 12v son constantes, es decir energizas la heladera y ese fan ya tiene los 12v su motor comienza su marcha por la señal F/B, también hay otro cable el cual se encarga del ancho del pulso, ósea con el fan detenido también hay 12v, :confused: allí nace mi problema. las prueba que realice las saque de unos informes desde México.
pero no consigo solucionar los micro cortes. gracias por su ayuda :confused::o

No te lo pregunté directamente pero pensé que se desprendía de lo que te había planteado...

¿Hay una resistencia a positivo en el pin A0 para fijar el estado alto y que no detecte posibles ruidos como pulsos? (Incluso puede ser necesario en lugar de a 5V conectarla a masa para fijar el nivel bajo).
¿O no es necesaria porque los estados alto y bajo ya los define la señal F/B?
Ojo, no es lo mismo que el tester o multímetro mida 0 entre sus puntas a que efectivamente haya 0 volts en el circuito (de hecho un tester en modo voltímetro va a mostrar 0 incluso con las puntas dejadas sobre la mesa)

¿Cuál es el ancho de pulso esperable y cada cuanto tiempo llegan?

Como ya aclaraste lo de la alimentación, esos son los datos que faltan para revisar el código sin tener que suponer y adivinar.

Un esquema de conexión (puede ser a mano alzada, nadie se va a ruborizar) vendría muy bien para completar el panorama.

Saludos

Otra pregunta... :D.. La parte de potencia del compresor, está integrada a la main ? o es placa aparte ? Siempre hablando del compresor original...

Moderador:
No es posible que tu hilo siga con los defectos que ya te he pedido que soluciones durante varios dias.
Post inicial, no tiene etiquetas de códigos.
Post#2, quitar las leyendas que dicen color
Post#10 doble repetición de lo que dice @pepelui, entiendo que puedas repetir y esta mal de acuedo a las normas pero dos veces, es demasiado. Por cierto 1 tmb lo es. Edita!
Post#12 vuelves a repetir el comentario de @pepelui del post#11. Justamente eso es la falta. Repetir. No repitas!!

No te advierto mas

NOTA: las respuestas o comentarios a este comentario mío las haces por privado!!

Lee las normas del foro.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.