접시딱기프로그램
//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;}
}