Progetto cancello a due ante

Be io propongo all'autore del thread l'idea basilare elementare che proporrei a mio nipote di 15 anni con tutto l'affetto che gli porto. Sara l'autore a decidere se gli è stato utile o preferisce altre spiegazioniQuesto è uno pseudocodice traducibile uno a uno, non si useranno funzioni l'apertura delle ante saranno un semplice digitalWrite() sull'attuatore inserito nello switch.

**Se è vietato chiedere non so se è vietato proporre di propria volontà dal regolamento, si parla sempre che è vietato chiedere ma è vietato dare qualcosa ?? Sappiamo tutti che ci sono buoni tutorial su youtube fatti anche da ingegneri, dove si mostra proprio il codice, penso che tutti riteniamo che sia utile per un principiante anche vedere questi esempi che poi volendo potrà adattare, non vedo perche non si posso mostrare uno pseudocodice su un forum, oppure riteniamo criminali chi si guarda gli esempi su youtube, in caso non si possa fare da regolamento NON ARRABBIAMOCI :slight_smile: chiediamo al moderatore di canellare :wink:

INIZIO PSEUDOCODICE, secondo richieste iniziali

#define ATTESA 0
#define APERTURA1ANTA 1
#define PAUSA1 2
#define PAUSA2 6
#define APERTURA2ANTA 3
#define CHIUSURA2ANTA 4
#define CHIUSURA1ANTA 5
#define CHIUSO 0
#define  APERTO 1
int stato=ATTESA;
int flag=0; //mi indica se devo fare la pausa
int statoCancello=CHIUSO;
//Variabili per conteggio tempo tramite millis()
int avviaTimer=0;
unsigned long TempoPrecedente=0;
int intervalloTempo=0;
int tempoTrascorso=0;

void loop(){
// Switch che seleziona gli stati

    switch(stato){

        case ATTESA:
            SE statoCancello==CHIUSO e pulsanteApri==HIGH{
               stato=APERTURA1ANTA;
               intervalloTempo=5000;//Tempo neccessario alla Apertura
               tempoPrecedente=millis();
               avviaTimer=1; //Tempo neccessario all'Apertura
            }
            SE statoCancello==APERTO e pulsanteChiudi==HIGH{
               stato=CHIUSURA2ANTA;
               intervalloTempo=5000;//Tempo neccessario alla chiusura
               tempoPrecedente=millis();
               avviaTimer=1; //Tempo neccessario alla chiusura
            }
            break;
        case APERTURA1ANTA:
            SE avviaTimer==1 e tempoTrascorso==1 {
               avviaTimer=0;
               tempoTrascorso=0;
               ferma prima anta//digitalWrite()
               flag=1;
               stato=PAUSA1;
            }
            break;
        case PAUSA1://pausa tra apertura prima anta e apertura seconda anta
            SE flag==1 {
                flag=0; //non ripete più if
                intervalloTempo=4000;//Tempo tra apertura prima e secoda anta
                tempoPrecedente=millis();
                avviaTimer=1; //Tempo neccessario alla chiusura
               tempoTrascorso=0;
            }
            SE avviaTimer==1 e tempoTrascorso==1 {//sono passati 4 secondi
               intervalloTempo=5000;//Tempo neccessario alla Apertura
               tempoPrecedente=millis();
               avviaTimer=1; //Tempo neccessario all'Apertura;
              tempoTrascorso=0;
               stato=APERTURA2ANTA;
            }
            break;
        case APERTURA2ANTA:
            SE avviaTimer==1 e tempoTrascorso==1 {
               avviaTimer=0;
               tempoTrascorso=0;
               ferma  seconda anta//digitalWrite()
               statoCancello=APERTO; //abbiamo eseguito l'apertura il cancello ora è aperto
               stato=ATTESA;
               
            }
            break;
        case CHIUSURA2ANTA:
            SE pulsanteApri==HIGH o pulsanteSicurezza==HIGH{ // In caso di pericolo 
               fermo 1 anta
               fermo 2 anta
               
               statoCancello=CHIUSTO;
               stato=ATTESA; //attendo comandi pulsanti apertura
               break;
            }
             SE avviaTimer==1 e tempoTrascorso==1 {
               avviaTimer=0;
               tempoTrascorso=0;
               ferma  seconda anta//digitalWrite()
               flag=1;
               stato=PAUSA2;
            }
            break;
        case CHIUSURA1ANTA:
            SE pulsanteApri==HIGH o pulsanteSicurezza==HIGH{ // In caso di pericolo 
               fermo 1 anta
               fermo 2 anta
               break;
               statoCancello=CHIUSTO;
               stato=ATTESA; //attendo comandi pulsanti di apertura
            }
             SE avviaTimer==1 e tempoTrascorso==1 {
               avviaTimer=0;
               tempoTrascorso=0;
               ferma  pima anta//digitalWrite()
               statoCancello=CHIUSTO; // Abbiamo chiuso il cancello, adesso e attivo il pulsante apri
               stato=ATTESA;
            }
            break;
        case PAUSA2:
             SE flag==1 {
                flag=0; //non ripete più if
                intervalloTempo=4000;//Tempo tra apertura prima e secoda anta
                tempoPrecedente=millis();
                avviaTimer=1; //Tempo neccessario alla chiusura
                tempoTrascorso=0; 
            }
            SE avviaTimer==1 e tempoTrascorso==1 {//sono passati 4 secondi procedo con altra anta
               intervalloTempo=5000;//Tempo neccessario alla Apertura
               tempoPrecedente=millis();
               avviaTimer=1; //Tempo necessario all'Apertura;
               tempoTrascorso=0;
               stato=CHIUSURA1ANTA;
            }
            break;
    }

    //Timer usato per calcolare gli intervvalli di tempo 
    SE avviaTimer==1 {

       SE millis()-tempoPrecedente >=intervalloTempo{
               tempoTrascorso=1;
    }
}
1 Like