Archivi tag: microcontrollore

Arduino LilyPad – lezione 04: suono

Per questa lezione ho utilizzato LilyPad Buzzer che ho acquistato su Sparkfun. Si tratta di un piccolo buzzer induttivo con due pin I/O in grado di riprodurre suoni di un livello sufficientemente alto da poter essere sentiti ad esempio se avete il buzzer in tasca, ma non aspettatevi livelli sonori elevatissimi.
Le dimensioni sono di 20 mm di diametro e 0,8 mm di spessore.

Passo 01

Come consigliato nella lezione n. 3 procedete anche per questa piccola scheda alla realizzazione del supporto protettivo in cartocino al fine di evitare scivolamenti dei morsetti a coccodrillo.

Passo 02

Collegate il “+” del buzzer al piedino 9 di LilyPad e il “-” del buzzer al “-” di LiLyPad come rappresentato nell’immagine:

Passo 03

Avviate l’IDE di Arduino e copiate ed incollate il codice che trovate di seguito:

/* Arduino LilyPad: lezione 04: suono
 * Uso del modulo buzzer
 * Michele Maffucci LilyPad Buzzer per realizzare semplici note musicali
 * https://www.maffucci.it/2011/06/30/arduino-lilypa-zione-04-suono/
 * Progetto originale:
 * http://web.media.mit.edu/~leah/LilyPad/07_sound.html
 * per un grafico sulle differenti frequenze delle note:
 * http://www.phy.mtu.edu/~suits/notefreqs.html
 */
 
int ledPin = 13;	// il LED è connesso al pin digitale 13
int speakerPin = 9;	// il buzzer è connesso al pin digitale 9 (uscita di tipo PWM)
 	 
void setup()	 
{	 
         pinMode(ledPin, OUTPUT);		// si imposta ledPin come pin di output
         pinMode(speakerPin, OUTPUT);	// si imposta speakerPin come pin di output
}	 
 	 
void loop()	// inizio del loop
{	 
          scale();		// chiamata della funzione scale()
          delay(1000);	// attesa di 1 secondo
}	 
 	 
void beep (unsigned char speakerPin, int frequencyInHertz, long timeInMilliseconds)		// funzione che produce il suono
{	 
          int x;
          
          // converte il periodo della nota in un intero lungo
          long delayAmount = (long)(1000000/frequencyInHertz);
          
          long loopTime = (long)((timeInMilliseconds*1000)/(delayAmount*2));
          
			for (x=0;x<loopTime;x++)
				{
					digitalWrite(speakerPin,HIGH);
					delayMicroseconds(delayAmount);
					digitalWrite(speakerPin,LOW);
					delayMicroseconds(delayAmount);
				}
}	 
 	 
void scale ()
{	 
			// speakerPin: piedino LilyPad; numero da: 2093 a 4186: frequenza della nota; 500: durata della nota

			digitalWrite(ledPin,HIGH);	//accende il LED
			beep(speakerPin,2093,500);	//C: suona le note C (C7 come da tabella linkata sopra) per 500ms
			beep(speakerPin,2349,500);	//D
			beep(speakerPin,2637,500);	//E
			beep(speakerPin,2793,500);	//F
			beep(speakerPin,3136,500);	//G
			beep(speakerPin,3520,500);	//A
			beep(speakerPin,3951,500);	//B
			beep(speakerPin,4186,500);	//C
			digitalWrite(ledPin,LOW);	//spegne il LED
}

Un long è un tipo intero lungo che può contenere un numero intero positivo o negativo (quindi senza punto decimale) di 32 bit con valori compresi tra 2.147.483.647 a – 2.147.483.648

Analizziamo con molta attenzione la funzione beep.

long delayAmount = (long)(1000000/frequencyInHertz); ?

Domanda: cosa vuol dire 1000000/frequencyInHertz:

Vi ricordo che il periodo di una forma d’onda è:

T =1/f

dove f è la frequenza espressa in Hertz. L’unità di misura del periodo T è il secondo.

quindi la formula:

1000000/frequencyInHertz

può essere scritta come:

1000000 * (1/frequencyInHertz)

ovvero:

1000000 * T

Domanda: perché moltiplichiamo per 1000000?

Perché la variabile delayAmount verrà passata a delayMicroseconds() che è una funzione che mette in pausa il programma per un tempo, espresso in microsecondi, specificato dal parametro.

Domanda: ma in un secondo quanti microsecondi ci sono?

1 milione di microsecondi

Ecco spiegato l’arcano, poichè delayMicroseconds() accetta un parametro in microsecondi bisogna moltiplicare 1/frequencyInHertz per 1000000.

Domanda: cosa vuol dire (long) nell’istruzione:

long delayAmount = (long)(1000000/frequencyInHertz);

Per spiegare questa linea di codice devo parlarvi di Type-casting.
In C è possibile forzare il tipo di una variabile (int, long, float, …) in un altro tipo, utilizzando l’operatore “()

Ad esempio:

int a;
int b=67;
float c=3.14;
float d;
char lettera='M';

/* assegna il valore 3 (solo la parte intera) ad a */
a=(int)c 

/* assegna il valore 77 (codice ASCII) ad a */
a=(int)lettera

/* assegna alla variabile d il valore di b, 67.0 (valore float) */
d=(float)b

In alcuni casi il Type-casting viene fatto automaticamente dal compilatore in altri casi bisogna specificarlo. Il Type-casting è una richiesta al compilatore di trasformazione di tipo.

Quando siamo in dubbio è buona norma eseguire il Type-casting.

Il Type-casting risulta utile ad esempio in una divisione:

int x, y;
float w;

w=(float)x/(float)y;

questa operazione assicura che la divisione sia in floating-point.

Tornando alla nostra istruzione:

long delayAmount = (long)(1000000/frequencyInHertz);

quando effettuiamo un passaggio di valore ad una funzione bisogna convertire long in (long , infatti delayAmount viene passata a delayMicroseconds.

Domanda: ma cos’è delayAmount?

è il periodo T della frequenza della nota.

Domanda: a cosa serve loopTime?

loopTime definisce il numero di volte in cui la nota deve essere suonata.

Infatti nel corpo del for:

digitalWrite(speakerPin,HIGH);
delayMicroseconds(delayAmount);
digitalWrite(speakerPin,LOW);
delayMicroseconds(delayAmount);

si ha:

digitalWrite(speakerPin,HIGH);

viene messo ad alto l’uscita speakerPin (pin 9)

delayMicroseconds(delayAmount);

la nota viene suonata per un tempo delayAmount, periodo della della nota

l’uscita speakerPin (pin 9) viene portata a massa (spento)

digitalWrite(speakerPin,LOW);

per una quantità di tempo pari al periodo:

delayMicroseconds(delayAmount);

La variazione del timbro della nota avviene se utilizzate la modulazione di larghezza di impulso in inglese Pulse Width Modulation, in questo modo se il treno di impulsi è sufficientemente elevato l’orecchio umano non percepirà una sequenza di impulsi ma un suono costante.

Arduino LilyPad – lezione 03: controlliamo l’accensione di un led con un pulsante

Questa lezione ha lo scopo di realizzare un sistema che rilevi il cambiamento di stato e per far ciò costruiremo un rudimentale pulsante con due fili alle cui estremità vi sono delle pinzette a coccodrillo, quando i due fili saranno collegati, vorrà dire che il pulsante è chiuso, quando i due fili saranno scollegati il pulsante sarà aperto.

Per questo esperimento utilizzeremo due connettori alle cui estremità sono collegati dei morsetti a coccodrillo, prima di procedere vi consiglio di ritagliare una cartoncino di forma circolare con stesse dimensioni di LilyPad, ciò eviterà che le pinzette scivolino e che grattino la base inferiore isolata della scheda.

Passo 1

avrete bisogno di:

  • un cartoncino
  • una matita
  • un paio di forbici

tracciate una circonferenza prendendo come riferimento LilyPad

Passo 2

ritagliate lungo il bordo, fate in modo che la circonferenza tagliata sia leggermente più grande.

Passo 3

In questo modo il morsetto a coccodrillo dovrebbe avere una presa sicura senza il pericolo di scivolare e buon contatto elettrico.



Procedete allo stesso modo per i sensori e gli attuatori che collegherete a LilyPad mediante le pinzette a coccodrillo, anche per essi ritagliate dei cartoncini anti scivolamento.

Programmazione

Passo 1

Collegate un coccodrillo nero al morsetto negativo (indicato con -) ed il coccodrillo bianco al morsetto digitale 2, come indicato nell’immagine:

Quando collegate i due coccodrilli insieme vorrà dire che chiudete il circuito (interruttore chiuso) ed elettricamente vuol dire che collegate il pin digitale 2 direttamente a terra o “-“.

Vi ricordo che in Arduino “-” vuol dire “terra” e in Processing viene rappresentato con “LOW”, mentre “+” o “+5V” e in Processing  viene indicato con “HIGH”.

Passo 2

copiate il codice che segue in una finestra vuota:

int ledPin = 13;	                    // il LED e' connesso al pin digitale 13
int switchPin = 2;	                    // switch e' connesso al pin digitale 2
int switchValue;	                    // una variabile che tiene traccia quando il pulsante viene premuto

void setup()
{
  pinMode(ledPin, OUTPUT);	            // ledPin viene definito come pin di output
  pinMode(switchPin, INPUT);	            // switchPin viene definito come pin di input
  digitalWrite(switchPin, HIGH);            // poniamo di default switchPin ad HIGH (non premuto)
}	 

void loop()                                 // loop del programma
{
  switchValue = digitalRead(switchPin);	    // verifica se il pulsante e' premuto
  if (switchValue == LOW) {	            // se il pulsante e' premuto allora,
    digitalWrite(ledPin, HIGH);	            // accende il LED
  }
  else {	                            // altrimenti,
    digitalWrite(ledPin, LOW);	            // il led viene spento
  }
}

All’interno del loop:

viene memorizzato lo stato del pulsante in switchValue con

switchValue = digitalRead(switchPin);

Se il pulsante non è premuto switchValue assumerà il valore assegnato nel setup():

digitalWrite(switchPin, HIGH);

Poiché il circuito non è chiuso verso terra il LED rimarrà spento.

La condizione dell’IF:

..(switchValue == LOW)..

non risulta vera e quindi sarà eseguita la parte else dell’IF

digitalWrite(ledPin, LOW);

cioè il LED risulterà spento.

Se colleghiamo i coccodrilli, switchValue assumerà il valore “LOW” in quanto collegato direttamente alla terra (morsetto nero) e la condizione dell’IF

if (switchValue == LOW)

risulterà verà e quindi sarà eseguita la parte del codice:

digitalWrite(ledPin, HIGH);

e quindi il LED verrà acceso.

Bene! avete realizzato il vostro secondo scketch per LilyPad.

Nelle successive lezioni vedremo come collegare altri sensori ed attuatori a LilyPad.

Arduino LilyPad – lezione 02: facciamo lampeggiare un led

Installazione IDE Arduino

Per l’installazione dell’IDE prendete come sempre riferimento le guide sul sito Arduino oppure quelle che trovate su questo sito:

Installazione su Mac OS X
Installazione UBUNTU

Configurazione IDE

Di seguito trovate i passi per selezionare la porta seriale e la scheda dall’IDE Arduino per Mac OS X, per gli altri sistemi operativi il procedimento è analogo, seguite le istruzioni che trovate su questo sito facendo attenzione a selezionare la porta seriale e la scheda corretta.

Collegate il vostro LilyPad al computer ed avviate l’IDE Arduino.

Noterete, non appena collegate il cavo USB al computer i led TX e RX disposti sull’adattatore USB incominciano a lampeggiare, così come il led su LilyPad, dopo qualche secondo si spengono.

Selezionate la scheda: Tools -> Board -> LilyPad Arduino w/ ATmega328

Selezionate la porta seriale corretta: Tools -> Serial Port -> /dev/tty.usbserial-A8004wec

Esempio di programmazione: il nostro “amico” blink

La programmazione del dispositivo è identica a quella che potreste fare su qualsiasi altra scheda Arduino e quindi potete tranquillamente seguire il corso che trovate su questo sito facendo le dovute modifiche rispetto alla piedinatura.
Per questa breve introduzione userò il solito programma Blink.

Dagli esempi aprite lo sketch Blink:

File -> Example -> 1.Basic -> Blink

Lo sketch Blink:

Compilate il programma:

Se tutto va a buon fine al fondo della finestra apparirà il messaggio: “Done compiling”

Effettuate l’upload dello sketch sulla scheda, mentre viene effettuatta questa operazione lampeggiano i led RX e TX e dopo qualche istante lampeggerà il led sulla scheda:

Fate attenzione se vi compaiono messaggi di errore in fase di uloading è molto probabile che abbiate selezionato una porta seriale non corretta:

Se tutto a ha buon fine comparirà il messaggio “Done uploading”

Bene! Avete realizzato il vostro primo programma per LilyPad.

Arduino LilyPad – lezione 01: conoscere la scheda

Durante il prossimo anno scolastico continuerò il corso su Arduino e sperimenterò con i miei allievi anche l’uso di LilyPad, vorrei realizzare un progetto che sto portando avanti da qualche tempo che riguarda la realizzazione di un sistema indossabile per il rilevamento istantaneo di alcune grandezze fisiche che dovranno essere tradotte in tempo reale in grafici su computer e report su web.

Le lezioni su LilyPad che pubblicherò nei prossimi giorni su questo sito, saranno utilizzate durante il prossimo anno scolastico e potranno essere suscettibili di modifiche ed integrazioni. Tutte le lezioni su LilyPad, articoli e commenti importanti saranno accessibili direttamente dalla sezione: Impariamo ad usare Arduino dove trovate anche le lezioni che sto realizzando su Arduino UNO, dispense e link a risorse gratuite.

Queste lezioni prendono spunto dal tutorial che trovate al seguente link, a cui ho aggiunto esempi, filmati e dettagli tecnici.

I componenti utilizzati in questo tutorial sono stati acquistati sul sito SparkFun.

e per questo esempio ho utilizzato il kit: LilyPad Pro Kit in cui il microcontrollore sulla scheda LilyPad è l’ATmega328V.
La scheda LilyPad di questo kit corrisponde alla revision 4 (indicata sul sito arduino.cc come LilyPad Arduino 04)

Arduino LilyPad è una scheda studiata appositamente per applicazioni creative che possono essere indossate, infatti la scheda ha la possibilità di essere cucita su tessuti e i vari dispositivi possono essere interconnessi tra di loro mediante filo da sartoria conduttivo. Ha una forma circolare con diametro di 50 mm, spessore 0,8 mm.

LilyPad può essere programmato con il software Arduino dalla versione 10.0 o superiori.
La scheda può essere alimentata attraverso la presa USB del computer o mediante alimentazione esterna (mediante apposito adattatore). Può funzionare nel range di tensione che va da 2,7 a 5 V.
Rispetto alle altre schede Arduino, LilyPad risulta molto più fragile, inoltre fate attenzione a non superare la tensione di alimentazione di 5 V, rischiereste di romperla.
Maggiori informazioni sulle caratteristiche tecniche potete trovarle seguendo il link, se volete una prima guida seguite invece questo link, mentre per un tutorial andate qui.

Per quanto riguarda la piedinatura fate riferimento alle due immagini che vi allego:

fonte: westfw via Arduino forum

fonte: oreilly.com

Quindi l’elenco dei piedini è il seguente:

Piedino 1 – TX/D1
Piedini 2,3,4 – D2, D3, D4
Piedino 5 – GND o “-” (terra)
Piedino 6 – Vcc o “+” (alimentazione)
Piedino 7,8,9,10,11,12,13,14,15 – piedini digitali da D5 a D13
Pins 16,17,18,19,20,21 – piedini analogici da A0 a A5

Connettore superiore:

Piedino 1 – DTR
Piedino 2 – RX1
Piedino 3 – TX0
Piedino 4 – VCC
Piedino 5 – CTS (collegato a massa)
Piedino 6 – GND

Collegamento al computer

LilyPad può essere connessa al computer utilizzando i 6 pin che trovate sopra la scheda (nel mio caso):

Le modalità di collegamento sono 2:

FTDI Basic Breakout – 3.3V quella utilizzata da me.

USB FTDI TTL-232 cable – TTL-232R 3.3V

Se la vostra scheda è dotata di 4 connettori ed appartenente alla revision 2, allora per poterla collegare al computer dovete seguire il tutorial che trovate al seguente link.

Nella prossima lezione incominceremo a programmare!

Arduino – lezione 05: controllo presenza

Questa lezione nasce da un commento di Aldo Biscotti (seguite il link), che ha la necessità di realizzare l’illuminazione temporizzata delle scale di casa. Si sta cimentando in questo progetto e la sua richiesta di aiuto mi da parecchi spunti per la realizzazione di una lezione ad hoc per i miei allievi.
Per la realizzazione del suo progetto avrà la necessità di usare dei sensori di presenza, che in questa lezione saranno sostituiti da semplici pulsanti.

Dal commento che mi è stato lasciato desumo che la necessità descritta da Aldo è quella di comandare due lampade di due ambienti diversi mediante due distinti rilevatori di presenza.
Nel realizzare un primo prototipo di studio Aldo giustamente, visto che sta imparando a programmare Arduino, utilizza i pulsanti in sostituzione dei rilevatori e i diodi led in sostituzione delle lampade.

Questa la sua necessità:

Pulsante 1:
(salita) start,
accensione del led 1,
dopo 2 secondi accensione led 2,
dopo 2 secondi spegnimento led 1,
dopo 2 secondi spegnimento led 2,
end.

Pulsante 2:
(discesa) start,
accensione del led 2,
dopo 2 secondi accensione led 1,
dopo 2 secondi spegnimento led 2,
dopo 2 secondi spegnimento led 1,
end.

Grazie Aldo.

Risponderò ad Aldo prendendo in analisi il suo primo sketch e da questo ne svilupperò una serie di programmi in cui introdurrò nuovi concetti.

Innanzitutto realizziamo il primo circuito di test, costituito da due diodi led, una resistenza ed un pulsante, in questa lezione vedrete che utilizzerò sia una scheda Arduino UNO, che Arduino 2009, assolutamente simili dal punto di vista della programmazione:

Questo invece il disegno realizzato con Fritzing

l5-02b-arduino

Analizziamo il primo sketch.

// Esempio 1: accensione led

int led_1 = 8;
int led_2 = 9;
int btn_pin = 2; 

void setup() {
     pinMode(led_1, OUTPUT);
     pinMode(led_2, OUTPUT);
     pinMode(btn_pin, INPUT);
} 

void loop()
{
     int in = digitalRead(btn_pin);
     if (in == LOW)
     {
         digitalWrite(led_1, LOW);
         delay (2000);
         digitalWrite(led_2, LOW);
         delay (2000);
     }
      else
     {
         digitalWrite(led_1, HIGH);
         delay (2000);
         digitalWrite(led_2, HIGH);
         delay (2000);
     }
}

Non funziona molto bene, come si desume dal filmato vi sono alcune correzioni da fare:

Nell’if viene controllato se il pulsante non è stato premuto “in == LOW”, se vero vengono spenti in modo sequenziale i due LED, domanda:

Se una luce è già spenta perché aggiungere un ritardo?

Ciò implica che se il programma è in esecuzione nella prima parte dell’if non verrà rilevata la presenza di una persona al massimo per 4 secondi ed è come dire che appena entro nella stanza sarò al buio per 4 secondi prima che le luci vengano accese e quindi una persona potrà:

  • fermarsi ed attendere 4 secondi
  • oppure camminare per 4 secondi al buio compiendo circa 5 metri di spazio camminando, presumibilmente supererà la prima stanza al buio.

Questa la mia prima variazione:

// Esempio 2: accensione temporizzata di un led in una sola direzione

#define led_1 8    // il pin 8 è usato per il LED
#define led_2 9    // il pin 9 è usato per il LED
#define btn_pin 2  // il pin 2 è usato per il PULSANTE 1

// Variabili
int in = 0;

void setup() {
     pinMode(led_1, OUTPUT);    // impostiamo il pin led_1 come output
     pinMode(led_2, OUTPUT);    // impostiamo il pin led_2 come output
     pinMode(btn_pin, INPUT);   // impostiamo il pin btn_pin come input
} 

void loop()
{
     in = digitalRead(btn_pin); // assegna lo stato del pulsante
     if (in == HIGH)            // controlla se il pulsante è stato premuto
     {
         digitalWrite(led_1, HIGH);  // accendiamo il LED 1
         delay (2000);               // attesa di 2 sec
         digitalWrite(led_2, HIGH);  // accendiamo il LED 2
         delay (2000);               // attesa di 2 sec
         digitalWrite(led_1, LOW);   // spegniamo il LED 1
         delay (2000);               // attesa di 2 sec
         digitalWrite(led_2, LOW);   // spegniamo il LED 2
     }
}

Controllo se il pulsante e premuto, se vero inizia la sequenza di accensione, altrimenti se il pulsante non è premuto l’if non viene eseguito, le luci continuano a rimanere spente e ricomincia nuovamente il loop().
Ovviamente se durante la sequenza di accensione e spegnimento di 6 secondi viene premuto nuovamente il pulsante non accade nulla, vedremo più avanti che questa soluzione potrebbe causare qualche problema.

Vediamo adesso come utilizzare due pulsanti (o rilevatori di presenza) per governare l’accensione in senso opposto, il circuito realizzato è il seguente:

Questo lo sketch

// Esempio 3: accensione temporizzata di due led
// in due direzioni con uso dell'if 

#define led_1 8    // il pin 8 è usato per il LED
#define led_2 9    // il pin 9 è usato per il LED
#define btn_pin1 2  // il pin 2 è usato per il PULSANTE 1
#define btn_pin2 3  // il pin 3 è usato per il PULSANTE 2

// Variabili
int in1 = 0;        // variabile per memorizzare lo stato del PULSANTE 1
int in2 = 0;        // variabile per memorizzare lo stato del PULSANTE 2

void setup() {
     pinMode(led_1, OUTPUT);
     pinMode(led_2, OUTPUT);
     pinMode(btn_pin1, INPUT);
     pinMode(btn_pin2, INPUT);
} 

void loop()
{
     in1 = digitalRead(btn_pin1);
     in2 = digitalRead(btn_pin2);

     if (in1 == HIGH && in2 == LOW)  // se PULSANTE 1 premuto e PULSANTE 2 no sequenza 1
       {
           digitalWrite(led_1, HIGH);
           delay (2000);
           digitalWrite(led_2, HIGH);
           delay (2000);
           digitalWrite(led_1, LOW);
           delay (2000);
           digitalWrite(led_2, LOW);
       }
     if (in1 == LOW && in2 == HIGH)  // se PULSANTE 1 premuto e PULSANTE 2 no sequenza 2
       {
           digitalWrite(led_2, HIGH);
           delay (2000);
           digitalWrite(led_1, HIGH);
           delay (2000);
           digitalWrite(led_2, LOW);
           delay (2000);
           digitalWrite(led_1, LOW);
       }
}

Come potete notare ho usato l’operatore logico AND (&&) che effettua un controllo su quale dei pulsanti è acceso in questo modo controllo la direzione di accensione.

Per chiarire meglio ho realizzato uno schema che visualizza meglio cosa accade:

Si ricordi che la progettazione viene fatta usando pulsanti, ma voi estrapolate e pensate a dei rilevatori di presenza.

Supponiamo che la direzione sia da destra a sinistra, la persona 1 viene rilevata dal sensore R1, si accende la luce L1 per 2 secondi, entra nella stanza 2 e supponendo che non sia più veloce di due secondi, rischiando di entrare in una stanza buia, viene rilevato dal sensore R2, si accende la luce L2 e dopo 4 secondi si spegne la luce L1.

Ma cosa accade se nei primi 2 secondi entra un’altra persona nella prima stanza a destra?
La seconda persona resta al buio.
Stesso inconveniente accade nella direzione opposta da sinistra verso destra.

Quindi per superare questo incoveniente è necessario che l’accensione delle luci non duri solamente per un tempo prefissato, ma per tutto il tempo in cui la persona è presente nel locale, dopo di che la luce può spegnersi.

La soluzione più semplice di tutte è quella descritta dallo sketch che segue, si ricordi che premere il pulsante corrisponde a: “persona rilevata”

// Esempio 4: accensione di due led comandati da due pulsanti

#define led_1 8    // il pin 8 è usato per il LED
#define led_2 9    // il pin 9 è usato per il LED
#define btn_pin1 2  // il pin 2 è usato per il PULSANTE 1
#define btn_pin2 3  // il pin 3 è usato per il PULSANTE 2

// Variabili
int in1 = 0;
int in2 = 0;

void setup() {
  pinMode(led_1, OUTPUT);
  pinMode(led_2, OUTPUT);
  pinMode(btn_pin1, INPUT);
  pinMode(btn_pin2, INPUT);
} 

void loop()
{
  in1 = digitalRead(btn_pin1);
  in2 = digitalRead(btn_pin2);

  if (in1 == HIGH)                  // PULSANTE 1 premuto
  {
    digitalWrite(led_1, HIGH);      // accensione LED 1
  }
  else
  {
    digitalWrite(led_1, LOW);      // seil PULSANTE 1 non premuto LED 1 spento
  }

  if (in2 == HIGH)                  // PULSANTE 2 premuto
  {
    digitalWrite(led_2, HIGH);      // accensione LED 2
  }
  else
  {
    digitalWrite(led_2, LOW);      // seil PULSANTE 2 non premuto LED 2 spento
  }

}

Per evitare che ci sia uno spegnimento brusco dell’illuminazione appena si esce dalla stanza, ritardo lo spegnimento dell’illuminazione della stanza che ho appena abbandonato:

// Esempio 5: accensione di due led comandati da due pulsanti
// con ritardo di spegnimento di due secondi

#define led_1 8    // il pin 8 è usato per il LED
#define led_2 9    // il pin 9 è usato per il LED
#define btn_pin1 2  // il pin 2 è usato per il PULSANTE 1
#define btn_pin2 3  // il pin 3 è usato per il PULSANTE 2

// Variabili
int in1 = 0;
int in2 = 0;

void setup() {
  pinMode(led_1, OUTPUT);
  pinMode(led_2, OUTPUT);
  pinMode(btn_pin1, INPUT);
  pinMode(btn_pin2, INPUT);
} 

void loop()
{
  in1 = digitalRead(btn_pin1);
  in2 = digitalRead(btn_pin2);

  if (in1 == HIGH){                 // PULSANTE 1 premuto
    digitalWrite(led_1, HIGH);      // accensione LED 1
    delay (2000);                   // ritardo di 2 sec
  }
  else
  {
    digitalWrite(led_1, LOW);       // se il PULSANTE 1 non premuto LED 1 spento
  }

  if (in2 == HIGH){                 // PULSANTE 2 premuto
    digitalWrite(led_2, HIGH);      // accensione LED 2
    delay (2000);                   // ritardo di 2 sec
  }
  else
  {
    digitalWrite(led_2, LOW);        // seil PULSANTE 2 non premuto LED 2 spento
  }
}

Nella prossima lezione al fine di rendere più utile e gradevole il controllo sull’illuminazione della stanza vedremo come aumentare e diminuire gradualmente l’illuminazione usando una tecnica che sfrutta la modulazione di larghezza di impulso (PWM).


Vai alle altre lezioni:

Lezione01: Incominciamo con Arduino Arduino – lezione 02: facciamo lampeggiare un led Arduino – lezione 03: controlliamo un led con un pulsante
Lezione Arduino Lezione Arduino Lezione Arduino
Arduino – lezione 04: realizzare un programma che identifica le variazioni di stato Arduino – lezione 05: controllo presenza
Lezione Arduino Lezione Arduino