아두이노

접시딱기프로그램

내동 2019. 10. 25. 00:42

//Lavavajillas v.1.0.

//Programador: Pedro Rivera.

//Programa para arduino duemillanove o mini arduino pro.

//Controlador de un lavavajillas con 5 diferentes programas de lavado,

//control de temperatura termistor 10k.

//control de 6 relays optoacoplados

//Bajo licencia de Creative Commons.

#include <math.h>

#include <LiquidCrystal.h>

//asignar pines

LiquidCrystal lcd(8, 9, 10, 11, 12, 13);

#define doorBtn     2   //boton de puerta

#define errorSens   3   //sensor de exceso de llenado

#define drainPump   4   //bomba de desagüe

#define soapSolen   5   //Selenoide de dispensador de detergente

#define inletValve  6   //valvula de entrada de agua

#define regenSolen  7   //selenoide de regeneración

#define keySelect  A0   //llave selectora

#define startBtn   A1   //boton de inicio

#define fillSens   A2   //sensor de llenado

#define tempSensor A3   //sensor de temperatura

#define heater     A4   //calentador

#define washPump   A5   //bomba de lavado

//declaración de constantes

constint btnStrong =1;

constint btnNormal =2;

constint btnEconom =3;

constint btnFast   =4;

constint btnRinse  =5;

constint btnNone   =6;

//declaracion de variables

unsignedlong periodStart, periodFinished, periodElapsed;

unsignedlong periodStart2, periodFinished2, periodElapsed2;

volatileint doorBtnState  =0;

double tempArray[25];

byte arrayIndex   =0;

int lcdKeyMenu    =0;

int selKeyIN      =0;

int startBtnState =0;

int fillSensState =0;

int tempLimit     =57;

int x             =0;

//acciones

 

int readKey(){//leer la llave selectora de programas inicio

selKeyIN = analogRead(keySelect);//lee el valor desde el sensor

if(selKeyIN < 300)return btnRinse;

if(selKeyIN < 500)return btnEconom;

if(selKeyIN < 600)return btnNormal;

if(selKeyIN < 700)return btnStrong;

if(selKeyIN < 999)return btnFast;return btnNone;}

double waterTemp(){//subrutina tomada de www.neonsquirt.com/

if(arrayIndex>23){//a su vez tomada de Arduino Playground

arrayIndex=0;

}

else{

arrayIndex++;

}

double Temp;        // The Thermistor2 "Simple Code"

int RawADC = analogRead(tempSensor);

Temp = log(((10240000/RawADC)- 10000));

Temp = 1 /(0.001129148 +(0.000234125 +(0.0000000876741 * Temp * Temp ))* Temp );

Temp = Temp -273.15;   //convierte kelvin a celsious

tempArray[arrayIndex]=Temp;

Temp=0;

for(int i=0; i<24; i++){

Temp += tempArray[i];

}

return(Temp / 25);  // regresa el promedio de la temperatura del arreglo

}

 

void dispTemp(){

lcd.setCursor(0,4); lcd.print("Temperatura: ");

cd.print(int(waterTemp()));

lcd.print((char)223); lcd.print("C   ");

}

 

void Welcome(){

lcd.clear(); lcd.setCursor(0,0);

lcd.print("     Bienvenido     ");

lcd.setCursor(0,1); lcd.print("    Lavavajillas    ");

lcd.setCursor(0,2); lcd.print("     con Arduino    ");

lcd.setCursor(0,3); lcd.print("  RiveraTek  Rev 1.0");

delay(5000);

lcd.clear();

}

 

void Finish(){

lcd.clear(); lcd.setCursor(0,0);

lcd.print("   Vajilla Limpia   ");

lcd.setCursor(0,1); lcd.print(" Pulse el boton off ");

lcd.setCursor(0,2); lcd.print("    para terminar"   );

while(true){}; }

 

void selMenu(){

lcd.setCursor(0,0); lcd.print("     Seleccione     ");

lcd.setCursor(0,1); lcd.print("    un programa     ");

lcd.setCursor(0,2); lcd.print("   y pulse start    ");

lcd.setCursor(0,3); lcd.print("    para empezar    ");

actStartBtn(); }

 

void actStartBtn(){ //accion del boton de inicio

startBtnState = digitalRead(startBtn);

while(startBtnState == HIGH){

startBtnState = digitalRead(startBtn);

} }

 

void actDoorBtn(){   // accion switch puerta

digitalWrite(heater, LOW);

digitalWrite(washPump, LOW);

digitalWrite(soapSolen, LOW);

digitalWrite(drainPump, LOW);

digitalWrite(inletValve, LOW);

digitalWrite(regenSolen, LOW);

doorBtnState = digitalRead(doorBtn);

while(doorBtnState == HIGH){

doorBtnState = digitalRead(doorBtn); }

}

 

void actErrorSens(){

cli(); digitalWrite(heater, LOW);

digitalWrite(washPump, LOW);

digitalWrite(soapSolen, LOW);

digitalWrite(drainPump, LOW);

digitalWrite(inletValve, LOW);

digitalWrite(regenSolen, LOW);

lcd.setCursor(0,0); lcd.print("       ERROR        ");

lcd.setCursor(0,1); lcd.print("     DESCONECTE     ");

lcd.setCursor(0,2); lcd.print("  EL LAVAVAJILLAS   ");

lcd.setCursor(0,3); lcd.print(" DEL TOMA CORRIENTE ");

while(true){}; }

 

void actSoapSolenONE(){

digitalWrite(soapSolen, HIGH);

periodStart2 = millis();

timeElapsed2();

while(periodElapsed2 < 3000){

timeElapsed2(); }

digitalWrite(soapSolen, LOW);}

 

void actFill(){

lcd.setCursor(0,2); lcd.print("      Llenando      ");

digitalWrite(inletValve, HIGH);

periodStart2 = millis();

timeElapsed2();

while(periodElapsed2 < 7000){

digitalWrite(inletValve, HIGH);

timeElapsed2();

}

digitalWrite(washPump, HIGH);

digitalWrite(inletValve, HIGH);

fillSensState = digitalRead(fillSens);

while(fillSensState == LOW){

digitalWrite(washPump, HIGH);

digitalWrite(inletValve, HIGH);

fillSensState = digitalRead(fillSens);

}

digitalWrite(washPump, HIGH);

digitalWrite(inletValve, HIGH);

periodStart2 = millis();

timeElapsed2();

while(periodElapsed2 < 10000){

digitalWrite(inletValve, HIGH);

digitalWrite(washPump, HIGH);

timeElapsed2();

}

digitalWrite(inletValve, LOW);

lcd.setCursor(0,2);

lcd.print("                    ");

digitalWrite(washPump, HIGH); }

 

void actDrainPumpON(){

digitalWrite(drainPump, HIGH);

lcd.setCursor(0,2); lcd.print("      Drenando      ");

lcd.setCursor(0,3); lcd.print("                    ");

}

 

void actDrainPumpOFF(){

digitalWrite(drainPump, LOW);

lcd.setCursor(0,2); lcd.print("                    ");

}

 

void actDrain(){

actDrainPumpON();

fillSensState = digitalRead(fillSens);

while(fillSensState ==  HIGH){

actDrainPumpON(); fillSensState = digitalRead(fillSens); }

actDrainPumpON();

periodStart2 = millis();

timeElapsed2();

while(periodElapsed2 < 30000){

actDrainPumpON();

timeElapsed2(); }

actDrainPumpOFF(); }

 

void actHeaterON(){

digitalWrite(heater, HIGH);

}

 

void actHeaterOFF(){

digitalWrite(heater, LOW); }

 

void actPreWashON(){

digitalWrite(washPump, HIGH);

lcd.setCursor(0,2); lcd.print("     Prelavado       "); }

 

void actPreWashOFF(){

digitalWrite(washPump, LOW);

lcd.setCursor(0,2); lcd.print("                    "); }

 

void actWashON(){

digitalWrite(washPump, HIGH);

lcd.setCursor(0,2); lcd.print("      Lavando       "); }

 

void actWashOFF(){

digitalWrite(washPump, LOW);

lcd.setCursor(0,2); lcd.print("                    "); }

 

void timeElapsed(){

periodFinished= millis();

periodElapsed =(periodFinished periodStart); }

 

void timeElapsed2(){

periodFinished2 = millis();

periodElapsed2 =(periodFinished2 - periodStart2);

}

 

void actRinse(){

lcd.setCursor(0,1);

lcd.print("     Enjuagado     ");

actFill();

actWashON();

periodStart = millis();

timeElapsed();

while(periodElapsed < 390000){

actWashON();

timeElapsed(); }

actWashOFF();

pause();

actDrain(); }

 

 

void actClearRinse(){

lcd.setCursor(0,1);

lcd.print("    Abrillantado    ");

actFill();

actWashON();

actHeaterON();

while(waterTemp()< 48){

actHeaterON();

actWashON();

dispTemp();

}

actWashON();

actHeaterON();

digitalWrite(soapSolen, HIGH);

periodStart = millis();

timeElapsed();

while(periodElapsed < 60000){

actWashON();

actHeaterON();

digitalWrite(soapSolen, HIGH);

timeElapsed();

}

actWashON();

actHeaterON();

digitalWrite(soapSolen, LOW);

periodStart = millis();

timeElapsed();

while(periodElapsed < 3000){

actWashON();

actHeaterON();

digitalWrite(soapSolen, LOW);

timeElapsed();

}

actWashON();

actHeaterON();

digitalWrite(soapSolen, HIGH);

periodStart = millis();

timeElapsed();

while(periodElapsed < 60000){

actWashON();

actHeaterON();

digitalWrite(soapSolen, HIGH);

timeElapsed();

}

digitalWrite(soapSolen, LOW);

actWashON();

actHeaterON();

while(waterTemp()< tempLimit){

actHeaterON();

actWashON();

dispTemp();

}

actWashON();

actHeaterOFF();

periodStart = millis();

timeElapsed();

while(periodElapsed < 60000){

actWashON();

timeElapsed();

}

actWashOFF();

pause();

actDrain();

}

 

void actDry(){

lcd.setCursor(0,1);

lcd.print("      Secando       ");

periodStart = millis();

timeElapsed();

while(periodElapsed < 120000){

timeElapsed();

}

digitalWrite(regenSolen, HIGH);

actDrain();

periodStart = millis();

timeElapsed();

while(periodElapsed < 60000){

timeElapsed();

}

periodStart = millis();

timeElapsed();

while(periodElapsed < 1000){

digitalWrite(inletValve, HIGH);

timeElapsed();

}

digitalWrite(inletValve, LOW);

periodStart = millis();

timeElapsed();

while(periodElapsed < 3000){

timeElapsed();

}

periodStart = millis();

timeElapsed();

while(periodElapsed < 1000){

digitalWrite(inletValve, HIGH);

timeElapsed();

}

digitalWrite(inletValve, LOW);

digitalWrite(regenSolen, LOW);

actDrain();

periodStart = millis();

timeElapsed();

while(periodElapsed < 660000){

timeElapsed();

}

actDrain();

}

 

void pause(){

periodStart = millis();

timeElapsed();

while(periodElapsed < 3000){

timeElapsed(); }

}

//programas

 

void wStrong(){

lcd.setCursor(0,0);

lcd.print("Lavado Fuerte       ");

lcd.setCursor(0,1);

lcd.print("                    ");

lcd.setCursor(0,2);

lcd.print("                    ");

lcd.setCursor(0,3);

lcd.print("                    ");

actDrain();

pause();

actFill();

pause();

actPreWashON();

while(waterTemp()< 36){

actPreWashON();

actHeaterON();

dispTemp();

}

actHeaterOFF();

periodStart = millis();

timeElapsed();

while(periodElapsed < 180000){

actPreWashON();

dispTemp();

timeElapsed();

}

actPreWashOFF();

pause();

actDrain();

pause();

actFill();

pause();

actSoapSolenONE();

while(waterTemp()< 59){

actWashON();

actHeaterON();

dispTemp();

}

actHeaterOFF();

periodStart = millis();

timeElapsed();

while(periodElapsed < 720000){

actWashON();

dispTemp();

timeElapsed();

}

actWashOFF();

pause();

actDrain();

pause();

actRinse();

pause();

actRinse();

pause();

actClearRinse();

pause();

actDry();

Finish();

}

 

void wNormal(){

lcd.setCursor(0,0);

lcd.print("Lavado Normal       ");

lcd.setCursor(0,1);

lcd.print("                    ");

lcd.setCursor(0,2);

lcd.print("                    ");

actDrain();

pause();

actFill();

pause();

actPreWashON();

periodStart = millis();

timeElapsed();

while(periodElapsed < 360000){

actPreWashON();

dispTemp();

timeElapsed();

}

actPreWashOFF();

pause();

actDrain();

pause();

actFill();

pause();

actSoapSolenONE();

while(waterTemp()< 55){

actWashON();

actHeaterON();

dispTemp();

}

actHeaterOFF();

periodStart = millis();

timeElapsed();

while(periodElapsed < 840000){

actWashON();

dispTemp();

timeElapsed();

}

actWashOFF();

pause();

actDrain();

pause();

actRinse();

pause();

actClearRinse();

pause();

actDry();

Finish();

}

void wEconom(){

lcd.setCursor(0,0);

lcd.print("Lavado Economico    ");

lcd.setCursor(0,1);

lcd.print("                    ");

lcd.setCursor(0,2);

lcd.print("                    ");

actDrain();

pause();

actFill();

pause();

actPreWashON();

periodStart = millis();

timeElapsed();

while(periodElapsed < 480000){

actPreWashON();

dispTemp();

timeElapsed();

}

actPreWashOFF();

pause();

actDrain();

pause();

actFill();

pause();

actSoapSolenONE();

while(waterTemp()< 41){

actWashON();

actHeaterON();

dispTemp();

}

actHeaterOFF();

periodStart = millis();

timeElapsed();

while(periodElapsed < 600000){

actWashON();

dispTemp();

timeElapsed();

}

while(waterTemp()< 48){

actWashON();

actHeaterON();

dispTemp();

}

actHeaterOFF();

periodStart = millis();

timeElapsed();

while(periodElapsed < 30000){

actWashON();

dispTemp();

timeElapsed();

}

actWashOFF();

pause();

actDrain();

pause();

actRinse();

pause();

actClearRinse();

pause();

actDry();

Finish();

}

void wFast(){

tempLimit =48;

lcd.setCursor(0,0);

lcd.print("Lavado Rapido       ");

lcd.setCursor(0,1);

lcd.print("                    ");

lcd.setCursor(0,2);

lcd.print("                    ");

actDrain();

pause();

actFill();

pause();

actSoapSolenONE();

while(waterTemp()< 36){

actWashON();

actHeaterON();

dispTemp();

}

actHeaterOFF();

periodStart = millis();

timeElapsed();

while(periodElapsed < 240000){

actWashON();

dispTemp();

timeElapsed();

}

actWashOFF();

pause();

actDrain();

pause();

actRinse();

pause();

actClearRinse();

pause();

actDry();

Finish();

}

void wRinse(){

lcd.setCursor(0,0);

lcd.print("      Enjuagar      ");

lcd.setCursor(0,1);

lcd.print("                    ");

lcd.setCursor(0,2);

lcd.print("                    ");

actDrain();

pause();

actFill();

pause();

actPreWashON();

periodStart = millis();

timeElapsed();

while(periodElapsed < 360000){

actPreWashON();

dispTemp();

timeElapsed();

}

actPreWashOFF();

pause();

actDrain();

pause();

actDry();

Finish();

}

void setup(){

for(int i=0; i<25; i++) tempArray[i]=21;  //Temperatura primera lectura

lcd.begin(20,4);

pinMode(heater, OUTPUT);

pinMode(washPump, OUTPUT);

pinMode(soapSolen, OUTPUT);

pinMode(regenSolen, OUTPUT);

pinMode(drainPump,  OUTPUT);

pinMode(inletValve, OUTPUT);

digitalWrite(startBtn, HIGH);

digitalWrite(fillSens, HIGH);

digitalWrite(washPump, LOW);

digitalWrite(drainPump, LOW);

digitalWrite(inletValve, LOW);

attachInterrupt(0, actDoorBtn, RISING);

//attachInterrupt(1, actErrorSens, RISING);

}

 

void loop(){

Welcome(); selMenu(); lcdKeyMenu = readKey();// leer llave

switch(lcdKeyMenu){

case 1:

wStrong(); break;

case 2:

wNormal(); break;

case 3:

wEconom(); break;

case 4:

wFast(); break;

case 5:

wRinse(); break;}

}