//lcd.begin(16, 2);
// lcd.backlight();
#include <Wire.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
#define numberOfSeconds(num) ((num/1000) % 60 )
#define numberOfMinutes(num) (((num/1000) / 60) % 60)
const int ZERO = 0;
const int UNO = 1;
const int DUE = 2;
const int TRE = 3;
const int QUATTRO = 4;
const int CINQUE = 5;
const int SEI = 6;
const int nuColonneLcd = 16;
const int nuRigheLcd = 2;
const int controlloMotoreDxPin = 4;
const int controlloMotoreSxPin = 5;
//************************************************************************************
int minuti;
int secondi;
unsigned long secondiDati;
unsigned long tempoLimite;
unsigned long tempoRimanente;
unsigned long startTime;
unsigned long stopTime;
//****************************************************************************************
#define su 7
#define giu 9
#define ok 6
#define stopPin 2
int enable1 = 3;
//const int selettorePulsantePin = 2;
//const int pulsanteSuPin = 7;
//const int pulsanteGiuPin = 1;
//const int sensoreBassoPin = A5;
//const int sensoreMedioPin = A4;
//const int sensoreAltoPin = A1;
//const int sensoreScaricoPin = A3;
int livelloAcquaSelezionato = UNO; // 0 - Basso, 1 - Medio, 2 - Alto
int tempoLavaggioSelezionato = UNO - 1; // In minuti
int tempoRisciacquoSelezionato = TRE - 1; // In minuti
boolean livelloAcquaRaggiunto = false;
Servo scaricoAcquaPin;
Servo servo2;
Servo ingressoAcquaPin;
//*********************************************************
// Menu
const char * menu_principale[5] = {"Programma1", "Scarico+Centrifuga", "Risciacquo", "Programma4", "Programma5" };
int posizione = 0; //1
//unsigned long posizione = 0;
//***************************************************************
void setup() {
Serial.begin(9600);
pinMode(su, INPUT);
pinMode(giu, INPUT);
pinMode(ok, INPUT);
pinMode(stopPin, INPUT);
// pinMode(sensoreBassoPin, INPUT);
// pinMode(sensoreMedioPin, INPUT);
// pinMode(sensoreAltoPin, INPUT);
// pinMode(sensoreScaricoPin, INPUT);
pinMode(controlloMotoreDxPin, OUTPUT);
pinMode(controlloMotoreSxPin, OUTPUT);
digitalWrite(enable1, LOW);
digitalWrite(controlloMotoreDxPin, LOW);
digitalWrite(controlloMotoreSxPin, LOW);
lcd.begin(nuColonneLcd, nuRigheLcd);
lcd.setBacklight(1);
scaricoAcquaPin.attach(A0);
servo2.attach(A1);
ingressoAcquaPin.attach(A2);
attachInterrupt(digitalPinToInterrupt(stopPin), stopCiclo, RISING);
//****************************************
lcd.print("Scelta Programma");
delay( 1000 );
lcd.clear();
lcd.print( menu_principale[posizione]);
delay( 2000 );
}
//************************************************//
void loop() {
lcd.setCursor(0, 1);
int psu = digitalRead( su );
int pgiu = digitalRead( giu );
int pok = digitalRead( ok );
if ( psu == HIGH || pgiu == HIGH || pok == HIGH)
{
if ( psu == HIGH )
{
posizione++;
lcd.clear();
}
if ( pgiu == HIGH )
{
posizione--;
lcd.clear();
}
if ( posizione >= 5 )
{
posizione = 0;
}
if ( posizione < 0 )
{
posizione = 4;
}
lcd.print( menu_principale[posizione] );
delay(200);
if ( pok == HIGH )
{
lcd.clear();
switch ( posizione )
{
case 0:
//attende avvio
lcd.clear();
delay(200);
lcd.print( menu_principale[0] );
programma1();
break;
case 1:
lcd.clear();
delay(200);
lcd.print( menu_principale[1] );
programma2();
break;
case 2:
lcd.clear();
delay(200);
lcd.print( menu_principale[2] );
programma3();
break;
case 3:
lcd.clear();
delay(200);
lcd.print( menu_principale[3] );
programma4();
break;
case 4:
lcd.clear();
delay(200);
lcd.print( menu_principale[4] );
programma5();
break;
}
}
}
}
//************************************************//
void programma1()
{
lcd.clear();
delay(1000);
scaricoAcqua();
livelloAcquaSelezionato = UNO ;
delay(1000);
caricoAcqua();
tempoLavaggioSelezionato = DUE ;
delay(500);
lavaggio();
delay(500);
scaricoAcqua();
livelloAcquaSelezionato = UNO ;
delay(1000);
caricoAcqua();
delay(500);
tempoLavaggioSelezionato = UNO ;
lavaggio();
delay(500);
scaricoAcqua();
delay(500);
centrifuga();
delay(500);
lcd.clear();
lcd.print("Lavaggio Finito");
}
//***************************************************
void programma2() {
lcd.clear();
scaricoAcqua();
delay(500);
centrifuga();
delay(500);
lcd.clear();
lcd.print("Lavaggio Finito");
delay(2000);
}
//***************************************************
void programma3() {
lcd.clear();
delay(500);
scaricoAcqua();
delay(500);
livelloAcquaSelezionato = UNO;
caricoAcqua();
delay(500);
tempoLavaggioSelezionato = UNO;
delay(500);
scaricoAcqua();
delay(500);
centrifuga();
delay(500);
lcd.clear();
lcd.print("Lavaggio Finito");
}
//***************************************************
void programma4() {
lcd.clear();
lcd.print( "Programma4 NO!" );
}
//**************************************************
void programma5() {
lcd.clear();
lcd.print( "Programma5 NO!" );
}
//************************************************//
void scaricoAcqua() {
lcd.clear();
startTime = millis();
scaricoAcquaPin.write(360);
secondiDati = 10;
lcd.setCursor(0, 0);
lcd.print("Scarico ");
lcd.print(secondiDati);
lcd.print(" Sec.");
tempoTrascorso();
scaricoAcquaPin.write(90);
livelloAcquaRaggiunto = false;
delay(200);
}
//*****************************************************
void caricoAcqua() {
lcd.clear();
startTime = millis();
ingressoAcquaPin.write(360);
if (livelloAcquaSelezionato == ZERO) {
secondiDati = 30;
}
if (livelloAcquaSelezionato == UNO) {
secondiDati = 60;
}
if (livelloAcquaSelezionato == DUE) {
secondiDati = 90;
}
lcd.setCursor(0, 0);
lcd.print("Acqua ");
lcd.print(secondiDati / 60);
lcd.print(" Min.");
tempoTrascorso();
ingressoAcquaPin.write(90);
livelloAcquaRaggiunto = true;
delay(200);
}
//************************************************
/* ingressoAcquaPin.write(360);
while (!livelloAcquaRaggiunto) {
// int sensoreBasso = digitalRead(sensoreBassoPin);
// int sensoreMedio = digitalRead(sensoreMedioPin);
// int sensoreAlto = digitalRead(sensoreAltoPin);
if ((livelloAcquaSelezionato == ZERO ) || //&& sensoreBasso == LOW
(livelloAcquaSelezionato == UNO ) || // && sensoreBasso == LOW && sensoreMedio == LOW
(livelloAcquaSelezionato == DUE )) // && sensoreBasso == LOW && sensoreMedio == LOW && sensoreAlto == LOW
{
livelloAcquaRaggiunto = true;
}
delay(5000);
}
ingressoAcquaPin.write(45);
delay(200);
}
*/
//*****************************************************
void lavaggio() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Lavaggio ");
//lcd.print(secondiDati);
lcd.print(tempoLavaggioSelezionato);
lcd.print(" Min.");
tempoLavaggio();
}
//**************************************************************
void centrifuga() {
lcd.clear();
startTime = millis();
scaricoAcquaPin.write(360);
motoreGiraSx();
secondiDati = 120;
lcd.setCursor(0, 0);
lcd.print("Centrifuga ");
lcd.print(secondiDati / 60);
lcd.print(" Min.");
tempoTrascorso();
motoreFermo();
scaricoAcquaPin.write(90);
livelloAcquaRaggiunto = false;
delay(1000);
}
//***************************************************
void motoreGiraSx() {
digitalWrite(enable1, HIGH);
digitalWrite(controlloMotoreSxPin, HIGH);
}
//*******************************************************
void motoreGiraDx() {
digitalWrite(enable1, HIGH);
digitalWrite(controlloMotoreDxPin, HIGH);
}
//****************************************************
void motoreFermo() {
digitalWrite(enable1, LOW);
digitalWrite(controlloMotoreSxPin, LOW);
digitalWrite(controlloMotoreDxPin, LOW);
}
//******************************************************
void tempoTrascorso () {
tempoLimite = secondiDati * 1000 ;
tempoRimanente = tempoLimite - millis() + startTime ;
while (tempoRimanente > 0)
{
secondi = numberOfSeconds(tempoRimanente);
minuti = numberOfMinutes(tempoRimanente);
lcd.setCursor(0, 1);
lcd.print(minuti);
lcd.print (" min. ");
lcd.print (secondi);
lcd.print (" sec. ");
// delay(1000);
tempoRimanente = tempoLimite - millis() + startTime ;
if (tempoRimanente <= 1000)
{
tempoRimanente = 0;
}
}
}
//***********************************************************
void tempoLavaggio() {
for (int tempoCicloRimanente = tempoLavaggioSelezionato;
tempoCicloRimanente > ZERO; tempoCicloRimanente--) {
startTime = millis();
secondiDati = 60;
tempoLimite = secondiDati * 1000 ;
tempoRimanente = tempoLimite - millis() + startTime;
while (tempoRimanente > 0) {
secondi = numberOfSeconds(tempoRimanente);
minuti = numberOfMinutes(tempoRimanente);
lcd.setCursor(0, 1);
lcd.print(minuti + (tempoCicloRimanente - 1));
lcd.print(" min. ");
lcd.print(secondi);
lcd.print(" sec. ");
if (tempoRimanente <= 60000 && tempoRimanente >= 52000) {
motoreGiraSx();
}
if (tempoRimanente <= 52000 && tempoRimanente >= 45000) {
motoreFermo();
}
if (tempoRimanente <= 45000 && tempoRimanente >= 37000) {
motoreGiraDx();
}
if (tempoRimanente <= 37000 && tempoRimanente >= 30000) {
motoreFermo();
}
if (tempoRimanente <= 30000 && tempoRimanente >= 22000) {
motoreGiraSx();
}
if (tempoRimanente <= 22000 && tempoRimanente >= 15000) {
motoreFermo();
}
if (tempoRimanente <= 15000 && tempoRimanente >= 7000) {
motoreGiraDx();
}
if (tempoRimanente <= 7000 && tempoRimanente >= 0) {
motoreFermo();
}
tempoRimanente = tempoLimite - millis() + startTime;
if (tempoRimanente <= 1000) {
tempoRimanente = 0;
}
}
}
}
void stopCiclo() {
// chiama la funzione che blocca
stopFase() ;
}
void stopFase() {
while (true) // ciclo infinito
if (digitalRead(ok) == HIGH)
{
break; // esce dal ciclo se si preme il pulsante
}
delay(300);
Serial.println("STOP!");
Serial.print("arriva da: ");
Serial.println(posizione);
}
/*
delay(50);
lcd.clear();
startTime = millis();
stopTime = startTime;
tempoLimite = 20 * 1000 ;
tempoRimanente = tempoLimite - ( stopTime - startTime) ;
while (tempoRimanente > 0)
{
secondi = numberOfSeconds(tempoRimanente);
minuti = numberOfMinutes(tempoRimanente);
lcd.setCursor(0, 0);
lcd.print("PAUSA");
lcd.setCursor(0, 1);
lcd.print(minuti);
lcd.print (" min. ");
lcd.print (secondi);
lcd.print (" sec. ");
Serial.print("PAUSA ");
Serial.print(minuti);
Serial.print (" min. ");
Serial.print (secondi);
Serial.println (" sec. ");
// delay(1000);
tempoRimanente = tempoLimite - stopTime + startTime ;
// stopTime = stopTime ;
if (tempoRimanente <= 1000)
{
tempoRimanente = 0;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(minuti);
lcd.print("Fine pausa");
Serial.println ("Fine pausa");
}
}
}
}
//********************************************************************
*/
/*
#include <Wire.h>
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // set the LCD address to 0x27 for a 16 chars and 2 line display
#define numberOfSeconds(num) ((num/1000) % 60 )
#define numberOfMinutes(num) (((num/1000) / 60) % 60)
const char lavaggioStr[] = "Lavaggio";
const char risciacquoStr[] = "Risciacquo";
const char acquaStr[] = "Acqua";
const char livelloStr[] = "Livello";
const char bassoStr[] = "Basso";
const char medioStr[] = "Medio";
const char altoStr[] = "Alto";
const char minStr[] = "min";
const char caricoStr[] = "Carico";
const char scaricoStr[] = "Scarico";
const char centrifugaStr[] = "Centrifuga";
const char avvioProgrammaStr[] = "Avvio Programma:";
const char fineStr[] = "Finito";
const char colonnaStr[] = ":";
const char spazioStr[] = " ";
const int ZERO = 0;
const int UNO = 1;
const int DUE = 2;
const int TRE = 3;
const int QUATTRO = 4;
const int CINQUE = 5;
const int SEI = 6;
const int nuColonneLcd = 16;
const int nuRigheLcd = 2;
const int controlloMotoreDxPin = 4;
const int controlloMotoreSxPin = 5;
//************************************************************************************
int minuti;
int secondi;
unsigned long secondiDati;
unsigned long tempoLimite;
unsigned long tempoRimanente;
unsigned long startTime;
//****************************************************************************************
#define su 2
#define giu 1
#define ok 6
int enable1 = 3;
//const int selettorePulsantePin = 2;
//const int pulsanteSuPin = 7;
//const int pulsanteGiuPin = 1;
//const int sensoreBassoPin = A5;
//const int sensoreMedioPin = A4;
//const int sensoreAltoPin = A1;
//const int sensoreScaricoPin = A3;
int livelloAcquaSelezionato = UNO; // 0 - Basso, 1 - Medio, 2 - Alto
int tempoLavaggioSelezionato = UNO - 1; // In minuti
int tempoRisciacquoSelezionato = TRE - 1; // In minuti
boolean livelloAcquaRaggiunto = false;
Servo scaricoAcquaPin;
Servo servo2;
Servo ingressoAcquaPin;
// Menu
const char * menu_principale[5] = {"Programma1", "Scarico+Centrifuga", "Risciacquo", "Programma4", "Programma5"};
int posizione = 0; //1
//*********************************************************
void setup()
{
lcd.begin(16, 2);
lcd.backlight();
pinMode(su, INPUT);
pinMode(giu, INPUT);
pinMode(ok, INPUT);
// pinMode(sensoreBassoPin, INPUT);
// pinMode(sensoreMedioPin, INPUT);
// pinMode(sensoreAltoPin, INPUT);
// pinMode(sensoreScaricoPin, INPUT);
pinMode(controlloMotoreDxPin, OUTPUT);
pinMode(controlloMotoreSxPin, OUTPUT);
digitalWrite(enable1, LOW);
digitalWrite(controlloMotoreDxPin, LOW);
digitalWrite(controlloMotoreSxPin, LOW);
lcd.begin(nuColonneLcd, nuRigheLcd);
scaricoAcquaPin.attach(A0);
servo2.attach(A1);
ingressoAcquaPin.attach(A2);
//****************************************
lcd.print("Scelta Programma");
delay( 1000 );
lcd.clear();
lcd.print( menu_principale[posizione]);
delay( 2000 );
}
//************************************************
void loop()
{
lcd.setCursor(0, 1);
int psu = digitalRead( su );
int pgiu = digitalRead( giu );
int pok = digitalRead( ok );
if ( psu == HIGH || pgiu == HIGH || pok == HIGH)
{
if ( psu == HIGH )
{
posizione++;
lcd.clear();
}
if ( pgiu == HIGH )
{
posizione--;
lcd.clear();
}
if ( posizione >= 5 )
{
posizione = 0;
}
if ( posizione < 0 )
{
posizione = 4;
}
lcd.print( menu_principale[posizione] );
delay(200);
if ( pok == HIGH )
{
lcd.clear();
switch ( posizione )
{
case 0:
lcd.clear();
delay(200);
lcd.print( menu_principale[0] );
programma1();
break;
case 1:
lcd.clear();
delay(200);
lcd.print( menu_principale[1] );
programma2();
break;
case 2:
lcd.clear();
delay(200);
lcd.print( menu_principale[2] );
programma3();
break;
case 3:
lcd.clear();
delay(200);
lcd.print( menu_principale[3] );
programma4();
break;
case 4:
lcd.clear();
delay(200);
lcd.print( menu_principale[4] );
programma5();
break;
}
}
}
}
//************************************************
void programma1()
{
lcd.clear();
delay(1000);
scaricoAcqua();
livelloAcquaSelezionato = UNO ;
delay(1000);
caricoAcqua();
tempoLavaggioSelezionato = DUE ;
delay(500);
lavaggio();
delay(500);
scaricoAcqua();
livelloAcquaSelezionato = UNO ;
delay(1000);
caricoAcqua();
delay(500);
tempoLavaggioSelezionato = UNO ;
lavaggio();
delay(500);
scaricoAcqua();
delay(500);
centrifuga();
delay(500);
lcd.clear();
lcd.print("Lavaggio Finito");
}
//***************************************************
void programma2()
{
lcd.clear();
scaricoAcqua();
delay(500);
centrifuga();
delay(500);
lcd.clear();
lcd.print("Lavaggio Finito");
delay(2000);
}
//***************************************************
void programma3()
{
lcd.clear();
delay(500);
scaricoAcqua();
delay(500);
livelloAcquaSelezionato = UNO ;
caricoAcqua();
delay(500);
tempoRisciacquoSelezionato = UNO ;
scaricoAcqua();
delay(500);
centrifuga();
delay(500);
lcd.clear();
lcd.print("Lavaggio Finito");
}
//*************************************************************
void programma4()
{
lcd.clear();
lcd.print( "Programma4 NO!" );
}
//*************************************************************
void programma5()
{
lcd.clear();
lcd.print( "Programma5 NO!" );
}
//************************************************************
void scaricoAcqua()
{
lcd.clear();
startTime = millis ();
scaricoAcquaPin.write(360);
secondiDati = 10;
lcd.setCursor(0, 0);
lcd.print("Scarico ");
lcd.print(secondiDati);
lcd.print(" Sec.");
tempoTrascorso();
scaricoAcquaPin.write(90);
livelloAcquaRaggiunto = false;
delay(200);
}
//************************************************
void caricoAcqua()
{
lcd.clear();
startTime = millis ();
ingressoAcquaPin.write(360);
if (livelloAcquaSelezionato == ZERO )
{
secondiDati = 30;
}
if (livelloAcquaSelezionato == UNO )
{
secondiDati = 60;
}
if (livelloAcquaSelezionato == DUE )
{
secondiDati = 90;
}
lcd.setCursor(0, 0);
lcd.print("Acqua ");
lcd.print(secondiDati / 60);
lcd.print(" Min.");
tempoTrascorso();
ingressoAcquaPin.write(90);
livelloAcquaRaggiunto = true;
delay(200);
}
//*******************************************************
void lavaggio()
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Lavaggio ");
//lcd.print(secondiDati);
lcd.print(tempoLavaggioSelezionato);
lcd.print(" Min.");
tempoLavaggio();
}
//**************************************************************
void centrifuga()
{
lcd.clear();
startTime = millis ();
scaricoAcquaPin.write(360);
motoreGiraSx();
secondiDati = 120;
lcd.setCursor(0, 0);
lcd.print("Centrifuga ");
lcd.print(secondiDati / 60);
lcd.print(" Min.");
tempoTrascorso();
motoreFermo();
scaricoAcquaPin.write(90);
livelloAcquaRaggiunto = false;
delay(1000);
}
//************************************************
/* ingressoAcquaPin.write(360);
while (!livelloAcquaRaggiunto) {
// int sensoreBasso = digitalRead(sensoreBassoPin);
// int sensoreMedio = digitalRead(sensoreMedioPin);
// int sensoreAlto = digitalRead(sensoreAltoPin);
if ((livelloAcquaSelezionato == ZERO ) || //&& sensoreBasso == LOW
(livelloAcquaSelezionato == UNO ) || // && sensoreBasso == LOW && sensoreMedio == LOW
(livelloAcquaSelezionato == DUE )) // && sensoreBasso == LOW && sensoreMedio == LOW && sensoreAlto == LOW
{
livelloAcquaRaggiunto = true;
}
delay(5000);
}
ingressoAcquaPin.write(45);
delay(200);
}
*/
/*
void motoreGiraSx() {
digitalWrite(enable1, HIGH);
digitalWrite(controlloMotoreSxPin, HIGH);
}
void motoreGiraDx() {
digitalWrite(enable1, HIGH);
digitalWrite(controlloMotoreDxPin, HIGH);
}
void motoreFermo() {
digitalWrite(enable1, LOW);
digitalWrite(controlloMotoreSxPin, LOW);
digitalWrite(controlloMotoreDxPin, LOW);
}
void tempoTrascorso ()
{
tempoLimite = secondiDati * 1000;
tempoRimanente = tempoLimite - millis() + startTime ;
while (tempoRimanente > 0)
{
secondi = numberOfSeconds(tempoRimanente);
minuti = numberOfMinutes(tempoRimanente);
lcd.setCursor(0, 1);
lcd.print(minuti);
lcd.print (" min. ");
lcd.print (secondi);
lcd.print (" sec. ");
// delay(1000);
tempoRimanente = tempoLimite - millis() + startTime ;
if (tempoRimanente <= 1000)
{
tempoRimanente = 0;
}
}
}
//***************************************************************
void tempoLavaggio()
{
for (int tempoCicloRimanente = tempoLavaggioSelezionato;
tempoCicloRimanente > ZERO; tempoCicloRimanente--)
{
startTime = millis ();
secondiDati = 60;
tempoLimite = secondiDati * 1000;
tempoRimanente = tempoLimite - millis() + startTime;
while (tempoRimanente > 0)
{
secondi = numberOfSeconds(tempoRimanente);
minuti = numberOfMinutes(tempoRimanente);
lcd.setCursor(0, 1);
lcd.print(minuti + (tempoCicloRimanente - 1));
lcd.print (" min. ");
lcd.print (secondi);
lcd.print (" sec. ");
// delay(1000);
if (tempoRimanente <= 60000 && tempoRimanente >= 52000 )
{
motoreGiraSx();
}
if (tempoRimanente <= 52000 && tempoRimanente >= 50000)
{
motoreFermo();
}
if (tempoRimanente <= 50000 && tempoRimanente >= 42000 )
{
motoreGiraDx();
}
if (tempoRimanente <= 42000 && tempoRimanente >= 40000)
{
motoreFermo();
}
if (tempoRimanente <= 40000 && tempoRimanente >= 32000 )
{
motoreGiraSx();
}
if (tempoRimanente <= 32000 && tempoRimanente >= 30000)
{
motoreFermo();
}
if (tempoRimanente <= 30000 && tempoRimanente >= 22000 )
{
motoreGiraDx();
}
if (tempoRimanente <= 22000 && tempoRimanente >= 20000)
{
motoreFermo();
}
if (tempoRimanente <= 20000 && tempoRimanente >= 12000 )
{
motoreGiraSx();
}
if (tempoRimanente <= 12000 && tempoRimanente >= 10000)
{
motoreFermo();
}
if (tempoRimanente <= 10000 && tempoRimanente >= 2000 )
{
motoreGiraDx();
}
if (tempoRimanente <= 2000 && tempoRimanente >= 0)
{
motoreFermo();
}
tempoRimanente = tempoLimite - millis() + startTime;
if (tempoRimanente <= 1000)
{
tempoRimanente = 0;
}
}
}
}
//***************************************************************
*/