Sheet Arduino n.13 (Ammeter)

[Lezione del xx yyy 2019]

Premessa

La scheda della esercitazione n.13, richiede di implementare un misuratore di corrente alternata, utilizzando un trasformatore SCT-013-030.

Inoltre si richiede di utilizzare un display LCD 16x2 caratteri con interfaccia I2C. Non avendo un display LCD con questo bus di comando, ho utilizzato il display LCD fornito nello starter kit di Arduino. Spero sia accettabile, in quanto l’utilizzo della I2C è stato oggetto di una specifica esercitazione: lo sheet 9.

Progetto

L’interfacciamento del SCT-013 è copiato integralmente dallo sheet 13 del prof.Morresi.

Diverso il discorso per l’interfacciamento del display LCD. Qui mi sono rifatto ad un progetto presente nello starter kit di Arduino (progetto 11: sfera di cristallo), con una piccola variazione. Non volendo appesantire la circuiteria nella breadboard, ho eliminato il potenziometro che controlla il contrasto del display, mettendo il contrasto al massimo. Per farlo, basta seguire il suggerimento del datasheet del display, mettendo la V0 del display (display pin 3) a VSS (display pin 1), ovvero a ground.

Il circuito si presenta come segue:

_images/PIC_sh13.jpg

Quindi per il display dovremo:

  • alimentare a +5V il display (display pin 2: VDD);

  • mettere a 0V il riferimento del display (display pin 1: VSS) e quello di regolazione del contrasto (display pin 3: V0);

  • collegare il register select (display pin4: RS), nel ns caso al pin 11 di Arduino;

  • collegare il read/write (display pin5: R/W) al ground 1;

  • collegare il enable (display pin6: E) al pin 12 di Arduino;

  • utilizzando 4 bit per i caratteri da scrivere i pin display da 7 a 10 non devono essere collegati;

  • collegare i pin display da 11 a 14 per i 4 bit dati che pilotano il carattere da scrivere, nel ns caso display pin 11 al pin 4 di arduino, il display pin 12 al pin 5 di arduino e così via fino al display pin 14 con il pin 7 di arduino;

  • collegare l’alimentazione del led di background del display (display pin 15: LED+) al +5V, con la solita resistenza di 220 \(\Omega\) per limitare la corrente;

  • collegare il ground del led di background del display (display pin 16: LED-) al ground della breadboard.

Per completezza, riporto qui sotto lo schema dei collegamenti descritti:

_images/PIC_sh13_lcd_schema.svg

Decisamente: I2C è più semplice. Bastano quattro fili, incluse le alimentazioni, ed il gioco è fatto.

Video

Ecco il video del progetto. ATTENZIONE: CORREGGO QUANTO AFFERMATO NEL VIDEO. In effetti la misura in alternata (e non in continua, come avevo fatto subito prima della registrazione del video) indica la presenza di una bassa tensione (circa 0.6VAC) con trasformatore non attraversato da corrente.

Sketch

Lo sketch è il seguente

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/* Embedded Systems Architecture - hardware
 *  application on sheet 13
 *  
 *  ammeter - alternating curent (AC)
 */
 
#include "EmonLib.h"
#include <LiquidCrystal.h>

#define SCT  A1
#define REDE 230.0   // mains voltage 230V AC
#define LCD_RS 11
#define LCD_EN 12
#define LCD_D7 7
#define LCD_D6 6
#define LCD_D5 5
#define LCD_D4 4
#define BLANK_6 "      "

EnergyMonitor emon1;
LiquidCrystal lcd(LCD_RS, LCD_EN, LCD_D4, LCD_D5, LCD_D6, LCD_D7);

void setup() {
    Serial.begin(9600);            // init the serial at 9600 baud
    // calibration of input from SCT: Current const=ratio/Res.Burder=1800/62=29
    emon1.current(SCT, 29);
    // init lcd
    lcd.begin(16, 2);
    lcd.setCursor(0, 0);
    lcd.print("Corr.(A):");  //9 chars(ndx: 0-8)
    lcd.setCursor(0, 1);
    lcd.print("Pot.(W):");   //8 chars
}

void loop() {
    double Irms = emon1.calcIrms(1480);
    Serial.print("Current(A): ");
    Serial.print(Irms);
    Serial.print("   Power(W): ");
    Serial.println(Irms * REDE);
    clear_tails();
    lcd.setCursor(10, 0);
    lcd.print(Irms);
    lcd.setCursor(10, 1);
    lcd.print(Irms * REDE, 1);
    
    delay(2000);
}

void clear_tails(){
    lcd.setCursor(10, 0);
    lcd.print(BLANK_6);
    lcd.setCursor(10, 1);
    lcd.print(BLANK_6);  
}

Praticamente è la copia di quello del prof. Morresi.

Inizializzo l’oggetto di monitoraggio dell’energia (ln 20) e quello per pilotare il display (ln 21).

Nel setup inizializzo la seriale verso il PC, calibro l’input da SCT 2 (ln 26) e inizializzo il display (ln da 28 a 32) scrivenndo l’intestazione delle due righe.

Nel loop richiedo il calcolo dell’intensità di corrente rms (ln 36), poi uso il risultato in uscita verso la seriale, calcolando anche la potenza (ln 40). E in successione esco con gli stessi valori verso il display LCD.


1

In tal modo si va in scrittura verso il display.

2

Con qualche perplessità, qui mi sarei aspettato di leggere zero via zero quando non vi è corrente nel trasformatore. Invece ho delle letture di circa 0,06VAC. Confermate dal multimetro. D’altro canto anche il multimetro non è esente da disturbi. Con 6VAC di fondo scala, i puntali «aperti» comunque danno una misura, sia pure dell’ordine di 0.004VAC.