Info salti nel programma + blink led senza bloccare il progr

Ciao :slight_smile:
scusate se chiedo sempre le cose basilari, ma da queste devo partire... nel loop ho necessità di eseguire 2 programmi diversi a seconda di uno stato di un pin della mega2560; come si fanno salti nel programma? Vengo da assembler e li bastava scrivere GOTO nome_parte_programma, con C credo si usi il VOID, ma non ho capito come. Qualcuno potrebbe farmi un piccolo esempio? Il mio programma gestisce un antifurto, quindi ci sarà una parte che girerà ad antifurto disattivo e un'altra da attivo.
Ho una seconda richiesta, vorrei far lampeggiare un led x volte senza usare delay, in pratica allo scattare di un sensore, il led deve lampeggiare mettiamo 5 volte a 1 Hz, ma nel frattempo vorrei che il programma continuasse a testare gli altri sensori...
grazie a tutti dell'aiuto e della pazienza
ciao

Banalmente .... if() :confused:

void loop()
{ if(digitalRead(10)==HIGH)
  {  // parte 1
  }
  else
  { // parte 2
  }
}

poi meglio se spezzi in 2 funzioni void

void loop()
{ if(digitalRead(10)==HIGH)
    parte1();
 else
    parte2();
}
void parte1() { ... }
void parte2() { ... }

thedrifter:
Ho una seconda richiesta, vorrei far lampeggiare un led x volte senza usare delay, in pratica allo scattare di un sensore, il led deve lampeggiare mettiamo 5 volte a 1 Hz, ma nel frattempo vorrei che il programma continuasse a testare gli altri sensori…

Crei una variabile booleana, quando scatta il sensore metti questa booleana a TRUE.
Nel codice con una if() esegui il codice del lampeggio solo se la booleana è TRUE. Naturalmente NON puoi usare in questo codice il delay ma la millis().
In quel codice dovrai anche avere un contatore che arrivato a 5 rimette la booleana a FALSE

thedrifter:
... vorrei far lampeggiare un led x volte senza usare delay, in pratica allo scattare di un sensore, il led deve lampeggiare mettiamo 5 volte a 1 Hz, ma nel frattempo vorrei che il programma continuasse a testare gli altri sensori...

Come ti √® stato detto devi usare la millis() ...comincia a studiare prima QUI, poi QUI ed infine leggi anche QUI e QUI ... vedrai che ti sar√† tutto pi√Ļ chiaro :wink:

Guglielmo

Grazie, quindi uso il void, posso metterlo in qualsiasi parte del programma, ma sempre dentro il loop? E per uscire da quella parte di programma, basta la parentesi graffa? Il programma quindi prosegue dall' if iniziale?
grazie, Guglielmo avevo letto della millis, ora proverò a metterla in pratica, devo anche fare il trucchetto per quando farà overflow, sennò dopo 49 giorni non lampeggeranno + i led hi hi hi :slight_smile:
Grazie ancora
saluti

thedrifter:
Grazie, quindi uso il void, posso metterlo in qualsiasi parte del programma, ma sempre dentro il loop? E per uscire da quella parte di programma, basta la parentesi graffa? Il programma quindi prosegue dall' if iniziale?

Posso darti un consiglio? :slight_smile: ... prenditi un bel testo di C e comincia a studiare, poi ti riavvicinerai, sicuramente pi√Ļ produttivo, al tuo programma. :wink:

Puoi cominciare con QUESTO e puoi scaricarti QUESTO libro (... tranquillo, è un sito legale, purché per tuo esclusivo uso PERSONALE).

Guglielmo

thedrifter:
Grazie, quindi uso il void, posso metterlo in qualsiasi parte del programma, ma sempre dentro il loop? E per uscire da quella parte di programma, basta la parentesi graffa? Il programma quindi prosegue dall’ if iniziale?

Devi cambiare come ragioni perché il C segue un altra logica.

Il VOID vuol dire che la funzione non da un valore di ritorno.

Le funzioni devono essere definite fuori da altre funzioni percui fuori da loop(). Provalo e Ti da un errore in compilazione.

Da una funzione si puó ritornare perché tutte le istruzioni/funzioni sono state elaborate o perché si usa il return() o il break().

Comunque studiati un po il C.

Ciao Uwe

Ahhahhaha Guglielmo, preferisco quando mi dai qualche esempio, a quando mi dici di studiare :slight_smile: hi hi hi, comunque qualcosa ho letto, ma se non si mette in pratica è sempre difficile capire; so anche che devo studiare parecchio, sto iniziando adesso...
Uwe, ora ho capito, sei stato chiaro, quindi alla fine della parte chiamata ci va il return(); e il programma riprende da dove ha avuto la chiamata? (se non ho capito male, equivale al CALL e rispettivo RETURN che uso in assembler?)
Grazie di nuovo, ma si capisce di + sbattendoci la testa e chiedendo, che leggere e studiare a giornate e poi non saper fare comunque...
ciao ciao

return()

mmmmm..uwe ha trascritto male, il return non è una funzione, è uno stantment (Istruzione).

Le due parentesi () sono definite operatori di chiamata.
void myVoid(void) {

}

Definizione di funzione con nome myVoid, che non prende alcun parametro in ingresso e non restituisce nulla al chiamante.
Void = nulla.

Quindi dopo lo stantment non ci vanno le parentesi e al massimo ci può essere una espressione o una semplice variabile, simile a:
return index;

Se scrivi return (index); funziona uguale, ma se la scrivi così:
return(index) il compilatore potrebbe confondersi.

Ciao.

Ciao Uwe,
il programma funziona tranne una cosa, un allarme rimane sempre scritto, cioè, la parte di scrittura/cancellazione va solo se un sensore va in allarme, non se esce, ovvero non se esce l'ultimo.... Difficile spiegarmi, se ci sono + allarmi, li scrive, e va bene, se qualcuno esce dall'allarme lo cancella, e va bene, ma se uno solo è scritto, e esce dall'allarme, non lo cancella, e io non riesco a capire cosa manca...

Mauro, non ho capito il return, ok per il void, l'ho provato, e ho capito; ma il return, intanto la differenza del tuo esempio è lo spazio prima della parentesi? Quindi lo spazio ci vuole sempre... Altra cosa, ma questo return, ci vuole o no? Nell'esempio di Uwe non c'è return, eppure funziona... scusate

saluti

thedrifter:
Altra cosa, ma questo return, ci vuole o no? Nell’esempio di Uwe non c’è return, eppure funziona…

… continuiamo così, facciamoci del male! :roll_eyes:

Guglielmo

gpb01:
… continuiamo così, facciamoci del male! :roll_eyes:

Guglielmo

Io mi faccio male sicuro, mi viene la nausea… Vedo di leggere ancora un po’, è tutto molto diverso da come lo facevo, devo mappare diversamente il mio cervello :wink:
ciao

thedrifter:
devo mappare diversamente il mio cervello ...

Ma no, guarda, in realtà è sufficiente ... STUDIARE, almeno le basi :grin: :smiley: :grin:

Guglielmo

Vabb√®, avevo chiesto un aiuto, dire di studiare √® troppo semplice, ci sono cose poi che non si capiscono bene in un datasheet, e una spiegazione "a voce" varrebbe di pi√Ļ che la lettura di 100 pagine.....
Inoltre entrando nel dettaglio, non è che si spieghi gran che in giro l'uso delle parentesi, sia graffe che tonde, bisogna andare a caso, e non mi pare giusto.
Avevo chiesto informazioni sull'uscita da una chiamata, mi è stato spiegato il return, ho capito a cosa serve, ma ancora nessuno mi ha detto bene il rientro da una chiamata.... Date tutti per scontato certe cose, e vi arrabbiate se qualcuno le chiede perchè per voi è facile... Anche per me preparare un motore da corsa è facile, lo farei ad occhi chiusi, posso mettervi alla prova? Devo arrabbiarmi se non capite subito?
Grazie per gli aiuti, un saluto :slight_smile:

Inoltre entrando nel dettaglio, non è che si spieghi gran che in giro l'uso delle parentesi, sia graffe che tonde, bisogna andare a caso, e non mi pare giusto.

Se le cerchi nel manuale di Arduino di sicuro non le trovi, o almeno non dovrebbero stare li, ma su un manuale del linguaggio C/C++. Arduino usa il C++, cerca su wikipedia cosa sono.

Date tutti per scontato certe cose, e vi arrabbiate se qualcuno le chiede perchè per voi è facile...

Mica tanto, c'è un libro sul C++ che non ho finito di leggere che conta circa 900 pagine.

Vuoi che scriva qui su un forum 100 pagine sul C?, non credo. Quello che è fattibile su un forum qui viene fatto
regolarmente.

Anche per me preparare un motore da corsa è facile, lo farei ad occhi chiusi, posso mettervi alla prova? Devo arrabbiarmi se non capite subito?

mmm... io non mi sono arrabbiato mica, chi lo è?

Ciao.

Non mi riferivo a te Mauro, ma a Guglielmo, mi pareva irritato... Tu mi hai spiegato molto bene...
Cmq ora andiamo off topic... Cercherò su C++ allora per le parentesi, grazie :wink:

... irritato ? ? ? :o :o :o e per cosa ? :grinning:

Il mio era l'unico suggerimento possibile ed era seguito da un bel po' di faccine sorridenti :smiley: :grin: :smiley:

Ah ... se vuoi arrivare a fare veramente qualche cosa ... tocca pure che lo segui ... :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Guglielmo

Oramai siamo navigati, sappiamo che l'imperativo "devi studiare" viene sempre digerito male, per questo gpb01 ci mette le faccine sorridenti come digestivo, ma alle volte funzionano e altre no.

PS: Se per farsi pubblicità, vai dicendo che con il tuo sistema di sviluppo si deve studiare, il 50% dei potenziali acquirenti rimane o scappa a gambe levate?

Ciao.