Kamarád mi požádal zda by bylo možné vyrobit převodník na měření protékajícího AC proudu ze střídače FVE při napájení rozvaděče rodinného domu, aby nemusel mít u sebe neustále mobilní telefon (různé domácí práce kdy telefon doslova překáží) s aplikací pro bluetooth která tento odečet proudu umožňuje. Volba padla na modul Arduino Uno a k němu vyrobený převodník pro měřící transformátory proudu YHDC typ SCT-013-000 s měřícím rozsahem AC proudu 100A : 0.05A zakoupeným v [3] a zobrazováním na LCD displeji 4 x 20 znaků. Přípravek může posloužit pro vlastní inspiraci při podobných zapojeních, vždy je nutné dbát zvýšené opatrnosti z důvodu práce s napětím životu nebezpečným. Další zapojení s Arduino Uno nejenom na měření AC proudu a AC napětí v [4].
Přípravek s Arduino Uno, převodníkem pro měřící transformátory proudu a napájecím zdrojem je umístěn v platové elektrikářské krabici. Na boku krabice je umístěn vypínač napájení 230V AC společně s pojistkou pro jištění napájecího zdroje, displej je namontován na distančních sloupcích 100mm tak že v předním krytu elektrikářské krabice je pouze otvor pro LCD displej. Převodník pro tři měřící transformátory proudu je pro svoji jednoduchost vyroben na univerzální vrtané destičce a společně s deskou Arduino Uno je namontován na montážní destičce pro Arduino Uno zakoupené v [1] kde je převodník s Arduino Uno propojen. Pro ovládání LCD displeje 4 x 20 znaků je použit sériový řadič komunikující po sériové lince kde je použit pouze signál TXD z desky Arduino Uno, společně s napájecími záporným vodičem GND a kladným napájecím vodičem sériový řadič pro LCD displej byl zakoupen v [2]. Schéma zapojení převodníku pro měřící transformátory proudu je na obrázku č.01, na obrázku č.02 je celkové schéma zapojení přípravku pro měření AC proudu ve všech 3 fázích, výroba přípravku je čistě individuální věc. Převodník je tvořen pouze dvěma rezistory které z napájecího napětí 5V desky Arduino Uno dělič toto napětí rozdělí na referenční napětí o velikosti 2.5V, tyto děliče napětí jsou celkem tři pro každý měřící transformátor proudu ve fázích L1, L2, L3. Výstup ze spojených rezistorů tvořících dělič napětí je připojen na jeden vstup sekundárního vinutí měřícího transformátoru (na KONEKTORU JACK 3.5 označený „K“) a druhý sekundární výstup měřícího transformátoru proudu (na KONEKTORU JACK 3.5 označený „L“) je připojen na pin A/D převodníku L1 = A0, stejně tak jsou připojeny i další převodníky ve fázích L2 = A1, L3 = A2. Výstupní napětí z měřícího transformátoru proudu je střídavé a není možné jej přímo připojit na vstup A/D převodníku Arduino Uno z tohoto důvodu se musí použít napěťový dělič jehož napětí 2.5V tvoří (Ofset ~ 2.5V) pro napětí z měřícího transformátoru proudu. Uvedený převodník proudu umožňuje co nejjednodušším způsobem měřit střídavý proud. Napájení přípravku je spínaným zdrojem 230VAC/12VDC, hodnota 12V je snížena zapojenými diodami 1N4007 vždy dvě v sérii na kladném i záporném vodiči napájení snížena na hodnotu 8V, tato hodnota je pak na Arduino Uno desce stabilizována na hodnotu 5V.
Použité měřící transformátory proudu umožňují měřit AC proud v rozsahu 0 – 100A s proudovým výstupem 0.05A při plném zatížení počet závitů je 2000 kabel z měřícího transformátoru proudu je zakončen v konektoru JACK 3.5 kdy špička konektoru je označena „K“ a k nejdelší části konektoru je připojen vývod označený „L“ viz technická dokumentace k měřícímu transformátoru proudu. Tím že je výstup proudový je nutné sekundární výstup transformátoru osadit takzvaným zátěžovým (snímacím) rezistorem který výstup převede na napětí a toto je poté načítáno A/D vstupem Arduino Uno. Napětí na snímacím rezistoru NESMÍ PŘEKROČIT REFERENČNÍ NAPĚTÍ 2.5V, proto se jeho hodnota musí vypočítat k maximálnímu proudu který chceme měřit tak aby napětí rezistoru bylo vždy menší než je referenční napětí 2.5V. Pokud je měřící transformátor proudu osazen na vodiči kterým prochází proud nesmí nikdy jeho vývody sekundárního vinutí zůstat rozpojeny, vždy musí být zkratovány (společně spojeny) jinak dojde ke zničení měřícího transformátoru proudu. Výstupní hodnota proudu 0.05 je dána výpočtem 100A / 2000 počet závitů = 0.05A výpočet zátěžového rezistoru (snímacího) se provede tak že maximální RMS proud 100A si převedeme na špičkový proud podle vzorce RMS proud x √2 = 141.4A. Abychom vypočítali špičkový proud v sekundární cívce vydělíme špičkový proud 141.4A počtem závitů cívky 141.4A / 2000 = 0.0707A. Hodnota zátěžového (snímacího) rezistoru pak vychází takže referenční napětí dělíme vypočítaným špičkovým proudem v sekundární cívce 2.5V / 0.0707 = 35.36R volíme VÝDY NIŽŠÍ ZÁTĚŽOVÝ (SNÍMACÍ) REZISTOR MENŠÍ NEŽ VYPOČÍTANOU HODNOTU v tomto případě použijeme rezistor 33R anapětí na zátěžovém (snímacím) rezistoru vychází 33 x 0.0707 = 2.33V při plném zatížení 100A . V případě že by jsme tímto měřícím transformátorem proudu chtěli měřit maximální RMS proud 30A postupujeme shodně 30 x √2 = 42.42A, 4ě.42 / 2000 = 0.02121A. 2.5 / 0.02121 = 117.8R. 117.8 x 0.02121 = 2.498V. Použijeme-li rezistor 110R a napětí na zátěžovém (snímacím) rezistoru bude 2.33V, případě použití rezistoru 100R bude napětí na zátěžovém (snímacím) rezistoru 100 x 0.02121 = 2.12V. V každém případě je napětí při použití rezistorů 110R, 100R nižší než referenční napětí 2.5V což je v pořádku.
Použité měřící transformátory proudu YHDC jsou v tomto případě osazeny na přívodní vodiče L1, L2, L3 z přepínače „ volby sítě „ do první řady jističů z kterých je pak provedeno rozbočení napájení dalších řad jističů tak že měří celkový odběr v domovním rozvaděči, ať je tento realizován za normálního provozu od distributora nebo FVE. V případě výpadku sítě pak zobrazují po přepnutí přepínače „volba sítě“ na baterie kdy tyto napájí střídač a je normálně zobrazovaná hodnota proudu RD ze střídače napájeného ze zálohy baterií A je možno v případě potřeby vypnout vybrané okruhy tak aby se dosáhlo delšího napájení nutných el.spotřebičů. Měřící transformátory proudu jsou na fázové vodiče osazeny tak že šipka na obalu proudového měřícího transformátoru směřuje směrem k jističům „přepínač sítě > jističe„.
V případě jiné hodnoty zátěžového rezistoru tuto v programu přepíšeme, stejně tak můžeme změnit i komunikační PIN. Po nahraní programu do Arduino Uno odpojíme programovací kabel do konektorů na Arduino Uno zasuneme připojovací modul s připojeným převodníkem na měření proudu s připojenými měřícími transformátory proudu, LCD displej a připojíme napájení Arduino UNO do konektoru pro připojení napájení 7 – 12V nyní se musí na LCD postupně na řádcích shora dolů zobrazit MĚŘENÍ AC PROUDU, L1 A : , L2 A: , L3 A: . Nyní když pro otestování přípravků měřících transformátorů proudu, provlékneme měřícími transformátory jeden vodič a ten připojíme na jeden vývod objímky pro žárovku a druhý vodič připojíme přímo na objímku mimo měřící transformátory proudu a připojíme žárovku do el.sítě měl by se na LCD zobrazovat proudový odběr žárovky ve všech třech řádcích LCD displeje. Úpravy programu jsou čistě individuální věc.
// Mereni AC proudu s mericim transformatorem proudu typ: SCT-013-000
// se zobrazenim na LCD se seriovou komunikaci.
// Mereni proudu je ve trech fazich AC napeti 230VAC.
// www.mojeelektronika.mzf.cz vagnervlastimil@seznam.cz
#include <SoftwareSerial.h> // pripojeni knihovny pro kmunikaci LCD displejem
#define txPin 2 // definovani komunikacniho pinu s lcd displejem klidova uroven na lcd je nastavena na "T" vysoka
SoftwareSerial LCD = SoftwareSerial(0, txPin); // pripojeni nastavenych parametru ke knihovně
const int LCDdelay = 300; // nastaveni casove prodlevy pro lcd displej
#define L1_pinTrafo A0 // nastaveni cisla PINU pro pripojeni vystupu snimaciho rezistoru faze L1
#define L2_pinTrafo A1 // nastaveni cisla PINU pro pripojeni vystupu snimaciho rezistoru faza L2
#define L3_pinTrafo A2 // nastaveni cisla PINU pro pripojeni vystupu snimaciho rezistoru faze L3
int prevod = 2000; // prevodni pomer transformatoru
float L1_odpor = 33.0; // zadani velikosti odporu L1
float L2_odpor = 33.0; // zadani velikosti odporu L2
float L3_odpor = 33.0; // zadani velikosti odporu L3
float L1_Spickovenapeti; // zadani merici promenne L1
float L2_Spickovenapeti; // zadani merici promenne L2
float L3_Spickovenapeti; // zadani merici promenne L3
float L1_Spickovyproud; // zadani merici promenne L1
float L2_Spickovyproud; // zadani merici promenne L2
float L3_Spickovyproud; // zadani merici promenne L3
float L1_proudRMSnaRezistoru; // zadani merici promenne L1
float L2_proudRMSnaRezistoru; // zadani merici promenne L2
float L3_proudRMSnaRezistoru; // zadani merici promenne L3
float L1_proudRMS; // zadani merici promenne L1
float L2_proudRMS; // zadani merici promenne L2
float L3_proudRMS; // zadani merici promenne L3
float L1_celkem; // zadani merici promenne L1
float L2_celkem; // zadani merici promenne L2
float L3_celkem; // zadani merici promenne L3
void setup() {
delay(1000); // casova prodleva
pinMode(L1_pinTrafo, INPUT); // nastaveni pinu A0 pro prevodnik s transformatoeem jako vstup L1
pinMode(L2_pinTrafo, INPUT); // nastaveni pinu A1 pro prevodnik s transformatorem jako vstup L2
pinMode(L3_pinTrafo, INPUT); // nastaveni pinu A2 pro prevodnik s transformatorem jako vstup L3
pinMode(txPin, OUTPUT); // nastaveni komunikacniho pinu na vystup
LCD.begin(2400); // nastaveni prenosove rychlosti
smazLCD(); // prikaz pro inicializaci lcd a smazani displeje
podsviceniOn(); // zapnuti podsviceni displeje
kursorOff(); // vypnuti kursoru blikani
posunvpravo(); // nastaveni posunu znaku vpravo
LCDpoziceznaku(0, 2);
LCD.print("Mereni AC proudu"); // nadpis
delay(100); // casova prodleva pro displej
}
void loop() {
L1_Spickovenapeti = L1_NapetiSpickaSpicka(); // ziskani napeti Spicka-spicka pomoci funkce
L1_Spickovyproud = ((L1_Spickovenapeti / L1_odpor) * 1000.0); // vypocet proudu v mA tekoucjho rezistorem pomoci Ohmova zakona
L1_proudRMSnaRezistoru = (L1_Spickovyproud * 0.707); // vypocet RMS hodnoty proudu
L1_proudRMS = (L1_proudRMSnaRezistoru * prevod); // vypocet mereneho proudu diky znalosti prevodniho pomeru 2000:1
L1_celkem = (L1_proudRMS / 1000); // prepocet z honoty mA pro zobrazeni "A" 0.134A
LCDpoziceznaku(1, 0);
LCD.print("L1 A: "); // nastaveni pozice prvniho znaku na prvnim radku
delay(100); // casova prodleva pro zapis znaku
if (L1_proudRMS <= 0) { // porovnani hodnoty pokud je nizssi nebo rovna "0" pokracuje na dalsim radku
LCDpoziceznaku(1, 6);
LCD.print(" ");
} // vymazani znaku od pozice 0,6
else { // pokud neni pravda pokracuje na dalsim radku
LCDpoziceznaku(1, 6);
LCD.print(L1_celkem, 3); // nastaveni pozice vypoctu na prvnim radku vysledek na tri desetinna mista
delay(100);
} // casova prodleva pro zapis znaku
L2_Spickovenapeti = L2_NapetiSpickaSpicka(); // ziskani napeti Spicka-spicka pomoci funkce
L2_Spickovyproud = ((L2_Spickovenapeti / L2_odpor) * 1000.0); // vypocet proudu v mA tekoucjho rezistorem pomoci Ohmova zakona
L2_proudRMSnaRezistoru = (L2_Spickovyproud * 0.707); // vypocet RMS hodnoty proudu
L2_proudRMS = (L2_proudRMSnaRezistoru * prevod); // vypocet mereneho proudu diky znalosti prevodniho pomeru 2000:1
L2_celkem = (L2_proudRMS / 1000); // prepocet z honoty mA pro zobrazeni "A" 0.134A
LCDpoziceznaku(2, 0);
LCD.print("L2 A: "); // nastaveni pozice prvniho znaku na prvnim radku
delay(100); // casova prodleva pro zapis znaku
if (L2_proudRMS <= 0) { // porovnani hodnoty pokud je nizssi nebo rovna "0" pokracuje na dalsim radku
LCDpoziceznaku(2, 6);
LCD.print(" ");
} // vymazani znaku od pozice 0,6
else { // pokud neni pravda pokracuje na dalsim radku
LCDpoziceznaku(2, 6);
LCD.print(L2_celkem, 3); // nastaveni pozice vypoctu na prvnim radku vysledek na tri desetinna mista
delay(100);
} // casova prodleva pro zapis znaku
L3_Spickovenapeti = L3_NapetiSpickaSpicka(); // ziskani napeti Spicka-spicka pomoci funkce
L3_Spickovyproud = ((L3_Spickovenapeti / L3_odpor) * 1000.0); // vypocet proudu v mA tekoucjho rezistorem pomoci Ohmova zakona
L3_proudRMSnaRezistoru = (L3_Spickovyproud * 0.707); // vypocet RMS hodnoty proudu
L3_proudRMS = (L3_proudRMSnaRezistoru * prevod); // vypocet mereneho proudu diky znalosti prevodniho pomeru 2000:1
L3_celkem = (L3_proudRMS / 1000); // repocet z honoty mA pro zobrazeni "A" 0.134A
LCDpoziceznaku(3, 0);
LCD.print("L3 A: "); // nastaveni pozice prvniho znaku na prvnim radku
delay(100); // casova prodleva pro zapis znaku
if (L3_proudRMS <= 0) { // porovnani hodnoty pokud je nizssi nebo rovna "0" pokracuje na dalsim radku
LCDpoziceznaku(3, 6);
LCD.print(" ");
} // vymazani znaku od pozice 0,6
else { // pokud neni pravda pokracuje na dalsim radku
LCDpoziceznaku(3, 6);
LCD.print(L3_celkem, 3); // nastaveni pozice vypoctu na prvnim radku vysledek na tri desetinna mista
delay(5000);
} // casova prodleva pred dalsim odectu proudu
}
float L1_NapetiSpickaSpicka() {
float L1_vysledek = 0; // merici promenne
int L1_merenaHodnota = 0; // merici promenne
int L1_maximum = 0; // merici promenne
unsigned long zacatekMereni = millis(); // ulozeni startovaciho casu
while ((millis() - zacatekMereni) < 1000) { // mereni po dobu jedne sekundy
L1_merenaHodnota = analogRead(L1_pinTrafo); // mereni napeti na odporu
if (L1_merenaHodnota > L1_maximum) { // nalezeni maxima
L1_maximum = L1_merenaHodnota; // ulozeni noveho maxima
}
}
L1_vysledek = ((L1_maximum * 5.0) / 1024); // prevod vysledku na napeti ve Voltech
L1_vysledek = (L1_vysledek - 2.500); // vypocet hodnoty o stejnosmerne napeti prevodniku 2.500V
return L1_vysledek; // vraceni vysledku funkce
}
float L2_NapetiSpickaSpicka() {
float L2_vysledek = 0; // merici promenne
int L2_merenaHodnota = 0; // merici promenne
int L2_maximum = 0; // merici promenne
unsigned long zacatekMereni = millis(); // ulozeni startovaciho casu
while ((millis() - zacatekMereni) < 1000) { // mereni po dobu jedne sekundy
L2_merenaHodnota = analogRead(L2_pinTrafo); // mereni napeti na odporu
if (L2_merenaHodnota > L2_maximum) { // nalezeni maxima
L2_maximum = L2_merenaHodnota; // ulozeni noveho maxima
}
}
L2_vysledek = ((L2_maximum * 5.0) / 1024); // prevod vysledku na napeti ve Voltech
L2_vysledek = (L2_vysledek - 2.500); // vypocet hodnoty o stejnosmerne napeti prevodniku 2.500V
return L2_vysledek; // vraceni vysledku funkce
}
float L3_NapetiSpickaSpicka() {
float L3_vysledek = 0; // merici promenne
int L3_merenaHodnota = 0; // merici promenne
int L3_maximum = 0; // merici promenne
unsigned long zacatekMereni = millis(); // ulozeni startovaciho casu
while ((millis() - zacatekMereni) < 1000) { // mereni po dobu jedne sekundy
L3_merenaHodnota = analogRead(L3_pinTrafo); // mereni napeti na odporu
if (L3_merenaHodnota > L3_maximum) { // nalezeni maxima
L3_maximum = L3_merenaHodnota; // ulozeni noveho maxima
}
}
L3_vysledek = ((L3_maximum * 5.0) / 1024); // prevod vysledku na napeti ve Voltech
L3_vysledek = (L3_vysledek - 2.500); // vypocet hodnoty o stejnosmerne napeti prevodniku 2.500V
return L3_vysledek; // vraceni vysledku funkce
}
//podprogramy pro nastaveni lcd displeje
void LCDpoziceznaku(int row, int col) { // nastaveni pozice zobrazeni znaku
if (row > 1) {
row -= 2; // porovnani zda je row vetsi nez jedna
LCD.write(0xFE);
LCD.write((col + row * 64 + 148));
} // vypocet pozice znaku pro treti a ctvrty radek
else {
LCD.write(0xFE);
LCD.write((col + row * 64 + 128));
} // vypocet pozice znaku pro prvni a druhy radek
delay(LCDdelay);
} // konec podporgramu
void smazLCD() { // smazani a inicializace lcd displeje
LCD.write(0xFE);
LCD.write(0x01);
delay(LCDdelay);
} // prikaz pro smazani
void podsviceniOn() { // zapnuti podsviceni lcd displeje
LCD.write(0xFE);
LCD.write(0xE9);
delay(LCDdelay);
} // prikaz pro zapnuti
void podsviceniOff() { // vypnuti podsviceni lcd displeje
LCD.write(0xFE);
LCD.write(0xE8);
delay(LCDdelay);
} // prikaz pro vypnuti podsviceni displeje
void kursorOn() { // zapnuti kursoru podtrzitka blikani
LCD.write(0xFE);
LCD.write(0x0E);
delay(LCDdelay);
} // prikaz pro zapnuti kursoru zobrazeni
void kursorOff() { // prikaz pro vypnuti zobrazeni kursoru
LCD.write(0xFE);
LCD.write(0x0C);
delay(LCDdelay);
} // prikaz pro vypnuti kursoru
void posunvpravo() { // zapsane znaky se zapisuji zleva doprava
LCD.write(0xFE);
LCD.write(0x06);
delay(LCDdelay);
} // prikaz pro posun zapsanych znaku