Il wattmetro digitale fai da te è un progetto completo dedicato a tutti quelli che desiderano conoscere il consumo dei propri elettrodomestici. Per esempio, vi siete mai chiesti quanto costa lasciare il televisore in modalità stand-by per tutta la notte? oppure volete sapere quanto le diverse configurazioni del frigorifero influiscono sulla bolletta elettrica? Se la risposta è sì, allora sarete felici di usare un wattmetro per misurare il consumo energetico dei vostri dispositivi. In questo progetto andremo a vedere come si realizza un wattmetro digitale AC.
Caratteristiche del wattmetro digitale fai da te
Quello che andremo a costruire è un wattmetro, che può misurare il reale consumo di energia di un dispositivo connesso ad una linea elettrica da 230vrms/50Hz. Il microcontrollore PIC raccoglie la tensione e le informazioni sulla corrente grazie all'aiuto delle ADC e poi calcola la tensione RMS della rete elettrica, la corrente RMS utilizzata dal dispositivo e il risultante consumo medio di energia. Tutte queste informazioni vengono poi visualizzate sullo schermo Lcd.
Il wattmetro non necessita di una fonte di energia esterna, perché la riceve dalla rete. Nonostante ciò, la parte del microcontrollore è completamente isolata dai componenti che si interfacciano con la rete elettrica.
Progetto del circuito
Gli schemi del progetto sono stati realizzati con SoloCapture, l'editor di SoloPCB per gli schemi.
Per calcolare l'energia, abbiamo bisogno di conoscere la tensione che passa attraverso il carico e quanta corrente viene utilizzata dal carico. La tensione da misurare è direttamente la tensione della rete.
Sappiamo che essa è di 230Vrms/50Hz, ma ha una tolleranza del 10%. Sappiamo che la tensione della rete può variare tra 207Vrms e 253Vrms, quindi per ottenere un valore accurato è opportuno misurare la tensione della rete, senza inserire i 230Vrms nel calcolo.
La linea principale è collegata al connettore AC IN (j1). Per la misurazione della tensione viene collegata una rete di partitori di tensione (R1, R2, R3) tra la fase e le linee neutrali. Con l'aiuto del partitore, la tensione di rete viene ridotta al fattore di R1/(R1+R2+R3) = 1/201, che converte +o- 320V (picco) in +o-1.59V.
Viene poi eseguito il passaggio a 2.5V, che alla fine porta i +o- 320V a 0.91V - 4.09V, perfettamente nel range di 0V-5V .
Dopo i processi di riduzione e di modifica, la tensione attraverso R2 viene letta dall'ADC MCP3202. Poi l’informazione viene elaborata dal microcontrollore in formato 12 bit attraverso una interfaccia SPI. Per isolare la parte del microcontrollore dalla sezione che si interfaccia con la rete elettrica, sono stati usati optoaccoppiatori HCPL-0630 ad alta velocità. Il secondo canale di input analogico del microcontrollore viene utilizzato per leggere la tensione di riferimento da 2.5V e funge da fattore di correzione per i calcoli.
Mentre le linee neutrale e di terra provenienti dal connettore AC IN sono direttamente collegate al connettore AC OUT (j2), la linea di fase passa attraverso il sensore di corrente ACS712-20A (U4) per la misurazione della corrente.
Il sensore rilascia 2.5V a 0A. Quando la corrente scorre tra i terminali IP+ e IP-, l’output del sensore cambia ad un passo di 100m V/A. Quindi la tensione di output diventa 4.5V a +20A e 0,500V a -20A. L’output del sensore viene letto da un altro integrato Microchip, MCP3202, e inviato al microcontrollore sempre attraverso SPI: ACS712 offre isolamento interno, così da non richiedere interventi all’esterno.
Il sensore di corrente ACS712 è in grado di leggere +- 20° ma, considerando le limitazioni di corrente dei blocchi del terminale, il percorso della corrente AC è protetto da un fusibile 16A collegato in serie alla linea di fase.
Ci sono due isolate fonti da 5V per alimentare la rete ed il microcontrollore. Il trasformatore genera 2x6Vrms da 230Vrs. Ogni output viene rettificato dal raddrizzatore a ponti di diodi e poi regolato dai regolatori lineari 78L05. D2a D3 sono i Led che indicano lo stato di ogni alimentatore da 5V.
Il microcontrollore del wattmetro è il PIC18F252; in pratica legge la tensione e la corrente e calcola la tensione RMS, la corrente RMS e l’energia media. Poi si interfaccia con lo schermo LCD e mostra tutti questi valori. È dotato di un modulo SPI che permette di comunicare con gli ADC MCP3202. Il master clock del microcontrollore è a 5Mhz quando viene utilizzato un oscillatore al cristallo da 20Mhz. È presente un connettore ICSP (j3) che viene utilizzato per programmare il PIC.
Wattmetro analogico fai da te: il progetto della PCB
Realizzare il wattmetro come un dispositivo palmare è stata una buona idea e il contorno della PCB è stato disegnato di conseguenza. Autocad è stato impiegato per creare il contorno e il file .dxf è stato importato in SoloPCB.
Tutti i footprint che non sono inclusi nelle librerie SoloPCB sono stati creati manualmente e possono essere trovati nei file di progetto di SoloPCB.
Le linee (fase, neutro e messa a terra) che collegano il connettore AC IN al connettore AC OUT sono state disegnate più spesse possibile, mentre i condensatori di bypass sono posizionati più vicino possibile agli IC. Per AGND e DGND sono stati progettati due piani di terra separati per tenere bassa la resistenza di terra.
Tutti i componenti sono stati posizionati sul layer superiore; per rivestire sia il layer superiore che quello inferiore è stato utilizzato una copertura di acrilico.
Software per il wattmetro fai-da-te
Il microcontrollore legge i campioni di tensione e di corrente ogni millisecondo e raccoglie 40 coppie di campioni; poi calcola i valori RMS e la potenza media. Il periodo di 1 ms viene generato utilizzando il modulo Timer A, che funziona in modalità 16 bit e produce un interrupt ad ogni overflow.
Quindi assegniamo un valore di partenza in ogni ciclo e attendiamo l’innesco del primo millisecondo.
Dopo aver raccolto tutti i campioni, inizia il processo di calcolo; la tensione RMS e la corrente RMS vengono calcolate utilizzando l’equazione qui sotto
I campioni di tensione e di corrente includono la relazione di fase tra la tensione e la corrente, quindi la reale potenza AC, che è data da V*I* cosθ, può essere ottenuta calcolando la potenza media tramite l’equazione riportata di seguito.
I valori RMS risultanti vengono visualizzati sul display Lcd, utilizzando la libreria lcd.h del compilatore C della CCS.
L’intero codice C viene fornito alla fine di questo articolo con il resto della documentazione in allegato.
Assemblaggio e test del wattmetro fai da te
Di seguito viene elencata la lista delle parti necessarie al progetto
Quantity | Part Description | Designator |
---|---|---|
2 | 78L05 5V 0.1A Regolatore lineare SOT-89 | U1 U2 |
1 | REF03 2.5V Riferimento di tensione SO-8 | U3 |
1 | ACS712-20A Sensore di corrente ad effettoHall SO-8 | U4 |
2 | MCP3202-BI/SN Dual Channel 12 Bit Convertitore AD SO-8 | U5 U10 |
3 | HCPL-0630 High Speed Optoisolatore SO-8 | U6 U7 U8 |
1 | PIC18F252-I/SO 8 Bit Microcontrollore SO-28 | U9 |
2 | DF08S 800V 1A Mini Ponte a diodi | BR1 BR2 |
1 | HR-E3013051 230V to 2x6V 1.5VA Transformatore | TR1 |
1 | TC1602D 2×16 Dot Matrix LCD | LCD1 |
2 | 470uF 25V Electrolytic Capacitor 10x10mm | C1 C18 |
2 | 100uF 16V Electrolytic Capacitor 6.3×5.4mm | C2 C17 |
2 | 22pf 50V 0805 NPO SMD Ceramic Capacitor | C11 C12 |
1 | 1nF 50V 0805 X7R SMD Ceramic Capacitor | C9 |
14 | 100nF 50V 0805 X7R SMD Ceramic Capacitor | C2 C4 C5 C6 C7 C8 C10 C13 C22 C14 C15 C16 C17 C20 |
1 | 1uF 25V 1206 X7R SMD Ceramic Capacitor | C21 |
2 | 0R 1% 0805 Resistore | R16 |
2 | 1M 1% 0805 Resistore | R2 R3 |
3 | 1K 1% 0805 Resistore | R5 R6 R17 |
5 | 10K 1% 0805 Resistore | R1 R14 R15 R18 R19 |
4 | 2K 5% 0805 Resistore | R7 R8 R9 R13 |
4 | 330R 5% 0805 Resistore | R4 R10 R11 R12 |
2 | Red LED 0805 | D2 D3 |
1 | 20MHZ Quarzo | Y1 |
1 | SS14 1A 40V Diodo Schottky SMA | D1 |
1 | Schurter 0031.8221 SMD Fuse Holder | F1 |
1 | 16A Fuse 20x5mm | - |
2 | 1×3 5.2mm Pitch Screw Terminal Block | J1 J2 |
1 | 1×5 2.54mm Male Header | J3 |
Ecco un esempio di misurazione con un boiler da 2KW collegato al wattmetro.
Codice PIC
Il codice PIC è scritto in linguaggio C per il compilatore CCS.
#include <18F252.h> #device ADC=16 #FUSES NOWDT //No Watch Dog Timer #FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale #FUSES NOBROWNOUT //No brownout reset #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #use delay(crystal=20000000) #define ADC0_EN PIN_C2 #define ADC1_EN PIN_C6 #INCLUDE#define LCD_ENABLE_PIN PIN_A0 #define LCD_RS_PIN PIN_A2 #define LCD_RW_PIN PIN_A1 #define LCD_DATA4 PIN_B4 #define LCD_DATA5 PIN_B5 #define LCD_DATA6 PIN_B6 #define LCD_DATA7 PIN_B7 #define SPI_MODE_0 (SPI_L_TO_H | SPI_XMIT_L_TO_H) #include char read_count=0; char tick=0; unsigned int32 adc_accum_v=0; unsigned int32 adc_accum_i=0; unsigned int16 adc0_ref=0; unsigned int16 adc1_ref=0; float rms_v=0; float rms_i=0; float rms_v_cor=1.04245; float rms_v_accum=0; float rms_i_accum=0; float adc0_step=0; unsigned int32 adc_value_v[41]; unsigned int32 adc_value_i[41]; unsigned int32 sampling_period=60536; // 65536-60536=5000 >> 5000x200ns=1ms float apparent_power=0; float average_power_accum=0; float vi_accum=0; char i,k; #INT_RTCC void RTCC_isr(void) { set_rtcc(sampling_period); tick=1; read_count++; return; } void initialize() { setup_spi(SPI_MASTER | SPI_MODE_0 | SPI_CLK_DIV_64); lcd_init(); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); //13.1 ms overflow output_high(ADC0_EN); output_high(ADC1_EN); } unsigned int16 mcp3202_read(char adc_no, char ch_no) { unsigned int16 reading = 0; unsigned char MSbyte=0x00; unsigned char LSbyte=0x00; // Chip Select if (adc_no==0) {output_low(ADC0_EN);} else {output_low(ADC1_EN);} // Send Start Bit Spi_Write(0x01); // Channel Select and Read High Byte if (ch_no==0) {MSbyte=Spi_Read(0xA0);} else {MSbyte=Spi_Read(0xE0);} // Read Low Byte LSbyte=Spi_Read(0x00); // Join the Bytes reading=make16((MSbyte & 0x0F),LSbyte); output_high(ADC0_EN); output_high(ADC1_EN); return reading; } void main() { delay_ms(100); initialize(); adc1_ref = 2048; adc0_ref = mcp3202_read(0,1); adc0_step = 2.5/adc0_ref; k=0; while (1) { set_rtcc(sampling_period); enable_interrupts(INT_RTCC); enable_interrupts(GLOBAL); while (read_count<40) { while(tick==0) {} tick=0; adc_value_v[read_count-1] = mcp3202_read(0,0); adc_value_i[read_count-1] = mcp3202_read(1,0); } disable_interrupts(INT_RTCC); disable_interrupts(GLOBAL); read_count=0; for (i=0;i<40;i++) { if (adc_value_v[i]>=adc0_ref) {adc_value_v[i] = adc_value_v[i] - adc0_ref;} else {adc_value_v[i] = adc0_ref - adc_value_v[i];} if (adc_value_i[i]>=adc1_ref) {adc_value_i[i] -= adc1_ref;} else {adc_value_i[i] = adc1_ref - adc_value_i[i];} adc_accum_v += (adc_value_v[i] * adc_value_v[i]); adc_accum_i += (adc_value_i[i] * adc_value_i[i]); vi_accum += ((adc_value_v[i]*adc0_step*201) * rms_v_cor) * (adc_value_i[i] * ((5/4096)/0.100)) ; } average_power_accum += vi_accum /40; vi_accum=0; rms_v = ((sqrt(adc_accum_v /40))*adc0_step*201) * rms_v_cor ; rms_i = sqrt(adc_accum_i /40) * ((5/4096)/0.100); rms_v_accum += rms_v; rms_i_accum += rms_i; k++; if (k == 20) { k=0; printf(lcd_putc,"\f%3.1f V",(rms_v_accum/20)); lcd_gotoxy(9,1); printf(lcd_putc,"%2.2f A",abs(((rms_i_accum/20) - 0.1))); lcd_gotoxy(5,2); printf(lcd_putc,"%4.1fW",average_power_accum/20); rms_v_accum=0; rms_i_accum=0; average_power_accum=0; } adc_accum_v=0; adc_accum_i=0; } }
Buon DIY a tutti!
Original article witten by, and courtesy of, Electro-Labs
Ottimo articolo per poter controllare i consumi di vari apparecchi, una domanda sarebbe possibilie interfacciarlo con un arduino o un raspeberry per poter memorizzare i vari dati letti in modo da avere anche uno storico . Grazie ..
Per avere lo storico basta salvare i dati nel micro che ha già a disposizione, il PIC.
A che ti serve Arduino, o Raspberry?
controllo remoto a distanza, dove dovrei installare questo non è accessibile facilmente ma ho una connessione dati ..
Se liberi il pin del micro RC6 utilizzandone un altro per il CS dell’ MCP3202 hai a disposizione la uart con i pin TX/RX e quindi utilizzarli per comunicare con altre board, come Arduino o Raspi
Ciao,
ho l’esigenza di modificare il tuo circuito in quanto devo poter leggere le correnti elettriche da 4 prese di corrente oltre alla tensione di rete, il tutto per il controllo in automazione dei carichi elettrici.
Non ho bisogno del display e le informazioni le vorrei inviare ad Arduino o Raspberry che poi eseguono le loro logiche di controllo in base ai valori ricevuti..
Immagino che per la situazione non vada più bene il PIC18F25 da te usato, quindi ti chiedo se i dati rilevati dai sensori di corrente e tensione li posso mandare direttamente ad Arduino tramite i suoi ingressi digitali o analogici, o se invece devo per forza interporre un PIC simile al PIC18F25 che abbia più ingressi RCx.
Grazie
Mi sembra che con le conoscenze che possiedi, oltre alla laurea in giurisprudenza, potresti prendere anche quella in elettronica. Ottimo articolo, certo che la realizzazione è un po complessa, io sono ancora rimasto ai componenti tradizionali, quelli SMD sono un po’ difficili da montare. Comunque ancora complimenti.
I componenti SMD sono più rapidi da montare rispetto a quelli tradizionali, è solo una questione di attrezzatura e manualità, ma quest’ultima nemmeno tanto, dipende dal package.
Ad esempio per montare una resistenza od un condensatore tradizionale si deve girare la scheda mentre per l’smd si può lavorare comodamente su un piano. Per contenitori 1206 e 0805 il montaggio è semplice e rapido, per 0603 iniziano le prime difficoltà.
Per i microcontrollori con package SOIC SOP e TSOP vale lo stesso discorso sopra, i problemi iniziano con i TQFP ma la cosa è ancora fattibile. Inizia ad essere complicato invece il montaggio dei QFN e direi impossibile manualmente quello dei BGA.
P.S. Tutti disegni cad delle sigle citate sopra sono facilmente reperibili online.
Ciao, sono nuovo e quindi potrei dire delle “belinate” scusatemi in anticipo, esiste la possibilità di avere questo progetto già montato?
Salve Giuseppe,
non abbiamo il prodotto disponibile ma puoi realizzarlo da solo, tutta la documentazione è open source.
Orientativamente che costo può avere questo progetto?
Salve Fabio,
per avere una stima di costo dovresti avere un quantitativo da produrre. Se è per un pezzo, puoi facilmente inserire i componenti in un sito di venditori a catalogo (tipo Conrad o RS) e fare la somma, per poi aggiungere costo PCB (hobbisti, professionale, realizzato in Cina) e tempo di montaggio/collaudo. Un pezzo ha un costo artigianale 😉
P.S. Vedo che non sei ancora abbonato… Perchè? 🙂
Grazie.
Salve, solo una curiosità. Perché è stato necessario isolare l’ADC dal PIC? Ed invece di utilizzare degli optoisolatori si può utilizzare dell’hardware equivalente? Lo chiedo in quanto non ho mai utilizzato degli optoisolatori in generale e sono curioso di capirne il funzionamento.
Salve Jacopo,
quando si ha a che fare con la tensione di rete è sempre opportuno isolare. Infatti il collegamento tra ADC e Pic è stato optoisolato sia per una maggiore immunità ai disturbi, sia per una questione di sicurezza.