Power Consumed Pulse Counter
Link Articolo Originale: http://www.grix.it/viewer.php?page=8378
Semplice sistema per monitorare la potenza consumata mediante un contatore su guida DIN con Arduino + Ethernet
La domotica mi ha sempre affascinato e in questo periodo sto studiando una "rete" di sensori per il controllo remoto della mia abitazione. Come primo progetto ho deciso di monitorare tramite TCP-IP i consumi della rete elettrica in modo da poter effettuare una elaborazione dei dati su un computer Client Remoto.
I Moderni Contatori su guida DIN sono provvisti secondo la "DIN 43-864" di una uscita optoisolata per acquisire i consumi mediante un datalogger. Tale uscita si presenta con due terminali denominati SO+ e SO-.
clicca per ingrandire |
clicca per ingrandire |
Questo è il circuito equivalente interno :
Le uscite non sono altro che i terminali Collettore ed Emettitore di un transistor lasciato in configurazione open-collector. Il contatore restituisce 2000 impulsi (eccitando il transistor) per ogni kWh letto. Per ottenere tali impulsi si dovrà collegare un resistore di pull-up sul terminale SO+ :
Con tale configurazione, quando il consumo di potenza dell'abitazione è minore di 4W (risoluzione minima del contatore) esso non invia impulsi sui pin SO, il transistor non è in conduzione e sul pin DATA si avrà un valore logico alto pari a Vcc=5V :
Nessun impulso sul pin SO ,consumo < 4W
Quando il consumo è maggiore di 4W, il contatore incomincia a restituire una serie di impulsi. Ad ogni impulso entra in conduzione il transistor e sul pin data si avrà un valore logico basso:
In presenza di impulsi sul pin SO ,consumo > 4W
La durata dell'impulso misurata è di 86 ms.
Per determinare il consumo di potenza è necessario calcolare il tempo che intercorre tra un impulso e un altro.
2000 impulsi = 1KWh => tempo che intercorre tra due impulsi: 3600 sec / 2000 = 1.8 sec
Ciò significa che se l'intervallo di tempo che intercorre tra un impulso e un altro è pari a 1.8 sec, allora la potenza consumata in quel periodo di tempo è pari ad 1KW.
Esempio: è stato collegato al contatore un carico di circa 800W (phon), il contatore ha restituito una serie di impulsi intervallati da 2.44 sec
(1.8 sec / 2.44 sec ) * 1000 = 737.7 W
Come sistema per acquisire gli impulsi ho scelto l'Arduino, per chi ancora non conosce la board vi rimando al mio primo articolo. Certo la board è un po' sprecata visto che sarà necessario un solo pin digitale però è la migliore soluzione che ho trovato, in quanto all'Arduino è possibile inserire una ulteriore board con modulo ethernet. Il contatore non si trova vicino al client che memorizzerà le letture su database e quindi la soluzione migliore è quella di un Arduino con modulo ethernet. Anche se utilizzato un solo pin per la letture della potenza, il "sistema" è molto espandibile.
clicca per ingrandire |
Per determinare l'intervallo tra due impulsi viene utilizzato un interrupt con trigger sul fronte di discesa del segnale. Quando un primo impulso porta il segnale da H a L, viene richiamato l'interrupt0 dell'arduino che aziona un timer (in us). Quando viene ricevuto un secondo impulso l'interrupt disabilita il timer. Una volta determinato l'intervallo viene calcolata la potenza consumata secondo la formula precedente.
Il Client per ottenere le misurazioni si connette all'Arduino mediante il protocollo Telnet. Per avere un controllo giornaliero (24h/24h) è necessario un computer Client sempre attivo che consuma abbastanza potenza! Come client ho utilzzato una foxboard che tramite TCP-IP recupera i campioni dall'arduino, e li memorizza in un database per elaborare un grafico che verrà visualizzato in una pagina html. I campioni possono essere acquisiti da qualsiasi PC o sitema dotato di comunicazione TCP-IP e non è necessaria una foxboard! Ad esempio se disponete di un router con Linux OpenWrt con esso si possono elaborare i dati provenienti dall'arduino, senza lasciare il PC sempre acceso. Se non disponete di tutto ciò si può reaizzare un' applicazione per PC di tipo Real-Time che recupera i campioni e visualizza i consumi su un grafico in "tempo reale".
Arduino Codice Sorgente
server.println()
Download Codice Sorgente