Funzioni Contemporanee

Salve a tutti sono nuovo nel mondo Arduino, oggi mi sono messo a programmare con quello che mi ricordavo di C++, la mia domanda è: È possibile fare una funzione, bloccando quella precedente, e farne una nuova?

Mi spiego meglio con il codice:


const int Puls1 = 2;

const int RELE5 = 5;
const int RELE6 = 6;
const int RELE7 = 7;

void setup() {
  pinMode(RELE5, OUTPUT);
  pinMode(RELE6, OUTPUT);
  pinMode(RELE7, OUTPUT);
  
  pinMode(Puls1, INPUT);
 
  digitalWrite(Puls1, HIGH);
}

void loop() {
  
  if (digitalRead(Puls1) == LOW)
  {digitalWrite(RELE5, HIGH);
  digitalWrite(RELE6, HIGH);delay(10000);
	
  digitalWrite(RELE6, LOW);
  digitalWrite(RELE5, LOW);delay(30000);
  
  digitalWrite(RELE5, HIGH);
  digitalWrite(RELE7, HIGH);delay(2000);
 
  digitalWrite(RELE6, HIGH);
  digitalWrite(RELE5, HIGH);
  digitalWrite(RELE7, HIGH);delay(12000);

  digitalWrite(RELE5, LOW);
  digitalWrite(RELE6, LOW);
  digitalWrite(RELE7, LOW);}
     
}

Praticamente al click del pulsante fa delle funzioni(accendere/spegne i led), ma! Se io voglio nel frattempo che sta facendo una funzione stoppare quella funzione per farne un'altra? è possibile?

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare.
Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Praticamente al click del pulsante fa delle funzioni(accendere/spegne i led)

ne fa 1 sola funzione racchiusa tra le parentesi graffe

È possibile fare una funzione, bloccando quella precedente, e farne una nuova?

Stai toccando 3 argomenti differenti:

  1. Stoppare la funzione in cui ci si trova e non tornarci più
  2. Stoppare temporaneamente la funzione in cui ci si trova saltando ad un'altra per poi tornarci riprendendo dal punto in cui l'hai lasciata
  3. svolgere una seconda funzione mentre è operativa la prima

nel tuo caso quei delay() interrompono il processo, usa in alternativa la funzione millis() per ottenere un attesa ed eseguire altre istruzioni.
se vuoi invece interrompere un delay mi sembra (se non ricordo male) che lo fai agendo sul timer0 resettandolo, quest'ultima è una pratica insolita, inusuale.

pablos:
ne fa 1 sola funzione racchiusa tra le parentesi graffe

Stai toccando 3 argomenti differenti:

  1. Stoppare la funzione in cui ci si trova e non tornarci più
  2. Stoppare temporaneamente la funzione in cui ci si trova saltando ad un'altra per poi tornarci riprendendo dal punto in cui l'hai lasciata
  3. svolgere una seconda funzione mentre è operativa la prima

nel tuo caso quei delay() interrompono il processo, usa in alternativa la funzione millis() per ottenere un attesa ed eseguire altre istruzioni.
se vuoi invece interrompere un delay mi sembra (se non ricordo male) che lo fai agendo sul timer0 resettandolo, quest'ultima è una pratica insolita, inusuale.

Ti spiego meglio, io sto pilotando dei led, facendogli fare una serie di accezioni e spegnimenti temporizzati, vorrei che quando premo un pulsante:
-stoppi la funzione che sta facendo;
-faccia una funzione che ho programmato.

Comunque ciò che vorrei fare io e ciò cha hai detto tu nel 4° punto

pablos:
4) Stoppare funzione in cui ci si trova,per poi svolgere una seconda funzione.

Ti spiego meglio

Io ho capito
Quando ti trovi dentro a quel ES: delay(30000) che dura 30 sec non puoi fare niente, quindi no, con il codice che hai scritto non puoi.

te l'ho scritto

nel tuo caso quei delay() interrompono il processo, usa in alternativa la funzione millis() per ottenere un attesa ed eseguire altre istruzioni

qui hai un esempio di un led che lampeggia e ti lascia libero il micro di fare altre cose

Una spiegazione della funzione millis()

pablos:
http://arduino.cc/en/Tutorial/BlinkWithoutDelay
qui hai un esempio di un led che lampeggia e ti lascia libero il micro di fare altre cose

Una spiegazione della funzione millis()
http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/

La funzione millis non l'ho capita, cioè a me non serve, a me serve una funzione di, stop di tutto ciò che sta facendo per dare io una funzione da fare al posto di quella che stava facendo

Ti abbiamo capito.
Il delay() aspetta il tempo indicato senza fare NIENTE e senza poter fare qualcosa d'ALTRO.

Il millis() é una funzione che Ti da come risposta i millisecondi trascorsi dall accensione del Arduino. Tu controlli se il tempo é passato e poi fai qualcosa. Visto che oltre a controllare se il tempo é passato puoi anche controllare se un pulsante é stato premuto questo va bene per il Tuo progetto.
Ciao Uwe

Ci sono almeno 10 richieste a settimana sul forum uguali alla tua, quindi sappiamo di cosa parli

Ragazzi mi potreste fare un esempio concreto dell'uso del Millis con il pulsate e un led ve ne sarei grato

Non ha senso usare la libreria di leOS per ovviare una pausa bloccante fatto con delay(). Basta usare i milis().
Ciao Uwe

@Massy97 :
Vedo un paio di problematiche nel tuo codice ...

  1. La funzione delay() è bloccante, per cui ... nel momento in cui la chiami NON puoi fare altro fino a quando non è terminata. Per ovviare a questo devi studiarti come si usa la millis() prima QUI, poi QUI ed infine leggi anche QUI ... vedrai che ti sarà tutto più chiaro ...

  2. Devi considerare che un pulsante "reale" si comporta diversamente da un pulsante "ideale". Difatti, se in teoria ti basta verificare con una:

if (digitalRead(Puls1) == LOW)

... in pratica occorre tenere conto che quando si schiaccia un pulsante sul piedino di ingresso quello che realmente arriva è :


... e quindi devi adottare una tecnica di "debouncing" per ovviare al problema.

Guglielmo

Ragazzi il problema è che io, essendo che voglio pilotare tramite dei relè dei motorini non posso usare il millis in quanto i relè si attiverebbero e si staccherebbero in continuazione....

Non c'entra nulla quello che hai detto nell'ultimo post. Se prima non impari il metodo millis, non capirai mai quello che ti vogliono dire gli altri. Non "girano" in continuazione se imposti tutto correttamente.

Massy97:
Ragazzi il problema è che io, essendo che voglio pilotare tramite dei relè dei motorini non posso usare il millis in quanto i relè si attiverebbero e si staccherebbero in continuazione....

Perché lo programmi in quel modo?
Ciao Uwe

Massy97:
Ragazzi il problema è che io, essendo che voglio pilotare tramite dei relè dei motorini non posso usare il millis in quanto i relè si attiverebbero e si staccherebbero in continuazione....

Ehhhhh ? ? ? :o :o :o

Evidentemente NON ti sei studiato i link che ti ho messo altrimenti non avresti scritto questa cosa ... :smiling_imp:

Guglielmo

non posso usare il millis in quanto i relè si attiverebbero e si staccherebbero in continuazione....

probabilmente hai caricato il "blink without delay" vedendo il motore accendersi e spegnersi senza capirne il principio.

@Massy97
Puoi spiegare bene cosa vorresti fare? tipo "premo un pulsante e vorrei che ....." spiega le azioni che fisicamente fai e il risultato che vorresti ottenere, altrimenti resta difficile dirti come applicare il millis().

Mi dispiacerebbe che il forum risultasse a te popolato di persone che non sanno aiutarti, visto che tra un anno dovrai usarlo a scuola, spiega e mettici un po' di tuo.

ciao

Molto "semplice" io ho:

  • 3 relè
  • Un pulsante
  • Una fotocellula

Dovrei, con il premere il pulsante avviare per dei secondi, che decido io, 2 relè (RELE5, RELE6) dopo di che, li stoppo per sempre dei secondi che voglio io. In fine, finito il tempo "Pausa" di nuovo avvio i relè (RELE5, RELE7) per poi avviare tutti i relè per tot secondi e poi stoppare il tutto. Ma, nel momento in cui finisce la "Pausa", e quindi si avviano i relè, vorrei che la fotocellula entrasse in funzione, e quindi se in caso passo un oggetto i relè:1) Si stoppano; 2) si riattivano.

mettiamo dei numeri per capirci

  • stato iniziale tutto spento

  • pigio il pulsante avvio la sequenza tic e tac

  • RELE5, RELE6 ON per 10 sec >> la fotocellula qui deve spegnere se interrotta? o no?

  • RELE5, RELE6 OFF per 30 sec

  • RELE5, RELE7 ON per 2 sec >> la fotocellula qui deve spegnere se interrotta? o no?

  • RELE5, RELE6, RELE6 ON per 12 sec >> la fotocellula qui deve spegnere se interrotta?

Comunque sono 4 eventi in sequenza se non ho capito male, quindi ti dovrebbe bastare un solo millis() e uno
switch case con 4 passaggi

dove puoi usare una sorta di ENABLE sui relè data dalla fotocell

boolean alert_stop = digitalRead(fotocell); //input della fotocellula arresto motori 1 enable ... 0 disable
digitalWrite(RELE5, Stato1 & alert_stop);
digitalWrite(RELE6, Stato2 & alert_stop);
digitalWrite(RELE7, Stato3 & alert_stop);

Dove Stato1/2/3... è il valore che passi alla funzione ON/OFF dei singoli relay
...
...