
Un pulsante capacitivo per accendere le luci di una stanza
Immaginiamo che bello poter arrivare a casa e dover accendere la luce solo sfiorando con un dito una piccola porzione di muro, che ha al suo interno un interruttore nascosto, quello di cui sto parlando è di creare un pulsante capacitivo in grado di far accendere e spegnere una luce in una stanza. L’idea di questa realizzazione non è ovviamente mia, ma di Paul Bagder, il concetto che sta alla base di tutto il progetto è data dallo strumento Theremin, che è quello strumento “musicale” che si suona avvicinando e allontanando le mani da un asta di ferro, ecco un'immagine rappresentativa:
Come funziona è semplicissimo, questo strumento semplicemente rileva la presenza di carica su un corpo nelle sue vicinanze e ne calcola la sua capacità complessiva.
E' disponibile online una libreria scritta da Paul Bagder da utilizzare con Arduino Uno e si chiama Capacitive Sensing Library, abbreviata capSense, scaricabile gratuitamente da:
http://www.arduino.cc/playground/Main/CapSense
Oltre alla libreria c’è anche un descrizione dettaglia del suo utilizzo e del principio di funzionamento di questo tipo di sensore compreso la sintassi utilizzata per richiamare le varie funzioni al suo interno.
Passiamo ora alla realizzazione pratica, per prima cosa ecco cosa ci occorre:
- Arduino Uno ovviamente oppure anche Arduino 2009
- Un foglio di alluminio piccolo
- Un led verde o qualsiasi altro va bene ugualmente
- Una resistenza nell’ordine dei Mega ohm
Per quanto riguarda la resistenza apro una piccola parentesi, più è grande la resistenza inserita è piu è sensibile il nostro pulsante alla nostra presenza, il che significa che se noi ad esempio mettiamo una resistenza nell’ordine dei 10 – 20 Mega ohm il sensore ci rileva la presenza della mano a una distanza di qualche cm di distanza dal sensore. Io ho preferito optare per una resistenza di 2 Mega ohm, funziona lo stesso discretamente, mettendo quella basta sfiorare il foglio di alluminio e il sensore ti rileva.
Passiamo al circuito da costruire:
Il sensore è un filo con una estremità scoperta, abbastanza lungo, questo filo va messo in mezzo ad un foglio piccolo di carta stagnola piegato in due.
La resistenza da 2 Mega ohm và collegata tra i pin digitali 2 e 4, mentre il led tra GND e il pin digitale 12, ricordatevi solo di mettere una piccola resistenza tra il led e gnd o tra led e pin 12, in modo da non farlo bruciare.
Giusto per mettervi a conoscenza, per chi non lo sapesse, il disegno del circuito l'ho creato con un programma che si chiama Fritzing, disponibile gratuitamente a questo indirizzo:
http://fritzing.org/
Ora l'unica parte che ci manca è programmare il firmware per Arduino, ecco il sorgente:
CapSense cs_4_2 = CapSense(4,2);
int i = 0;
void setup()
{
pinMode(12,OUTPUT);
cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);
Serial.begin(9600);
}
void loop()
{
long total = cs_4_2.capSense(30);
delay(150);
Serial.println(total);
if (total >60)
{
i++;
Serial.println("Acceso");
}
switch (i)
{
case 1:
digitalWrite(12,HIGH);
break;
case 2:
digitalWrite(12,LOW);
i=0;
break;
}
}
Vediamo ora la sintassi base della libreria CapSense.h:
- CapSense cs_4_2 = CapSense(4,2);
Questa stringa ci dice dove viene collegata la resistenza, ossia tra il pin 4 e il pin 2, ovviamente questi due valori possono essere cambiati, l'importante e che siano pin digitali.
- cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);
Serve per impostare il tempo di auto calibrazione del sensore, ponendo la funzione in questo modo viene disattivata l’auto calibrazione del sensore.
- long total = cs_4_2.capSense(30);
Questa variabile registra la capacita totale misurata sommando 30 campioni, anche qui il 30 può essere cambiato come si vuole.
Ho aggiunto nel sorgente anche la possibilita di far comunicare arduino con il serial monitor, è una funzionalità in più che si può anche eliminare perché non compromette la corretta esecuzione del firmware.
Con le corrette modifiche al circuito, collegando ad esempio dei relè e altri componenti potremmo trasformare questo progettino e considerarne un reale utilizzo in casa.

>Questi non li riesco a capire…premetto che ho solo un’infarinatura di programmazione..
Mi aiutate?:)< mmmm... rileggiti i post e il codice dell'articolo che ora è corretto. Per la resistenza dal momento che c'è ne una solo si riferisce per forza a quella che nell'articolo dice di avere messo da 2 Mega ohm. Ciao.
Ciao, non ho approfondito più di tanto, ma da programmatore la prima cosa che ho notato e la mancanza del header file, che guardando al link http://www.arduino.cc/playground/Main/CapSense, si capisce qual’è l’header da includere.
Le applicazioni di questo sensore sono molteplici, la prima che mi viene in mente riguarda la sostituzione del pulsante con cui accendiamo le luci di casa, anche se mi sembra di ricordare che alcune aziende del settore abbiano già interruttori di questo tipo.
Tuttavia io rimango della idea che un bel deviatore è ancora meglio del pulsante più relè per accendere le luci.
Ciao.
Grazie della segnalazione,
l’include vuoto era sfuggito anche a me 🙂
(problema dovuto solo alla visualizzazione, in html l’include è presente. Risolto con l’uso dei caratteri html speciali)
a proposito, nel codice relativo alla libreria che hai linkato, mi sembra ci sia una svista:
CapSense cs_4_2 = CapSense(4,2); // 10 megohm resistor between pins 4 & 2….
CapSense cs_4_5 = CapSense(4,5); // 10 megohm resistor between pins 4 & 6….
CapSense cs_4_8 = CapSense(4,8); // 10 megohm resistor between pins 4 & 8….
sbaglio o il 5 andrebbe sostituito con 6 (o viceversa) ?
Pensavo di essermi dimenticato qualche pezzo, comunque nel caso
CapSense cs_4_5 = CapSense(4,5); // 10 megohm resistor between pins 4 & 6….
la resistenza è tra i pins 4 & 5 e non tra i 4 & 6
Non conosco quell’errore, riprova a scrivere il programma nell’ide senza copiare.
Il loop per la prova di compilazione lo puoi lasciare vuoto, se compila riempi il loop.
Sembra più un errore di battitura, non so hai inserito qualche carattere “\” inavvertitamente. Potrebbe anche essere che non trova il file header che hai incluso.
Riprova un pò con calma, con la convinzione che hai scritto qualcosa di sbagliato, se non trovi nulla poi vediamo.
Ciao.
Ciao,
come dice maurotec prova a scriverlo direttamente tu sull’ IDE, magari possono esserci problemi di battitura, per quanto riguarda la resistenza il sorgento è compilato per funzionare con il circuito della foto. Per quanto riguarda il valore della resistenza puoi variarla a tuo piacimento, per il grado di sensibilità, io quando l’ho sperimentato ne avevo solo una da 2M ohm e i risultati ottenuti erano più che accettabili
Esatto KOral, ci sono due resistenze, una va sul diodo per evitare che l’uscita del microcontroller si bruci ma anche per limitare la corrente che scorre nel diodo led.
Comunque Stefano88 si riferisce alla resistenza da 2M ohm come ha ribadito lui stesso. Ti consiglio di inscriverti al forum di Arduino e di studiare un pò di elettronica di base, niente di complicato solo l’ABC. Sul forum di arduino troverai vecchi post dove si discute della capacità di corrente massima fornibile dal microcontroller come la potenza massima, insomma da leggere c’è tanto. Ti fornisco alcuni nick di utenti Arduino che sanno il fatto loro:
Ovviamente Io MauroTec, Astrobeed, Leo72, Menniti, lesto, uwefed ecc,
Troverai di sicuro modo di crescere ed imparare.
Ciao.
Scusa ma avevo perso un po’ di vista il post, che il led Tx lampeggi è normale perché Arduino invia dati al pc sul Serial Monitor, il motivo che non ti funzioni nulla può essere magari l’errata configurazione della velocità, dove è collegata l’usb di arduino, io ho impostato 9600 magari la tua è diversa, per impostare questa velocità basta andare su gestione dispositivi e poi alla voce Arduino, tasto destro, proprietà se non mi sbaglio. Magari è quello il problema che non funzionava più nulla.
Per quanto riguarda la seconda domanda sinceramente non ci ho mai fatto caso e non ho mai fatto quel tipo di prova.
Per risolvere l’errore prova a cancellare gli spazi all’inizio di ogni riga.
Per me ha funzionato
Ciao
Cosi mi sembra un po troppo generica la domanda. COSA vuoi imparare a programmare?
Una volta che hai le idee chiare fai una ricerca su questo sito.
ciao a tutti,
ho intenzione di relaizzare il circuito in oggetto. Sono un novizio della programmazione, quindi ti chiedo:
il listato riportato nell’articolo tiene conto delle varie modifiche o va riguardato tenendone conto?
Grazie
Franco
Ciao!!
Ho realizzato un touch all'interno di una scatola 503 con una placca della bticino…
Avrei bisogno di chiarimenti se qualcuno può aiutarmi.
Cosa strana…
Provato il tutto vicino al Pc con porta seriale collegata e i valori oscillano su dei numeri bassi.
Sfiorando il sensore tutto ok … mi comanda il relè e accende la luce.
Ok fin qui tutto apposto…
Spostato il tutto a muro, preciso che li vicino ho il differenziale(non so se può essere utile come informazione), la soglia del sensore per far scattare il relè devo portarla intorno ai 1200 altrimenti il touch spegne e accende da solo la luce.
Quindi cambiata la soglia a 1200 tutto ok… Ho utilizzato il touch per 2 o 3 giorni fino ad oggi che come per magia di colpo a ricominciato a funzionare da solo..
Portata la soglia a >1300 funziona di nuovo…Non capisco !!!
Secondo voi e possibile che se imposto cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF); a cs_4_2.set_CS_AutocaL_Millis(0); forse risolvo il problema perchè in questo caso il sensore va in autocalibrazione e quindi aprendo la seriale fino a quando non sfioro il sensore lui gira con un valore di 0 ???
Spero possiate aiutarmi … non posso rischiare che mentre non sono a casa questo impazzisce e tutto il giorno la luce si spegne e si accende!! Grazie!!!!!!
Buongiorno, mi rendo conto che ‘articolo è un po’ vecchio, ma ciò nonostante è brutto vedere dei segnaposto senza immagine. La prima immagine (riferita penso al Theremin) non si vede e il link è rotto: https://it.emcelettronica.com/files/u16604/there
grazie