domenica 25 marzo 2012

[Finito] Timer lavatrice con scelta del lavaggio

Con questo progetto si avrà un timer per la lavatrice.
Basta selezionare il tipo di lavaggio (cotone 60°, cotone 40°, etc etc) e l'ora in cui si desidera che la lavatrice finisca il lavaggio:

/*
Collegare lo schermo LCD nei pin 13,12,11,10,9,8 dell'arduino
 Collegare un button (per set orologio) nel pin 7
 Collegare il rotary encoder nei pin 2-3 e il button pin nel pin 4
 Collegare il modulo RTC:  SCL-->pin AN5   SDA-->pin AN4
 */
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,13,11,10,9,8);
int ora;
int minuti;
int oraA = 13;
int minutiA = 00;
int val;
int button2 = 7;
int encoder0PinA = 3;
int encoder0PinB = 2;
int encoder0Pos = 0;
int button = 4;
int encoder0PinALast = LOW;
int n = LOW;
int oraextra = 1;
boolean OldButtonState = false;
boolean NewButtonState = false;
boolean OldButtonState2 = false;
boolean NewButtonState2 = false;
char* lavo[]={"   Cotone 60'   ","   Cotone 40'   ","  Sintetici 60' ","  Sintetici 40' ","   Misti  40'   ","   Rapido 30'   ","  Delicati 40'  ","    Lana  30'   "};
int timelavoore[]={2, 2, 1, 1, 1, 0, 0, 0};
int timelavominuti[]={20, 5, 30, 20, 0, 30, 45, 40};
int lavaggio = 1;
int oraX;
int minutiX;

void setup()  {
  Serial.begin(9600);
  pinMode(7, INPUT);
  pinMode(4, INPUT);
  pinMode(3, INPUT);
  pinMode(2, INPUT);
  lcd.begin(16, 2);
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.println("  BUON  GIORNO  ");
  lcd.setCursor(0,1);
  lcd.println(" Wash-timer 1.0 ");
  delay(1500);
  lcd.clear();
  ora = RTC.get(DS1307_HR, true);
  minuti = RTC.get(DS1307_MIN, false);

}




void loop(){ 
  ora = RTC.get(DS1307_HR, true);
  minuti = RTC.get(DS1307_MIN, false);
  visualizza_ora();
  visualizza_allarme();
  if (ButtonPressed()){
    washtype();
    SetAlarm();
  }
  if (ButtonPressed2()){
    SetClock();
  }
 
  if (ora == oraX && minuti == minutiX){
    allarme();
    delay(1000);
    //fai partire il relè che attiverà la lavatrice
  }

}

void allarme(){
  lcd.setCursor(0,1);
  lcd.print(" Avvio lavatrice ");
  lcd.setCursor(0,0);
  lcd.print("                 ");
  delay(500);
  lcd.setCursor(0,0);
  lcd.print(" Avvio lavatrice ");
  lcd.setCursor(0,1);
  lcd.print("                 ");
  delay(500);
}


void visualizza_ora(){
  lcd.setCursor(0,0);
  lcd.print("  ");
  lcd.print("Orario ");
  if (ora <10){
    lcd.setCursor(9,0);
    lcd.print("0");
    lcd.print(ora);
  }
  else { 
    lcd.setCursor(9,0);
    lcd.print(ora);
  }

  lcd.setCursor(11,0);
  lcd.print(":");

  if (minuti <10){
    lcd.setCursor(12,0);
    lcd.print("0");
    lcd.print(minuti);
  }
  else { 
    lcd.setCursor(12,0);
    lcd.print(minuti);
  }

  lcd.print("  ");
}

void visualizza_allarme(){
  lcd.setCursor(0,1);
  lcd.print("Avvia alle:");
  if (oraX <10){
    lcd.setCursor(11,1);
    lcd.print("0");
    lcd.print(oraX);
  }
  else { 
    lcd.setCursor(11,1);
    lcd.print(oraX);
  }

  lcd.setCursor(13,1);
  lcd.print(":");

  if (minutiX <10){
    lcd.setCursor(14,1);
    lcd.print("0");
    lcd.print(minutiX);
  }
  else { 
    lcd.setCursor(14,1);
    lcd.print(minutiX);
  }
}



void SetAlarm(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" Fine lavaggio: ");
 
  while (!ButtonPressed()){
    setOraA();   
    lcd.setCursor(6,1);
    if (oraA < 10){
      lcd.setCursor(6,1);
      lcd.print("0");
      lcd.print(oraA);
    }
    else
    {
      lcd.setCursor(6,1);
      lcd.print(oraA);
    }
  }
  while (!ButtonPressed()){
    setMinutiA();
    lcd.setCursor(8,1);
    lcd.print(":");
    if (minutiA < 10){
      lcd.setCursor(9,1);
      lcd.print("0");
      lcd.print(minutiA);
    }
    else
    {
      lcd.setCursor(9,1);
      lcd.print(minutiA);
    }
  }
 
  minutiX = minutiA - timelavominuti[lavaggio];
  if(minutiX < 0){
    minutiX = 60 + (minutiA - timelavominuti[lavaggio]);
    oraextra = 1;
    } else {oraextra = 0;}
 
  oraX = oraA - timelavoore[lavaggio] - oraextra;
  if(oraX < 0){
   oraX = 23 + (oraA -timelavoore[lavaggio]);
  }
 
}


void SetClock(){

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Imposta l'orario");

  while (!ButtonPressed()){
    setOra();   
    lcd.setCursor(6,1);
    if (ora < 10){
      lcd.setCursor(6,1);
      lcd.print("0");
      lcd.print(ora);
    }
    else
    {
      lcd.setCursor(6,1);
      lcd.print(ora);
    }

  }

  while (!ButtonPressed()){
    setMinuti();

    lcd.setCursor(8,1);
    lcd.print(":");
    if (minuti < 10){
      lcd.setCursor(9,1);
      lcd.print("0");
      lcd.print(minuti);
    }
    else
    {
      lcd.setCursor(9,1);
      lcd.print(minuti);
    }
  }
  RTC.stop();
  RTC.set(DS1307_MIN, minuti);
  RTC.set(DS1307_HR,ora);     
  RTC.start();
}

void setOraA() {
  n = digitalRead(encoder0PinA);
  if ((encoder0PinALast == LOW) && (n == HIGH)) {
    if (digitalRead(encoder0PinB) == LOW) {
      oraA--;
      if (oraA < 0){
        oraA = 23;
      }
    }
    else {
      oraA++;
      if (oraA >= 24){
        oraA = 00;      
      }
    }
  }
  encoder0PinALast = n;
}

void setMinutiA() {
  n = digitalRead(encoder0PinA);
  if ((encoder0PinALast == LOW) && (n == HIGH)) {
    if (digitalRead(encoder0PinB) == LOW) {
      minutiA--;
      if (minutiA < 0){
        minutiA = 59;
      }
    }
    else {
      minutiA++;
      if (minutiA >= 59){
        minutiA = 00;      
      }
    }
  }
  encoder0PinALast = n;
}


void setOra() {
  n = digitalRead(encoder0PinA);
  if ((encoder0PinALast == LOW) && (n == HIGH)) {
    if (digitalRead(encoder0PinB) == LOW) {
      ora--;
      if (ora < 0){
        ora = 23;
      }
    }
    else {
      ora++;
      if (ora >= 24){
        ora = 00;      
      }
    }
    Serial.print ("Ora impostata: ");
    Serial.println (ora);
  }
  encoder0PinALast = n;
}

void setMinuti() {
  n = digitalRead(encoder0PinA);
  if ((encoder0PinALast == LOW) && (n == HIGH)) {
    if (digitalRead(encoder0PinB) == LOW) {
      minuti--;
      if (minuti < 0){
        minuti = 59;
      }
    }
    else {
      minuti++;
      if (minuti >= 59){
        minuti = 00;      
      }
    }
    Serial.print ("Minuti impostati: ");
    Serial.println (minuti);
  }
  encoder0PinALast = n;
}

boolean ButtonPressed() {
  boolean WasIt;
  NewButtonState = !digitalRead(button);
  if ((!OldButtonState) && (NewButtonState)) {
    WasIt = true;
  }
  else {
    WasIt = false;
  }
  OldButtonState = NewButtonState;
  return(WasIt);
}

boolean ButtonPressed2() {
  boolean WasIt2;  // as in, "Was It pressed?"
  NewButtonState2 = !digitalRead(button2);
  if ((!OldButtonState2) && (NewButtonState2)) {
    WasIt2 = true;
  }
  else {
    WasIt2 = false;
  }
  OldButtonState2 = NewButtonState2;
  return(WasIt2);
}














void washtype(){
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Scegli  lavaggio");
  while(!ButtonPressed()){
      menulavaggio();
      lcd.setCursor(0,1);
      lcd.print(lavo[lavaggio]);
     }
}
 
void menulavaggio() {
  n = digitalRead(encoder0PinA);
  if ((encoder0PinALast == LOW) && (n == HIGH)) {
    if (digitalRead(encoder0PinB) == LOW) {
      lavaggio--;
      if (lavaggio <0){
        lavaggio = 7;
      }
    }
    else {
      lavaggio++;
      if (lavaggio > 7){
        lavaggio = 0;      
      }
    }
  }
  encoder0PinALast = n;
}

Nessun commento:

Posta un commento