Go Down

Topic: Io abito al piano terra (Read 175 times) previous topic - next topic

Standardoil

e in una villetta a schiera
ecco perchè mi sono fatto l'ascensore, se cercate la logica è appena uscita con il raziocinio, voglio fare tanti ragionamenti
e quindi scherzi a parte, siccome mi hanno regalato un bellissimo coso con un fracco di display e bottoni e lucine tutte, se andate a vedere qui capite: https://forum.arduino.cc/index.php?topic=542701.0
dicevo, con quel bel giocattolo, in mancanza della inganneressa giovane ho passato qulche tempo piacevole stasera dopo cena:
mi sono fatto l'ascensore
Ho collegato il coso strano ad una UNO, ho caricato dal library manager la libreria TM1638lite
e poi mi sono fatto questo:
Code: [Select]

// di Nelson "StandardOil"
// Idea da sviluppare: ascensore con un LM1638

#include <TM1638lite.h>
TM1638lite tm(4, 7, 8);



byte piano; // piano attuale dell'ascensore
bool prenotato; // ascensore prenotato oppure no
byte chiamato; // piano prenotato
bool porta = 1; // 1 aperta, 0 chiusa

void setup(void)
{
    // accendiamo la P
    tm.displayASCII(piano, 'P');
}

void loop(void)
{
    if (prenotato)
    {
        if (chiamato == piano)
        {
            // siamo già al piano, spengo la prenotazione
            tm.setLED(chiamato, 0);
            prenotato = 0;

            // se la porta è chiusa la apro
            if (!porta)
            {
                tm.displayASCII(piano, 'A');
                delay(1000);
                tm.displayASCII(piano, 'P');
                porta = 1;
            }
        }
        else
        {
            // devo muovere
            // chiudo la porta
            if (porta)
            {
                tm.displayASCII(piano, 'C');
                delay(1000);
                tm.displayASCII(piano, ' ');
                porta = 0;
            }

            if (chiamato > piano)
            {
                motorsale();
                piano++;
            }

            if (chiamato < piano)
            {
                motorscende();
                piano--;
            }

            tm.displayASCII(piano, 'P');
            delay(100);
        }
    }
    else
    {
        if (byte bottoni = tm.readButtons())
        {
            prenotato = 1;
            chiamato =    prenota(bottoni);
        }
    }
}

byte prenota(byte value)
{
    byte chiamato = 0;

    for (byte i = 0; i < 8; i++)
    {
        tm.setLED(i, value & 1);

        if (value & 1)
        {
            chiamato = i;
        }

        value = value >> 1;
    }

    return chiamato;
}




void motorsale()
{
    // simula il movimento  a salire con i dot
    for (byte i = 0; i < 8; i++)
    {
        tm.displayASCII(i, '.');
        delay(100);
    }

    for (byte i = 0; i < 8; i++)
    {
        tm.displayASCII(i, ' ');
        delay(100);
    }
}
void motorscende()
{
    // simula il movimento  a scendere con i dot
    for (byte i = 0; i < 8; i++)
    {
        tm.displayASCII(7 - i, '.');
        delay(100);
    }

    for (byte i = 0; i < 8; i++)
    {
        tm.displayASCII(7 - i, ' ');
        delay(100);
    }
}

all'avvio visualizza presente sul primo display
se premete un tasto prenota il piano accendendo il led superiore, se è lo stesso dove l'ascensore è presente de-prenota subito
altrimenti per un secondo mostra C per dire che sta chiudendo la porta, poi una simpatica animazione coi punti decimali vi mostra la salita o la discesa, ad ogni piano accende la P di presente
arrivato al piano prenotato spegne il led, mostra A per aprire la porta in un secondo e poi mostra P di presente al piano
mi sembra una cosina interessante, per una mezza serata, magari seerve da spunto per qualcuno
se il mio furbofono fosse meno da pezzente magari farei anche un piccolo video...
Prima legge di Nelson (che sono io):
A parità di risultato maggiore
è il pensiero, minore il lavoro.
Quindi prima di fare pensa!

Go Up