Progettino per la tesina

Ciao a tutti,
mi presento… Sono Joseph Balzano e sono uno studente 18enne che quest’anno deve sostenere la maturità D:
Arrivo subito al dunque… Già da di diversi mesi ho in mente di fare un progetto, mi sono documentato su tutto quello che avrei dovuto prendere per arduino ed è arrivata l’ora di ordinare il tutto. Ora come ora però mi sta venendo in mente una grande domanda, che non riesco per niente a capire. Arrivando, con più di 4 anni di programmazione alle spalle, di tantissimi linguaggi di programmazione, il più dei quali ad oggetti credo di non aver ancora ben capito il funzionamento pratico di Arduino… Mi spiego meglio :confused: La mia domanda è: Posso con Arduino mentre sto facendo rilevazioni per esempio con un accelerometro interrompere il tutto, perchè per esempio qualcuno ha appoggiato il suo tag NFC sul modulo apposta? Una sorta di evento/funzione chiamata solo quando viene “appoggiato” il tag NFC?
Posso farlo? Se si come? Mi dareste una semplice dritta? :slight_smile:
Grazie mille in anticipo :slight_smile:

La mia domanda è: Posso con Arduino mentre sto facendo rilevazioni per esempio con un accelerometro interrompere il tutto, perchè per esempio qualcuno ha appoggiato il suo tag NFC sul modulo apposta? Una sorta di evento/funzione chiamata solo quando viene "appoggiato" il tag NFC?

Lo fai con l'impiego di un interrupt, ma arduino non è l'unico a possedere un micro con alcuni interrupt.... direi che tutti i microcontroller e/o microprocessori ne possiedono almeno uno.

[http://arduino.cc/en/Reference/attachInterrupt[/url](http://arduino.cc/en/Reference/attachInterrupt)

Non credo che sia necessario usare un interrupt perché il controllo del NCF non é cosí critico che Arduino deve reagire nei prossimi µS.

Secondo me basta leggere nel loop() l' interfaccia NFC.

Ciao Uwe

esatto un megaloop che richiama le sequenze...forse il punto è che non si ha ancora afferrato che tutto è sequenziale su qualsiasi macchina poi ti sembra che avvenga nello stesso momento perchè magari non riusciamo a vedere manco i msecondi

Okkey, ma mettiamo che io sono per esempio in un ciclo dove ogni secondo rilevo posizioni dei tre assi dell'accelerometro, in un'intervallo di venti secondi. In quei venti secondi, arduino è sostanzialmente freezato no? :/

Grazie comunque delle risposte :)

La risposta è blinkWithoutDelay ;) invece di bloccare il proseguimento del codice verifichi che siano trascorsi tot secondi dall'ultima volta che hai eseguito quell'istruzione

Quindi Arduino va avanti a leggere il codice e solo quando sono trascorsi tot secondi rifai quell'azione? Altra domanda se la rilevazione va a termine (ci sono più di tot movimenti in un'intervallo) io dovrei aprire il canale al modulo GSM che a quel punto dovrebbe inviare un messaggio e andare su un sito finchè il tag NFC non viene riappoggiato, come faccio a fare tutto questo?

Io ho pensato, successivamente alla rilevazione degli assi e se si verifica una determinata condizione apro un ciclo interno che mi rileva altre cose e invia il tutto, ma sempre stessa domanda come faccio ad uscire da questo ciclo? .-.

Il problema che mi fotte è la programmazione ad oggetti. Tutta un'altra cosa e completamente diversa da Arduino :(

P.s. Se qualcuno riesce mi potrebbe spiegare meglio il funzionamento degli Interrupt? :/

JosephBalzanoDev: [...] che quest'anno deve sostenere la maturità D:

Che sennò cade? Mettici sotto un bel cuneo di legno!

Ora come ora però mi sta venendo in mente una grande domanda, che non riesco per niente a capire. Arrivando, con più di 4 anni di programmazione alle spalle, di tantissimi linguaggi di programmazione, il più dei quali ad oggetti credo di non aver ancora ben capito il funzionamento pratico di Arduino.. Mi spiego meglio :/ La mia domanda è: Posso con Arduino mentre sto facendo rilevazioni per esempio con un accelerometro interrompere il tutto, perchè per esempio qualcuno ha appoggiato il suo tag NFC sul modulo apposta? Una sorta di evento/funzione chiamata solo quando viene "appoggiato" il tag NFC? Posso farlo? Se si come? Mi dareste una semplice dritta? :) Grazie mille in anticipo :)

Il problema che mi fotte è la programmazione ad oggetti. Tutta un'altra cosa e completamente diversa da Arduino :(

P.s. Se qualcuno riesce mi potrebbe spiegare meglio il funzionamento degli Interrupt? :/

Quattro anni passati a studiare i linguaggi object-oriented e neanche uno a studiare i bassi fondi. Interrupt è quello che avviene a te quando impegnato a programmare ti arriva una telefonata, tu metti in pausa il task "programmare" e salti al task "vedi chi telefona". PS:Nello stesso modo in cui capita perdersi una telefonata quando sei oberato, il micro può perdere una interruzione.

Per non provare questo senso di smarrimento con Arduino ti serve un lungo giro nei bassi fondi. Il problema che ti poni esiste scrivendo un programma per qualunque tipo di microcontroller, pic, ARM, AVR, ecc. Il motivo è legato alla mancanza del sistema operativo che su un PC compie l'impensabile. Senza OS devi fare tutto tu a mano, e non c'è un supervisore che ti impedisce di scrivere in ram ad un indirizzo arbitrario, per dire nel più bello puoi fare eseguire al micro uno azzeramento della RAM, con il risultato imprevedibile.

Ciao.

Lucailvec: il punto è che non si ha ancora afferrato che tutto è sequenziale su qualsiasi macchina poi ti sembra che avvenga nello stesso momento perchè magari non riusciamo a vedere manco i msecondi

il punto è che la domanda è molto chiara

JosephBalzanoDev: La mia domanda è: Posso con Arduino mentre sto facendo rilevazioni per esempio con un accelerometro interrompere il tutto, perchè per esempio qualcuno ha appoggiato il suo tag NFC sul modulo apposta? Una sorta di evento/funzione chiamata solo quando viene "appoggiato" il tag NFC?

Interrompere il tutto .... significa ignorare tutto il resto e saltare ad una subroutine ... in risposta alla sua domanda la soluzione migliore per me è un interrupt. Anche perchè non sappiamo quanto sarà lungo e complesso il programma adesso o in futuro, se cominci a impegnare un po' di seriale, un po' di I2c, controlli registri vari, puoi scordarti di farlo con un millis() e non parliamo di us nemmeno con un loop() vuoto, parliamo di un 16Mhz con un IDE core che fa parecchi giri prima di arrivare, puoi fare il programma grande, lungo e lento quanto vuoi, un interrupt avrà sempre la priorità.

Interrompere il tutto .... significa ignorare tutto il resto e saltare ad una subroutine ... in risposta alla sua domanda la soluzione migliore è un interrupt. Anche perchè non sappiamo quanto sarà lungo e complesso il programma adesso o in futuro, se cominci a impegnare un po' di seriale, un po' di I2c, controlli registri vari, puoi scordarti di farlo con un millis() e non parliamo di us nemmeno con un loop() vuoto, parliamo di un 16Mhz con un core che fa parecchi giri prima di arrivare.

Non mi sembra abbia vincoli di tempo ristretti da dover fare miracoli per rispettarli. Ci sarebbe da capire cosa intende con; interrompere il tutto.

Se vuole eseguire compiti a tempo senza impegnare la cpu l'unica è quella di usare un timer interno o esterno con tutte le complicazioni che comporta specie per un principiante. Proprio per questo un giro nei bassi fondi gli schiarirà le idee.

La maggior parte dei programmini Arduino usa millis, quando ci sono vincoli temporali da rispettare fiscalmente millis e Arduino style è controproducente.