Ev Kullanımı için Akıllı Priz Uygulamasının Arduino ile Modellenmesi ve Matlab Simülasyonu /...

21
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

Transcript of Ev Kullanımı için Akıllı Priz Uygulamasının Arduino ile Modellenmesi ve Matlab Simülasyonu /...

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.