/*
Programa de control y ciclo de funcionamiento basico de una lavadora
*/
//Variables de salida
//RELES
int centrifugado=23; // RELE 1, CENTRIFUGADO, se declara la operacion del motor centrifugado
int motor_arranque=25; // RELE 2, ARRANQUE MOTOR, se declara el movimiento del motor sentido derecha
int cambiogiromotor=27; // RELE 3, ON SENTIDO DERECHA, OFF SENTIDO IZQUIERDA
int cambiogiromotor1=29; // RELE 4, ON SENTIDO DERECHA, OFF SENTIDO IZQUIERDA
int bomba=24; // RELE 5, se declara control del motor que desaloja el agua
int agua=26; // RELE 6, se declara control de la valvula del agua
int termo=28; // RELE 7, se declara permisivo para el termocalentador
// Variables de entrada digitales
int llenado_deseado=33;//boton de llenado, 1:lleno, 0 medio lleno
int seleccion_S1 = 35; // Seleccion S1
int seleccion_S2 = 37; // Seleccion S2
/*
S1 S2 Estado
- 0 No centrifugado programa corto
0 0 Centrifugado programa corto
- - No centrifugado programa largo
0 - Centrifugado programa largo
*/
int nivel_medio=39; // sensor de nnivel medio
int nivel_lleno=41; // sensor de nnivel lleno
int vacia = 43; // sensor de nivel vacio
int puerta=45; // se decla ra pin de entrada del sensor de contacto de la puerta del tambor
// Variables internas
// Auxiliares
int valormotor_arranque; // RELE 2, ARRANQUE MOTOR, se declara el movimiento del motor sentido derecha
int valorcambiogiromotor; // RELE 3, ON SENTIDO DERECHA, OFF SENTIDO IZQUIERDA
int valorcambiogiromotor1; // RELE 4, ON SENTIDO DERECHA, OFF SENTIDO IZQUIERDA
int valorvaciado; // RELE 5, se declara control del motor que desaloja el agua
int valoragua; // RELE 6, se declara control de la valvula del agua
int valortermo; // RELE 7, se declara permisivo para el termocalentador
int valorllenado_deseado; //boton de llenado, 1:lleno, 0 medio lleno
int valorseleccion_S1; // Seleccion S1
int valorseleccion_S2; // Seleccion S2
int valornivel_medio; // sensor de nivel medio
int valornivel_lleno; // sensor de nivel lleno
int valorvacia;
int valorpuerta; //
bool valorlavadocorto;
bool valorcentrifugado;
int valordireccionmotor = 0;
unsigned long tiempoactual; // tiempo desde que arranco por primera vez el arduino
unsigned long tiempoultimo;
int t_lavado = 10;//*60; // tiempo en segundos para lavados
int t_enjuague = 2;//*60; // tiempo en segundos para enjuague
int t_intermitente = 1;//*60; // tiempo en segundos para cambio giro
int t_centrifugado = 5;//*60; // tiempo en segundos para centrifugado
int valor_t_lavado = 0; // tiempo actual
int valor_t_enjuague = 0; // tiempo actual
int valor_t_intermitente = 0;// tiempo actual
int valor_t_centrifugado = 0;// tiempo actual
// de Marca de estados
int m = 10; // Estado inicial
int m_last = 10; // Ultimo estado
/*
m concepto
10 estado inicial
20 llenado inicial con agua
30 proceso de lavado
40 drenaje
50 llenado para enjuagado 1
60 enjuagado 1
70 drenaje 1
80 llenado para enjuagado 2
90 enjuagado 2
100 drenaje 2
110 centrifugado
120 LAvado terminado
*/
void setup() {
// initialize serial:
Serial.begin(9600);
Serial.println("Iniciando Lavado");
// estableciendo las entradas y salidas de las variables
pinMode (centrifugado, OUTPUT);
pinMode (motor_arranque, OUTPUT);
pinMode (cambiogiromotor, OUTPUT);
pinMode (cambiogiromotor1, OUTPUT);
pinMode (agua, OUTPUT);
pinMode (bomba, OUTPUT);
pinMode (termo, OUTPUT);
pinMode (llenado_deseado, INPUT);
pinMode (seleccion_S1, INPUT);
pinMode (seleccion_S2, INPUT);
pinMode (nivel_medio, INPUT);
pinMode (nivel_lleno, INPUT);
pinMode (puerta, INPUT);
}
void loop() {
actualizartiempos();
leerinputs();
/*
m concepto
10 estado inicial
11
12
20 llenado inicial con agua
30 proceso de lavado
40 drenaje
50 llenado para enjuagado 1
60 enjuagado 1
70 drenaje 1
80 llenado para enjuagado 2
90 enjuagado 2
100 drenaje 2
110 centrifugado
120 LAvado terminado
*/
Serial.println("Estado: "+ String(m));
switch(m) {
case 10: // La lavadora está recien arrancada, comprobamos los sensores
if (valorpuerta == 1) {
Serial.println("la puerta esta abierta");
Serial.println("ponemos la lavadora en modo pausa parando la bomba, el motor y cerrando las EV");
m = 12;
m_last = 10;
pararmotor();
pararbomba();
cerrarvalvulallenado();
break;
}
else{
m=20;
m_last = 10;
arrancarmotor();
abrirvalvulallenado();
break;
}
break;
case 12: //estado de pausa
if (valorpuerta == 0) {
Serial.println("la puerta esta cerrada, reanudamos lavado");
Serial.println("rescatamos el estado anterior al de pausa");
switch(m_last) {
case 10:
// estabamos en modo inicial
m = 10;
m_last = 12;
break;
case 20:
// estabamos en modo inicial
m = 20;
m_last = 12;
break;
}
}
break;
case 20: //comprobamos si tiene agua suficiente y si no, llenamos hasta el nivel deseado
if (valorpuerta == 1) {
Serial.println("la puerta esta abierta");
Serial.println("ponemos la lavadora en modo pausa parando la bomba, el motor y cerrando las EV");
m = 12;
m_last = 20;
pararmotor();
pararbomba();
cerrarvalvulallenado();
break;
}
// comprobamossi tiempo intermitente se ha superado para alternar el giro del motor
comprobarintermitenciamotor();
if ((valorllenado_deseado == 1) && (valornivel_lleno == 1)) {
Serial.println("consigna lleno total y lavadora llena de agua, se procede al lavado");
cerrarvalvulallenado ();
m = 30;
m_last = 20;
break;
}
else if ((valorllenado_deseado == 0) && (valornivel_medio == 1)) {
Serial.println("consigna medio lleno total y lavadora medio llena de agua, se procede al lavado");
cerrarvalvulallenado ();
m = 30;
m_last = 20;
break;
}
else {
// no hay nivel de agua suficiente, abrir el agua
abrirvalvulallenado();
break;
}
break;
case 30: // Lavado
if (valorpuerta == 1) {
Serial.println("la puerta esta abierta");
Serial.println("ponemos la lavadora en modo pausa parando la bomba, el motor y cerrando las EV");
m = 12;
m_last = 30;
pararmotor();
pararbomba();
cerrarvalvulallenado();
break;
}
// comprobamossi tiempo intermitente se ha superado para alternar el giro del motor
comprobarintermitenciamotor();
// comprobamos si ya se ha superado el tiempo del lavado
// El lavado largo es el doble de tiemp que el lavado corto
if ((valor_t_lavado >= t_lavado) && !(valorlavadocorto)) {
valor_t_lavado = 0;
arrancarbomba();
m = 40;
m_last = 30;
break;
}
if ((valor_t_lavado >= t_lavado*2) && (valorlavadocorto)) {
valor_t_lavado = 0;
arrancarbomba();
m = 40;
m_last = 30;
break;
}
break;
case 40: //Vaciado o drenaje
if (valorpuerta == 1) {
Serial.println("la puerta esta abierta");
Serial.println("ponemos la lavadora en modo pausa parando la bomba, el motor y cerrando las EV");
m = 12;
m_last = 40;
pararmotor();
pararbomba();
cerrarvalvulallenado();
break;
}
// comprobamossi tiempo intermitente se ha superado para alternar el giro del motor
comprobarintermitenciamotor();
if (valorvacia == 1) {
Serial.println("La lavadora esta vacia de agua");
pararbomba ();
m = 50;
m_last = 40;
break;
}
break;
case 50: // llenado para enjuague
if (valorpuerta == 1) {
Serial.println("la puerta esta abierta");
Serial.println("ponemos la lavadora en modo pausa parando la bomba, el motor y cerrando las EV");
m = 12;
m_last = 50;
pararmotor();
pararbomba();
cerrarvalvulallenado();
break;
}
// comprobamossi tiempo intermitente se ha superado para alternar el giro del motor
comprobarintermitenciamotor();
if ((valorllenado_deseado == 1) && (valornivel_lleno == 1)) {
Serial.println("consigna lleno total y lavadora llena de agua, se procede al enjuague");
cerrarvalvulallenado ();
m = 60;
m_last = 50;
break;
}
else if ((valorllenado_deseado == 0) && (valornivel_medio == 1)) {
Serial.println("consigna lleno total y lavadora llena de agua, se procede al enjuague");
cerrarvalvulallenado ();
m = 60;
m_last = 50;
break;
}
else {
// no hay nivel de agua suficiente, abrir el agua
abrirvalvulallenado();
}
break;
case 60: // enjuagado 1
if (valorpuerta == 1) {
Serial.println("la puerta esta abierta");
Serial.println("ponemos la lavadora en modo pausa parando la bomba, el motor y cerrando las EV");
m = 12;
m_last = 60;
pararmotor();
pararbomba();
cerrarvalvulallenado();
break;
}
// comprobamossi tiempo intermitente se ha superado para alternar el giro del motor
comprobarintermitenciamotor();
// comprobamos si ya se ha superado el tiempo del enjuagado
if (valor_t_enjuague >= t_enjuague) {
valor_t_enjuague = 0;
arrancarbomba();
m_last = 60;
m = 70;
break;
}
break;
case 70: //Vaciado o drenaje
if (valorpuerta == 1) {
Serial.println("la puerta esta abierta");
Serial.println("ponemos la lavadora en modo pausa parando la bomba, el motor y cerrando las EV");
m = 12;
m_last = 70;
pararbomba();
cerrarvalvulallenado();
break;
}
// comprobamossi tiempo intermitente se ha superado para alternar el giro del motor
comprobarintermitenciamotor();
if (valorvacia == 1) {
Serial.println("La lavadora esta vacia de agua");
pararbomba ();
m = 80;
m_last = 70;
break;
}
break;
case 80: // llenado para enjuague
if (valorpuerta == 1) {
Serial.println("la puerta esta abierta");
Serial.println("ponemos la lavadora en modo pausa parando la bomba, el motor y cerrando las EV");
m = 12;
m_last = 80;
pararmotor();
pararbomba();
cerrarvalvulallenado();
break;
}
// comprobamossi tiempo intermitente se ha superado para alternar el giro del motor
comprobarintermitenciamotor();
if ((valorllenado_deseado == 1) && (valornivel_lleno == 1)) {
Serial.println("consigna lleno total y lavadora llena de agua, se procede al enjuague");
cerrarvalvulallenado ();
m = 90;
m_last = 80;
break;
}
else if ((valorllenado_deseado == 0) && (valornivel_medio == 1)) {
Serial.println("consigna lleno total y lavadora llena de agua, se procede al enjuague");
cerrarvalvulallenado ();
m = 90;
m_last = 80;
break;
}
else {
// no hay nivel de agua suficiente, abrir el agua
abrirvalvulallenado();
}
break;
case 90: // enjuagado 2
if (valorpuerta == 1) {
Serial.println("la puerta esta abierta");
Serial.println("ponemos la lavadora en modo pausa parando la bomba, el motor y cerrando las EV");
m = 12;
m_last = 90;
pararmotor();
pararbomba();
cerrarvalvulallenado();
break;
}
// comprobamossi tiempo intermitente se ha superado para alternar el giro del motor
comprobarintermitenciamotor();
// comprobamos si ya se ha superado el tiempo del enjuagado
if (valor_t_enjuague >= t_enjuague) {
valor_t_enjuague = 0;
arrancarbomba();
m_last = 90;
m = 100;
break;
}
break;
case 100: //Vaciado o drenaje
if (valorpuerta == 1) {
Serial.println("la puerta esta abierta");
Serial.println("ponemos la lavadora en modo pausa parando la bomba, el motor y cerrando las EV");
m = 12;
m_last = 100;
pararmotor();
pararbomba();
cerrarvalvulallenado();
break;
}
// comprobamossi tiempo intermitente se ha superado para alternar el giro del motor
comprobarintermitenciamotor();
if (valorvacia == 1) {
Serial.println("La lavadora esta vacia de agua y arrancamos centrifugado");
arrancarcentrifugado ();
m = 110;
m_last = 100;
break;
}
break;
case 110: // enjuagado 2
if (valorpuerta == 1) {
Serial.println("la puerta esta abierta");
Serial.println("ponemos la lavadora en modo pausa parando la bomba, el motor y cerrando las EV");
m = 12;
m_last = 110;
pararmotor();
pararbomba();
cerrarvalvulallenado();
break;
}
// comprobamos si ya se ha superado el tiempo del centrifugado
if (valor_t_centrifugado >= t_centrifugado) {
valor_t_centrifugado = 0;
pararcentrifugado();
pararbomba();
m = 120;
m_last = 110;
break;
}
break;
case 120: // Final
if (valorpuerta == 1) {
Serial.println("la puerta esta abierta");
Serial.println("ponemos la lavadora en modo pausa parando la bomba, el motor y cerrando las EV");
m = 12;
m_last = 120;
pararmotor();
pararbomba();
cerrarvalvulallenado();
break;
}
break;
default:
// statements
break;
}
delay(5000);
}
void actualizartiempos() {
// actualizamos los contadores de tiempo
Serial.println("Actualizando tiempos");
tiempoactual = millis();
valor_t_lavado = valor_t_lavado + (tiempoactual-tiempoultimo)/1000;
valor_t_enjuague = valor_t_enjuague + (tiempoactual-tiempoultimo)/1000;
valor_t_intermitente = valor_t_intermitente + (tiempoactual-tiempoultimo)/1000;
valor_t_centrifugado = valor_t_centrifugado + (tiempoactual-tiempoultimo)/1000;
tiempoultimo = tiempoactual;
}
void leerinputs() {
// Leemos el valor de tdos los imnputs para luego ver los estados
Serial.println("Leyendo Inputs");
valorllenado_deseado = digitalRead (llenado_deseado);Serial.println("llenado_deseado: "+String(valorllenado_deseado));
valorseleccion_S1 = digitalRead (seleccion_S1);Serial.println("seleccion_S1: "+String(valorseleccion_S1));
valorseleccion_S2 = digitalRead (seleccion_S2);Serial.println("seleccion_S2: "+String(valorseleccion_S2));
valornivel_medio = digitalRead (nivel_medio);Serial.println("nivel_medio :"+String(valornivel_medio));
valornivel_lleno= digitalRead (nivel_lleno);Serial.println("nivel_lleno :"+String(valornivel_lleno));
valorvacia = digitalRead (vacia);Serial.println("vacia: "+String(valorvacia));
valorpuerta= digitalRead (puerta);Serial.println("puerta :"+String(valorpuerta));
if (valorseleccion_S1 == LOW) {
valorcentrifugado == 1;
if (valorseleccion_S2 == LOW) {
Serial.println("Programado lavado corto");
valorlavadocorto = 1;
}
}
else {
valorcentrifugado = 0;
if (valorseleccion_S2 == HIGH) {
Serial.println("Programado lavado largo");
valorlavadocorto = 0;
}
}
if (digitalRead(cambiogiromotor) && digitalRead(cambiogiromotor1)) {
// Los dos reles de sentido de giro en ON, Motor en dirección directa
valordireccionmotor = 1;
}
if (!(digitalRead(cambiogiromotor)) && !(digitalRead(cambiogiromotor1))) {
// Los dos reles de sentido de giro en OFF, Motor en dirección inversa
valordireccionmotor = 0;
}
Serial.println("Direccion motor: " + String(valordireccionmotor));
delay(5000);
}
void pararmotor() {
Serial.println("Motor OFF");
digitalWrite(motor_arranque,LOW);
}
void arrancarmotor() {
Serial.println("Motor ON");
digitalWrite(motor_arranque,HIGH);
}
void comprobarintermitenciamotor() {
// comprobamossi tiempo intermitente se ha superado para alternar el giro del motor
if (valor_t_intermitente >= t_intermitente) {
//cambiamos el giro del motor
cambiarsentidogiromotor();
valor_t_intermitente = 0;
}
}
void cambiarsentidogiromotor() {
// para cambiar el sentido de giro, paramos el motor y cambiamos los dos reles de sentido giro
Serial.println("Cambiando sentido de giro del motor");
if (digitalRead(motor_arranque) == HIGH) {
pararmotor();
delay(5000);
}
if (valordireccionmotor == 0) {
digitalWrite(cambiogiromotor,HIGH);
digitalWrite(cambiogiromotor1,HIGH);
valordireccionmotor = 1;
Serial.println("Direccion motor: " + String(valordireccionmotor));
}
else {
digitalWrite(cambiogiromotor,LOW);
digitalWrite(cambiogiromotor1,LOW);
valordireccionmotor = 0;
Serial.println("Direccion motor: " + String(valordireccionmotor));
}
arrancarmotor();
}
void arrancarcentrifugado() {
Serial.println("Arrancando centrifugado");
digitalWrite(centrifugado,HIGH);
}
void pararcentrifugado() {
Serial.println("Parando centrifugado");
digitalWrite(centrifugado,LOW);
}
void abrirvalvulallenado() {
Serial.println("Abriendo valvula de llenado");
digitalWrite(agua,HIGH);
}
void cerrarvalvulallenado() {
Serial.println("Cerrando valvula de llenado");
digitalWrite(agua,LOW);
}
void arrancarbomba() {
Serial.println("Arrancando bomba");
digitalWrite(bomba,LOW);
}
void pararbomba() {
Serial.println("Parando bomba");
digitalWrite(bomba,LOW);
}