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 chiediamo al moderatore di canellare
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;
}
}