Tutorial: Shield I/O comandare luci esterne

In un precedente articolo dedicato alla shield I/O hai visto come assemblarla passo passo e provato un primo sketch dimostrativo delle potenzialità della shield stessa.

shield Input Output

Ripartendo proprio da quell’articolo ho realizzato un video con 6 led ad alta luminosità che si accendono e spengono in sequenza, ma non vorrai fermarti a questo …

Immagina di utilizzare al posto dei led delle luci, i relè montati sulla scheda supportano fino a 125v e 0.5A questo è un po’ limitante se vuoi utilizzare lampade classiche a 220v ma se scegli di utilizzare illuminazione a led per la domotica può essere una buona base da cui sviluppare il tuo progetto.

Iniziamo dal video demo:

Il collegamento dei led in questo caso è stato molto semplice tutti i poli negativi ( massa) sono collegati tra loro e attraverso una resistenza di 470Ω al polo negativo della shield. Tutti i terminali positivi sono collegati ad uno ad uno ai relè che hanno come terminale comune il polo positivo, una foto è senza dubbio migliore di 1000 parole per cui ecco quello che ti ho descritto:

In questa configurazione l’accensione e lo spegnimento dei led ( o luci a led della vostra abitazione ) è pilotato solo dallo sketch che ho caricato su Arduino:

int out=0;

long interval = 1000;

void setup() {
  for (int out=8; out<=13; out++){
    pinMode(out, OUTPUT);
  }
}

void loop()
{
  for (int out=8; out<=13; out++){
    digitalWrite(out, HIGH);
    delay(interval);
  }

  delay(interval);    

  for (int out=8; out<=13; out++){
    digitalWrite(out, LOW);
    delay(interval);
  }

  delay(interval);
}

Come avrai già notato è una semplificazione dello sketch mostrato nell’articolo precedente perchè il suo scopo è pilotare solo le 6 uscite digitali (8-13).

Per ottenere questo effetto nella funzione loop() hai due cicli identici di tipo for 13-16 e 20-23, il primo ciclo:

linea 13: definisci un ciclo di tipo for da 8 a 13, i pin a cui sono connessi i relè;

linea 14: per ciascun pin invia il segnale HIGH al pin corrispondente;

linea 15: attendi un intervallo di 1 sec. (definito alla linea  03) prima di passare al pin successivo;

Allo stesso modo le linee 20-23 rieseguono un ciclo da 8 a 13 inviando il segnale LOW ad ogni uscita (linea  21);

… Il divertimento arriva ora …

Di uno sketch come quello visto fino ad ora te ne fai poco, puoi al massimo fare una demo ai tuoi amici.

Vorrai utilizzare questa shield in modo più utile, un primo suggerimento è prendere tutta la serie di articoli sui giochi di luce di Natale ed adattarla per essere utilizzata con la shield I/O otterrai dei fantastici giochi di luce per il tuo prossimo Natale 🙂

Una seconda e più interessante applicazione è collegare alle 6 porte di ingresso digitale (pin 2-7 di Arduino) degli interruttori classici da parete ed inserire il tuo progetto nella scatola di derivazione elettrica di casa, potrai accendere le luci di casa attraverso Arduino, il vantaggio immediato è che puoi utilizzare dei pulsanti al posto degli interruttori tradizionali e quindi avere più combinazioni e scenari programmabili, ad esempio potresti decidere che con un solo pilsante vuoi che si accendano le luci dell’ingresso e del salotto o con un’altro quelle della cucina e della kappa.

Ecco uno sketch che accende una luce alla pressione del pulsante corrispondente e la spegne ad una nuova pressione:

int out[6]={8,9,10,11,12,13};
int in[6]={2,3,4,5,6,7};
int stato[6]={0,0,0,0,0,0};

long interval = 1000;

void setup() {
  for (int i=0; i<6; i++){
    pinMode(out[i], OUTPUT);
    pinMode(in[i], INPUT);
  }
}

void loop()
{
  for (int i=0; i<6; i++){
    if (digitalRead(in[i]) == LOW) {
      if (stato[i] == 0) { stato[i] = 1; }
      else               { stato[i] = 0; }
      delay(300);
    }
    digitalWrite(out[i], stato[i]);
  }
}

Il codice non è complesso, tuttavia ti invito a prestare attenzione ad alcuni passaggi:

linea 01: definisci un array di tipo int (out[6]) in cui inserisci i pin di  Output di Arduino utilizzati dalla scheda;

linea 02: similmente alla linea 1, definisci i pin di tipo INPUT, quelli che accettano i segnali digitali provenienti dai pulsanti;

linea 03: definisci un array di tipo int il cui scopo è memorizzare lo stato delle 6 uscite o luci corrispondenti;

linee 07-12: definisci la funzione setup() in cui con un ciclo da 0 a 6 per ciascun valore degli array in e out imposti la modalità di INPUT o OUTPUT per i pin corrispondenti;

linee 14-16: definisci la funzione di loop() e il ciclo for identico a quello visto per la funzione setup(), lo scopo del ciclo for è quello di eseguire per ciascun loop dello sketch delle verifiche ed operazioni su tutti i pin di input ed output;

linea 17: alla pressione di uno dei pulsanti collegati agli ingressi 2-7, Arduino rileva un segnale LOW in quanto avrai avuto cura di connettere a massa ( GND ) il terminale collegato all’uscita, la pressione del pulsante porta a LOW (massa o GND) il rispettivo pin;

linee 18-19: sei in questa condizione se hai premuto un pulsante, verifichi lo stato dell’uscita corrispondente e lo reimposti al valore contrario, se lo stato è 0 lo imposti ad 1, se lo stato è 1 lo imposti a 0;

linea 20:  attendi 300 millisecondi prima di procedere al controllo successivo sul pin seguente, questo tempo puoi variarlo a piacimento, regola il tempo di attesa in cui la pressione del pulsante non ha effetto, è quello che qualcuno chiama ritardo di pressione, in pratica con tempi molto piccoli non fai in tempo a rilasciare il pulsante prima che Arduino rilevi il nuovo stato, considera che Arduino lavora a 16MHz;

Curiosità: il tempo di reazione di una persona è normalmente di 1 sec, 1000 millisecondi;

linea 22: è la linea che fa tutto, invia lo stato al pin di output corrispondente, premo il pulsante connesso al pin 3 si accende o spegne la luce connessa al pin 9.

Ed ecco un video dimostrativo:

Buon divertimento.

Cortesemente, prima di inserire i commenti leggi il regolamento

Permanent link to this article: http://www.mauroalfieri.it/elettronica/tutorial-shield-io-comandare-luci-esterne.html

10 comments

1 ping

Skip to comment form

    • Alessandro on 12 marzo 2013 at 14:19
    • Reply

    Salve le volevo rivolgere una domanda , sarei intenzionato col mio arduino 2 a controllare le accensione luci del camper ( tutte con un unico pulsante o al massimo con 2 , premendo semplicemente più volte associo il punto luce desiderato, controllo temperatura abitacolo più pilotaggio n 2 ventole riscaldamento e lettura displey stato ventole , in fine mi piacerebbe poter motorizzare la mia parabola

    La ringrazio della sua cortesia nel leggere il messaggio

    1. Ciao Alessandro,
      il progetto mi sembra moto interessante.
      Ti consiglio di procedere per gradi, parti con la gestione delle luci e dei pulsanti, poi procedi con la temperatura, il display e le ventole.

      Mauro

    • Alessandro on 12 marzo 2013 at 21:39
    • Reply

    Salve Mauro grazie per aver preso visione di ciò che le ho scritto ma in riguardo le chiedo un aiutino , nn è moltissimo che ho incominciato a usare arduino quindi le volevo chiedere come era possibile risolvere il problema del pulsante per accendere più di una pigiando più volte , e dove posso trovare un buon manuale per capire tutte quelle formule da usare la ringrazio

    1. Ciao Alessandro,
      ti consiglio di seguire le lezioni del corso on-line gratuite, sul blog.
      Non ho capito a quali formule ti riferisci.

      Mauro

  1. Buon Giorno Mauro non sapendo come contattarti ti scrivo qua avrei bisogno di parlarti riguardo ad un applicazione che vorrei realizzare con arduino ed è la seguente: tramite pc quindi con un software comandarte n relè, multipli di 8 che si attivano e disattivano tramite rete lan puoi aiutarmi a trovare o realizzare questa cosa grazie e attendo una tua risposta ILARIO LUZI

    1. Ciao Ilario,
      ieri ti ho scritto dalla casella info del Blog, puoi usare quella per contattarmi.

      Mauro

    • Fabrizio on 26 agosto 2013 at 22:44
    • Reply

    Ciao Mauro, da pochissimo ho iniziato a programmare l’arduino cercando di realizzare una sorta di domotica per casa composta da 4 relè comandati sia da una pagina web che con pulsanti in più volevo usare le entrate analogiche come termometri o addirittura come termostato per dare il consenso alla caldaia, il tutto visualizzato su una pagina html. Ovviamente sto procedendo per gradi, ho trovato uno sketch che per pilotare relè dalla pagina web ed ora sono impantanato sul comando a pulsanti. Domani proverò questo tuo sketch visto che con l’altro (http://www.mauroalfieri.it/elettronica/arduino-led-pulsante.html) l’ho provato a ripetere x4 relè ma funziona alla perfezione solo il primo. Su questo sketch non ho capito come collegare elettricamente gli imput, di solito collego una resistenza da 10k dall’imput a gnd per LOW e sempre con la resistenza da 10k dall’imput a 5v per HIGH (anche se sul tuo tutorial “arduino led pulsante” bastava solo collegare la resistenza da al gnd per dare l’imput e mantenere lo stato) ma non riesco prorprio a capire cosa vuoi dire spiegando la linea 17, mi potresti dare una mano? Altra cosa, per quale motivo, dagli sketch che leggo non si usa mai il pin1?

    P.s. usando l’ethernet shild i pin 10-11-12-13 sono occupati quindi mi farebbe comodo usare anche il pin1.

    Grazie mille…

    1. Ciao Fabrizio,
      il tuo progetto è molto interessante e l’approccio che stai tenendo lo è altrettanto.
      Partire per gradi è senza dubbio un ottimo modo di iniziare sopratutto considerando la tua giovane esperienza con Arduino.

      Il mio blog è nato proprio per aiutare chi come te ha voglia di sperimentare e provare.
      Sui pulsanti trovi molti articoli, l’importante è ricordare che la resistenza puoi collegarla verso la massa ( Gnd ) o verso il positivo ( +5v ) e ciò che cambia è il valore che leggi sull’ingresso arduino. Prova a realizzarti un semplice sketch di lettura del pulsante e farti scrivere nel monitor seriale il valore letto, comprenderai meglio cosa intendo.

      La linea 17 dice ciò che hai già capito da solo: collegando il pin arduino a terminale del pulsante in modo che alla pressione dello stesso il circuito si chiuda verso massa ( Gnd ) ti consentirà di leggere LOW sul pin Arduino.

      I pin 0 e 1 sono riservati alla comunicazione seriale tra Arduino ed il Pc, in pratica attraverso quei pin comunichi sia nel momento in cui invvii lo sketch ad arduino, sia durante il suo funzionamento per comunicare con il serial monitor dell’IDE arduino.
      Puoi utilizzare anche il pin Digitale 0 ed 1 per i tuoi progetti ma ti persi la possibilità di utilizzarli per il monitor seriale e quindi per il Debug del progetto.

      Mauro

    • mirco1973 on 1 settembre 2013 at 00:24
    • Reply

    ciao,

    sono alle prime armi con arduino, ho una shield i/o come nel tuo pregetto, volevo chiederti come poter fare sketch per poter attivare e disattivare le 6 uscite, usando pero il serial monitor, cioè attivare a piacere le uscite io…
    se puoi darmi aiuto ti ringrazio.

    mirco1973

    1. Ciao Mirco,
      se sei alle prime armi e ti piacerebbe iniziare a sperimentare con arduino ti consiglio di leggere il mio corso on-line gratuito o partecipare ad uno dei miei prossimi corsi in aula per imparare a interagire con il monitor serale e gli input/output arduino.

      Mauro

  1. […] è molto differente da quello che hai letto in questo articolo “Tutorial: Shield I/O comandare luci esterne” ho apportato alcune modifiche allo sketch per poter utilizzare dei normali interruttori e non dei […]

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.