Go Down

Topic: Finito lavatrice. guardate il codice (Read 697 times) previous topic - next topic

cerozziello88

salve a tutti, qlkuno saprà dai miei post precedenti ke stavo cercando di automatizzare una lavatrice qst è il risultato, se possibile mi date qlke consiglio logico-strutturale per migliorarlo?
lo switch case è usato per la selezione di 6 diversi programmi di lavaggio.
grazie
Code: [Select]

//Uscite comandate con relè
#define giradx 11      
#define girasx 12
#define carico 13
#define scarico 10
#define centrifuga 9
#define acquacalda 8
//ENTRATE DIGITALI
#define sveglia 3
#define livelloalto 7
#define livellobasso 6
#define okacquacalda 5
#define programma1 14
#define programma2 15
#define programma3 16
#define programma4 17
#define programma5 18
#define programma6 19
int statolivellobasso=0;
int statolivelloalto=0;
int permessocentrifuga=0;
int permessoacquacalda=0;
int selettore=0;
int statosveglia=0;
void setup() {      
///DEFINIZIONE NOMI DEI PIN  
  attachInterrupt(1, blink, FALLING);
 pinMode(giradx, OUTPUT);
 pinMode(girasx, OUTPUT);
 pinMode(carico, OUTPUT);
 pinMode(scarico, OUTPUT);
 pinMode(centrifuga, OUTPUT);
 pinMode(acquacalda, OUTPUT);
 pinMode(livellobasso, INPUT);
 pinMode(livelloalto, INPUT);
 pinMode(okacquacalda,INPUT);
 pinMode(programma1,INPUT);
 pinMode(programma2,INPUT);
 pinMode(programma3,INPUT);
pinMode(programma4,INPUT);
pinMode(programma5,INPUT);
pinMode(programma6,INPUT);
}
void loop() {
 int programmaselezionato=0;
 selettore=0;
 programmaselezionato =      selezioneprogramma();

 // questo swich-case mi permette la selezione del programma da dare, ma se con break esco dallo switch ritorno alla funzione che seleziona il programma da fare
   switch (programmaselezionato) {    
     
//PRELAVAGGIO//
      case 1:
   do {
     digitalWrite(carico, HIGH);
     statolivellobasso=digitalRead(livellobasso);
   }  
   while (statolivellobasso==  HIGH);
   digitalWrite(carico, LOW);
   lavaggio_un_minuto();
   do {
     digitalWrite(acquacalda, HIGH);
     permessoacquacalda=digitalRead(okacquacalda);
   }  
   while (permessoacquacalda ==  HIGH);
   digitalWrite(acquacalda,LOW);
   for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
     lavaggio_un_minuto();
   }
   do {
     digitalWrite(acquacalda, HIGH);
     permessoacquacalda=digitalRead(okacquacalda);
   }  
   while (permessoacquacalda ==  HIGH);
   digitalWrite(acquacalda,LOW);
       for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
     lavaggio_un_minuto();
   }
   do {
     digitalWrite(acquacalda, HIGH);
     permessoacquacalda=digitalRead(okacquacalda);
   }  
   while (permessoacquacalda ==  HIGH);
   digitalWrite(acquacalda,LOW);
       for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
     lavaggio_un_minuto();
   }
   do {
     digitalWrite(acquacalda, HIGH);
     permessoacquacalda=digitalRead(okacquacalda);
   }  
   while (permessoacquacalda ==  HIGH);
   digitalWrite(acquacalda,LOW);
   for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
     lavaggio_un_minuto();
   }
   scaricoacqua();
   digitalWrite (scarico,LOW);
   delay(10000);
   break;
//PROGRAMMA 2//
     case 2:
   do {
     digitalWrite(carico, HIGH);
     statolivellobasso=digitalRead(livellobasso);
   }  
   while (statolivellobasso==  HIGH);
   digitalWrite(carico, LOW);
   lavaggio_un_minuto();
   do {
     digitalWrite(acquacalda, HIGH);
     permessoacquacalda=digitalRead(okacquacalda);
   }  
   while (permessoacquacalda ==  HIGH);
   digitalWrite(acquacalda,LOW);
   for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
     lavaggio_un_minuto();
   }
       do {
     digitalWrite(acquacalda, HIGH);
     permessoacquacalda=digitalRead(okacquacalda);
   }  
   while (permessoacquacalda ==  HIGH);
   digitalWrite(acquacalda,LOW);
   for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
     lavaggio_un_minuto();
   }
           do {
     digitalWrite(acquacalda, HIGH);
     permessoacquacalda=digitalRead(okacquacalda);
   }  
   while (permessoacquacalda ==  HIGH);
   digitalWrite(acquacalda,LOW);
   for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
     lavaggio_un_minuto();
   }
              do {
     digitalWrite(acquacalda, HIGH);
     permessoacquacalda=digitalRead(okacquacalda);
   }  
   while (permessoacquacalda ==  HIGH);
   digitalWrite(acquacalda,LOW);
   for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
     lavaggio_un_minuto();
   }

           do {
     digitalWrite(acquacalda, HIGH);
     permessoacquacalda=digitalRead(okacquacalda);
   }  
   while (permessoacquacalda ==  HIGH);
   digitalWrite(acquacalda,LOW);
   for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
     lavaggio_un_minuto();
   }
   
           do {
     digitalWrite(acquacalda, HIGH);
     permessoacquacalda=digitalRead(okacquacalda);
   }  
   while (permessoacquacalda ==  HIGH);
   digitalWrite(acquacalda,LOW);
   for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
     lavaggio_un_minuto();
   }
           do {
     digitalWrite(acquacalda, HIGH);
     permessoacquacalda=digitalRead(okacquacalda);
   }  
   while (permessoacquacalda ==  HIGH);
   digitalWrite(acquacalda,LOW);
   for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
     lavaggio_un_minuto();
   }
scaricoacqua();
centrifuga_un_minuto();
   do {
     digitalWrite(carico, HIGH);
     statolivelloalto=digitalRead(livelloalto);
   }  
   while (statolivelloalto==  HIGH);
   digitalWrite(carico, LOW);
   for (int contatorelavaggi=0; contatorelavaggi <= 2; contatorelavaggi++){
     lavaggio_un_minuto();
   }
    scaricoacqua();
centrifuga_un_minuto();
   do {
     digitalWrite(carico, HIGH);
     statolivelloalto=digitalRead(livelloalto);
   }  
   while (statolivelloalto==  HIGH);
   digitalWrite(carico, LOW);
   for (int contatorelavaggi=0; contatorelavaggi <= 2; contatorelavaggi++){
     lavaggio_un_minuto();
   }
    scaricoacqua();
centrifuga_un_minuto();
   do {
     digitalWrite(carico, HIGH);
     statolivelloalto=digitalRead(livelloalto);
   }  
   while (statolivelloalto==  HIGH);
   digitalWrite(carico, LOW);
   for (int contatorelavaggi=0; contatorelavaggi <= 2; contatorelavaggi++){
     lavaggio_un_minuto();
   }
    scaricoacqua();
    centrifuga_quattro_minuti();
    delay(10000);
    break;


cerozziello88

Code: [Select]
[code]case 3:
do {
      digitalWrite(carico, HIGH);
      statolivellobasso=digitalRead(livellobasso);
    } 
    while (statolivellobasso==  HIGH);
    digitalWrite(carico, LOW);
    lavaggio_un_minuto();
    do {
      digitalWrite(acquacalda, HIGH);
      permessoacquacalda=digitalRead(okacquacalda);
    } 
    while (permessoacquacalda ==  HIGH);
    digitalWrite(acquacalda,LOW);
    for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
      lavaggio_un_minuto();
    }
        do {
      digitalWrite(acquacalda, HIGH);
      permessoacquacalda=digitalRead(okacquacalda);
    } 
    while (permessoacquacalda ==  HIGH);
    digitalWrite(acquacalda,LOW);
    for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
      lavaggio_un_minuto();
    }
            do {
      digitalWrite(acquacalda, HIGH);
      permessoacquacalda=digitalRead(okacquacalda);
    } 
    while (permessoacquacalda ==  HIGH);
    digitalWrite(acquacalda,LOW);
    for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
      lavaggio_un_minuto();
    }
             
scaricoacqua();
centrifuga_un_minuto();
    do {
      digitalWrite(carico, HIGH);
      statolivelloalto=digitalRead(livelloalto);
    } 
    while (statolivelloalto==  HIGH);
    digitalWrite(carico, LOW);
    for (int contatorelavaggi=0; contatorelavaggi <= 2; contatorelavaggi++){
      lavaggio_un_minuto();
    }
     scaricoacqua();
centrifuga_un_minuto();
    do {
      digitalWrite(carico, HIGH);
      statolivelloalto=digitalRead(livelloalto);
    } 
    while (statolivelloalto==  HIGH);
    digitalWrite(carico, LOW);
    for (int contatorelavaggi=0; contatorelavaggi <= 2; contatorelavaggi++){
      lavaggio_un_minuto();
    }
     scaricoacqua();
     centrifuga_quattro_minuti();
delay(10000);
break;
////
case 4:
    do {
      digitalWrite(carico, HIGH);
      statolivellobasso=digitalRead(livellobasso);
    } 
    while (statolivellobasso==  HIGH);
    digitalWrite(carico, LOW);
    lavaggio_un_minuto();
    do {
      digitalWrite(acquacalda, HIGH);
      permessoacquacalda=digitalRead(okacquacalda);
    } 
    while (permessoacquacalda ==  HIGH);
    digitalWrite(acquacalda,LOW);
    for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
      lavaggiolana();
    }
    do {
      digitalWrite(acquacalda, HIGH);
      permessoacquacalda=digitalRead(okacquacalda);
    } 
    while (permessoacquacalda ==  HIGH);
    digitalWrite(acquacalda,LOW);
    for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
      lavaggiolana();
    }
scaricolana();
centrifuga_lana_un_minuto();

    do {
      digitalWrite(carico, HIGH);
      statolivelloalto=digitalRead(livelloalto);
    } 
    while (statolivelloalto==  HIGH);
    digitalWrite(carico, LOW);
lavaggiolana();
scaricolana();
centrifuga_lana_otto_minuti();
delay(10000);
break;

     
     
     /////////////////////////////////LAVAGGIO 4////////////////////////////////////////////////////////
  case 5:
    do {
      digitalWrite(carico, HIGH);
      statolivellobasso=digitalRead(livellobasso);
    } 
    while (statolivellobasso==  HIGH);
    digitalWrite(carico, LOW);
    lavaggio_un_minuto();
    do {
      digitalWrite(acquacalda, HIGH);
      permessoacquacalda=digitalRead(okacquacalda);
    } 
    while (permessoacquacalda ==  HIGH);
    digitalWrite(acquacalda,LOW);
    for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
      lavaggiolana();
    }
    do {
      digitalWrite(acquacalda, HIGH);
      permessoacquacalda=digitalRead(okacquacalda);
    } 
    while (permessoacquacalda ==  HIGH);
    digitalWrite(acquacalda,LOW);
    for (int contatorelavaggi=0; contatorelavaggi <= 1; contatorelavaggi++){
      lavaggiolana();
    }
scaricolana();
centrifuga_lana_un_minuto();
    do {
      digitalWrite(carico, HIGH);
      statolivelloalto=digitalRead(livelloalto);
    } 
    while (statolivelloalto==  HIGH);
    digitalWrite(carico, LOW);
lavaggiolana();
scaricolana();
centrifuga_lana_un_minuto();
    do {
      digitalWrite(carico, HIGH);
      statolivelloalto=digitalRead(livelloalto);
    } 
    while (statolivelloalto==  HIGH);
    digitalWrite(carico, LOW);
lavaggiolana();
scaricolana();
centrifuga_lana_otto_minuti();
delay(10000);
break;

case 6:
scaricoacqua_un_minuto();
centrifuga_quattro_minuti();
delay(10000);
break;
}
}
[/code]

cerozziello88

per fare livellobasso, livelloalto e acquacalda, ho passato il filo che va all'arduino su quel pin per i  2 pressostati  e per il termostato, come se fosse un interruttore con la relativa resistenza di pull.

mromani

#3
Feb 13, 2012, 12:16 am Last Edit: Feb 14, 2012, 12:04 pm by mromani Reason: 1
Ciao, ho scorso velocemente il tuo codice, e i miei 2 cent di consigli "logico-strutturali" si concretizzano in:
- il codice è poco leggibile, premi CTRL-T nell'IDE per migliorare l'indentazione
- lo switch/case è decisamente troppo "lungo" IMHO: raggruppa le istruzioni di ogni case in una funzione. Alla fine il risultato è una cosa simile a questa:

Code: [Select]

switch ( programma ) {
    case 1:
        programma1();
        break;

    case 2:
        programma2();
        break;
}


In questo modo la struttura del programma principale è più chiara.

Infine è prassi scrivere i nomi delle costanti in maiuscolo, per distinguerle dalle variaibli.

cerozziello88

Grazie gentilissimo per i consigli!! comincerò da queste modifiche.
i  do while vanno bene?

mromani

Prego :-)

In merito ai do/while non posso darti una risposta definitiva perché non conosco il circuito.
Una cosa che mi viene in mente leggendo frammenti come questo

Code: [Select]

do {
    digitalWrite(acquacalda, HIGH);
    permessoacquacalda=digitalRead(okacquacalda);

while (permessoacquacalda ==  HIGH);
digitalWrite(acquacalda,LOW);


è che la chiamata digitalWrite(acquacalda, HIGH) può essere spostata fuori dal ciclo, appena prima del do{}, perché impostare ripetutamente un pin sempre allo stesso valore non ha molto senso, anche se non è scorretto.

cerozziello88

visto ke quei digitalwrite comandano dei relè , cosa mi consigli di metterli fuori al "do" allora?
qlla ke hai preso come esempio attiva il relè acquacalda, poi legge il pin collegato al termostato e esce dal ciclo fin quando il termostato non stacca.

mromani

Quote
visto ke quei digitalwrite comandano dei relè , cosa mi consigli di metterli fuori al "do" allora?


Premesso che non ho assolutamente capito cosa vuol dire questa domanda, come ti ho detto non conosco il circuito, quindi mi sono limitato ad una considerazione di tipo astratto: una volta settato un pin HIGH, non cambierà stato fino al prossimo digitalWrite(pin, LOW), quindi non è necessario ri-eseguire ditigalWrite(pin, HIGH) ogni volta.

Michele Menniti

Intanto mi permetto di consigliarti di rivedere la forma della frase
Quote
visto ke quei digitalwrite comandano dei relè , cosa mi consigli di metterli fuori al "do" allora?
, rivolta ad uno che ti sta aiutando e non maledicendo, suona un po' male...

Penso che mromani volesse dire di fare così
Quote

digitalWrite(acquacalda, HIGH);
do {
       permessoacquacalda=digitalRead(okacquacalda);
    } 
while (permessoacquacalda ==  HIGH);
digitalWrite(acquacalda,LOW);

il comando digitalWrite non è a tempo, ma è un comando ON/OFF, cioè quando metti in HIGH un pin, quel pin resta in HIGH finché non viene eseguito il comando che lo mette il LOW, se metti
Quote
digitalWrite(acquacalda, HIGH);
all'interno del do..while lo esegui ripetutamente ed inutilmente; invece in questo modo accendi il relé e questo resta acceso per tutto il tempo che il do...while va avanti, finché il ciclo non termina ed a questo punto viene eseguito
Quote
digitalWrite(acquacalda, LOW);
che spegne il relé, tutto qui. :)
Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

mromani

Sospetto che dietro quel nick si celino due persone differenti...  XD

PaoloP

Ma è uscito: "Che più bianco non si può!"?  ;)

Go Up