Facciamo su e giu', dice l'inganneressa.....

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)

Che comunque, e poi vado a dormire veramente...
il primo al quale non piace sono io
la sua complessità ciclomatica è eccessiva, dovrei ri-scriverlo riducendola un po'
ma per oggi basta così

Non riesco a capire il significato di "inganneressa" :slight_smile:

In ditta da me girano frotte (io le chiamo mandrie) di giovani (e anche no) ingegneri, truccano (ingannano) sulle loro capacità e sui loro successi passati, ma purtroppo anche su quelli attuali.
E poi a me tocca prendere il badile e spalare (alle volte letteralmente) le carriolate di tiristori esplosi.
Ma loro parlano sempre di software certificato e protocolli di prova
Mai di errori nei calcoli e spessori di isolamento inadatti o sezioni di rame ridicole
Ecco che quindi io li chiamo "ingannieri" e se li piglio dove non devono gli corro dietro con la chiave del 55
Inganneressa è inganniere femmina
Per correttezza devo dire che l'ingannerressa giovane è meccanica, non elettronica, e la differenza di spessore si vede (io poi lo sento anche)

Ok ho capito grazie :slight_smile:

Standardoil:
... Mai di errori ...

"errori" ? ... che roba sono ? ... alla scuola per ingenieri non ce l'hanno spiegato ...

(scusa, non ho resistito :D)

Etemenanki:
"errori" ? ... che roba sono ? ... alla scuola per ingenieri non ce l'hanno spiegato ...

(scusa, non ho resistito :D)

Massi'
Non ricordi?
Durante il laboratorio di "scienza delle costruzioni creative e materiali alternativi"
Per intenderci quello che all'asilo si chiamava "giocare con la sabbia a fare castelli e torte di fango"

Comunque un karma a francesco01 che ha dimostrato curiosità: non legge solo le risposte alle sue domande