Con l'ascensore dico io?
per riallacciarmi a quando abitavo al primo pianohttps://forum.arduino.cc/index.php?topic=542753.msg3699128#msg3699128
Per spiegarmi meglio: oggi è venuta a trovarmi l'inganneressa giovane
e mi dice: facciamo su e giu'?
ora io lo so che non intendeva con l'ascensore, ma l'idea mi è rimasta
e complice l'insonnia e una doccia (dopo) ho avanzato un 51 minuti prima di andare a dormire
e ho pensato
Prima legge di Nelson sul pensiero: Pensare è sconsigliato per chi non è abituato
comunque mi è venuto in mente come fare su e giu' io, l'inganneressa e un ascensore
io ci sono
l'inganneressa c'era
l'ascensore eccolo qui:
// di Nelson "StandardOil"
// Idea da sviluppare:
// ascensore multipiano
#define PIANI 3
// il numero dei piani del palazzo
typedef struct
{
byte prenotazione; // piedino pulsante di prenotazione
byte presente; // piedino switch presente al piano
byte lampada; // piedino lampada presente
byte porta; // pin switch porta chiusa si no
byte motoporta; // pin comando chiusura porta al piano apri chiudi (uscita off porta in sicurezza: quindi CHIUSA)
// tutti i comandi e gli switch sono in logica DIRETTA, con debounce HARDWARE
// quando si fanno le cose si fanno bene
} tipopiano;
tipopiano piano[PIANI]; // definisce un array di strutture piano, ovvero un array di bottoni pulsanti motori etc etc
char prenotato = -1; // signed 8 bit, -1 signifoca NON prenotato. numeri positivi indicano il piano prenotato
char presente; // piano dove si trova l'ascensore
byte power; // pin di abilitazione motore (a seconda di che tipo di motore forse serve un diverso controllo
byte verso; // pin indicante il verso del motore
byte cabinachiusa; // pin switch porta cabina chiusa
byte cabinachiudi; // pin comando chiusura porta cabina, questo potrebbe essere rovescio (per ragioni di sicurezza)
void setup(void)
{
// qui si mettono i piedini
piano[0].prenotazione = 2;
// e via così, a seconda si quanti piani e che piedini si usano
// ricordarsi anche i pin del motore e della porta cabina
// pinmode
for (byte i = 0; i < PIANI; i++)
{
pinMode(piano[i].prenotazione, INPUT);
pinMode(piano[i].presente, INPUT);
pinMode(piano[i].lampada, OUTPUT);
pinMode(piano[i].porta, INPUT);
pinMode(piano[i].motoporta, OUTPUT);
}
pinMode(power, OUTPUT);
pinMode(verso, OUTPUT);
}
void loop(void)
{
// acquisisco il piano al quale è l'ascensore
presente = leggipiano();
// se l'ascensore è fermo
if (!digitalRead(power))
{
// aquisisco l'eventuale prenotazione (UNA sola)
prenotato = leggiprenotato();
// solo se il piano prenotato NON è il piano presente
if (prenotato != presente)
{
digitalWrite(piano[prenotato].lampada, HIGH);
// accendo la lampada
//ora, delle due l'una,
// o deve salire o deve scendere
// comunque chiudo le porte
chiudiportacabina();
chiudiportapiano(presente);
motore(presente - prenotato);
// motore() aziona il motore
}
}
else
{
// ascensore in moto
if (presente == prenotato)
{
// siamo arrivati
prenotato = -1;
// fermo il motore
digitalWrite(power, LOW);
digitalWrite(piano[prenotato].lampada, LOW);
// lampada spenta
// apro le porte
apriportacabina();
apriportapiano(presente);
}
}
}
bool motore(char senso)
{
// restituisce true se ha acceso il motore, non ci sono alternative,
// non sono contemplati guasti, per ora
digitalWrite(verso, senso > 0);
digitalWrite(power, HIGH);
return 1;
}
void apriportacabina(void)
{
digitalWrite(cabinachiudi, HIGH);
while (!digitalRead(cabinachiusa));
// aspetto micro di cabina chiusa
// qui si puo' mettere timeout e segnalazione di guasto
}
void chiudiportacabina(void)
{
digitalWrite(cabinachiudi, LOW);
while (digitalRead(cabinachiusa));
// aspetto micro di cabina chiusa
// qui si puo' mettere timeout e segnalazione di guasto
}
void apriportapiano(byte i)
{
digitalWrite(piano[i].motoporta, HIGH);
while (digitalRead(!piano[i].porta));
// aspetto micro di porta chiusa
// qui si puo' mettere timeout e segnalazione di guasto
}
void chiudiportapiano(byte i)
{
digitalWrite(piano[i].motoporta, LOW);
while (digitalRead(piano[i].porta));
// aspetto micro di porta chiusa
// qui si puo' mettere timeout e segnalazione di guasto
}
char leggipiano()
{
//acquisisce il piano dove è presente l'ascensore
for (byte i = 0; i < PIANI; i++)
{
if (digitalRead(piano[i].presente))
{
return i;
break;
// trovato un micro schiacciato
}
}
return -1; // non presente
}
char leggiprenotato()
{
for (byte i = 0; i < PIANI; i++)
{
if (digitalRead(piano[i].prenotazione))
{
return i;
break;
// trovato un bottone schiacciato
}
}
return -1;// non prenotato
}
aggiornamento della mattina:
ridotta complessità ciclomatica usando due sotto-funzioni
(trovato un bacherozzo e soppresso)