Lavarropas
Lavarropas
#include <math.h> // Needed for the logarithmic NTC thermistor temp sensor
#include <LiquidCrystal.h> // For the 4x20 LCD status screen
#include <Wire.h> // Used for the I2C RTC chip
#include "Chronodot.h" // Used to fetch and decode the RTC data
#define ventPin 7
#define soapDispensor 6
#define waterInlet 5
#define drainPin 4
#define washMotor 3
#define heaterPin 2
#define goButton A1
#define tempSensor A2
#define goLight 0
#define stopLight 1
#define stopButton A3
#define tiltSensor A0
void setup () {
for (int i=0; i<25; i++) tempArray[i]=70; // Fill the temperature array with
sane numbers.
Wire.begin(); // Used for the RTC
RTC.begin(); // Likewise
lcd.begin(20,4); // 4x20 LCD Panel
pinMode(tempSensor, INPUT);
pinMode(ventPin, OUTPUT);
pinMode(soapDispensor, OUTPUT);
pinMode(waterInlet, OUTPUT);
pinMode(drainPin, OUTPUT);
pinMode(washMotor, OUTPUT);
pinMode(heaterPin, OUTPUT);
pinMode(goButton, INPUT);
digitalWrite(goButton, HIGH); // activate internal pull-up resistor for this
input pin
pinMode(stopButton, INPUT);
pinMode(tiltSensor, INPUT);
digitalWrite(stopButton, HIGH);
digitalWrite(tiltSensor, HIGH);
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
}
void fillItUp() {
unsigned long fillTime = millis();
digitalWrite(waterInlet, HIGH);
while ((millis() - fillTime) < 105000) { // 1 minute, 45 seconds to fill the
dishwasher
delay(100);
updateRuntimeDisplay(1);
}
digitalWrite(waterInlet, LOW);
delay(100);
lcd.begin(20,4);
lcd.clear();
}
void drainItOut() {
unsigned long drainTime = millis();
digitalWrite(drainPin, HIGH);
delay(500);
lcd.begin(20,4);
lcd.clear();
while ((millis() - drainTime) < 105000) { // Usually empty in 1:30, but give it
a little extra time.
delay(100);
updateRuntimeDisplay(2);
}
digitalWrite(drainPin, LOW);
delay(100);
lcd.begin(20,4);
lcd.clear();
}
void tiltRoutine() {
long doorOpened = millis();
while (digitalRead(tiltSensor)) {
if ((millis()-doorOpened) > 120000) {
lcd.setCursor(0,3);
lcd.print(" ");
}
}
}
void ventDry() {
digitalWrite(ventPin, HIGH);
while (waterTemp() > 115) {
delay(1000);
updateRuntimeDisplay(6);
}
digitalWrite(ventPin, LOW);
}
void preRinse() {
unsigned long rinseTime = millis();
digitalWrite(washMotor, HIGH);
delay(500);
lcd.begin(20,4);
lcd.clear();
while ((millis() - rinseTime) < 600000) { // 60000 is 1 minute, 600000 should be
10.
updateRuntimeDisplay(4);
delay(1000);
}
digitalWrite(washMotor, LOW);
delay(100);
lcd.begin(20,4);
lcd.clear();
}
void finalRinse() {
unsigned long rinseTime = millis();
digitalWrite(heaterPin, HIGH);
digitalWrite(washMotor, HIGH);
digitalWrite(soapDispensor, HIGH); // It's not soap on the rinse cycle, it's that
"JetDry" stuff coming out.
delay(500);
lcd.begin(20,4);
lcd.clear();
while ((millis() - rinseTime) < 30000) { // run dispensor motor for 30 seconds
updateRuntimeDisplay(5);
delay(500);
}
digitalWrite(soapDispensor, LOW);
while (waterTemp() < 140) {
delay(1000);
updateRuntimeDisplay(5);
}
digitalWrite(heaterPin, LOW);
delay(5000);
digitalWrite(washMotor, LOW);
delay(100);
lcd.begin(20,4);
lcd.clear();
}
void washTheDishes() {
digitalWrite(heaterPin, HIGH);
digitalWrite(washMotor, HIGH);
delay(1500);
lcd.begin(20,4); // The display seems to wig out when the motor kicks in
lcd.clear(); // so I added an extra delay and reinitialize it here.
Untested.
while (waterTemp() < 120) { // Soap doesn't work well below 120f
updateRuntimeDisplay(3);
delay(1000);
}
unsigned long soapTime = millis();
digitalWrite(soapDispensor, HIGH);
while ((millis() - soapTime) < 30000) {
delay(500);
updateRuntimeDisplay(3);
}
digitalWrite(soapDispensor, LOW);
while (waterTemp() < 156) {
delay(1000);
updateRuntimeDisplay(3);
}
digitalWrite(heaterPin, LOW);
delay(5000);
digitalWrite(washMotor, LOW);
delay(100);
lcd.begin(20,4);
lcd.clear();
}
void loop() {
// drainItOut();
lcd.setCursor(0,0);
lcd.print(F("Today is: "));
digitalWrite(0, HIGH);
digitalWrite(1, HIGH);
while ((digitalRead(goButton))) { // Display Date/Time until button is pressed
if (!digitalRead(stopButton)) drainItOut();
if (digitalRead(tiltSensor)) {
tiltRoutine();
}