Go Down

Topic: domanda: come uscire da for e poi rientrare? (Read 2213 times) previous topic - next topic

fracchia

... anche a me e, purtroppo, molto spesso la gente che viene qui ci crede veramente !

E' semplice far lampeggiare un LED, ma come ci si allontana da ciò ... o ci si metti di impegno a STUDIARE (... ed occorre dedicarci tanto tempo) o ... a forza di copia/incolla non si impara nulla e non si va da nessuna parte.

Lo dico sempre ... ma mi rispondono che "non ho capito nulla" e che "la filosofia di Arduino è quella" ... mah ... ::)

Guglielmo

il punto è che ho iniziato a farlo a scuola, poi mi son detto: perché non fare qualcosa da solo per conto mio? comunque premetto che ho evitato di fare copia incolla da altre fonti

Etemenanki

... lo trovo "overkill" e complica il debouncing, se vuoi farlo in software ...
Si, su questo sono daccordo ... io l'avevo suggerito solo perche' i debounce li faccio sempre hardware, e perche' pensavo che gli semplificasse le cose, dato che in quel modo non doveva continuare a controllare il pulsante anche all'interno dei vari cicli, ne inserire routines che aspettassero il rilascio del pulsante per rileggerlo di nuovo (per non leggerlo "a raffica" per tutto il tempo che resta premuto) ...

Quindi dici che e' semplice "uso eccessivo di forza letale" (:P), ma non concettualmente errato del tutto ?
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

SukkoPera

#32
Mar 17, 2017, 07:03 pm Last Edit: Mar 17, 2017, 07:03 pm by SukkoPera
@fracchia: Smanettare e sperimentare è bene. Non fare copia/incolla senza capire è altrettanto bene. Però devi partire dalle basi. Se non hai idea di cosa sia un flag non puoi andare tanto lontano, per cui investi un po' di tempo a studiare questo concetto. Credo bastino 30 secondi :P.

@ete: Mah, definirlo "sbagliato" mi sembra eccessivo. Ci ho provato anch'io e ho deciso che non mi piace, ma è un parere personale. Forse è anche un peccato "sprecare" un pin di interrupt, quando ne abbiamo solo due a disposizione, per una cosa che è tranquillamente gestibile senza. Però è anche vero che se non li usiamo per nient'altro, è difficile definirlo uno spreco. Volendo ci sono anche i Pin Change Interrupt... Qua mi sembra prematuro più che altro, perché se stiamo a discutere di cos'è un flag, figuriamoci un interrupt. E poi risolvere i problemi di polling di un pulsante è sicuramente educativo :).
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

fracchia

Concordo sul fatto che il mio programma non sia il massimo, ad alcuni può fare schifo, a me piace e se riesco nell'intento vado avanti inserendo magari col tempo cose nuove, non posso nemmeno pretendere chissà cosa dopo 15 giorni che lo uso, sono riuscito a scrivere due programmini guardando e cercando qua e la informazioni, e alla fine ci sono riuscito e ne sono contento, manca solo un piccolo pezzettino per unire il tutto e farlo funzionare a dovere, io credo che l'esperienza si possa fare anche così, un corso dedicato non me lo posso permettere, visto poi che fa anche parte del programma didattico di scuola non ne varrebbe nemmeno la pena, penso.
Ho cercato un po su Google ma non trovo nulla a riguardo queste flag...anche se sono convinto che manchi davvero poco a finirlo e a farlo funzionare correttamente

SukkoPera

#34
Mar 17, 2017, 08:26 pm Last Edit: Mar 17, 2017, 08:27 pm by SukkoPera
Io sto cercando di farti capire che il tuo programma è più complesso e intricato di quello che serve, e che puoi semplificarti di molto la vita, se mi ascolti, oltre a imparare cose nuove che ti torneranno sicuramente utili.

Un flag è una variabile che può avere solo due valori: vero o falso.

Nel tuo caso si può usare un flag per indicare se la modalità di funzionamento è automatica o manuale.


Code: [Select]
boolean automatico = false;
const byte PIN_PULSANTE = 2;

void setup() {
  pinMode (PIN_PULSANTE, INPUT_PULLUP);
}

void loop() {
  int premuto = digitalRead (PIN_PULSANTE);
  if (premuto) {
    // Pulsante premuto, cambiamo modalità
    if (automatico == true)
      automatico = false;
    else
      automatico = true;
  }

  // A questo punto facciamo quel che dobbiamo fare a seconda della modalità
  if (automatico) {
    // ...
  } else {
    // ...
  }
}


È più chiaro ora?
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

fracchia

se non ho interpretato male tu dichiari una variabile che può essere o vero o falso, e poi all'inizio del programma premendo un pulsante passi da una modalità all'altra, perché ad una modalità viene associata la condizione vero mentre all'altra a falso, sbaglio?

SukkoPera

Non sbagli! Ora riesci ad andare avanti da solo?
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

fracchia

int premuto = digitalRead (PIN_PULSANTE);
  if (premuto) {
    // Pulsante premuto, cambiamo modalità
    if (automatico == true)
      automatico = false;
    else
      automatico = true;

Questo non mi è molto chiaro. Altra cosa, posso passare da una "modalità" (chiamiamola così dai) di funzionamento anche quando la modalità stessa è in corso o attende che abbia finito tutte le istruzioni prima di cambiare?

SukkoPera

#38
Mar 17, 2017, 11:49 pm Last Edit: Mar 17, 2017, 11:49 pm by SukkoPera
A questo punto ti suggerisco di spendere un po' di tempo sul materiale che ti ha passato gpb, ne varrà la pena.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

Etemenanki

#39
Mar 18, 2017, 10:25 am Last Edit: Mar 18, 2017, 10:28 am by Etemenanki
> Sukko: scusami solo un dubbio ...

...
void loop() {
  int premuto = digitalRead (PIN_PULSANTE);
  if (premuto) {
    // Pulsante premuto, cambiamo modalità
    if (automatico == true)
      automatico = false;
    else
      automatico = true;
  }
...
Ma in questo modo il pulsante non lo leggi "a raffica" ? ... voglio dire, dato che il loop viene continuamente ripetuto, non e' che cosi se il pulsante lo tieni premuto un minimo di tempo, ogni ciclo del loop lo legge e cambia di nuovo lo stato come se fosse ripremuto di nuovo ? ... non e' meglio metterci un controllo per evitarlo ? ... magari anche solo un while(premuto) alla fine degli if/else, che anche se secondo me non e' molto corretto perche' e' bloccante finche' il tasto resta premuto, forse basta per il suo utilizzo ... o sbaglio ?

EDIT: o magari anche cosi ?

Code: [Select]

  if (premuto) {     // Pulsante premuto, cambiamo modalità
    automatico = !automatico;
    while(premuto)
  }
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

SukkoPera

Assolutamente sì, ma volevo arrivarci un passo alla volta ;).
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

fracchia

Ho letto gran parte del materiale che mi è stato consigliato ma ugualmente non riesco a venirne a capo, sono pure passato in libreria per vedere se i libri proposti riuscivano a farmi chiarezza o quanto meno a rispondere ai miei dubbi ma niente, detto ciò mi vedo costretto a dover rinunciare al progetto in quanto da solo non riesco ad uscirne e procedere per tentativi non mi sembra la strada migliore.

SukkoPera

Mi spiace, ma se non riesci a capire quelle poche righe che ho scritto sopra, non c'è molto che possiamo fare, se non consigliarti ancora di studiare bene le basi della programmazione un passo alla volta, assicurandoti di capire bene ogni singolo argomento. Non avere fretta, non cercare di fare passi più lunghi della gamba.
"Code is read much more often than it is written, so plan accordingly. Design for readability."

Guida rapida a ESP8266: https://goo.gl/kzh62E

Go Up