Go Down

Topic: Depósito con agitador y nivel de máximo y mínimo (Read 1 time) previous topic - next topic

surbyte

Quote
1º ¿Con la de 5V bastará o tendré que irme a la de 12V? porque he leído que Arduino con 5VCC de entrada no garantiza que tengamos 5VCC en las salidas.
No entiendo a que 5V te refieres?
En Internet hay de todo, muchos tutoriales buenos y muchos malos. Ejemplo ha sido ese comentario de 12V que te seguramente escribió un vendedor o un programador de pagina web sin conocimiento de arduino y sus módulos.
Creo o supongo que sugieres alimentar Arduino por VIN con 5V lo que ya te digo que es insuficiente. Minimo 6.5V a 7.0Vdc.


2º ¿En caso de tener que irme a la de 12V? también he leído que se genera demasiado calor en Arduino.
Mentira.
Si vas a la pagina de arduino.cc y miras TU Arduino y buscas especificaciones, lee cual es la tensión sugerida? verás que dices incluso mayor a 12VDC. Entonces como van a sugerir algo que compromete termicamente al regulador del Arduino.
Arduino o mejor dicho ATmega328 (en genaral) requiere 5V que son provistos por un regulador de tensión.
El Regulador es el que tiene restricciones (asi como el mismo ATmega328) entonces si tu le pones muchas cosas (sensores, modulos rele, etc) el consumo crece y por ende la disipación de potencia también.

El limite esta en general en los 500mA sumados Arduino + modulos.
Si te pasas de ese valor empiezan los problemas además que tal vez no pueda con el requerimiento. Por eso siempre pedimos que los módulos sean alimentados externamente.

Miguelon23

Pues yo creo que lo tengo todo claro.
Voy a poner una fuente Mean Well MDR-10-12 y la conectaré directamente en los pines Vin y GND.
https://www.meanwell.co.uk/mdr-10-12.html
Cuando lo tenga listo todo, os comentaré que tal va.
Una vez mas, gracias.

Miguelon23

Hola a todos.
Por fin tengo mi proyecto andando, pero me surge un último problemilla y es con los dichosos ruidos de las entradas digitales.
Resulta que el agitador lo tengo conectado a un contactor que activo con un relé y tengo varios pulsadores en pull down con resistencias de 4,7k. Uno de ellos sirve para activar el llenado del depósito cuando se pulsa. Funciona todo bien, si no fuese porque de vez en cuando se activa solo el llenado. Me imagino que será por el ruido que genera la parte de alterna que tengo en el cuadro, sobre todo el arranque del agitador.
He leído varios post sobre ruido y uno de ellos decía que para solucionar estos problemas, habría que poner resistencias en el pull down de menor valor (creo que decía de 2,2k).
Para mi tiene su sentido, porque de esta manera, garantizas que lo que tienes en esa entrada sea mas próximo a 0V.
¿Vosotros que pensáis? Las resistencias actuales son de 0,5W ¿tendría que ponerlas de mas potencia? Yo creo que no.

Gracias.

surbyte

tal vez tu problema no sea ruido sino rebotes ya que usas un rele según tu explicación como indicador para comenzar una tarea.
Un rele al accionarse puede rebotar mecánicamente asi que tienes que implementar una rutina antirebotes.

Puntualmente cual es el pin que hace la lectura?

es este

Code: [Select]
pinMode(10,INPUT);  //Pulsador Llenado

Miguelon23

#19
Dec 19, 2018, 08:29 am Last Edit: Dec 20, 2018, 08:32 am by Miguelon23
Lo de los rebotes está descartado porque lo hace cuando nadie está accionando el pulsador, por eso lo achacaba al ruido.
Te pongo el código completo:
Code: [Select]
/***   Global variables   ***/
byte (estadoAgitador);
unsigned long intervaloEncendido;
unsigned long intervaloApagado;
unsigned long intervaloArranque;
unsigned long retardoAlarma;
byte (arranqueAgitador);                      //indica que el agitador está activo por el pulsador de arranque
unsigned long actualAgitador;                 //para saber cuando se activó el arranque del agitador
unsigned long finretardoAlarma;
unsigned long tiempoAnteriorEncendido;
unsigned long tiempoAnteriorApagado;
byte (electrovalvula);
byte (llenadoAgitador);


void setup() {

  intervaloEncendido=120000;          //agitador encendido durante 2 minutos

  intervaloApagado=600000;            //agitador apagado durante 10 minutos
  
  intervaloArranque=600000;           //agitador encendido al activar pulsador de arranque durante 10 minutos

  retardoAlarma=300000;               //alarma apagada durante 5 minutos

  finretardoAlarma=0;

  tiempoAnteriorEncendido=0;

  tiempoAnteriorApagado=0;
  
  estadoAgitador=false;               //para que el agitador empiece encendido

  electrovalvula=true;                //para que la electrovalvula empiece apagada

  pinMode(2,OUTPUT);                  //Contactor Agitador

  pinMode(8,INPUT);                   //Nivel Bajo

  pinMode(12,INPUT);                  //Pulsador anulación Alarma

  pinMode(4,OUTPUT);                  //Alarma

  pinMode(10,INPUT);                  //Pulsador Llenado

  pinMode (3,OUTPUT);                 //Electroválvula

  pinMode(5,OUTPUT);                  //Led Llenado

  pinMode(9,INPUT);                   //Nivel Alto

  pinMode(11,INPUT);                  //Pulsador Agitador

}


void loop() {
 digitalWrite(2,estadoAgitador);
 digitalWrite(3,electrovalvula);
  {
    if ((electrovalvula == false)||(arranqueAgitador == true)) {                              //si la electrovalvula está activa o el agitador se activó por el pulsador de arranque
      digitalWrite(2,LOW);                                                                   //activa el agitador
      estadoAgitador=false;
    }
     else{                                                                                   //de lo contrario
      if ((millis()-tiempoAnteriorEncendido>=intervaloEncendido)&&estadoAgitador==false) {   //comprueba el tiempo transcurrido en el ciclo encendido del agitador
      estadoAgitador=true;
      digitalWrite(2,estadoAgitador);
      tiempoAnteriorApagado=millis();
     }
      if ((millis()-tiempoAnteriorApagado>=intervaloApagado)&&estadoAgitador==true) {        //comprueba el tiempo transcurrido en el ciclo apagado del agitador
      estadoAgitador=false;
      digitalWrite(2,estadoAgitador);
      tiempoAnteriorEncendido=millis();
     }
     }
     if ((digitalRead(8) == false)&&(electrovalvula == true)) {                              //consulta el estado del nivel bajo y si la electrovalvula está apagada
      digitalWrite(2,HIGH);                                                                   //desactiva el agitador
      estadoAgitador=true;
      if (digitalRead(12) == true) {                                                          //consulta el pulsador de la alarma
        delay (50);
        finretardoAlarma=millis()+retardoAlarma;                                              //fija la variable del fin del retardo de la alarma
        digitalWrite(4,HIGH);                                                                 //apaga la alarma
        }
      if (finretardoAlarma <= millis()) {                                                     //si se ha superado el número fijado en el retardo de la alarma y el nivel bajo sigue bajo
        digitalWrite(4,LOW);                                                                  //enciende la alarma
      }
     }
     if (digitalRead(8) == true) {                                                            //consulta que está por encima del nivel bajo
        digitalWrite(4,HIGH);                                                                 //apaga la alarma
      }
    if ((digitalRead(10) == true)&&(electrovalvula == true)) {                               //consulta el pulsador de llenado y si la electrovalvula no está activa
      delay (50);
      digitalWrite(2,LOW);                                                                    //activa el agitador
      digitalWrite(3,LOW);                                                                    //activa la electrovalvula
      electrovalvula=false;
      digitalWrite(5,HIGH);                                                                   //activa el led de llenado
      digitalWrite(4,HIGH);                                                                   //desactiva la alarma
     }
    if ((digitalRead(9) == false)&&(electrovalvula == false)) {                                //consulta el nivel alto y si la electrovalvula está activa
      digitalWrite(2,HIGH);                                                                   //desactiva el agitador
      digitalWrite(3,HIGH);                                                                   //desactiva la electrovalvula
      electrovalvula=true;
      llenadoAgitador=true;
      digitalWrite(5,LOW);                                                                    //desactiva el led de llenado
      digitalWrite(4,HIGH);                                                                   //desactiva la alarma
     }
    if ((digitalRead(12) == true)&&(electrovalvula == false)) {                                //consulta el pulsador de la alarma y si la electrovalvula está activa, cancela el llenado
      delay (50);
        digitalWrite(2,HIGH);                                                                 //desactiva el agitador
        digitalWrite(3,HIGH);                                                                 //desactiva la electrovalvula
        electrovalvula=true;
        llenadoAgitador=true;
        digitalWrite(5,LOW);                                                                  //desactiva el led de llenado
        digitalWrite(4,HIGH);                                                                 //desactiva la alarma
       }
    if ((digitalRead(11) == true)||(llenadoAgitador == true)) {                               //consulta el pulsador del agitador
      arranqueAgitador=true;
      llenadoAgitador=false;
      actualAgitador=millis();                                                                //iguala actualAgitador a millis
      digitalWrite(2,LOW);                                                                    //activa el agitador
     }
    if ((millis()-intervaloArranque)>=actualAgitador) {                                       //si millis menos intervaloArranque se iguala a cuando se inicio actualAgitador
      arranqueAgitador=false;
      digitalWrite(2,HIGH);                                                                   //desactiva el agitador
     }

}
}


Pongo una foto para que veáis el montaje.


En las pruebas de ayer, se sumó otro problema y es que cuando lleva unas horas funcionando se bloquea y no hace nada, ni cuando pulsas un botón. Eso si que ya no se por qué puede ser.

Gracias,

surbyte

No veo la foto, por favor edita y usa las explicaciones al final de las normas para visualizar las imagenes adjuntadas.

Miguelon23

#21
Dec 19, 2018, 03:43 pm Last Edit: Dec 20, 2018, 08:34 am by Miguelon23
Ya la tenéis puesta.

surbyte

En un ambiente como el que trabajas no puedes hacer cosas asi


Code: [Select]
if (!electrovalvula == true || arranqueAgitador == true) {

a todo contacto se le debe agregar un debounce
Luego si usas relays y activas/desactivas motores, o inductores/electroválvulas, estas causan todo tipo de transitorios.

Asi que primero:
1. Usa librerías como Bounce2.h y modifica todo tu código con la rutina antirebotes para aseguarse que las cosas ocurren una vez.

2. Mi recomendación es que consideres usar reles SSR y si aún asi falla, entonces tenemos que considerar otras cosas.

Miguelon23

Hola a todos.

Después del parón navideño, he vuelto a retomar mi proyecto.
Parece ser que he acabado con la activación indeseada de mis entradas digitales con una simple modificación del código. He puesto una segunda consulta a la entrada digital con un pequeño delay en medio:
Code: [Select]
if ((digitalRead(10) == true)&&(electrovalvula == true)) {
      delay (50);
      if (digitalRead(10) == true) {

No os fijéis en el uso de delay, porque era una prueba rápida y lo cambiaré por millis.

Pero sigo teniendo el problema de los cuelgues de Arduino que explicaba en otro post.
Aleatoriamente, después de un tiempo de uso, deja de funcionar y tengo que pulsar el botón de reset para que arranque de nuevo.
No se si puede ser por alimentar el módulo de relés directamente de Arduino y no con otra fuente externa, cosa que me fastidiaría bastante, porque la fuente que uso es de 12V y no tendría manera de sacar los 5V de otro sitio que no fuese Arduino u otra fuente mas de 5V.
Quiero aclararos que cuando me ha pasado algún cuelgue, es cuando está con su funcionamiento temporizado de agitado. Vamos, que solo activa y desactiva el tiempo fijado el relé que alimenta el contactor del agitador. Por lo que me extrañaría que tuviera un exceso de consumo la salida de 5V de Arduino, puesto que solo hay un relé activo.
A ver que os parece a vosotros.

Gracias.

surbyte

Ese paro que mencionas es debido a ruido electrico por la activación/detencion de algun motor o electroválvula.

Repasemos.
Si no te lo he dicho, te lo digo ahora.
Todo lo que alimentes con DC (corriente directa) motores, electroválvulas debe tener un diodo en antiparalelo. Es decir, entre bornes del motor o electroválvula un diodo del tipo 1n4002 o 1N4007 (cualquier numero entre estos 2 o 7 sirve) lo pones de modo que el catodo este unido al positivo y el anodo al otro borne de la electrovalvula.
No importa si lo alimentas con el relé. Lo que importa es que no genere transitorios.

LUego de probar con el diodo en antiparalelo nos comentas si mejoró o dejó de fallar.

tauro0221

Hi,
Sugerencia  porque si quires anadirle otro PS entonces puedes usar regulador de voltajes de 12 voltios 5 voltios y de esta manera aisla los 5 voltios de los 12 voltios Pregunta en donde se encuentra el arduino.

Miguelon23

Ese paro que mencionas es debido a ruido electrico por la activación/detencion de algun motor o electroválvula.

Repasemos.
Si no te lo he dicho, te lo digo ahora.
Todo lo que alimentes con DC (corriente directa) motores, electroválvulas debe tener un diodo en antiparalelo. Es decir, entre bornes del motor o electroválvula un diodo del tipo 1n4002 o 1N4007 (cualquier numero entre estos 2 o 7 sirve) lo pones de modo que el catodo este unido al positivo y el anodo al otro borne de la electrovalvula.
No importa si lo alimentas con el relé. Lo que importa es que no genere transitorios.

LUego de probar con el diodo en antiparalelo nos comentas si mejoró o dejó de fallar.
Pero entiendo que lo del diodo es solo si fuese corriente continua y yo activo 3 cosas con el módulo de relés, 1 agitador, 1 electroválvula y 1 bocina, y todos ellos son de alterna.

tauro0221



tauro0221

Hi,
Aqui hay dos suluciones y es de cambiar los relays a AC SSR o tratar de usar supresore de ruidos. Yo uso los que se conocen como MOV .Estos se usan cuando son componentes magneticos o que usan embobinados como motores, valvulasy selenoides. Puedes hacer una prueba y es de instalarle un mov V275LA40BP en paralelo a los contactos. Este se usa en un voltaje de 275 voltios AC, Esto no quire decir que te va arreglar el problema pero si te trabaja entonces no tienes necesidad de usar los AC SSR. Si no trabajan entonces vaz a tener que proceder a remplazarlos. Una cosa que tienes que tener en consideracion es que los relays cuando esta en un servico de mucho cierre/abre los contactos por lo regular se te van a danar y vaz tenerlos que remplazar a menudo. Surbyte y yo siempre para estas aplicacion recomendamos el uso de los SSR. Son los mejores apraesta aplicacion.

Go Up