Monitoring Tegangan, Arus, dan Daya Pada Charger

28
TUGAS AKHIR SEMESTER 1 MIKROKONTROLLER DAN INTERFACE MONITORING TEGANGAN, ARUS, DAN DAYA PADA CHARGER BATERI Oleh : Mughni Syahid NRP. 1310145014 Dosen : Mohamad Safrodin B.Sc, MT PROGRAM STUDI DIII TEKNIK ELEKTRO INDUSTRI DEPARTEMEN TEKNIK ELEKTRO POLITEKNIK ELEKTRONIKA NEGERI SURABAYA Kampus ITS Keputih Sukolilo, Surabaya 60111, Jawa Timur, Indonesia Telp.(031) 5947280 Fax:(031)5946114 © 2015

Transcript of Monitoring Tegangan, Arus, dan Daya Pada Charger

TUGAS AKHIR SEMESTER 1

MIKROKONTROLLER DAN INTERFACE

MONITORING TEGANGAN, ARUS, DAN DAYA PADA

CHARGER BATERI

Oleh :

Mughni Syahid

NRP. 1310145014

Dosen :

Mohamad Safrodin B.Sc, MT

PROGRAM STUDI DIII TEKNIK ELEKTRO INDUSTRI

DEPARTEMEN TEKNIK ELEKTRO

POLITEKNIK ELEKTRONIKA NEGERI SURABAYA Kampus ITS Keputih Sukolilo, Surabaya 60111, Jawa Timur, Indonesia

Telp.(031) 5947280 Fax:(031)5946114

© 2015

MONITORING TEGANGAN, ARUS DAN DAYA

PADA CHARGER BATERAI I. TUJUAN

1. Sebagai tugas akhir semester 1 mata kuliah mikrokontroller dan interface. 2. Dapat mengaplikasikan visual studio C# sebagai monitoring dan data base MySQL

sebagai media penyimpan data monitoring.

II. DASAR TEORI 2.1 Sensor Tegangan

Rangkaian sensor tegangan yang dipakai adalah pembagi tegangan dengan resistor dikarenakan tegangan yang diukur maksimal 27,72 V, sedangkan tegangan yang diperbolehkan masuk ke ADC pada mikrokontroler maksimal 5 V. Gambar 2.1. menunjukkan gambar rangkaian sensor tegangan dengan dua buah resistor R1 dan R2.

Gambar 2.1. Rangkaian Sensor Tegangan

Untuk mendapatkan nilai dari resistor yang digunakan adalah dengan rumus pembagi teganagan seperti pada rumus 2.1 dibawah ini :

푅2 = ∗ (푅1 + 푅2) (2.1) Dimana : R1 : Resistor R1 R2 : Resistor R2 Vi : Tegangan Input Vo : Tagangan Output

2.2 Sensor Arus (ACS 712) 5A ACS712 menyediakan solusi ekonomis dan tepat untuk pengukuran arus AC atau DC di dunia industri, komersial, dan sistem komunikasi. Perangkat terdiri dari rangkaian sensor efek-hall yang linier, low-offset, dan presisi. Saat arus mengalir di jalur tembaga pada bagian pin 1-4, maka rangkaian sensor efek-hall akan mendeteksinya dan mengubahnya menjadi tegangan dan outputnya pada pin 7. Konfigurasi pin IC dan rangkaiannya seperti ditunjukkan pada Gambar 2.2.

Gambar 2.2. 1Konfigurasi Pin dari IC ACS7 12.

Sensor ACS712 ini pada saat tidak ada arus yang terdeteksi, maka keluaran

sensor adalah 2,5 V. Dan saat arus mengalir dari IP+ ke IP-, maka keluaran akan >2,5 V. Sedangkan ketika arus listrik mengalir terbalik dari IP- ke IP+, maka keluaran akan < 2,5 V. Berikut ini adalah karakteristik dari sensor suhu ACS712.

Memiliki sinyal analog dengan sinyal-ganguan rendah (low-noise) Ber-bandwidth 80 kHz Total output error 1.5% pada Ta = 25°C Memiliki resistansi dalam 1.2 mΩ Tegangan sumber operasi tunggal 5.0V Sensitivitas keluaran: 66 sd 185 mV/A Tegangan keluaran proporsional terhadap arus AC ataupun DC Fabrikasi kalibrasi Tegangan offset keluaran yang sangat stabil Hysterisis akibat medan magnet mendekati nol Rasio keluaran sesuai tegangan sumber

2.3 Daya DC Daya DC adalah perkalian dari tegangan dan arus, sehingga :

푃 = 푉푥퐼 (2.2)

Dimana : P = Daya (Watt) V = Tegangan ( Volt) I = Arus (Ampere)

1 Datasheet of ACS712. Allegro, MicroSystems, LLC

III. GAMBAR BLOK DIAGRAM RANGKAIAN

IV. ALAT DAN BAHAN

Software 1. Microsoft Visual Studio 2008 C# 2. XAMPP ( Apache dan MySQL ) 3. MySql Connector 4. Code Vision AVR 5. Khazama AVR Programmer Hardware 1. Transformator 5A 2. Rectifier dan Filter 3. Minimum sistem mikrokontroller Atmega 16 4. LCD Display16X2 5. DC – DC Converter ( Buck Converter ) 6. Sensor Tegangan ( Voltage Devider ) 7. Sensor Arus (ACS712) 5A 8. MAX 232 dan USB to serial 9. Baterai 12V / 7,2Ah 10. Downloader 11. Kabel Penghubung

VCC

USB

TX

ADC

PLN

PWM

TRAFO 5A

RECTIFIER DAN

FILTER

BUCK CONVERTER

SENSOR ARUS

BATERAI 12V

7,2AH

SENSOR TEGANGAN

MINSYS MIKROKONTROLLER

ATMEGA 16

LCD DISPLAY

MAX 232 USB to SERIAL CONVERTER

KOMPUTER VISUAL C# DATA BASE

REGULATOR 5V

V. PROSEDUR PERCOBAAN A. Membuat Program di Mikrokontroller

1. Buka Code Vsision AVR

2. Setting konfigurasi I/O

3. Buat Program

4. Download ke Mikrokontroller dengan Khazama AVR Programmer

B. Membuat Program di PC / Komputer 1. Membuat Program Data Base My SQL ( Aktifkan Aphace dan MySQL)

2. Buka Admin, Buat folder db_data dan new data_charger dan buat tabel

3. Untuk koneksi data base dengan visual C# maka instal MySQL Connector

4. Buat Program monitoring di Visual C#

New Project -> windows form aplication

5. Buat desain Form dan Program

6. Untuk menambahkan Grafik tambahkan Zedgraph

7. Membuat koneksi Data Base MySQL dengan Visual C#

VI. HASIL PERCOBAAN 1. Tampilan monitoring Visual C#

Keterangan :

1. Grafik Tegangan, Arus, Daya yang ditampilkan per detik / real time namun tidak disimpan di data base.

2. Grafik Tegangan / Arus / Daya dari data base yang ditampilkan per menit. 3. Tabel untuk melihat data yang tersimpan di data base. 4. Setting COM serial dan tombol connect. 5. Tombol tools untuk grafik dan data base.

2. Membaca data base dan menampilkan grafik tegangan

Grafik tegangan naik menandakan proses pengisian. Pada saat arus tegangan naik maka menggunakan charger metode Arus Konstan sehingga tegangan baterai yang akan berubah. Saat tegangan baterai mecapai 14,4 V maka metode yang digunakan Tegangan Konstan sehingga tegangan charger konstan di 14,4V. Karena kondisi kontrol PI yang tidak stabil serta skala pembacaan sensor sehingga menyebabkan output menjadi osilasi diantara setpoint 14,4 V.

3. Membaca data base dan menampilkan grafik arus

Saat awal pengisian baterai maka charger menggunkan metode Arus Konstan sehingga arus sesuai set point 1,44 A. Namun karena kondisi kontrol PI yang tidak stabil dan skala pembacaan sensor arus yang besar menyebabkan output dari kontrol PI osilasi di antara setpoint arus 1,44 A. Setelah Tegangan Charger menjadi 14,4 V maka metode berubah menjadi Tegangan Konstan set point 14,4V dan arus pengisian akan turun. Jika arus pengisian turun dan mencapai steady maka menandakan baterai sudah dalam kondisi penuh dan pengisian selesai.

4. Membaca data base dan menampilkan grafik daya

Daya yang terbaca dari proses pengisian baterai ini adalah daya dari perkalian

Tegangan dan Arus ( VxI ). Daya pengisian baterai pertama kali adalah dari arus charger 1,44 V x tegangan terendah baterai. Setelah pengisian maka daya akan naik dan mencapai tertingginya saat tegangan 14,4 V dan arus 1,44 A. Setelah itu daya akan turun kareana arus mengalami penurunan , daya yaitu tegangan charger 14,4V x Arus Charger. Jika arus sudah steady maka daya kan kecil dan daya akan steady pula sehingga juga bisa diasumsikan sebagai indikasi baterai penuh selain dari data arus.

5. Membaca data base di MySQL

Membaca data di MyAdmin SQL yang sudah tersimpan. Karena daya yang banyak maka ditampilkan yang 500 baris.

6. Membuat tampilan gafik di MySQL Untuk mempermudah menganalisa data maka di MySQL data base dapat

ditampilkan ke grafik. Dari tampilan grafik hasilnya sama dengan tampilan grafik di monitoring Visul C# namun di MySQL data Tegangan, Arus dan Daya ditampilkan di satu grafik sehingga data arus yang nilainya kecil sulit untuk dianalisa nilainya.

Warna coklat adalah data Daya, Warna biru adalah data Tegangan, sedangkan warna Orange adalah data arus.

VII. KESIMPULAN Dari percobaan ini maka dapat diambil keimpulan diantaranya : 1. Dengan monitoring data yang ditampilkan di grafik dapat mempermudah

melihat dan menganalisa perubahan data dari sensor. 2. Dengan penyimpanan data di data base maka akan mempermudah

pengambilan sensor data karena tidak perlu mencatat tiap waktu dan mengurangi resiko error dan kesalahan saat pengambilan data manual.

3. Waktu sampling penyimpanan data ke data base harus memperhatikan waktu lama sistem bekerja karena semakin banyak data yang disimpan maka semakin besar memori dan waktu eksekusi menjadi lama, sehingga kadang menjadi error dan kendala saat menampilkan data.

VIII. LAMPIRAN PROGRAM

1. Program di Mikrokontroller /***************************************************** Project : Monitoring Tegangan, Arus, dan Daya pada Charger Baterai Version : rev 1 Date : 28/10/2015 Author : Mughni Syahid Company : PENS Comments: bismillah project mikrokontroller dan interface Chip type : ATmega16 Program type : Application AVR Core Clock frequency: 16,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega16.h> #include <stdio.h> #include <delay.h> #include <alcd.h> #define adc_teg read_adc(0) #define adc_ars read_adc(1) #define pwm OCR1A #define on 1 #define off 0 #define bts_ars_pnh 0.650 #define kp_t 8 #define ki_t 0.9 #define kd_t 0 #define tst 1 #define sp_t 14.4 #define kp_a 8 #define ki_a 0.9 #define kd_a 0 #define tsa 1 #define sp_a 1.44 // Declare your global variables here #define ADC_VREF_TYPE 0x00 unsigned char lcd[16]; float nilaitt, nilaiaa; int kirima, kirimv; float nilai_t, Inte_t=0, error_t=0, P_t=0 , I_t=0 , PI_t=0; float nilai_a, Inte_a=0, error_a=0, P_a=0 , I_a=0 , PI_a=0; int da[51], a=0, na=0, aa; int dt[26], t=0, nt=0, tt;

int m=0, o=1, p=0, q=0, ca=1, ct=1, cs=1, charger=0, ; // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } void baca_sensor() { //////////// sensor tegangan ////////////// t++; dt[t]=adc_teg; nt=nt+dt[t]; if(t==24) { nt=nt/25; tt=nt; t=0; } nilaitt=((tt*5.0/1023)*12200)/2200; //////////// sensor arus //////////////// a++; da[a]=adc_ars; na=na+da[a]; if(a==49) { na=na/50; aa=na; a=0; } nilaiaa=((aa*5.0/1023)-2.5)/0.185; //if(nilaiaa<0.1) nilaiaa=0; kirima=aa; kirimv=tt; putchar('T'); putchar((kirimv%10000)/1000 + 0x30); putchar((kirimv%1000)/100 + 0x30); putchar((kirimv%100)/10 + 0x30); putchar(kirimv%10 + 0x30); putchar('A'); putchar((kirima%10000)/1000 + 0x30); putchar((kirima%1000)/100 + 0x30); putchar((kirima%100)/10 + 0x30); putchar(kirima%10 + 0x30); } void sistem_charger() { //////////////// charger ON /////////////// if(charger==on)

{ if(nilaiaa<=500&&o==1) { ca=on; ct=off; cs=off; o=0; p=1; q=0; m=0; } if(nilaitt>=14.4&&p==1) { ca=off; ct=on; cs=off; o=0; p=0; q=1; m=0; } //////////// arus konstan 1.44 A ///////////// if(ca==on) { sprintf(lcd,"%.2fV A> %.3fA ",nilaitt,nilaiaa); lcd_gotoxy(0,1); lcd_puts(lcd); //////////////// Kontrol PI ////////////////// nilai_a=((adc_ars*5.0/1023)-2.5)/0.185; error_a=sp_a-nilai_a; Inte_a=Inte_a+(error_a*tsa); P_a=kp_a*error_a; I_a=ki_a*Inte_a; PI_a=P_a+I_a; if(Inte_a>200) { Inte_a=200; } if(PI_a>200) { PI_a=200; } if(PI_a<0) { PI_a=0; } pwm=PI_a; } //////////// tegangan konstan 14.4 V //////////// if(ct==on) { sprintf(lcd,"%.2fV <T %.3fA ",nilaitt,nilaiaa); lcd_gotoxy(0,1); lcd_puts(lcd); //////////////// Kontrol PI ////////////////// nilai_t=(((adc_teg*5.0)/1023)*12200)/2200; error_t=sp_t-nilai_t; Inte_t=Inte_t+(error_t*tst); P_t=kp_t*error_t; I_t=ki_t*Inte_t; PI_t=P_t+I_t; if(Inte_t>200) { Inte_t=200; } if(PI_t>200) { PI_t=200; } if(PI_t<0) { PI_t=0; } pwm=PI_t; } } //////////////// charger OFF /////////////// if(charger==off) { pwm=0; o=1; }

/////////////////// end ///////////////// } // Declare your global variables here void main(void) { // Declare your local variables here PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x00; PORTC=0xFF; DDRC=0xFF; PORTD=0x00; DDRD=0xF0; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 15,625 kHz // Mode: Normal top=0xFF // OC0 output: Disconnected TCCR0=0x05; TCNT0=0x64; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=ICR1 // OC1A output: Non-Inv. // OC1B output: Non-Inv. // Noise Canceler: Off // Input Capture on Falling Edge // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0xA2; TCCR1B=0x11; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=200; // TOP=(fclk/(2*N*fpwm)) //138 //150 OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x41; // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: On // USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 9600 UCSRA=0x00; UCSRB=0x18; UCSRC=0x86; UBRRH=0x00; UBRRL=0x67; // ADC initialization // ADC Clock frequency: 1000,000 kHz // ADC Voltage Reference: AREF pin // ADC Auto Trigger Source: ADC Stopped ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x84; // Alphanumeric LCD initialization // Connections are specified in the // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu: // RS - PORTB Bit 0 // RD - PORTB Bit 1 // EN - PORTB Bit 2 // D4 - PORTB Bit 4 // D5 - PORTB Bit 5 // D6 - PORTB Bit 6 // D7 - PORTB Bit 7 // Characters/line: 16 lcd_init(16); // Global enable interrupts #asm("sei") lcd_gotoxy(0,0); lcd_puts("CHARGER & ATS"); lcd_gotoxy(0,1); lcd_puts("LJ PENS ELIN"); lcd_clear(); while (1) { // Place your code here charger = on; baca_sensor(); sistem_charger(); } }

2. Program di Visual C#

Program Koneksi Database using System; using System.Collections.Generic; using System.Linq; using System.Text; using MySql.Data.MySqlClient;

namespace databaseC { class koneksi { public static MySqlConnection getkoneksi() { String MyConString = "SERVER=localhost;" + "DATABASE=db_data;" + "UID=root;" + "PASSWORD=; "; return new MySqlConnection(MyConString); } } } Program Utama using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using MySql; using MySql.Data; using MySql.Data.MySqlClient; using ZedGraph; namespace databaseC { public partial class Form1 : Form { int i=0, k=0, tegint, arusint, dayaint, dbid, dbteg, dbarus, dbdaya; string teg, arus,daya; float tegfloat, arusfloat, dayafloat; string waktu; DateTime tgl; int TickStartT, intModeT = 1; int TickStartA, intModeA = 1; int TickStartD, intModeD = 1; int TickStartDB; public Form1() { InitializeComponent(); }

private void ShowData() { if (GrafikDB.GraphPane.CurveList.Count <= 0) return;

LineItem curve1DB = GrafikDB.GraphPane.CurveList[0] as LineItem;

if (curve1DB == null) return;

IPointListEdit List1DB = curve1DB.Points as IPointListEdit;

if (List1DB == null) return; List1DB.Clear(); lvData.Visible = true; lvData.View = View.Details; lvData.Items.Clear(); lvData.Scrollable = true; MySqlConnection conn = koneksi.getkoneksi(); MySqlCommand command = conn.CreateCommand();

command.CommandText = "SELECT * FROM data_charger"; MySqlDataReader reader = null;

conn.Open(); MySqlCommand cmd = new MySqlCommand(command.CommandText, conn);

reader = cmd.ExecuteReader(); i = 0; while (reader.Read()) {

lvData.Items.Add(reader["id"].ToString()); lvData.Items[i].SubItems.Add(reader["Tegangan"].ToString()); lvData.Items[i].SubItems.Add(reader["Arus"].ToString()); lvData.Items[i].SubItems.Add(reader["Daya"].ToString()); lvData.Items[i].SubItems.Add(reader["Waktu"].ToString()); double time = (Environment.TickCount - TickStartDB) / 1000.0;

Scale xScale = GrafikDB.GraphPane.XAxis.Scale; xScale.Max = i + xScale.MajorStep; xScale.Min = 0; dbid = Convert.ToInt16(reader["ID"].ToString());

dbteg = Convert.ToInt16( reader["Tegangan"].ToString());

dbarus = Convert.ToInt16(reader["Arus"].ToString()); dbdaya= Convert.ToInt16(reader["Daya"].ToString());

GraphPane myPaneDB = GrafikDB.GraphPane; if (Convert.ToString(CBDB.Text)== "Tegangan") { List1DB.Add(i, dbteg);

myPaneDB.Title.Text = " Grafik Data Base Tegangan ";

myPaneDB.YAxis.Title.Text = " Tegangan(V) "; } if (Convert.ToString(CBDB.Text) == "Arus") { List1DB.Add(i, dbarus); myPaneDB.Title.Text = " Grafik Data Base Arus "; myPaneDB.YAxis.Title.Text = " Arus(A) "; } if (Convert.ToString(CBDB.Text) == "Daya") { List1DB.Add(i, dbdaya); myPaneDB.Title.Text = " Grafik Data Base Daya "; myPaneDB.YAxis.Title.Text = " Daya(D) "; } GrafikDB.AxisChange(); GrafikDB.Invalidate(); GrafikDB.Refresh(); i++; } reader.Close(); conn.Close(); } private void btnTampil_Click(object sender, EventArgs e) { ShowData(); } private void timer2_Tick(object sender, EventArgs e) { IsiData(); } private void btnIsi_Click(object sender, EventArgs e) { timer2.Enabled = true; btnIsi.BackColor = Color.GreenYellow; btnStopIsi.BackColor = Color.LightGray; }

private void Form1_Load(object sender, EventArgs e)

{ Connect.BackColor = Color.LightGray; Disconnect.BackColor = Color.Red; btnIsi.BackColor = Color.LightGray; btnStopIsi.BackColor = Color.Red; // Grafik Data Base GraphPane myPaneDB = GrafikDB.GraphPane; myPaneDB.Title.Text = " Grafik Data Base "; myPaneDB.XAxis.Title.Text = " Waktu(Menit) ";

RollingPointPairList ListDB = new RollingPointPairList(60000); RollingPointPairList List1DB = new RollingPointPairList(60000);

LineItem curveDB = myPaneDB.AddCurve(" ", ListDB, Color.Red, SymbolType.None);

myPaneDB.XAxis.Scale.Min = 0; myPaneDB.XAxis.Scale.Max = 30; myPaneDB.XAxis.Scale.MinorStep = 1; myPaneDB.XAxis.Scale.MajorStep = 5; GrafikDB.AxisChange(); TickStartDB = Environment.TickCount; } private void Form1_Unload(object sender, EventArgs e) { SerialPort.Close(); timer3.Enabled = false; } private void IsiData() { k++; tgl = DateTime.Now;

waktu = string.Format("{0:yyyy'-'MM'-'dd HH':'mm':'ss}",tgl);

MySqlConnection conn = koneksi.getkoneksi(); MySqlCommand command = conn.CreateCommand();

command.CommandText = "INSERT INTO data_charger (Tegangan,Arus,Daya,Waktu) VALUES('" + teg + "','" + arus + "','" + daya + "','" + waktu + "')";

conn.Open();

MySqlCommand cmd = new MySqlCommand(command.CommandText, conn);

cmd.ExecuteNonQuery();

conn.Close(); } private void ClearData() { MySqlConnection conn = koneksi.getkoneksi(); MySqlCommand command = conn.CreateCommand(); command.CommandText = "DELETE FROM data_charger WHERE 1 "; conn.Open();

MySqlCommand cmd = new MySqlCommand(command.CommandText, conn);

cmd.ExecuteNonQuery(); conn.Close(); } private void hapus_Click(object sender, EventArgs e) { ClearData(); lvData.Items.Clear(); }

private void lvData_SelectedIndexChanged(object sender, EventArgs e)

{ } private void btnStopIsi_Click(object sender, EventArgs e) { timer2.Enabled = false; btnIsi.BackColor = Color.LightGray; btnStopIsi.BackColor = Color.Red; }

void zedGraphControlT_Load(object sender, EventArgs e) { } private void Disconnect_Click(object sender, EventArgs e) { Connect.BackColor = Color.LightGray; Disconnect.BackColor = Color.Red; SerialPort.Close(); } private void Connect_Click(object sender, EventArgs e) { Connect.BackColor = Color.GreenYellow; Disconnect.BackColor = Color.LightGray;

SerialPort.PortName = Convert.ToString(comboBox.Text); SerialPort.Open(); timer3.Enabled = true; // grafik tegangan GraphPane myPaneT = GrafikTegangan.GraphPane; myPaneT.Title.Text = " Grafik Tegangan "; myPaneT.XAxis.Title.Text = " Waktu (s) "; myPaneT.YAxis.Title.Text = " Tegangan (V) ";

RollingPointPairList ListT = new RollingPointPairList(60000); RollingPointPairList List1T = new RollingPointPairList(60000);

LineItem curveT = myPaneT.AddCurve("Tegangan", ListT, Color.Blue, SymbolType.None); LineItem curve1T = myPaneT.AddCurve(" ", List1T, Color.YellowGreen, SymbolType.None);

myPaneT.XAxis.Scale.Min = 0; myPaneT.XAxis.Scale.Max = 30; myPaneT.XAxis.Scale.MinorStep = 1; myPaneT.XAxis.Scale.MajorStep = 5; GrafikTegangan.AxisChange(); TickStartT = Environment.TickCount; // grafik arus GraphPane myPaneA = GrafikArus.GraphPane; myPaneA.Title.Text = " Grafik Arus "; myPaneA.XAxis.Title.Text = " Waktu (s) "; myPaneA.YAxis.Title.Text = " Arus (A) ";

RollingPointPairList ListA = new RollingPointPairList(60000); RollingPointPairList List1A = new RollingPointPairList(60000);

LineItem curveA = myPaneA.AddCurve("Arus", ListA, Color.Green, SymbolType.None); LineItem curve1A = myPaneA.AddCurve(" ", List1A, Color.Blue, SymbolType.None);

myPaneA.XAxis.Scale.Min = 0; myPaneA.XAxis.Scale.Max = 30; myPaneA.XAxis.Scale.MinorStep = 1; myPaneA.XAxis.Scale.MajorStep = 5; GrafikArus.AxisChange(); TickStartA = Environment.TickCount;

// grafik Daya GraphPane myPaneD = GrafikDaya.GraphPane; myPaneD.Title.Text = " Grafik Daya "; myPaneD.XAxis.Title.Text = " Waktu (s) "; myPaneD.YAxis.Title.Text = " Daya (A) ";

RollingPointPairList ListD = new RollingPointPairList(60000); RollingPointPairList List1D = new RollingPointPairList(60000);

LineItem curveD = myPaneD.AddCurve("Daya", ListD, Color.Red, SymbolType.None); LineItem curve1D = myPaneD.AddCurve(" ", List1D, Color.White, SymbolType.None);

myPaneD.XAxis.Scale.Min = 0; myPaneD.XAxis.Scale.Max = 30; myPaneD.XAxis.Scale.MinorStep = 1; myPaneD.XAxis.Scale.MajorStep = 5; GrafikDaya.AxisChange(); TickStartD = Environment.TickCount; } string DataSerial; int pos1, pos2; private void timer3_Tick(object sender, EventArgs e) { DataSerial = SerialPort.ReadExisting(); pos1 = DataSerial.IndexOf('T'); pos2 = DataSerial.IndexOf('A'); textBox1.Text = "T" + DataSerial.Substring(pos1 + 1, 4); textBox2.Text = "A" + DataSerial.Substring(pos2 + 1, 4); tegint = Convert.ToInt32(DataSerial.Substring(pos1 + 1, 4)); tegfloat = ((tegint * 5*1000/ 1023) * 12200) / 2200; teg = Convert.ToString(tegfloat);

arusint = Convert.ToInt32(DataSerial.Substring(pos2 + 1, 4)); arusfloat = ((arusint * 5 * 1000 /1023 ) - 2500 ) * 1000 / 185;

arus = Convert.ToString(arusfloat);

dayafloat = (Convert.ToInt32(tegfloat) * Convert.ToInt32(arusfloat))/1000;

dayaint = Convert.ToInt32 (dayafloat) ; daya = Convert.ToString(dayaint); tbSerial.Text = DataSerial;

LabTeg.Text = "Tegangan = " + teg + " mV"; LabArus.Text = "Arus = " + arus + " mA"; labDaya.Text = "Daya = " + daya + " mW"; DrawT(teg, "14400"); DrawA(arus, "1440"); DrawD(daya, "0"); } private void DrawT(string setpointT, string voltage) { double intsetpointT; double intvoltage; double.TryParse(setpointT, out intsetpointT); double.TryParse(voltage, out intvoltage); if (GrafikTegangan.GraphPane.CurveList.Count <= 0) return;

LineItem curveT = GrafikTegangan.GraphPane.CurveList[0] as LineItem; LineItem curve1T = GrafikTegangan.GraphPane.CurveList[1] as LineItem;

if (curveT == null) return; if (curve1T == null) return; IPointListEdit ListT = curveT.Points as IPointListEdit; IPointListEdit List1T = curve1T.Points as IPointListEdit; if (ListT == null) return; if (List1T == null) return;

double time = (Environment.TickCount - TickStartT) / 1000.0;

ListT.Add(time, intsetpointT); List1T.Add(time, intvoltage); Scale xScale = GrafikTegangan.GraphPane.XAxis.Scale; if (time > xScale.Max - xScale.MajorStep) { if (intModeT == 1) { xScale.Max = time + xScale.MajorStep; xScale.Min = xScale.Max - 30.0; } else { xScale.Max = time + xScale.MajorStep; xScale.Min = 0; } }

GrafikTegangan.AxisChange(); GrafikTegangan.Invalidate(); GrafikTegangan.Refresh(); } private void DrawA(string setpointA, string current) { double intsetpointA; double intcurrent; double.TryParse(setpointA, out intsetpointA); double.TryParse(current, out intcurrent); if (GrafikArus.GraphPane.CurveList.Count <= 0) return;

LineItem curveA = GrafikArus.GraphPane.CurveList[0] as LineItem; LineItem curve1A = GrafikArus.GraphPane.CurveList[1] as LineItem;

if (curveA == null) return; if (curve1A == null) return; IPointListEdit ListA = curveA.Points as IPointListEdit; IPointListEdit List1A = curve1A.Points as IPointListEdit; if (ListA == null) return; if (List1A == null) return;

double time = (Environment.TickCount - TickStartA) / 1000.0;

ListA.Add(time, intsetpointA); List1A.Add(time, intcurrent); Scale xScale = GrafikArus.GraphPane.XAxis.Scale; if (time > xScale.Max - xScale.MajorStep) { if (intModeA == 1) { xScale.Max = time + xScale.MajorStep; xScale.Min = xScale.Max - 30.0; } else { xScale.Max = time + xScale.MajorStep; xScale.Min = 0; } } GrafikArus.AxisChange(); GrafikArus.Invalidate(); GrafikArus.Refresh();

} private void DrawD(string setpointD, string power) { double intsetpointD; double intpower; double.TryParse(setpointD, out intsetpointD); double.TryParse(power, out intpower); if (GrafikDaya.GraphPane.CurveList.Count <= 0) return;

LineItem curveD = GrafikDaya.GraphPane.CurveList[0] as LineItem; LineItem curve1D = GrafikDaya.GraphPane.CurveList[1] as LineItem;

if (curveD == null) return; if (curve1D == null) return; IPointListEdit ListD = curveD.Points as IPointListEdit; IPointListEdit List1D = curve1D.Points as IPointListEdit; if (ListD == null) return; if (List1D == null) return;

double time = (Environment.TickCount - TickStartD) / 1000.0;

ListD.Add(time, intsetpointD); List1D.Add(time, intpower); Scale xScale = GrafikDaya.GraphPane.XAxis.Scale; if (time > xScale.Max - xScale.MajorStep) { if (intModeD == 1) { xScale.Max = time + xScale.MajorStep; xScale.Min = xScale.Max - 30.0; } else { xScale.Max = time + xScale.MajorStep; xScale.Min = 0; } } GrafikDaya.AxisChange(); GrafikDaya.Invalidate(); GrafikDaya.Refresh(); }

private void DrawDB(string setpointDB, string DB) { double intsetpointDB; double intDB; double.TryParse(setpointDB, out intsetpointDB); double.TryParse(DB, out intDB); if (GrafikDB.GraphPane.CurveList.Count <= 0) return;

LineItem curveDB = GrafikDB.GraphPane.CurveList[0] as LineItem; LineItem curve1DB = GrafikDB.GraphPane.CurveList[1] as LineItem;

if (curveDB == null) return; if (curve1DB == null) return; IPointListEdit ListDB = curveDB.Points as IPointListEdit;

IPointListEdit List1DB = curve1DB.Points as IPointListEdit;

if (ListDB == null) return; if (List1DB == null) return; double time = (Environment.TickCount - TickStartDB) /

1000.0; ListDB.Add(time, intsetpointDB); List1DB.Add(time, intDB); GrafikDB.AxisChange(); GrafikDB.Invalidate(); GrafikDB.Refresh(); } } }