Pages: [1]   Go Down
Author Topic: Finito lavatrice. guardate il codice  (Read 673 times)
0 Members and 1 Guest are viewing this topic.
Napoli
Offline Offline
Jr. Member
**
Karma: 0
Posts: 64
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
//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;

Logged

Napoli
Offline Offline
Jr. Member
**
Karma: 0
Posts: 64
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
[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]
Logged

Napoli
Offline Offline
Jr. Member
**
Karma: 0
Posts: 64
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Offline Offline
God Member
*****
Karma: 2
Posts: 596
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
« Last Edit: February 14, 2012, 06:04:21 am by mromani » Logged

Napoli
Offline Offline
Jr. Member
**
Karma: 0
Posts: 64
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
God Member
*****
Karma: 2
Posts: 596
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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.
Logged

Napoli
Offline Offline
Jr. Member
**
Karma: 0
Posts: 64
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

0
Offline Offline
God Member
*****
Karma: 2
Posts: 596
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 574
Posts: 12653
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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. smiley
Logged


0
Offline Offline
God Member
*****
Karma: 2
Posts: 596
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sospetto che dietro quel nick si celino due persone differenti...  smiley-lol
Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 114
Posts: 7209
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma è uscito: "Che più bianco non si può!"?  smiley-wink
Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Pages: [1]   Go Up
Jump to: