Da tempo ormai abbiamo imparato a smanettare con il nostro Arduino. Controlliamo apparecchiature complicatissime o accendiamo semplicemente un led. Siamo comunque sperimentatori…degli inventori….dei creativi….dei Makers 🙂
Il punto di forza di Arduino è come abbiamo detto molte volte…la semplicità…la praticità. Per far lampeggiare un led si impiegano pochi secondi….
Semplicità non vuol dire poca potenza…o giochi da bambini 🙂
Infatti … volendo … e’ possibile dialogare con il processore Atmega anche in maniera un po più diretta e “meno semplice”…il tutto per scoprire nuove funzioni e portare al massimo la CPU.
Se vogliamo accendere un led procediamo come segue:
settiamo il pin come output : pinMode(Pin, OUTPUT);
e poi portiamo il livello ALTO o BASSO con : digitalWrite(Pin, HIGH);
magari se siamo più addentrati mettiamo un cliclo e facciamo lampeggiare il led alla velocità che decidiamo noi….
….e fin qui tutto ok!
Ma se vogliamo cambiare lo stato di 2 o più pin contemporaneamente????
Voi direte….metto 2 o più righe di digitalWrite.
Si ma……sono più righe di codice e comunque sono istruzioni separate…che il processore, per quanto veloce, fa una dopo l’altra.
Non mi piace….voglio un comando che in una riga mi cambia lo stato di tutte le uscite contemporaneamente!
E se si cerca…il comando c’e’ !!!
Vi mando alla pagina ufficiale….se ve la volete leggere tutta!
Se no ve la spiego io ….
Arduino ha 3 porte :
- B uscite digitali da 8 a 13
- C ingressi analogici
- D uscite digitali da 0 a 7
Iniziamo a parlare alla CPU a suoni di 1 e 0…..parliamo semplicemnte….1 e’ abilitato…0 disabilitato.
Voglio settare i pin da 1 a 7 come output e lo 0 come input in un unico comando?
Ecco come :
DDRD = B11111110;
Voglio settare i pin 7,5 e 3 come HIGH e tutti gli altri LOW….in un unico comendo???
Ecco :
PORTD = B10101000;
Notate che gli 1 sono in corrispondenza dei pin da settare…
Semplice no??????
I programmi creati saranno più snelli, corti….e di conseguenza occuperanno molto meno spazio nella preziosa e limitata memoria del nostro Arduino.
Il semplice programma per far lampeggiare il led che trovate tra gli esempi dell’IDE, opportunamente modificato per far lampeggiare 3 led contemporaneamente, occupa circa 1400 byte se scritto nel modo classico….e solo 600 byte se compilato usando questo metodo alternativo!
Buon Lavorooooo 🙂
Ciao purtroppo sono alle primissime armi, potresti farmi un esempio concreto, con quello che hai scritto, di codice per accendere 4 led, due a due? Esempio: pin 1 e 3 due led che si accendono contemporaneamente e quando si spengono si accendono altri due led su altre due uscite tipo 9 e 11, tipo flipflop. Mi servirebbe per far accendere più led facendoli lampeggiare. Ti allego solo un mini codice preso su internet che funziona ma vorrei ampliarlo. Grazie mille. Mauri
// Project 1 – Police Lights by Dave1324
int ledDelay = 50; // delay by 50ms
int redPin = 9;
int bluePin = 11;
void setup() {
pinMode(redPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop() {
digitalWrite(redPin, HIGH); // turn the red light on
delay(ledDelay); // wait 50 ms
digitalWrite(redPin, LOW); // turn the red light off
delay(ledDelay); // wait 50 ms
digitalWrite(redPin, HIGH); // turn the red light on
delay(ledDelay); // wait 50 ms
digitalWrite(redPin, LOW); // turn the red light off
delay(ledDelay); // wait 50 ms
delay(100); // delay midpoint by 100ms
digitalWrite(bluePin, HIGH); // turn the blue light on
delay(ledDelay); // wait 50 ms
digitalWrite(bluePin, LOW); // turn the blue light off
delay(ledDelay); // wait 50 ms
digitalWrite(bluePin, HIGH); // turn the blue light on
delay(ledDelay); // wait 50 ms
digitalWrite(bluePin, LOW); // turn the blue light off
delay(ledDelay); // wait 50 ms
}
Mauri….per un programmino cosi semplice come quello che hai postato…o come quello che vorresti fare…ha poco senso il tutto. Mi spiego meglio..scriveresti meno codice e quindi risparmi memoria…ma su un programmone…non su un paio di righe per far lampeggiare due led.
In questo listato basta aggiungere altri 2 int per dichiarare altri 2 led e metterli di seguito nel listato. L’occhio non vedrebbe nessuna differenza e non avresti aumenti consistenti come occupazione di memoria.
Scusa il ritardo nella risposta ma sono stato occupato con il lavoro.
Si questo era solo un esempio preso in rete anche perchè io non lo saprei neppure fare.
Grazie mille per i consigli che mi hai dato. Alla prosima.
Mauri
Ciao!
Sono Marta. Dovrei realizzare un progetto in cui accendere 9 matrici LED contemporaneamente. Possiedo un arduino MEGA 2560. Purtroppo essendo una principiante ho qualche difficoltà nel trovare un metodo adatto per realizzare quanto detto.
Devo fare praticamente un tris: le 9 matrici devono mantenere contemporaneamente uno stato X o O durante il gioco.
Mi sembra che l’articolo di questa pagina https://www.danilolarizza.com/controllare-piu-pin-contemporaneamente-arduino/ possa effettivamente essermi d’aiuto ma sinceramente non so come implementarlo.
Riuscirebbe a darmi uno spunto?
Marta
Ciao io avrei bisogno di un consiglio per un progetto…
Vorrei che quando alimento arduino..
1) Si accende e tiene acceso un led
2) 2 Emetta un suono con un bunzer per qualche secondo
3) Si accende un secondo led (e tiene acceso anche il primo led)
praticamente deve dare l’effetto quanto segue..
corrente
led 1 acceso
suono magari 10 secondi
led 2 acceso
Ho provato vari modi ma cosi facendo mi manda in ciclo anche il bunzer all’infinito
come posso risolvere?
Ma non devi fare un ciclo…e’ solo una sequenza.
posta il listato o mandamelo via email e ci ragioniamo su.
Ciao Danilo
leggendo il tuo articolo sull’uso contemporaneo dei pin d’uscita di arduino in particolare sull’uso del comando PORTD = B10101000; in cui sono attivi in contemporanea i pin 7,5,3 ti chiedo se e possibile avere uno sketch completo d’esempio in cui i pin da 1 a 7 di arduino siano attivi alti ( high ) .
ringraziandoti anticipatamente colgo l’occasione per inviarti i piu cordiali saluti
alessandro
Ciao alessandro, basta usare portd = b11111110 e tutti i pin da 1 a 7 saranno hight.
Salve, ma se si 7 output volessi far cambiare di stato solo alcuni pin e gli altri non cambino di stato, come si può fare?
Grazie
Claudio
Ciao Claudio, ogni valore 1 é un valore alto…ogni 0 é basso. Creo stringhe con uno e zero….e il gioco é fatto.
Buona sera,
Premetto che sono un neofita che sta cercando di comprendere il linguaggio Arduino. Mi sono cimentato a costruirmi con i neopixel utilizzando un Arduino uno un orologio e sono riuscito dopo numerosi fallimenti e lettura di Internet nel mio intento evidenziando anche ogni cinque minuti il relativo led acceso. Però desidero fare accendere anche i led a parte giorni del mese, giorno della settimana mese e se fattibile anche l’anno utilizzando dei neopixel da 8, da 12 e da 32 (8*4), ma come era prevedibile mi sono perso, potrebbe darmi un aiuto.grazie
Buongiorno Pasquale, naturalmente lei comprende che da un commento e’ impossibile darle una risposta. Il progetto che lei ha seguito e’ composto da uno schema e da un circuito. Non sapendo di che si tratta…dare una risposta è cosa ardua. Buona Giornata.
Cerco di spiegarmi meglio. Ho creato una codifica su arduino uno. Come detto precedentemente ho utilizzato un cerchio di 60 neopixel per creare l’orologio. Allo scadere delle ore 24,00 dovrebbero accendersi il neopixel per il giorno del mese (1/31) e contemporaneamente accendersi il megapixel del giorno della settimana (1/7). Al successivo giro di boa spegnersi i led armadietti e accendere i neopixel successivi e così via
Buongiorno, il sistema di strisce led neopixel basa il funzionamento su un indirizzo da dare a ciascun led. L’articolo scritto ha un altro obiettivo, ovvero quello di comandare due o più pin dell’arduino contemporaneamente. Per risolvere il suo problema e’ tutta questione di codice non riconducibile pero’ al suddetto articolo.