1
ENERJİ SİSTEMLERİ MÜHENDİSLİĞİ
PROJESİ
“Ev Kullanımı için Akıllı Priz Uygulamasının Arduino
ile Modellenmesi ve Matlab Simülasyonu”
Burak Tekin
100105019
Eren SOYLU
100105045
2
ÖZET
Elektrik enerjisinin algısı; -maddesel bir nicelik olarak-, insan hissiyatıyla
anlaşılması zordur. Enerjinin niteliğinin ve niceliğinin algısını günlük
kullanımlarda insan hayatının bir parçası haline getirmek, enerjinin
sürdürülebilirliği ve güvenilirliği konusunda büyük önem taşımaktadır. Enerji
tasarrufu da bir çeşit enerji kaynağı olarak değerlendirilebilir. Bu algının
insanların günlük hayatına oturtulması sebebiyle akıllı prizler enerjinin arzı,
niteliği ve niceliği algısının oluşmasında büyük önem arz etmektedir.
Anahtar Kelimeler: Akıllı priz, arduino, güç, reaktif güç, faz farkı
ABSTRACT
Sense of electrical energy – as a material quantity- , is hard to define with
human senses. The sense of quality and quantity of energy in daily life matters
great importance as a part of human life. Energy effiency can be also interpreted
as an energy source. Smart plugs are important equipments for making a new
sense of energy which put in appearance of energy supply, quantity and quality.
Keywords: Smart plug, arduino, power, reactive power, phase difference
3
1. Matematiksel Model
Güç hesabının matematiksel olarak modellenmesi ARM tabanlı Arduino
işlemcisinde hesaplamaların yapılma sürecinde büyük önem taşımaktadır. Var
olan güç hesaplama algoritmaları C++ programında yazılıp derlenmeden önce
matematiksel modelleri örneklenir ve sonrasında güç hesabı için kullanılacak
C++ kütüphaneleri oluşturulur.
Güç hesabı için kullanılacak birincil fonksiyon VRMS ve IRMS fonksiyonudur.
RMS (Root-Mean-Square) yöntemi belirli genliğe sahip sürekli sinüzoidal
ifadelerin istatistiksel olarak anlamlı değerlerini çıkarmada kullanılan en yaygın
yöntemdir. Projemizde gerilim ve akım sinyallerinin zamana bağlı her bir
örneğinden elde edilen verilerin anlamlı ifadelerinin çıkarımlarının yapılmasında
RMS değerlerini ettiğimiz matematiksel modelleri kullandık.
= 1
()
RMS değerinin gerilim sinyali üzerinden matematiksel ifadesi yukarıdaki
gibidir. Zamana bağlı, sürekli VRMS fonksiyonunun mikro işlemcide; işlemcinin
saat zamanına bağlı –Kullandığımız Arduino mikro işlemci için saat zamanı 16
kHz’dir.- her bir örnek (i) için RMS değerinin ifadesi içinse aşağıdaki fonksiyon
kullanılır.
= 1
()
4
Burada N ölçüm sayısıdır. Bozulmamış sinüzoidal sinyaller için
maksimum anlamlı gerilim (VMAG) değeri genelde RMS değerinin
hesaplanmasında kullanılır.
= 1
|()|
=
2√2×
Güç Faktörü (PF) hesaplanırken ise görünür gücün (S) ve gerçek gücün
(P) oranı alınır.
= 1
()
=
= .
() = .
üç = −
Sinyal işlemede kullanılan veriler AC analog gerilim algılama devresi ve
AT (Akım Transformatörü) analog akım algılama devresinden elde
edilmektedir. Bu devreleri oluşturmanın amacı prizde kullanılan hattan geçen
gerilim ve akımı ölçen AC-AC 9V adaptörün ve AT’nün elde ettiği birincil ham
gerilim ve akım sinyallerinin mikro işlemcinin ADC gerilim aralığına
dönüştürülmesi için gereklidir.
5
2. Gerilim ve Akım Algılama Devresi Şemaları
a. Gerilim Algılama Devresi
Gerilim algılama devresi AC-AC 9V adaptörden aldığı gerilim sinyallerinin
Arduino ADC (Analog-to-Digital Conversation ) sinyal gerilim aralığına
dönüştürülmesi için kullanılır.
Şekil 1- Gerilim Algılama Devresi
Şekil 1’de gerilim algılama devresi bulunmaktadır.9 V AC-AC Adaptörden
aldığı 9V değerindeki gerilim sinyallerini ADC gerilim aralığına düşürerek
mikro işlemcide sinyalin kullanılır hale gelmesini sağlar.
Devre ’de AC-AC adaptörü ve Arduino mikro işlemcinin 3.3 V’luk
çıkışından aldığımız DC akım ve mikro işlemciye gönderdiğimiz sinyal çıkışı
bulunmaktadır. Sinyal gerilim bölücü devre ile daraltılır.
6
Şekil 2 - AC Adaptör Sinyali (Üst) | Dönüştürülmüş sinyal ( Alt ) – ( y- doğrultusu Volt , x- doğrultusu saniyedir.)
Şekil 2’de görüldüğü üzere AC-AC adaptörden alınan yaklaşık 9V değerindeki
sinüzoidal sinyal gerilim bölücü devre sayesinde Arduino’nun ADC girişine
uygun hale gelecek hale dönüştürülür. Sinyalin genliğine bakıldığında en yüksek
ve en düşük değerini 18 V aralığında olan bir sinyal 3.3 V aralığında bir sinyale
dönüştürülmüş olur.
b. Akım Algılama Devresi
Akım Transformatörü (AT) iki farklı çekirdeğin etrafına sarılmış bobinlerin
üzerinde; hattan geçen akımdan dolayı oluşan
manyetik akımı indükleyerek bir gerilim
oluşturur. Projemizde YHDC SCT-013-000
akım transformatörünü kullandık. Maksimum
100A değerinde olan 2000:1 sarım değerindeki
akım transformatörü hat akımıyla temas
edilmediğinden akım ölçümü yapmanın en
güvenli yollarından biridir. Şekil 3- YHDC SCT-013-000 (YHDC Industries, 2014)
7
Akım transformatörü üzerinde indüklenen gerilim sinyali akım algılama
devresi sayesinde Arduino ADC giriş sinyali aralığına uygun gerilim ve akım
değerlerine dönüştürülerek mikro işlemciye gönderilir.
Şekil 4- Akım Algılama Devresi
Şekil 4’de akım algılama devresi görülmektedir. Akım transformatöründen
aldığı sinyaller Arduino ADC girişine uygun hale getirilerek mikro işlemciye
gönderilir.
Şekil 5’de görülen grafikte akım algılama devresi çıkış gerilim değeri üstte
ve akım sinyali altta bulunmaktadır. Gerilim sinyali mikroişlemcinin girişine
gönderilerek gerilim algılama devresinden elde edilen sinyal verileriyle beraber
anlık olarak VRMS ve IRMS değerlerinin ve aktif, reaktif, görünür güç değerlerinin
ve güç çarpanının hesaplanmasında kullanılır. Hesaplamalar mikro işlemcinin
her bir saat zamanında mikro işlemci üzerinde yapılır. Mikro işlemcide ADC
girişine göre dönüştürülmüş sinyallerin RMS değerleri hesaplanırken ölçümleme
çarpanları kullanılır. Bu çarpanlar 230 V RMS değerindeki hat geriliminden
mikro işlemci girişine gönderilen sinyallerin yeniden asıl değerlerine çevrilerek
gerçek VRMS ve IRMS değerlerinin elde edilmesini sağlar.
8
Şekil 5 - AT çıkışı gerilim değeri ( Üst )( y- doğrultusu Volt , x- doğrultusu saniyedir.) | AT çıkışı akım değeri ( Alt )( y- doğrultusu Amper , x- doğrultusu saniyedir.)
Bu devrelerin Proteus programında birleştirilerek çizilmiş ve baskı devre haline getirilmiş halleri aşağıda verilmiştir.
Şekil 6 - Akım ve Gerilim Devresi Bütünleştirilmiş
9
Bütünleştirilmiş devrede sinyal girişleri ve mikro işlemci çıkışları
terminal kullanılarak bütünleştirilmiş ve düzenlenmiştir. Terminal Çıkışları aşağıdaki tabloda verilmiştir.
Çıkış Numarası Çıkış Yeri 1 9V AC-AC Pozitif 2 9V AC-AC Negatif 3 Arduino Gerilim Sinyali A10 4 Akım Transformatörü Pozitif 5 Akım Transformatörü Negatif 6 Arduino Akım Sinyali A11 7 Boş 8 Boş 9 Boş 10 Boş 11 3.3 V Arduino 12 Toprak Arduino
Bütünleştirilmiş devrenin 3 Boyutlu PCB Dizaynı ve 3 boyutlu hali aşağıdaki şekillerde verilmiştir. Çizimler Proteus – Ares programında yapılmıştır.
Şekil 7- Bütünleştirilmiş Devre PCB Çizimi
10
Şekil 8 - Bütünleştirilmiş Devre 3 Boyutlu Tasarımı Üst
Şekil 9- Bütünleştirilmiş Devre 3 Boyutlu Tasarım Alt
11
3. Matlab Simülasyonu Gerilim algılama devresinin ve gerilim algılama devresinin simülasyonu
Matlab programı içerisindeki Simulink paket programında yapılmıştır. Simülasyonun blok diyagramı aşağıda verilmiştir.
Şekil 10- Simulink Blok Diyagramı
Simülasyon devre şemalarına uygun biçimde hazırlanmıştır. Devre şemalarından farklı olarak giriş ve çıkış sinyallerinin ölçümleri için Simulink içerisinde bulunan gerilim ve akımları algılayan aynı zamanda bu verileri
dizilerde saklayacak olan bloklar kullanılmıştır. Yukarıdaki şekilde solda bulunan devre gerilim algılama devresi, sağda bulunan devre akım algılama devresidir. Gerilim ve akım algılama devresinden gelen sinyalleri kullanarak
matematiksel modele uygun biçimde RMS değerlerini mikro işlemcide hesaplayacak bloklar ise aşağıda verilen bloklardır. Akım ve gerilim sinyalleri
için RMS değerleri ayrı ayrı hesaplanarak her bir benzetim zamanı için çarpımları alınıp görünür güç hesaplanmıştır.
Simülasyonda örneklenen senaryo 230 V AC geriliminde 16 A akım ile çalışan bir hat için görünür güç hesabıdır. Akım transformatörü bu simülasyonda 16 A akım altında elde edilecek sinüzoidal sinyalin 22Ω değerindeki yükleme direnci üzerinde oluşturacağı akım hesaplanarak bulunmuştur. Örnekteki hesap için sinyal üretecinin genliği aşağıdaki gibi hesaplanmıştır.
12
YHDC SCT-013-000 Akım transformatörü için 16A ve 2000:1 sarım
değerinde;
16 A’lik akımın RMS değeri;
= 16 . √2 = 22.62
22.62
=
2000
1
= 0.01131
Akım transformatörünün üzerinde oluşan gerilim sinyali ise 22Ω değerindeki yükleme direnci altında;
= . ü
= 0.01131 . 22 Ω
= 0. 248
Olarak hesaplanır. Bu değer simülasyonda akım transformatörünün üzerinde
oluşan gerilimi temsil etmek üzere 50 Hz frekansında 0.248 V maksimum genliğinde sinüzoidal sinyal üretecek blok ile modellenir.
Akım ve gerilim için RMS değerleri matematiksel modele uygun biçimde bloklarda işlendikten sonra aşağıdaki gibi osiloskop tarafından 1 saniye
benzetim süresinde grafiği oluşturulmuştur.
Şekil 11 - Vrms değeri için 1 s'lik benzetim zamanında osiloskop ölçümü (y- doğrultusu Volt , x- doğrultusu saniyedir.)
13
Şekil 12 –Irms değeri için 1’lik benzetim süresinde osiloskop ölçümü (y- doğrultusu Amper , x- doğrultusu saniyedir.)
Sinyallerin kalibrasyonları yapılırken 230V AC gerilim ve 16A akımda
çalışan bir hat için kalibrasyon çarpanları hesaplanmıştır. Gerilim için
kalibrasyon çarpanı 139,377 ve akım için kalibrasyon çarpanı 9,437 olarak
hesaplanmış ve sinyallerin RMS değerleri hesaplanmadan önce bu çarpanlarla
büyütülerek gerçek değerleri elde edilmiştir.
VRMS ve IRMS değerleri çarpım bloğuyla çarpılarak gerçek güç harcaması
hesaplanmıştır. Osiloskop verileri aşağıdaki gibidir.
Şekil 13 - Görünür Gücün hesaplanması ( y- doğrultusu Watt, x- doğrultusu saniyedir.)
14
4. Arduino girişleri ve yazılım
Arduino tasarım ve benzetim için bir araya getirilmiş, üzerinde 16 kHz’lik
ARM 7 işlemci bulunan bir prototip geliştirme kartıdır. Devre hazırlandıktan
sonra terminalden alınan çıkışlar Arduino’nun A10 ve A11 ADC girişlerine
bağlanır. Mikro işlemci kendi adıyla anılan Arduino derleyicisi ile C++ dilinde
derlenir ve USB port aracılığıyla Arduino’ya gönderilir.
Şekil 14 - Arduino devre kartı ve Analog Girişler (Arduino.CC, 2014)
Arduino için gerekli kütüphaneler ve C++ yazılımı aşağıda verilmiştir.
EmonLib.h
#ifndef EmonLib_h
#define EmonLib_h
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
#if defined(__arm__)
#define ADC_BITS 12
#else
#define ADC_BITS 10
#endif
#define ADC_COUNTS (1<<ADC_BITS)
class EnergyMonitor
15
public:
void voltage(int _inPinV, double _VCAL, double _PHASECAL);
void current(int _inPinI, double _ICAL);
void voltageTX(double _VCAL, double _PHASECAL);
void currentTX(int _channel, double _ICAL);
void calcVI(int crossings, int timeout);
double calcIrms(int NUMBER_OF_SAMPLES);
void serialprint();
long readVcc();
//Useful value variables
double realPower,
apparentPower,
powerFactor,
Vrms,
Irms;
private:
int inPinV;
int inPinI;
double VCAL;
double ICAL;
double PHASECAL;
int lastSampleV,sampleV;
int lastSampleI,sampleI;
double lastFilteredV,filteredV;
double lastFilteredI, filteredI;
double phaseShiftedV;
double sqV,sumV,sqI,sumI,instP,sumP; int startV; //Instantaneous voltage at start of sample window.
boolean lastVCross, checkVCross; //Used to measure number of times
threshold is crossed.
int crossCount;
;
#endif
EmonLib.cpp
#include "EmonLib.h"
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
16
#include "WProgram.h"
#endif
void EnergyMonitor::voltage(int _inPinV, double _VCAL, double _PHASECAL)
inPinV = _inPinV;
VCAL = _VCAL;
PHASECAL = _PHASECAL;
void EnergyMonitor::current(int _inPinI, double _ICAL)
inPinI = _inPinI;
ICAL = _ICAL;
void EnergyMonitor::voltageTX(double _VCAL, double _PHASECAL)
inPinV = 2;
VCAL = _VCAL;
PHASECAL = _PHASECAL;
void EnergyMonitor::currentTX(int _channel, double _ICAL)
if (_channel == 1) inPinI = 3;
if (_channel == 2) inPinI = 0;
if (_channel == 3) inPinI = 1;
ICAL = _ICAL;
void EnergyMonitor::calcVI(int crossings, int timeout)
#if defined emonTxV3
int SUPPLYVOLTAGE=3300;
#else
int SUPPLYVOLTAGE = readVcc();
#endif
int crossCount = 0;
int numberOfSamples = 0;
boolean st=false; unsigned long start = millis();
17
while(st==false)
startV = analogRead(inPinV);
if ((startV < (ADC_COUNTS/2+50)) && (startV > (ADC_COUNTS/2-50))) st=trueif ((millis()-start)>timeout) st = true;
start = millis();
while ((crossCount < crossings) && ((millis()-start)<timeout))
numberOfSamples++;
lastSampleV=sampleV;
lastSampleI=sampleI;
lastFilteredV = filteredV;
lastFilteredI = filteredI;
sampleV = analogRead(inPinV);
sampleI = analogRead(inPinI);
filteredV = 0.996*(lastFilteredV+(sampleV-lastSampleV));
filteredI = 0.996*(lastFilteredI+(sampleI-lastSampleI));
sqV= filteredV * filteredV;
sumV += sqV;
sqI = filteredI * filteredI;
sumI += sqI;
phaseShiftedV = lastFilteredV + PHASECAL * (filteredV - lastFilteredV);
instP = phaseShiftedV * filteredI;
sumP +=instP; //Sum
lastVCross = checkVCross;
if (sampleV > startV) checkVCross = true;
else checkVCross = false;
if (numberOfSamples==1) lastVCross = checkVCross;
if (lastVCross != checkVCross) crossCount++;
double V_RATIO = VCAL *((SUPPLYVOLTAGE/1000.0) / (ADC_COUNTS));
Vrms = V_RATIO * sqrt(sumV / numberOfSamples);
double I_RATIO = ICAL *((SUPPLYVOLTAGE/1000.0) / (ADC_COUNTS));
Irms = I_RATIO * sqrt(sumI / numberOfSamples);
//Calculation power values
18
realPower = V_RATIO * I_RATIO * sumP / numberOfSamples;
apparentPower = Vrms * Irms;
powerFactor=realPower / apparentPower;
sumV = 0;
sumI = 0;
sumP = 0;
double EnergyMonitor::calcIrms(int NUMBER_OF_SAMPLES)
#if defined emonTxV3
int SUPPLYVOLTAGE=3300;
#else
int SUPPLYVOLTAGE = readVcc();
#endif
for (int n = 0; n < NUMBER_OF_SAMPLES; n++)
lastSampleI = sampleI;
sampleI = analogRead(inPinI);
lastFilteredI = filteredI;
filteredI = 0.996*(lastFilteredI+sampleI-lastSampleI);
sqI = filteredI * filteredI;
sumI += sqI;
double I_RATIO = ICAL *((SUPPLYVOLTAGE/1000.0) / (ADC_COUNTS));
Irms = I_RATIO * sqrt(sumI / NUMBER_OF_SAMPLES);
//Reset accumulators
sumI = 0;
return Irms;
void EnergyMonitor::serialprint()
Serial.print(realPower);
Serial.print(' ');
Serial.print(apparentPower);
Serial.print(' ');
Serial.print(Vrms);
Serial.print(' ');
Serial.print(Irms);
19
Serial.print(' ');
Serial.print(powerFactor);
Serial.println(' ');
delay(100);
long EnergyMonitor::readVcc()
long result;
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328__) || defined (__AVR_ATmega328P__)
ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#elif defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_AT90USB1286__)
ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
ADCSRB &= ~_BV(MUX5); #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
ADMUX = _BV(MUX5) | _BV(MUX0);
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) ||
defined(__AVR_ATtiny85__)
ADMUX = _BV(MUX3) | _BV(MUX2);
#endif
#if defined(__AVR__)
delay(2);
ADCSRA |= _BV(ADSC);
while (bit_is_set(ADCSRA,ADSC));
result = ADCL;
result |= ADCH<<8;
result = 1126400L / result;
return result;
#elif defined(__arm__)
return (3300);
#else
return (3300);
#endif
Arduino kütüphaneleri (EmonLib, 2014) kullanılarak oluşturulan yazılım ise aşağıda verilmiştir.
#include "EmonLib.h" // Emon Kütüphanesi içe aktarıldı
EnergyMonitor monitor; // yeni monitör tanımlandı.
20
void setup()
Serial.begin(9600);
monitor.voltage(10, 234.26, 1.7);
monitor.current(1, 111.1);
void loop()
monitor.calcVI(20,2000); // hesaplamalar tamamlandı.
monitor.serialprint(); // hesaplamalar yazdırıldı.
float realPower = monitor.realPower; //gerçek güç
float apparentPower = monitor.apparentPower; //görünür güç
float powerFActor = monitor.powerFactor; // güç çarpanı
float supplyVoltage = monitor.Vrms; // Vrms değeri
float Irms = monitor.Irms; // I rms değeri
5. Sonuç ve Değerlendirmeler Bu çalışma sadece akım algılama ve gerilim algılama devreleri tasarlanıp
Arduino çıkışları elde edilerek tek bir elektrik prizi üzerinde uygulanması için
tasarlanmıştır. Devre ergonomik hale getirilerek daha küçük ve kompakt boyutta
yeniden günlük kullanılan prizlerin boyutuna getirilerek daha erişilebilir ve
kullanışlı hale getirilebilir.
Arduino mikro işlemcisi güç hesaplamalarının yanında Raspberry Pi B+
modeli bir mini bilgisayar üzerine kurulmuş bir web sunucusuyla RF sinyalleri
aracılığıyla haberleşerek anlık güç kullanımının ve enerji tüketiminin saatlik,
günlük ve aylık kullanımları birden çok priz için hesaplanarak elektrik tüketimi
görselleştirilebilir. Ev kullanımı için tasarladığımız bu proje daha büyük ölçekli
işletmelerde ve kurumlarda kullanılarak; elektrik maliyetlerinin düşürülmesinde
ve gelişen teknoloji ile enerji tüketimi düşük cihazlara kurumları ve bireyleri
yönlendirerek enerji tasarrufu ve verimliliği konusunda büyük katkı sağlayabilir.
21
Kaynaklar
Arduino.CC. (2014). Arduino Mega 2560. Retrieved from Arduino Mega 2560:
http://arduinoturkiye.com/wp-
content/uploads/Arduino_Mega2560_nedir.jpg
boredomprojects.net. (2014, Ağustos 31). Home Energy Monitoring System.
Retrieved from Boredom Projects:
http://boredomprojects.net/index.php/projects/home-energy-monitor
EmonLib. (2014). Open Energy Monitor. Retrieved from GitHub:
https://github.com/openenergymonitor/EmonLib
Mohan, Undeland, & Robbins. (1989). Power Electronics. London: John Wiley
& Sons Inc.
Moulin, E. (2014, Kasım 02). RMS Calculation for Energy Meter Applications
Using the ADE7756. Retrieved from
http://www.analog.com/static/imported-
files/application_notes/AN578_a.pdf
YHDC Industries. (2014, 25 12). YHDC SCT-0013-000. Pekin, PRC.
Top Related