Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Far eseguire due funzioni indipendenti

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteWALTERmwp, Foto Utentexyz

3
voti

[11] Re: Far eseguire due funzioni indipendenti

Messaggioda Foto Utenteedgar » 11 feb 2020, 13:02

Macelettronic ha scritto:vorrei capire, prima di acquistare materiale, se mi piace o meno

Personale esperienza: un approccio di questo tipo porta poco lontano.
Negli anni '80 del secolo scorso decisi di imparare il Pascal. Non avevo alcuna motivazione o scopo finale se non di imparare quel linguaggio di programmazione. Risultato: non l'ho mai imparato. Idem per il C, fatto addirittura un corso aziendale di Ansi C, mai avuto un motivo per applicarlo, dimenticato in qualche mese.
E' andata meglio con il Basic (c'era solo quello) e un HP85. Si trattava di scrivere codice per gestire strumentazione ed automatizzare alcune funzioni. Lo saprei usare (e talvolta lo uso) tuttora a distanza di quasi 40 anni.
Dal basso della mia ignoranza il suggerimento che mi sento di darti è: poniti un obbiettivo non troppo difficile ma nemmeno troppo semplice. Documentati sul linguaggio di programmazione e cerca di mettere in pratica quello che impari man mano. Documentazione in rete ce n'è quanta ne vuoi (anche troppa).
Una cosa che molti arduinisti ignorano è che il micro si può programmare anche indipendentemente dall'ambiente di sviluppo arduinico. Ci sono compilatori C, Basic, simil Pascal e chi più ne ha più ne metta.
Per la parte economica: il classico Arduino R3 + accessori di base dalla Cina costa un'inezia, non ti sveni sicuramente.
Avatar utente
Foto Utenteedgar
10,0k 4 5 8
Master
Master
 
Messaggi: 5229
Iscritto il: 15 set 2012, 22:59

0
voti

[12] Re: Far eseguire due funzioni indipendenti

Messaggioda Foto UtenteDatman » 20 ott 2020, 15:54

Macelettronic, ciò che chiedi è molto semplice, perché chiedi solo di accendere un LED e di farne lampeggiare un altro: una volta acceso il primo, se non lo spegni rimane acceso e puoi accendere e spegnere l'altro tutte le volte che vuoi... :)
Il problema nasce quando tu vuoi ottenere due azioni cicliche contemporanee, ad esempio far lampeggiare un LED a 1Hz e un altro a 2Hz. Per fare questo devi vedere ciò che vuoi ottenere come una sequenza temporale a passi di 0,25 secondi:

1. si accendono entrambi
2. si spegne il secondo
3. si accende il secondo e si spegne il primo
4. si spegne il secondo

1. si accendono entrambi
...

Pensa di mettere sul fuoco il caffè e l'acqua per la pasta e, in forno, la torta:
- allo scadere del 5° minuto togli il caffè
- allo scadere del decimo butta la pasta
- allo scadere del 45° togli la torta
Avatar utente
Foto UtenteDatman
162 4
Frequentatore
Frequentatore
 
Messaggi: 115
Iscritto il: 10 apr 2017, 22:57

0
voti

[13] Re: Far eseguire due funzioni indipendenti

Messaggioda Foto UtenteEcoTan » 20 ott 2020, 16:14

Macelettronic ha scritto:Vi posto il mio programma, il simulatore mi da errore nel secondo void loop

in cui hai omesso lo spazio (blank) fra void e loop.
L'altro loop non so se crei conflitto, in tutti i casi è superfluo come ti hanno detto.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5420
Iscritto il: 29 gen 2014, 8:54

0
voti

[14] Re: Far eseguire due funzioni indipendenti

Messaggioda Foto Utentegianc2020 » 21 ott 2020, 15:47

guarda la funzione millis, con i micro come atmega 328 deve farti a mano quello che su altri sistemi è 'quasi' nativo'.
https://www.arduino.cc/reference/en/lan ... me/millis/
Avatar utente
Foto Utentegianc2020
15 1 3
 
Messaggi: 25
Iscritto il: 3 giu 2020, 19:24

0
voti

[15] Re: Far eseguire due funzioni indipendenti

Messaggioda Foto Utentelemure64 » 21 ott 2020, 16:32

Macelettronic ha scritto:Dopo aver capito come far accendere un Led, volevo capire come poter far accendere un Led ed in contemporanea farne lampeggiare un altro, per capire come far eseguire due funzioni indipendenti in contemporanea.


Quello che vuoi, teoricamente si chiama macchina a stati finiti, dato che Arduino non ha il multitasking; ma con un compito così elementare (digital_write) che è praticamente istantaneo rispetto ai tempi della CPU puoi usare il sistema classico, o sue varianti. Cerco di instradarti dato che fin qui, avrò letto male io, risposte dirette alla domanda non ne ho viste.

Facciamo un caso ultra-semplice, ovvero dare il solo impulso di accensione ad alcuni LED. In sostanza per ciascun LED si dichiara una variabile dello stesso tipo restituito da "millis" (unsigned long o size_t? boooo, non ricordo) che conterrà il tempo in cui il LED è stato "impulsato" l'ultima volta, e la inizializzi con zero. A inizio loop leggi "millis", che chiamo T e poi per ciascun LED confronti T con quello dell'ultima accensione; se è maggiore o uguale all'intervallo prefissato viene eseguita una sezione di codice che fa due cose: { chiamare digital_write ; memorizzare T nella variabile relativa al led ; }. Quindi il tuo codice ha questa struttura: a inizio loop leggi T e lo memorizzi, poi ci saranno tanti blocchi come descritto sopra, uno per ciascun LED.

Ovviamente quanto sopra non fa praticamente niente di utile: non fa altro che chiamare digital_write ma (e questo è il "cambio di paradigma") per ciascun PIN a intervalli da te decisi per ciascuno. Il LED resta acceso dopo la prima chiamata ma intanto spero di averti fatto vedere come si approccia il problema. Non resta che estendere il meccanismo allo spegnimento che, come si dice, lasciato per esercizio al lettore :)
Avatar utente
Foto Utentelemure64
689 3 6
Stabilizzato
Stabilizzato
 
Messaggi: 421
Iscritto il: 23 giu 2020, 12:26

2
voti

[16] Re: Far eseguire due funzioni indipendenti

Messaggioda Foto UtenteWALTERmwp » 22 ott 2020, 22:54

@lemure64, post un po' ruvidi ci possono stare, il punto di vista personale o la sensazione del momento condiziona modi o contenuti, condivisibili o meno.
In questo thread la richiesta dell'OP, abbinata a quel codice, credo abbia "detto" a qualcuno più di quel ch'è stato scritto.
Però è vero che se uno se la sente può dare il suo contributo accompagnando chi lo cerca e in tal caso sarebbe buona cosa sapere se il tuo esempio è stato compreso.
Se Foto UtenteMacelettronic, che mi pare abbia retto bene le critiche(costruttive), ha visto la notifica magari ci può dire qualcosa, così, per un feedback.

In generale, l'inconsapevole approssimazione fa capolino in qualsiasi sezione ma per diversi motivi in questa si manifesta con maggior frequenza; poi dedicare del tempo a chi si affaccia in modo estemporaneo o superficiale, in ogni caso per avere una mano, resta comunque una scelta apprezzata.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

5
voti

[17] Re: Far eseguire due funzioni indipendenti

Messaggioda Foto UtentedrGremi » 22 ott 2020, 23:18

Si la cosa che non capisco e probabilimente mi tirerò dietro un sacco di critiche negative è perché rispondere. Cioè, prima di rispondere con un RTFM oppure con proposte di omicidio multiple misto ad altri reati ad una domanda qualsiasi con una risposta del tipo "ma lo sai fare? perché se lo sai fare allora fallo e se non lo sai fare imparalo" è meglio non rispondere proprio.

Oppure questo atteggiamento serve a diminuire la propria frustazione sentendosi superiori? Una domanda per molti banale non lo è sicuramente per chi l'ha fatta. Magari con una ricerca in più otteneva la risposta, magari non sapeva cercare.
Ma invece di sprecare il tempo a scrivere risposte da superiori perché non si risponde affatto e si passa a un altro topic "di maggior intelletto"? Forse è troppo difficile rispondere a domande complesse ed è più facile non rispondere affatto ai topic facili e dare sfogo agli istinti più bassi.

Comuque mi scuso per quanto detto, alla fine è off-topic, ma questo atteggiamento potrebbe rientrare nel manuale di come uccidere un forum. Essere puri e duri è facile, fa sentire migliori, ma alla fine purificando di qui, purificando lì non si salva nessuno e poi si scopre che così migliori non si è.

Un saluto.
Avatar utente
Foto UtentedrGremi
2.294 3 5 9
Master EY
Master EY
 
Messaggi: 1455
Iscritto il: 20 nov 2019, 19:49

0
voti

[18] Re: Far eseguire due funzioni indipendenti

Messaggioda Foto Utentelemure64 » 22 ott 2020, 23:41

WALTERmwp ha scritto:@lemure64, post un po' ruvidi ci possono stare, il punto di vista personale o la sensazione del momento condiziona modi o contenuti, condivisibili o meno.
In questo thread la richiesta dell'OP, abbinata a quel codice, credo abbia "detto" a qualcuno più di quel ch'è stato scritto.
Però è vero che se uno se la sente può dare il suo contributo accompagnando chi lo cerca e in tal caso sarebbe buona cosa sapere se il tuo esempio è stato compreso.


Capisco cosa vuoi dire e certe volte mi trovavo a rivestire lo stesso ruolo di bacchettatore costruttivo (da tempo non lo faccio più perché ho preso coscienza piena di quante cose non so...). Il mio intento era solo di complementare il ventaglio di risposte; c'è stata una parte "demolitiva" che spero abbia avuto il suo scopo, quello di far prendere coscienza della lontananza (colmabilissima) degli obiettivi. Ma mancava quella costruttiva e ho tentato semplicemente di riempire il vuoto. Non sottintendevo critiche a nessuno se non un pizzico di ironia, che non sempre riesco a dosare :)
Avatar utente
Foto Utentelemure64
689 3 6
Stabilizzato
Stabilizzato
 
Messaggi: 421
Iscritto il: 23 giu 2020, 12:26

1
voti

[19] Re: Far eseguire due funzioni indipendenti

Messaggioda Foto UtenteWALTERmwp » 23 ott 2020, 0:14

lemure64 ha scritto:(...) Il mio intento era solo di (...)
nessun problema, figurati.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[20] Re: Far eseguire due funzioni indipendenti

Messaggioda Foto Utentestefanopc » 23 ott 2020, 9:01

Se interessa ancora un modo di risolvere il problema io ti dico come faccio solitamente da autodidatta se devo gestire due eventi completamente asincroni.
Mettiamo di dover fare lampeggiare due led
uno 2 secondi acceso 2 secondi spento Collegato al pin LED 1
uno 3 secondi acceso 3 secondi spento Collegato al pin LED 2
Mi creo un contatore piuttosto lento che ad esempio conti da 1 a 1000 in 10 secondi e poi si resetta e ricomincia da 1 .
Nel ciclo che gestisce il contatore metto un primo confronto tra il contatore e una variabile che gestisce il timer del primo Led potrei chiamarla L1 e all'inizio vale 200
Tutte le volte che il contatore arriva a essere maggiore di L1 devo fare le seguenti operazioni :
Sommo a L1 il semiperiodo(200)
Inverto lo stato del pin Led1
Lo stesso per il secondo led.
Nel ciclo che gestisce il contatore metto un secondo confronto tra il contatore e una variabile che gestisce il timer del secondo Led potrei chiamarla L2 e all'inizio vale 300
Tutte le volte che il contatore arriva a essere maggiore di L2 devo fare le seguenti operazioni :
Sommo a L1 il semiperiodo(300)
Inverto lo stato del pin Led2

Quando il contatore arriverà a 1000 oltre a fare ricominciare da 1 devo anche gestire i contatori L1 ed L2 e se contengono un valore maggiore o uguale a 1000 (quasi sicuramente ) devo sottrarre 1000.
Spiegato molto grossolanamente e da adattare correttamente alle proprie esigenze potrebbe essere una idea per suggerirti una possibile soluzione alla tua richiesta.
Spero di non attirare le ire degli esperti... :D
Ciao
600 Elettra
Avatar utente
Foto Utentestefanopc
13,3k 5 9 13
Master EY
Master EY
 
Messaggi: 5566
Iscritto il: 4 ago 2020, 9:11

PrecedenteProssimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti