Anda di sini

Pemrograman

Membuat Monitor Suhu Ruangan Dengan Visual Studio C#, Arduino dan Sensor LM35

Aditya Suranata - 13 November 2015 11:22:38 6

1. Dasar Teori

LM35 merupakan salah satu dari sekian banyak sensor analog untuk mengukur suhu. Perubahan suhu disekitar sensor menyebabkan terjadinya perubahan nilai tahanan pada sensor, sehingga turut menyebabkan perubahan nilai tegangan output dari sensor. Perubahan nilai tegangan inilah yang dimanfaatkan oleh komponen Analog to Digital Converter (ADC) pada mikrokontroler untuk menyediakan data digital berupa data suhu yang kemudian bisa dibaca oleh mikrokontroler.

Data digital yang telah diterima oleh mikrokontroler dalam hal ini masih berupa sampel data (data mentah) sehingga perlu dilakukan kalibrasi. Kalibrasi dilakukan dengan cara memasukan sampel data tersebut ke sebuah fungsi yang didapat dari hasil perhitungan dengan kondisi suhu pada pengukuran sebenarnya (perbandingan antara hasil terukur dan aktual). Setelah data suhu sebenarnya diketahui, data suhu tersebut dikirim ke komputer menggunakan komunikasi serial untuk ditampilkan pada interface.

Aplikasi interface pada komputer selanjutnya membaca port serial (COM) tempat dimana data suhu tersebut akan dikirim oleh mikrokontroler. Data serial yang telah diterima kemudian ditampilkan pada sebuah grafik sehingga bisa terlihat data suhu pada rentang waktunya.

2. Alat Dan Bahan

a. Perangkat Keras

  • 1 Arduino Uno R3 x 1
  • 2 Kabel USB A to B x 1
  • 3 Kabel Jumper x 3
  • 4 Sensor Suhu LM35 x 1

b. Perangkat Lunak

3. Ranah Kerja

Proses pengerjaannya akan dibagi menjadi tiga bagian, yaitu :

  1. Perakitan Perangkat Keras
  2. Pemrograman arduino
  3. Pemrograman Interface

3.1 Perakitan Perangkat Keras

Perangkat keras dirakit berdasarkan gambar berikut :

3.2 Kode Progam pada Arduino

/** Workshop Dasar Mikrokontroler 2014 
RADE - Robotics AnD Embedded Systems STMIK STIKOM Bali 
**/
//Pin wiper pada sensor LM32 (terminal tengah) tersambung ke Analog //Pin 3
//Yang disamping tersambung ke 5V dan Ground
int analogPin = 3;
  
//Variabel untuk menyimpan data suhu
float suhu;
  
void setup()
{
  //Setup serial dengan baud 9600
  Serial.begin(9600);
}
  
void loop()
{
  //Baca pin input 
  suhu = analogRead(analogPin);
  //Lakukan kalibrasi
  suhu = suhu * 0.48828125;
  //Kirim ke komputer melalui serial
  Serial.println(suhu);
  //Delay sebelum melakukan pembacaan selanjutnya
  delay(50);
}

3.3 Pemrograman Antarmuka

Buka Visual Studio IDE, buat proyek baru dengan tipe Visual C# dan pilih Windows > Windows Forms Application. Ketik nama proyek Monitor Suhu kemudian OK.

Mulai membuat interface dengan mendrag-and-drop masing-masing kontrol ke form. Kemudian untuk kode pada form1 atau form utama gunakan kode berikut :

/** Workshop Dasar Mikrokontroler 2014 RADE - Robotics AnD Embedded Systems STMIK STIKOM Bali 
Ditulis Oleh : Aditya Suranata 
untuk Public Domain 
**/
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;
//namespace untuk zedGrpah
using ZedGraph;
//namespace untuk class serial
using System.IO.Ports;
//namespace untuk melihat setting global komputer
using System.Globalization;
  
namespace Monitor_Suhu
{
    public partial class Form_utama : Form
    {
        /**Inisialisaisi arduino
         * Setup port serial dengan nama port COM65,
         * dan baud rate sebesar 9600.
         * Baud rate disini dengan di arduino harus sama
         * **/
        SerialPort arduino = new SerialPort("COM1",9600);        
          
        //waktu mulai dalam milidetik
        double waktuStart = 100;
  
  
        //konstruktor
        public Form_utama()
        {
            InitializeComponent();
        }
  
        //event ketuka tombol start diklik
        private void btn_kontrol_start_Click(object sender, EventArgs e)
        {
            //start detak untuk mulai mengaktifkan grapher
            try
            {
                //matikan tombol start
                btn_kontrol_start.Enabled = false;
                //nyalakan tombol stop
                btn_kontrol_stop.Enabled = true;
                //set batas waktu pembacaan serial sebelum dinyatakan gagal
                arduino.ReadTimeout = 1000;
                //set batas waktu penulisan serial
                arduino.WriteTimeout = 1000;
  
                //nyalakan detak
                Detak.Enabled = true;
                //mulai detak
                Detak.Start();  
            }
            catch (Exception gagal)
            {
                //Error handling
                //MessageBox.Show(gagal.ToString());
            }
        }
  
          
        //event ketika detak dimulai
        private void Detak_Tick(object sender, EventArgs e)
        {
            try
            {
                //Mulai komunikasi dengan arduino
                arduino.Open();
  
                //get item kurva pertama pada grafik
                LineItem kurvaSuhu = zedGraphSuhu.GraphPane.CurveList[0] as LineItem;
  
                //get PointPairList
                IPointListEdit listSuhu = kurvaSuhu.Points as IPointListEdit;
  
                //waktu yang terlewati
                double waktu = (Environment.TickCount - waktuStart) / 1000.0;
  
                //baca data suhu yang dikirim arduino,
                //konversi data tersebut (string) ke double,
                //dan tambahkan ke listSuhu
                float dataSuhu = float.Parse(arduino.ReadLine(), CultureInfo.InvariantCulture.NumberFormat);
                listSuhu.Add(waktu,Convert.ToDouble(dataSuhu));
  
                //Tutup komunikasi dengan arduino
                arduino.Close();
  
                //Buat scale X tetap rolling dalam interval 30 detik, dengan satu
                //langkah besar antara nilai X maksimal dan akhir dari axis
                Scale xScale = zedGraphSuhu.GraphPane.XAxis.Scale;
                if (waktu > xScale.Max - xScale.MajorStep)
                {
                    xScale.Max = waktu + xScale.MajorStep;
                    xScale.Min = xScale.Max - 30.0;
                }
  
                // Pastikan Y axis di scale ulang untuk mengakomodir data aktual
                zedGraphSuhu.AxisChange();
  
                // Redraw paksa
                zedGraphSuhu.Invalidate();
  
            }
            catch (Exception gagal)
            {
                //error handling
                //tutup komunikasi dengan arduino jika masih terhubung
                if (arduino.IsOpen)
                {
                    arduino.Close();
                }
                //MessageBox.Show(gagal.ToString());
            }
  
        }
  
  
        //event ketika tombol stop diklik
        private void btn_kontrol_stop_Click(object sender, EventArgs e)
        {
            try
            {
                //nyalakan kembali tombol start
                btn_kontrol_start.Enabled = true;
                //matikan tombol stop
                btn_kontrol_stop.Enabled = false;
                //stop detak
                Detak.Stop();
                //matikan detak
                Detak.Enabled = false;
                //jika komunikasi masih terbuka, tutup komunikasi
                if (arduino.IsOpen)
                {
                    arduino.Close();
                }
            }
            catch (Exception gagal)
            {
                //error handling
                //MessageBox.Show(gagal.ToString());
            }
        }
          
        //event ketika form utama dibuka
        private void Form_utama_Load(object sender, EventArgs e)
        {
            try
            {
                //catat waktu pertama sebagai referensi
                waktuStart = Environment.TickCount;
  
                //Inisialisasi ZedGraph
                GraphPane grafikSuhu = zedGraphSuhu.GraphPane;
                grafikSuhu.Title.Text = "Grafik Suhu";
                grafikSuhu.XAxis.Title.Text = "Waktu (Detik)";
                grafikSuhu.YAxis.Title.Text = "Suhu (Celcius)";
  
                //Simpan 120 point. Pada 500 ms sampel rate.
                //RollingPointPairList adalah class penyimpanan yang efisien 
                //dengan tetap merolling kumpulan point data tanpa perlu
                //men-shift nilai data apapun
                RollingPointPairList listSuhu = new RollingPointPairList(120);
  
                //Inisialisasi kurva
                LineItem kurvaSuhu = grafikSuhu.AddCurve("Suhu", listSuhu, Color.Red,SymbolType.None);
  
            }
            catch (Exception gagal)
            {
                //error handling
                //MessageBox.Show(gagal.ToString());
            }
        }
  
    }
}

Lakukan pengujian dengan menghubungkan Arduino ke komputer. Periksa nama port COM yang digunakan oleh Arduino dari Device Manager, kemudian pastikan tidak ada program lain yang menggunakan port tersebut termasuk Arduino IDE agar tidak bentrok. Kemudian cocokan nama port serialnya dengan yang tertulis di program. Run program untuk memulai debugging.

Jika terjadi kesalahan atau program tidak bekerja, uncomment syntax MessageBox pada block catch masing-masing kode untuk mentracing kesalahan yang menyebabkan program tidak bekerja.

3.580
Image

Aditya Suranata

Aditya suka menulis, bukan hanya sekedar hobi, menulis menjadi medianya untuk mencurahkan pikiran dan perasaan. Di TutorKeren.com kebanyakan menyumbang tulisan sesuai dengan minat dan keahliannya yaitu pada kategori pemrograman dan elektronika. Selain itu juga gemar menulis mengenai hal-hal umum, seperti ilmu alam, sosial dan beberapa pengalamannya yang mungkin bisa berguna untuk orang lain.

Artikel Menarik Lainnya

Komentar

Saya sudah coba program tersebut tetapi sensornya saya ganti dengan SHT11,programnya berjalan tetapi ngelag ... bagaimana solusinya agar tidak lag? terimakasih

Halo,

Supaya programnya tidak ngelag, maka harus digunakan teknik threading. Jadi proses untuk antarmuka dan proses untuk pengambilan datanya dipisah threadnya, di halaman dokumentasi C# telah dijelaskan dengan lengkap dan rinci bagaimana cara menggunakan threading agar aplikasi menjadi reposif. Selain itu, delay pengiriman dan pembacaan juga dapat dikurangi agar respon datanya menjadi lebih cepat...

Selamat mencoba, jika mengalami kesulitan jangan sungkan untuk diskusi lagi

HTSL://HIGH THINKING SIMPLE LIVING . ME

nampilin grafik nya pake apa yak gan, kok gak ketemu di visual studionya

downtown

itu yang di tampilin di windows form namanya apa yak gan yang grafiknya

downtown

.net framwork 4.0 kompatibel sama zedgraph versi berapa gan ?

downtown

Halo,

sayang sekali gan, ane sudah kurang update dengan ini dan sudah termasuk ketinggal jaman Biggrin

Mau tulis ulang lagi

HTSL://HIGH THINKING SIMPLE LIVING . ME

Mari Gabung

Halo Emo 51 , Ada yang ingin disampaikan? Jangan sungkan untuk gabung diskusi ini. Silahkan Login dulu atau Daftar baru.