วันอาทิตย์ที่ 19 มกราคม พ.ศ. 2557

ควบคุมการเปิดปิดไฟ ด้วยหน้า GUI ผ่าน Serial Port ด้วยภาษาC#

วันนี้ผมนอนไม่หลับเพราะนอนมาหลายชั่วโมงหลังจากไปแข่ง NSC มาผมเลยนอนจนพอละ เลยอยากเขียน blog ก็เลยตื่นตอน "ตี 3" วันนี้ผมจะเขียนเรื่องการเปิดปิดไฟด้วย หน้า User Interface ที่เขียนด้วยภาษา C#
โดยบทความนี้ผมเขียนกัน board Arduino UNO และ Visual c# นะครับ

 1.เริ่มแรกให้ สร้างโปรเจคขึ้นมาใหม่

2. ลาก Serial Port จาก Tool box มาวางไว้บน Form ที่เราสร้างไว้



หากสำเร็จจะมีคำว่า Serial Port อยู่ข้างล่างดังรูป


3. ลากปุ่มที่จะต้องใช้ในการเปิดปิดไฟออกมาวางบน Form


4. ลาก Combo box และปุ่มมาวางเพื่อใช้ในการเลือก Port เผื่อในกรณีที่คอมพิวเตอร์เรามีหลาย Port 


5. เรียกใช้งาน System.IO.Ports


6.เมื่อโหลด Form นี้ขึ้นมาให้ทำ เอา Port Name มาใส่ใน Combo box


7.ใส่ CheckForIllegalCrossThreadCall = false; ข้างบนใน class Form 1

8.เมื่อทำการรันโปรแกรมจะเห็น Port ที่มีอยู่ ของผมมีแค่ port เดียวเลยไม่ต้องเลือก
แต่ผมเขียนไว้เผื่อในกรณีที่คนอื่นเค้าเข้ามาอ่านแล้วเค้ามีหลาย port กันนะครับ



9.เปลี่ยนชื่อปุ่มให้เรียบร้อยแล้ว double click เข้าไปเพิ่มโคดตังนี้


หากมีการคลิกที่ปุ่ม Selectport จะทำการเลือก port จาก combobox แล้วทำการเปิด port นั้น


10.คลิกเข้าไปเพิ่ม Code ในส่วนของปุ่ม ON 

หากมีการคลิกปุ่มนี้ให้มีการส่งค่า 1 ไปยัง bord


ในปุ่ม OFF ก็เขียนเช่นเดียวกัน แต่เปลี่ยนค่า โดยผมให้ค่าที่ส่งไปเป็น 2 ในกรณีปิดไฟ


ทางฝั่งหน้า GUI ก็เสร็จแต่เพียงเท่านี้

11.ในส่วนทางฝั่งโปรแกรมฝังตัวจะอธิบายโคดดังนี้


เมื่อเขียนเสร็จก็ทำการ Upload เข้าไปใน board ได้เลยครับ แล้วลองรัน ดู
********ในกรณีที่ใครมีแค่ port เดียวก็เสียวได้ ก็ไม่ต้องสร้าง combo box เพื่อเลือก port นะครับ สั่งเปิด port ในตอนโหลด form ไปเลยนะครับ*******

 Code เต็มทางฝั่ง GUI นะครับ


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;//เช็ค thread call
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //รับข้อมูล port name ใส่ Combo Box
            String[] stportname = SerialPort.GetPortNames();
            foreach (String n in stportname)
            {
                comboBox1.Items.Add(n);
            }
            comboBox1.SelectedIndex = 0;

        }

        private void button1_Click(object sender, EventArgs e)
        {

            serialPort1.Write("1");
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //จะเลือก port และเปิด port
            serialPort1.PortName = comboBox1.SelectedItem + "";
            serialPort1.Open();
        }

อีตรง  private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) ไม่ต้องมีก็ได้นะครับ ผมเผลอกดเข้ามาเฉยๆ อิอิอิอิ
        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
           
        }

        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Write("2");
        }
    }
}


Code เต็มทางฝั่ง Board นะครับ 





void setup() {     
Serial.begin(9600);
  pinMode(13, OUTPUT);    //ให้ pin 13 เป็น output  
}

// the loop routine runs over and over again forever:
void loop() {
  if(Serial.available()>0)
  /*ตองตรวจสอบว่ามีข้อมูลในbufferหรือไม่ถ้ามีจึงจะสามารถใช้Serial.read() ได้*/
    {
      int n = Serial.read();//อ่านค่าออกมา
      switch(n)
      {
        case '1':digitalWrite(13,HIGH);break;//ไฟเปิด
        case '2':digitalWrite(13,LOW);break;//ไฟปิด
      }
    }
}

กรุณาอ่านด้วยนะครับ Copy มากๆมันไม่ดีเดียว program error แล้วหาไม่เจอนะครับ 
กล้องผมถ่ายตอนกลางคืนมันกากมากบ่องตงไดแค่นี้หละอิอิอิอิ



ไม่มีความคิดเห็น:

แสดงความคิดเห็น