Menu difficile da realizzare

Buongiorno a tutti..
Ho un problema...
Sto realizzando un piccolo macchinario per stampare con Hot_Foil,spiego meglio:
Una pressa manuale dove faccio interagire arduino nel gestire un po di cose,un pid per il riscaldamento di una piastra per lo stampaggio,un display dove vengono lette le varie informazioni,un led ed un beep per interagire con l'utilizzatore della macchina.....
e qui iniziano i problemi......
In pratica sto cercando in rete degli esempi o dei progetti da modificare per poter realizare sto progetto ma nulla da fare.....
Quello che cerco è questo:
Mi serve usare un display Nokia 5110,un encoder rotativo ,il menu vorrei strutturarlo in maniera che quando accendo vengono visualizzate delle variabili tipo temperatura attuale e settata,e lo stato di altre variabili ...se ruoto l'encoder vado a selezionare se entrare nel menu o accendere se spento o spegnere se acceso il riscaldatore tramite il pid (3 cose... menu...on (se off ) off (se on) )
se entro nel menu il display cambia e vengono visualizzate le varie righe dove posso impostare le varie cose....(set temperatura(se premo ci sara un numero che varia e quando premo salvo quel numero sulla variabile desiderata),avanzamento (altre tre righe On-Off ,misura, back),Beep(se entro ci sara on,off,back)..

insomma una confusione ma il concetto è questo,sto cercando un menu dove la pagina principale mi faccia vedere quello che voglio io e solo se premo visualizzo le righe del menu,dove se le seleziono mi sposto nelle varie pagine dove imposto delle variabili .
ho trovato soltanto menu che non fanno visualizzare le informazioni e manu che non mi impostano le variabili..

spero possiate aiutarmi con una bruttacopia da dove posso partire.
un saluto ,scusate l'enorme confusione nello spiegarmi....e grazie a chi mi aiuterà

Tipo qualcosa del genere?

noon proprio,il display,quando è appena acceso il sistema ,dovra mostrare dei testi e delle variabili,semplificando la cosa potrei mettere che premendo una volta il pomolo dell'encoder apro il menu,dove ho delle voci da selezionare ed attribuirne il valore oppure lo stato di on - off ,ogni voce del manu avra anche "back" per tornare alla visualizzazione precedente e la prima avrà "main" oppure "quit" per tornare alla schermata principale,va anche bene senza sottomenu..
ora non so come fare a postare una sorta di grafico ad albero del menu e capisco che scritto cosi puo fare solo confusione......

Praticamente stai descrivendo il menu della mia sveglia. Schermata principale mostra ora, e altre info che cambiano ogni 5 sec. Premo e appare il nome della prima regolazione, ruoto e scorro i nomi. Premo ed entro nella regolazione. Premo per confermare. In ogni momento pressione lunga per annullare. Non ci sono voci "precedente" o "esci". Confermata la regolazione, o annullata, o annullata per timeout di un minuto senza muovere l'encoder, si torna per semplicità sempre alla schermata principale.
Una regolazione può essere formata da diversi campi, ad esempio la regolazione della sveglia prevede di regolare: ora, minuto, attiva/disattiva, se suona anche sabato e domenica oppure no. La pressione breve conferma ogni valore spostandosi sul successivo, all'ultimo c'è la conferma e aggiornamento di tutto.
Però il tutto è scritto con codice non bloccante e macchine a stati finiti, questi due concetti li conosci o sono oscuri?

ciao,si,in pratica è proprio quello che cerco,per il discorso bloccante e stati finiti mi sembra di ricordare qualcosa su come è fatto il diagaramma albero del menu,o roba simile...
tu come display che hai usato ??

Un normale LCD 2x16 con la libreria LiquidCrystal.h

56468798754

interessante,ma teoria da un semplice 1602 a un nokia5110 teoria cambia lo "stampaggio sul display"
a me interessa il menu,tu saresti cosi gentile da postarmi il codice della tua sveglia e vedere se riesco a cavarne qualcosa ??

Ecco, ripulito da una gestione WiFi e altre cose ancora non implementate.

sveglia-ridotta.ino (38,3 KB)

È incasinato perché gestisce anche una matrice di LED (4 cifre da 15 punti), ma quello che conta è la appMachine divisa nelle varie fasi, corrispondenti alle varie regolazioni.

grazie mille,ci studio su

ciao,ho provato alegge e capire ma è fuori dalla mia portata..
ho trovato degli altri menu,ma o non ci capisco nulla oppure non funzionano ,con problemi di impostazioni o errori su librerie....
non riesco a capire dove sbaglio..in uno non riesco a trovare dove modificare l'indirizzo i2c per mettere il mio display......non ne esco...
non pensavo di piantarmi su questa cosa,ho fatto prima a realizzare tutta la meccanica fresando pezzi e costruendo la pressa e tutti i vari componenti e mi pianto su ste robe per non mettere un pannello gigante con 8000 pulsanti e led....volevo semplificare al massimo il pannellino operatore mettendo un display e un encoder,un led ed un beep,con pochi e semplici ingressi tipo due finecorsa un pulsante,e come uscite,una per l'ssr per la gestione tramite pid di una resistenza,un'uscita come ho gia scritto di pochi led,una pwm per un motorino per avvolgere l'hot-foil (che sto valutando se usare un comune motore dc gestendo l'avanzamento con un tempo,oppure uno stepper dando proprioi millimetri di avanzamento)......
si,sembrano tante cose ma di fatto gestire queste cose con un menu mi semplifica notevolmente la cosa.....tu potresti aiutarmi ??
ho a disposizione una marea di cose riguardo arduino,ma pensavo di usare alla fine :
arduino nano
un display 5110
l'encoder rotativo
il beeb usato come segnale acustico (si pressa e dopo un tot di tempo suona per avvisare di togliere pressione) il beep sara disattivabile da menu
dei finecorsa per capire se la leva di pressione è alta o bassa
un led per capire quando la piastra è in temperatura
un led per capire assieme al beep quando è finito il tempo di pressione
un pulsante per l'avanzamento in manuale del foil

si insomma ...una confusione..

Ciao.
Premessa... Di elettronica capisco poco, ma sono uno stampatore e conosco la stampa a caldo.
Quanti parametri ti serve impostare?
Temperatura
Avanzamento
Tempo di pressione
Poi?
Tempo fa ho fatto una cosa simile anche se più semplice. Dovevo gestire solo gli avanzamenti perché la temperatura era gestita da una scheda a parte.
Avevo usato un tastierino 4x4... oltre ai numeri ci sono 4 pulsanti (A B C D) che avevo associato a 4 parametri. In pratica scrivevo un numero col tastierino e premendo una lettera impostavo quel valore sul parametro corrispondente.
Usavo il cancelletto per cancellare e l'asterisco per l'avanzamento manuale.

[OFF TOPIC]
Su che materiale devi stampare? In tutte le macchine che ho visto io la pressione è "istantanea"... perché hai necessità di lasciare in pressione il foil? Non rischi di "cuocere" il materiale?
Riguardo l'avanzamento del foil, secondo me la soluzione a tempo è da scartare. Meglio la soluzione passo-passo, che tra l'altro è utilizzata anche su tutte le macchine che ho visto in carriera. Il problema è come trasformare i mm in passi... il diametro del cilindro su cui recuperi il foil stampato aumenta man mano che procedi con la stampa, quindi il numero di passi cambia di volta in volta.
Altra cosa... di che materiale è fatta la piastra riscaldante? e quanto è grande? Secondo me puoi gestire la temperatura della piastra in modalità ON-OFF senza complicarti la vita col pid... diverse macchine industriali fanno così...
Ultima cosa... che è solo una mia curiosità... che matrici usi per stampare? Magnesio? Alluminio? Ottone?
[/OFF TOPIC]

ciao,cerco di risponderti...
il materiale del clichè è in magnesio ma nulla mi vieta di farmeli realizzare in alluminio(ultimamente li fanno cosi)
per quanto riguarda l'avanzamento,usero un passo passo ,la gestione della misura non sara un problema perche usero un rullo fisso con sopra pressato uno di gomma recuperato da una stampante,mentre il rullo dove verrà avvolto verra fatto girare da una cinghia ,la quale non sarà molto tesa in modo da farla slittare ,girerà col motorino passo passo ,in questo modo un cm del foil verrà fatto avvolgere su tipo 1.5 del rullo di sfrido,ma la cinghia slitterà e in questo modo me lo terra leggermente teso...
per quanto riguarda il tempo... so per certo che il foil su carta è istantaneo,ma col clichè potro anche fare pressioni su pelle e legno che necessitano di tempi piu lunghi e temperature diverse,da qui la necessita di queste impostazioni..
la temperatura....verà gestita da una termocoppia K o un ntc e con il pid è piu precisa,non che mi serva ,ma la parte pid la si trova gia fatta con interfaccia con max6675 per la termocoppia e per questo usero tale sistema..
la macchina l'ho pensata,progettata,disegnata e costruita tutta io,è una sorta di copia di una pressa di precisione con l'adfattamento al foil con banco regolabile in x e y per il centraggio dell'oggetto da stampare..tutto questo lo volevo fare da anni,ora ne approfitto per stampare il nome sui colori a matita della figlia(una scusa come un'altra )

Ho detto che era incasinato, non è scritto per essere didattico e ci sono insieme molte altre cose. Forse questo scheletro (per orientarsi) può essere più utile?

// collegamenti hardware
#define SPEAKER        ...      // ---> 0 riposo 
#define ENCODER_SW     ...      // <--- LOW se premuto
#define ENCODER_A      ...      // <--- HIGH a riposo
#define ENCODER_B      ...      // <--- HIGH a riposo

// fase iniziale processo appmachine
uint8_t        fase = 0;  

// variabili valorizzate da lettura encoder
bool           onClic;
bool           onLpress;
bool           onUp;
bool           onDn;

// tempo di sistema letto da millis ad ogni ciclo
uint32_t       now;       






//--------------------------------------------------------------------
//     L E V E L    2
//--------------------------------------------------------------------

void beepClic(void)   { tone(SPEAKER, 500,  60); }

void beepLpress(void) { tone(SPEAKER, 1000, 60); }

void beepUp(void)     { tone(SPEAKER, 3000, 10); }

void beepDn(void)     { tone(SPEAKER, 2000, 10); }





//--------------------------------------------------------------------
//     L E V E L    1
//--------------------------------------------------------------------


const uint8_t tabT[7][4] = {
    { 0, 4, 1, 0 },
    { 2, 1, 1, 0 },
    { 2, 3, 1, 2 },
    { 2, 3, 3, 0 },
    { 5, 4, 4, 0 },
    { 5, 4, 6, 5 },
    { 5, 6, 6, 0 }
};


void readEncoder(void){
    static uint8_t  s = 0;  // stato processo lettura switch
    static uint8_t  f = 0;  // stato processo lettura fasi
    static uint16_t t;

    // rileva click e longpress pulsante
    onClic = false;
    onLpress = false;
    uint8_t in = digitalRead(ENCODER_SW);
    if      (0 == s  &&  LOW == in)               { t = now;          s = 1; }
    else if (1 == s  &&  HIGH == in)              { onClic = true;    s = 0; }
    else if (1 == s  &&  ((uint16_t)now-t > 500)) { onLpress = true;  s = 2; }
    else if (2 == s  &&  HIGH == in)              {                   s = 0; }

    // rileva rotazione encoder
    uint8_t enc = (digitalRead(ENCODER_B) << 1) | digitalRead(ENCODER_A);
    onUp = (3 == f  &&  3 == enc);
    onDn = (6 == f  &&  3 == enc);
    f = tabT[f][enc];
}

//--------------------------------------------------------------------

void appMachine(void)
{
    static uint8_t  s;
    static uint32_t t; // per calcolo tempo trascorso da inizio fase
    static uint8_t  fasePrec = ~fase;

    bool primo = (fase != fasePrec);
    if (primo) { fasePrec = fase;  t = now; }
    uint32_t trascorso = now - t;
    switch (fase)
    {
        //__________________________________________________
        // maschera principale
        case 0:
            if (primo) {  // operaz all'attivazione fase
                stampaPrincipale();
            }

            // se click su encoder, attiva menu
            if (onClic) { fase = 1;  beepClic();  break; }
            
            // altre operaz da eseguire ad ogni giro
        break;
        //__________________________________________________
        // scorre opzioni menu
        case 1: 
            if (primo) { 
                s = 0;  // scelta da 0 a 6
                stampaScelta(s); 
            }
            
            // se pressione lunga, annulla e torna a principale
            if (onLpress) { beepLpress();  fase = 0;  break; }
            
            // se clic attiva la scelta
            if (onClic) { 
                beepClic(); 
                // imposta fase regolazione per scelta effettuata
                if (...==s) { fase=...; }
                //...ecc...
                break;
            }

            // se ruotato riavvia timer inattivita`
            if (onUp  ||  onDn) { t = now; }

            // se ruotato cambia scelta
            if      (onUp  &&  s < 6) { s += 1;  beepUp();  stampaScelta(s); }
            else if (onDn  &&  s > 0) { s -= 1;  beepDn();  stampaScelta(s); }

            // se passati 20 sec senza azioni torna a principale
            if (trascorso > 20000) { fase = 0; }
        break;
        //__________________________________________________
    }
}




//--------------------------------------------------------------------
//     L E V E L    0
//--------------------------------------------------------------------

void setup(){
    pinMode(ENCODER_A,  INPUT);
    pinMode(ENCODER_B,  INPUT);
    pinMode(ENCODER_SW, INPUT);
}

//--------------------------------------------------------------------

void loop() {
    now = millis();
    readEncoder();  // imposta onClic, onLpress, onUp, onDn
    appMachine();   // esegue la fase corrente
}

Complimenti! Quando l'avrai finita sarei curioso di vederla, se ti va di postare qualche foto.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.