Vous êtes sur la page 1sur 8

D// C�digo C para Arduino, PROGRAMA UNIVERSAL DE LAVADORA

// Licencia Creative Commons


// Este c�digo se ejecuta a trav�s de mi lavadora, y pretende controlar los
siguientes instrucciones:
// Control de electrovalvula de prelavado/suavizante
// Control de electrovalvula de lavado
// Supervisa el sensor de temperatura del agua termistor NTC, y por lo tanto
control de su
temperatura.
// Controlar la velocidad (rpm) del motor universal (de escobillas) con un PWM, y
siete posibles
velocidades
// Control de inversi�n de giro en lavado lento de ropa
// �Control de velocidad a trav�s de tacometro de lavadora?
// Control de la bomba de vaciado
// Control del hidronivel
// Control de resistencia calentadora de agua
// Control de una pantalla de cristal liquido de 4 filas por 20 columnas, con
control I2C
// Control de botonera: selector de temperatura, selector
centrifugado(lento,r�pido),selector tipo
de ropa(tiempo de lavado)
// Futuras mejoras ====> inclusi�n de reloj para programar la hora de lavado
(mejora de gasto
energ�tico)

// Esta es la revisi�n de c�digo 1.0

#include <math.h> // Se necesita para el sensor de temperatura de termistor NTC


logar�tmica
#include <LiquidCrystal_I2C.h>
#include "pitches.h"
#include <Wire.h> // Usado por el chip I2C RTC, es el reloj
#include "Chronodot.h" // Se utiliza para traer y decodificar los datos de RTC
Chronodot RTC; // Creando el objeto RTC
LiquidCrystal_I2C lcd(0x27,21,22);
unsigned long cycleStart; // Se utiliza para hacer el seguimiento de cu�nto tiempo
ha estado
lavando.
// notas melod�a:
int melody[] = {
NOTE_C3, NOTE_C3, NOTE_C3, NOTE_GS2, NOTE_DS3, NOTE_C3, NOTE_GS2, NOTE_DS3,
NOTE_C3, NOTE_G4, NOTE_G4, NOTE_G4, NOTE_GS4, NOTE_DS4, NOTE_C4, NOTE_GS2,
NOTE_DS3, NOTE_C3 };
// notas duraci�n: 4 = quarter note, 8 = eighth note, etc.:
int noteDurations[] = {
4,4,4,4,8,4,4,8,4,4,4,4,4,8,4,4,8,4};
//Designando pines
#define OFF HIGH //no encuentro explicaci�n porque me funcionan al contrario
(�@####@@#@#@#�����aaaaaarrrrrrgggggggg)
#define ON LOW
#define PinSinUtilizar0 0 //PIN SIN UTILIZAR
#define MotorVelocidad1 1 //pin lavado lento
#define MotorVelocidad2 2 //pin centrifugado lento
#define MotorVelocidad3 3 //pin centrifugado rapido
// BOTONES
#define BotonTemperatura 4 //pin boton de temperatura
#define BotonCentrifugado 5 // pin boton de selecci�n velocidad centrifugado
#define BotonInicio 6 //pin boton de inicio
//#define PinBuzzer 7 //BUZZER MUSICA FINAL
#define CalentadorAgua 8 // pin enciende resistencia
#define VaciadoPin 9 //pin bomba desague
#define AguaIn1 11 //pin electrovalcula prelavado o suavizante
#define AguaIn2 10 //pin electrovalcula lavado o jab�n
#define Hidronivel 12 // pin hidronivel
//#define PinPuerta 13 //PIN PUERTA
// Anal�gicos
#define tempSensor A4 //pin thermistor
//#define botonGO A1
//#define botonStop A2
//#define PinSinUtilizarA3 A3 //PIN SIN UTILIZAR
//#define PinSinUtilizarA4 A4 //PIN SIN UTILIZAR
//#define PinPuerta A5 //PIN PUERTA
void setup () {
Wire.begin(); // Usado por el RTC
RTC.begin(); // Igualmente
lcd.begin(20,4); // 20x4 LCD Panel
//declarando posici�n de las entradas de los pines
pinMode(Hidronivel, INPUT);
pinMode(tempSensor, INPUT);
pinMode(AguaIn1, OUTPUT);
pinMode(AguaIn2, OUTPUT);
pinMode(VaciadoPin, OUTPUT);
pinMode(CalentadorAgua, OUTPUT);
pinMode(MotorVelocidad1, OUTPUT);
pinMode(MotorVelocidad2, OUTPUT);
pinMode(MotorVelocidad3, OUTPUT);
//pinMode(MotorReverse, OUTPUT);
// pinMode(PinPuerta, OUTPUT);
//pinMode(botonGO, INPUT);
//digitalWrite(botonGO, ON); // activar resistencia de actuaci�n interna para este
pin de entrada
//pinMode(botonStop, INPUT);
//INICIALIZO LOS PINES A OFF O LOW
digitalWrite(AguaIn1, OFF);
digitalWrite(AguaIn2, OFF);
digitalWrite(VaciadoPin, OFF);
digitalWrite(CalentadorAgua, OFF);
digitalWrite(MotorVelocidad1, LOW);
digitalWrite(MotorVelocidad2, LOW);
digitalWrite(MotorVelocidad3, LOW);
//digitalWrite(MotorReverse, OFF);
//===========================esto estaba en el
loop===============================================//
lcd.backlight();
lcd.setCursor(0,0);
lcd.print(F("Iniciando..."));
//digitalWrite(PinPuerta, ON); //cierra la puerta
//delay (3000);
// Ir bot�n fue presionado, ejecute a trav�s de los ciclos
//OJO CONTROLAR CUANDO PASA DE UNA FUNCI�N A OTRA
cycleStart = millis();
//VaciandoLavadora(15000,0);//un poco de vaciado antes de comenzar 15 sec
delay(100);
//llenarAgua(120000,1);//CUBETA PRELAVADO: valvula prelavado/suavizante 1, valvula
jabon 2
delay(100);
MotorLavado(600000, 4, 40);//PRELAVADO 10 MINUTOS(600000) parametro1= tiempo de
lavado, parametro2= pantalla "Lavando/Prelavado", parametro3= temperatura
delay(100);
VaciandoLavadora(120000,2);
delay(100);
//llenarAgua(120000,2);//JAB�N: valvula prelavado/suavizante 1, valvula jabon 2
delay(100);
//MotorLavado(1200000, 3, 10);//LAVADO parametro1= tiempo de lavado, parametro2=
pantalla
"Lavando", parametro3= temperatura
delay(100);
//VaciandoLavadora(120000,2);//VACIA PARA COGER SUAVIZANTE
delay(100);
//llenarAgua(120000,1);//SUAVIZANTE: valvula prelavado/suavizante 1, valvula jabon
2
delay(100);
//MotorLavado(300000,5,0);//SUAVIZANTE parametro1= tiempo, parametro2= pantalla
"Suavizante", parametro3= temperatura
delay(100);
//VaciandoLavadora(120000,2);
delay(1000);
//CentrifugadoSuave(120000);//SUAVE parametro1 = tiempo 1,5 minutos = 90000 ms
//CentrifugadoFuerte(60000);//FUERTE parametro1 = tiempo
delay(1000);
lcd.clear();
lcd.setCursor(0,3);
lcd.print(F("Lavado finalizado"));
//digitalWrite(PinPuerta, LOW);
delay(10000);
musica();
musica();
lcd.clear();
//lcd.noBacklight();
//===========================fin esto estaba en el
loop===============================================//
}
//===============================================================================
===================
//==================================COMIENZO FUNCIONES
DEPURADAS======================================
//===============================================================================
===================
double Termistor(int RawADC) {
const float resistor = 9800; //El valor en ohmnios de la resistencia del termistor
a 25�C
const float voltage = 4.76; // El voltaje real en el punto 5Vcc de tu placa Arduino
//Para ahorrar c�lculos lo definimos como constante en esta parte del programa
const float K= 273.15; //Para pasar a grados Kelvin
const float e = 2.718281828459045; //Constante matem�tica
const float B = 3760; //Valor Beta de tu termistor, lo consegui en esta pagina,
sino tendras que
calcularlo http://www.amwei.com/views.asp?hw_id=61
const float unodivr = 1/(resistor * pow(e,(-B/298.15))); //Con pow elevamos e al
resultado
float T = 0; //Declaramos la variable Temperatura
float tmedia; //Variable para calcular media
int cnt; //temperatura media y contador
int grados, decimas; //Para ponerle coma al resultado (en espa�ol)
int sensorPin = A4; // Selecciona la entrada para el termistor
int sensorValue = 0; // Aqu� almacenamos el valor del sensor
// Parte 1: Leemos el puerto anal�gico 0 y convertimos el valor en voltios.
sensorValue = analogRead(sensorPin); //Leemos anal�gico 0
float v2 = (voltage*float(sensorValue))/1024.0f;
// Parte 2: Calcular la resistencia con el valor de los voltios mediante la
ecuaci�n del divisor de
voltaje
//voltage = 4.83
//R2 = 10000
//R1 = Thermistor resistance
//V2= v2
//so V2=(R2*V)/(R1+R2)
//and r1=((r2*v)/v2)-r2 <--final
float r1a = (voltage*float(resistor))/v2;
float r1 =r1a - resistor;
//Parte 3: Calcular la temperatura basandose en la ecuaci�n Steinhart-Hart y la
ecuaci�n del
valor Beta.
// T=B/ln(r1/rinfinit)
T = B/log(r1*unodivr);
T=T-273.15; //Convertimos de Kelvin a �C y ya tenemos la temperatura
// ahora obtenemos la parte entera
grados=(int)T;
grados=(grados-24);//chapuza mia
return grados;
}
void llenarAgua(unsigned long tiempo,int valvula) { //DOBLE SISTEMA DE SEGURIDAD,
POR
TIEMPO Y POR HIDRONIVEL
lcd.begin(20,4);
lcd.clear();
muestraPantalla(1);
unsigned long tiempollenado = millis();
int hidronivelestado = 0;
hidronivelestado = digitalRead(Hidronivel); //lectura del pin hidronivel
//while (((millis() - tiempollenado) < tiempo) && (hidronivelestado == 0)) {
while (((millis() - tiempollenado) < tiempo)) {
//while (hidronivelestado == HIGH) {
if(valvula == 1){digitalWrite(AguaIn1, ON);}else{digitalWrite(AguaIn2, ON);}
hidronivelestado = digitalRead(Hidronivel);
}
digitalWrite(AguaIn1, OFF);
digitalWrite(AguaIn2, OFF);
delay(100);
lcd.begin(20,4);
lcd.clear();
}
void VaciandoLavadora(unsigned long tiempo,int pantalla) {//argumento1=tiempo,
argumento2=1(iniciando) 2(vaciando)
unsigned long vaciadoTiempo = millis();
muestraPantalla(pantalla);
while ((millis() - vaciadoTiempo) < tiempo) {
digitalWrite(VaciadoPin, ON);
delay(100);
}
digitalWrite(VaciadoPin, OFF);
delay(100);
lcd.begin(20,4);
lcd.clear();
}
void MotorLavado(unsigned long tiempo, int pantalla, int temperatura) {
//argumento1=tiempo,
argumento2=indicaci�n pantalla, argument3=temperatura
lcd.begin(20,4); // La pantalla aparece cuando el motor entra en acci�n
muestraPantalla(pantalla);
unsigned long tmpmotorgiro = millis();
//temperatura variables y lecturas
int val;//Crea una variable entera
int temp;//Variable de temperatura = temp
val=analogRead(A4);//Lee el valor del pin analogo 2 y lo mantiene como val
temp=Termistor(val);//Realiza la conversi�n del valor analogo a grados Celsius
while (temp < temperatura) {//mientras no alcance la temperatura esta activado la
resistencia
calentadora de agua
digitalWrite(CalentadorAgua, ON);
delay(100);
temp=Termistor(val);//devuelve la temperatura
}
digitalWrite(CalentadorAgua, OFF);
//fin temperatura variables y lecturas
while ((millis() - tmpmotorgiro) < tiempo) { //mientras lavado, gira en motor en
ambos sentidos
muestraPantalla(pantalla);
while (temp < temperatura) {//mientras no alcance la temperatura esta activado la
resistencia calentadora de agua
digitalWrite(CalentadorAgua, ON);
delay(100);
temp=Termistor(val);//devuelve la temperatura
}
digitalWrite(CalentadorAgua, OFF);
//fin temperatura variables y lecturas
//GIRA A DERECHA
digitalWrite(MotorVelocidad1, HIGH);
delay(3000);
digitalWrite(MotorVelocidad1, LOW);
delay(6000);

}
digitalWrite(CalentadorAgua, OFF);
delay(100);
digitalWrite(MotorVelocidad1, LOW);
delay(100);
lcd.begin(20,4);
lcd.clear();
}
void CentrifugadoSuave(unsigned long tiempo) {
lcd.begin(20,4); // La pantalla aparece cuando el motor entra en acci�n
digitalWrite(VaciadoPin, ON);
unsigned long tmpmotorgiro = millis();
while ((millis() - tmpmotorgiro) < tiempo) { //mientras lavado, gira en motor en
ambos sentidos
//digitalWrite(MotorVelocidad1, HIGH);
//digitalWrite(MotorVelocidad2, HIGH);
digitalWrite(MotorVelocidad3, HIGH); //solo el 3 500 rpm
delay(100);
muestraPantalla(6);
}
digitalWrite(MotorVelocidad1, LOW);
digitalWrite(MotorVelocidad2, LOW);
digitalWrite(MotorVelocidad3, LOW);
delay(10000);
digitalWrite(VaciadoPin, OFF);
lcd.begin(20,4);
lcd.clear();
}
void CentrifugadoFuerte(unsigned long tiempo) {
lcd.begin(20,4); // La pantalla aparece cuando el motor entra en acci�n
unsigned long tmpmotorgiro = millis();
while ((millis() - tmpmotorgiro) < tiempo) { //mientras lavado, gira en motor en
ambos sentidos
// 1500 rpm
digitalWrite(MotorVelocidad1, HIGH);
digitalWrite(MotorVelocidad2, HIGH);
digitalWrite(MotorVelocidad3, HIGH);
digitalWrite(VaciadoPin, ON);
delay(100);
muestraPantalla(7);
}
delay(10000);
digitalWrite(VaciadoPin, OFF);
delay(100);
digitalWrite(MotorVelocidad1, LOW);
digitalWrite(MotorVelocidad2, LOW);
digitalWrite(MotorVelocidad3, LOW);
delay(100);
lcd.begin(20,4);
lcd.clear();
}
void musica(){
for (int thisNote = 0; thisNote < 18; thisNote++) {
int noteDuration = 1000/noteDurations[thisNote];
tone(7, melody[thisNote],noteDuration); //conecta el pin 7
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(7); //desconecta el pin 7
}
}
//===============================================================================
===================
//===============================================================================
===================
//===============================================================================
===================
void muestraPantalla(byte currentMode) { // No estoy contento con esta rutina.
Necesita
trabajarla
unsigned long elapsedSeconds = ((millis() - cycleStart) / 1000); // Vamos con el
n�mero de
segundos transcurridos
unsigned long elapsedMinutes = (elapsedSeconds / 60);
unsigned long elapsedHours = (elapsedMinutes / 60);
lcd.setCursor(0,0);
lcd.print(F("Tiempo lavado: "));
if (elapsedHours > 0) { // No mostrar las horas transcurridas si ha transcurrido
menos de una
hora.
lcd.print(elapsedHours);
lcd.print(':');
if (elapsedHours == 1) elapsedMinutes -= 60;
if (elapsedHours == 2) elapsedMinutes -= 120;
}
if (elapsedMinutes < 10) { // S�lo muestra un solo d�gito, por lo que necesita un
cero de m�s.
lcd.print('0');
}
//temperatura
int val;//Crea una variable entera
int temp;//Variable de temperatura = temp
val=analogRead(A4);//Lee el valor del pin analogo 2 y lo mantiene como val
temp=Termistor(val);//Realiza la conversi�n del valor analogico a grados Celsius
//temperatura
lcd.print(elapsedMinutes);
lcd.setCursor(0,1);
lcd.print(F("Temp Agua: "));
lcd.print(temp);
delay (1000);
lcd.print('C');
lcd.setCursor(0,3);
switch (currentMode) {
case 0:
lcd.print(F("Iniciando"));
break;
case 1:
lcd.print(F("Llenando"));
break;
case 2:
lcd.print(F("Vaciando"));
break;
case 3:
lcd.print(F("Lavando ropa"));
break;
case 4:
lcd.print(F("10 minutos Prelavado"));
break;
case 5:
lcd.print(F("Suavizante"));
break;
case 6:
lcd.print(F("Centrifugado suave"));
break;
case 7:
lcd.print(F("Centrifugado fuerte"));
break;
}
}
void loop() {/*
int val=analogRead(A4);//Lee el valor del pin analogico y lo mantiene como val
int temp=Termistor(val);//Realiza la conversi�n del valor analogico a grados
Celsius

lcd.clear();
lcd.setCursor(0,1);
lcd.print(F("Temp Agua: "));
lcd.print(temp);
delay (1000);
lcd.print('C');
while (temp < 65) {//mientras no alcance la temperatura esta activado la
resistencia calentadora
de agua
digitalWrite(CalentadorAgua, ON);
delay(100);
temp=Termistor(val);//devuelve la temperatura
lcd.clear();
lcd.setCursor(0,1);
lcd.print(F("Temp Agua: "));
lcd.print(temp);
delay (1000);
lcd.print('C');
}
digitalWrite(CalentadorAgua, OFF);
*/
}

Vous aimerez peut-être aussi