Go Down

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

Miguelon23

Hola a todos. Soy nuevo en esto y quería controlar un depósito que lleva un agitador, un nivel de máximo y mínimo y una electroválvula de llenado.
Tengo una duda con el temporizado del agitador. Lo hago con millis, pero me encuentro con la incertidumbre de que pasará cuando millis se desborde y empiece otra vez, no se si me dejará de funcionar el código. Porque, si no lo he entendido mal, millis no se puede igualar a 0 y en aproximadamente 50 días, se desborda.
Os lo pego a ver que os parece.

Code: [Select]

/***   Global variables   ***/
int estadoAgitador;
long intervaloEncendido=150000;
long intervaloApagado=480000;
long intervaloArranque=600000;
int retardoAlarma=400;
long tiempoAnteriorEncendido=0;
long tiempoAnteriorApagado=0;
String Paso1;
String Paso2;
int (electrovalvula) = 3;

void setup() {
 
  estadoAgitador=true;

  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() {
  Paso1; {
    if ((millis()-tiempoAnteriorEncendido>=intervaloEncendido)&&estadoAgitador==true) {
      estadoAgitador=false;
      digitalWrite(2,estadoAgitador);
      tiempoAnteriorApagado=millis();
     }
    if ((millis()-tiempoAnteriorApagado>=intervaloApagado)&&estadoAgitador==false) {
      estadoAgitador=true;
      digitalWrite(2,estadoAgitador);
      tiempoAnteriorEncendido=millis();
     }
  }
  Paso2; {
    if (digitalRead(8) == false) {            //consulta el estado del nivel bajo
      if (digitalRead(12) == true) {          //consulta el pulsador de la alarma
        retardoAlarma=0;                      //fija la variable del retardo de la alarma en 0
        digitalWrite(4,LOW);                  //apaga la alarma
        }
      }
      if (retardoAlarma >= 400) {             //si se ha superado el número fijado en el retardo de la alarma
        digitalWrite(4,HIGH);                 //enciende la alarma
       }else {                                //de lo contrario
        retardoAlarma ++;                     //suma 1 al retardo de la alarma
      }
     }
    if (digitalRead(10) == true) {            //consulta el pulsador de llenado
      digitalWrite(2,HIGH);                   //activa el agitador
      digitalWrite(3,HIGH);                   //activa la electrovalvula
      digitalWrite(5,HIGH);                   //activa el led de llenado
      digitalWrite(4,LOW);                    //desactiva la alarma
     }
    if (digitalRead(9) == false) {            //consulta el nivel alto
      digitalWrite(2,LOW);                    //desactiva el agitador
      digitalWrite(3,LOW);                    //desactiva la electrovalvula
      digitalWrite(5,LOW);                    //desactiva el led de llenado
      digitalWrite(4,LOW);                    //desactiva la alarma
     }
    if (digitalRead(10) == true) {            //consulta el pulsador de llenado
      if (electrovalvula == true) {           //si la electrovalvula esta activada
        digitalWrite(2,LOW);                  //desactiva el agitador
        digitalWrite(3,LOW);                  //desactiva la electrovalvula
        digitalWrite(5,LOW);                  //desactiva el led de llenado
        digitalWrite(4,LOW);                  //desactiva la alarma
       }
     }
    if (digitalRead(11) == true) {            //consulta el pulsador del agitador
      intervaloArranque+=millis();            //suma millis a intervaloArranque
      digitalWrite(2,HIGH);                   //activa el agitador
     }
    if (millis() >= intervaloArranque) {      //si millis es mayor que el intervalo de arranque
      digitalWrite(2,LOW);                    //desactiva el agitador
      Paso1;                                  //salta al paso 1
      }else {                                 //de lo contrario
      Paso2;                                  //salta al paso 2
     }

}


Seguramente haya cosas mejorables y agradezco los consejos que me podáis dar.

Un saludo y gracias

Miguelon23

Gracias por la idea, pero esa solución no me sirve porque habrá veces que la placa esté apagada durante tiempo y no puedo estar pendiente de si se le acabó la pila al módulo RTC.
¿Se os ocurre alguna manera de hacerlo con millis?

Un saludo

EDwaRD88

La idea del rtc, no la descartaría ademas puedes monitorear el estado de la bateria por un puerto analogo y generar alguna alarma si se encuentra baja, ademas el circuito rtc no consume mucho de la bateria, segun los fabricantes puede durar 5 años.

Si fuera obligatorio usar millis() porque no evaluas si es menor que  1000 y reescribes todas las variables,

surbyte

Cuando millis() se desborde si usas unsigned long para cada variable no pasará nada.
Ya se ha explicado varias veces en este foro que no hay error en las cuentas superados los 47 dias y chirolas.

Si tienes alguna duda busca arriba derecha noter millis() y verás de lo que hablo.

Miguelon23

Entonces, si no he entendido mal, si cambio los long que tengo por unsigned long bastará ¿no?

surbyte

Para comenzar te vuelvo a decir que ese problema de desbordamiento no va a ocurrir siempre que uses unsigned long SIEMPRE que hagas operaciones con millis().

Por otro lado la batería de un rtc no se acaba en meses tarda años. Asi que olvida esas cosas que has leído por ahi porque no son ciertas.
Es como la batería que tenian las PC digamos del 95 en adelante... las cambiabas? No.. eso lo hacias luego de 5 años o mas.

Miguelon23

Ya lo tengo todo mas o menos encaminado. Gracias por la ayuda.
Ahora estoy con la simulación del proyecto, pero hay una cosa que no tengo claro que me la esté haciendo bien.
Para consultar el estado de un Pin digital de salida le pongo donde las variables int (electrovalvula) = 3; que es el número de pin que activo para llenar el depósito y cada vez que quiero saber el estado de la electroválvula pregunto por ella poniendo (electrovalvula == true);
Cuando quieres saber el estado de un pin de salida ¿Esto se hace así?

surbyte

No entiendo como hiciste ese programa y preguntas lo de la electroválvula.
Es como leer un botón, es lo mismo.
Un estado digital, con digitalRead(pinElectroválvula)

Code: [Select]
int (electrovalvula) = 3;
esta mal.

Se define asi
int no es buena idea porque un pin solo ocupa un byte de modo que con esto es suficiente

Code: [Select]
const byte electrovalvula = 3;

podria haber sido
Code: [Select]
byte electrovalvula = 3;

pero le agrego el const porque se trata de algo que no vas a cambiar o sea una constante.

Te recomiendo vayas a

Ve a Documentación => Indice de temas tutoriales => Clases de Youtube

Te darán una mejor base de conocimientos que la que tienes ahora.
Sin base de arduino es dificil avanzar y cada línea será una duda tras otra.

Miguelon23

Hola, ya tengo el código listo y probado. Gracias por la ayuda.
Ahora tengo otra duda, pero es con un módulo de relés que le quiero poner. He leído todo lo que he encontrado sobre estos módulos y me queda claro que la alimentación tengo que conectarla con una fuente externa de 12VCC entre los pines donde lleva el jumper, quitándolo y conectando entre GND y JC-VCC (creo que ponía esto). Y la VCC y GND del Arduino, lo conecto a la VCC y GND que tiene al lado de las entradas.
Ahora bien, la duda que tengo es si con una fuente de 12VCC me vale para alimentar todo. Y si es así, ¿el Arduino lo puedo alimentar por los pines GND y Vin o tiene que ser por el conector de alimentación?
Quería usar algo así: https://www.electronicaembajadores.com/es/Productos/Detalle/SA55002/sistemas-de-alimentacion/fuentes-conmutadas-carril-din/fuente-alimentacion-conmutada-carril-din-mean-well-20w-12v-mdr-20-12

surbyte

No me queda claro lo de alimentar los reles con 12VDC.
Por que no pones un link al módulo relé del que hablas?


surbyte

#11
Oct 03, 2018, 03:24 pm Last Edit: Oct 03, 2018, 03:25 pm by surbyte
Lo que supuse.. Donde ves 12V?
Veo reles de 5V y lógica de 5V. De modo que se alimentan con 5V.
Prueba primero Alimentando VCC con los 5V del Arduino siempre que uses una fuente adecuada para Arduino de mas de 500mA sino mi consejo es que lo hagas con una fuente independiende del Arduino y comparte GND con el.

Miguelon23

Pues leí lo de los 12V en esta otra:
https://www.todoelectronica.com/es/modulo-rele-5vdc-de-4-canales-10a-para-arduino-p-110228.html
Puse el otro enlace, porque es donde seguramente compre todo, y a mi me parece el mismo módulo. No se por qué en un sitio pone que hay que alimentarla con 12V y en otro no.

surbyte

#13
Oct 03, 2018, 04:25 pm Last Edit: Oct 03, 2018, 05:25 pm by surbyte
EDITO : porque veo tu placa y comenta de usar 12V.
La verdad me sorprende mucho. Tus reles son 5V no veo regulador en la placa.
Porque no comienzas con 5V y pruebas a ver como funciona?

Code: [Select]
long intervaloEncendido=150000;
long intervaloApagado=480000;
long intervaloArranque=600000;


estos deben modificarse por estos

Code: [Select]
unsigned long intervaloEncendido=150000;
unsigned long intervaloApagado=480000;
unsigned long intervaloArranque=600000;


EDITO 2: Este es el esquema de tu módulo 4 reles




En el se ve claramente que no hay regulador.
WIKIpedia dice

Quote
VCC is system power source, and JD_VCC is relay power source. Ship 5V relay by default. Plug jumper cap to use
O sea 5V

Mira el enlace porque esta muy claro link que tengo razón y no es 12V la alimentación.

Cuando los reles son 12VDC entonces si.

Otro link mas en pdf

Miguelon23

Muchas gracias, da gusto con explicaciones tan claras.
Es cierto que viendo el esquema queda bastante claro que debe funcionar a 5V, no se como ponían en la pagina lo de los 12V. De todas maneras, como lo voy a comprar en la tienda física, preguntaré para asegurarme.
Lo de cambiar los tiempos a unsigned long, ya me había quedado claro y en el definitivo lo tengo corregido.
Para acabar, me gustaría que me recomendarais con que se alimenta mejor Arduino. Comentaros que quiero meterlo todo en una caja y tendré un carril DIN para poner un magnetotérmico y un contactor que necesito para el agitador. Por eso pensaba ponerle una fuente de las que van en carril DIN (por ejemplo, la HDR-15 de Mean Well)
Os lanzo las preguntas:
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.
2º ¿En caso de tener que irme a la de 12V? también he leído que se genera demasiado calor en Arduino.
3º ¿Cualquiera de las 2 opciones las puedo conectar al Vin? o tiene que ser por el conector de alimentación.
Yo creo que resolviendo esto, me queda todo claro, por lo menos para este proyecto, porque ya tengo algún otro en mente... que parece que esto engancha cuando te van saliendo las cosas.
Un saludo y gracias.

Go Up