ผู้เขียน หัวข้อ: เรียนรู้ครั้งที่ 20 [การสร้างโปรแกรมส่งข้อความแสดงบนจอ LCD ด้วย Visual C#]  (อ่าน 5527 ครั้ง)

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์
การแสดงผลด้วยจอ LCD ชนิดตัวอักษรที่เชื่อมต่อกับบอร์ดไมโครคอนโทรลเลอร์ Arduino เพื่อใช้แสดงข้อความเพื่อสื่อสารกับผู้ใช้งานให้รู้การดำเนินการใด ๆ ตามที่ผู้ออกแบบได้เขียนโปรแกรมกำหนดไว้ หากบอร์ดไมโครคอนโทรลเลอร์เชื่อมต่อกับคอมพิวเตอร์จะสามารถส่งข้อความจากคอมพิวเตอร์ไปแสดงที่จอ LCD ได้

คอนเซปของการสร้าง
   -โปรแกรมอินเตอร์เฟสที่สร้างขึ้นด้วย Visual C# จะเป็นตัวส่งข้อมูลไปครั้งละชุดโดยหัวข้อมูลจะเป็นคำสั่งควบคุมการทำงานของ LCD เช่น ล้างข้อมูลหน้าจอ, ปิดแสง LED Backlight, เปิดแสง LED Backlight และคำสั่งให้พิมพ์ข้อความโดยข้อความรับมาจากตัว TextBox
   -บอร์ด Arduino เชียนโค้ดรับข้อมูลทำการตรวจสอบว่าหัวข้อมูลที่รับเข้ามาเป็นคำสั่งทำอะไร (ใช้การตัดส่วนข้อมูลเอาเฉพาะส่วนคำสั่ง) แล้วดำเนินการตามคำสั่งที่ได้รับ

การดำเนินการตามขั้นตอนดังนี้
1. วงจรที่ใช้ทดลอง เชื่อมต่อจอ LCD i2c ขา SDA เข้าที่ A4 ขา SCL ที่ A5 และต่อขาไฟบวกและกราวด์ดังรูป


2. เนื่องจากต้องส่งข้อความและคำสั่งอื่น ๆ ไปในก้อนเดียวกันผ่านทางพอร์ตอนุกรมดังนั้นต้องออกแบบรูปแบบข้อมูลโดยแยกเป็น 3 ส่วนคือ
   -ส่วนแรก 4 ไบต์เก็บคำสั่งใช้ควบคุมการทำงาน (สามารถเพิ่มตามความต้องการได้)
   -ส่วนที่ 2 จำนวน 2 ไบต์เก็บตำแหน่งคอลัมน์ที่จะแสดงข้อความ
   -ส่วนสุดท้ายเป็นข้อความที่ต้องการแสดงผล
*รูปแบบเป็นการกำหนดขึ้นตามความต้องการของผู้ซึ่งไม่ใช่ค่ามาตราฐานสากลแต่อย่าใด


3. สร้างโปรเจคไฟล์แล้ววางตัวคอนโทรลและแก้ไขชื่อดังรูป ตัวคอนโทรลที่ใช้งานได้แก่
    -Button
    -ComboBox
    -GroupBox
    -Label
    -SerialPort
    -TextBox


4. กดปุ่ม Shift ค้างไว้แล้วคลิกที่คอมโบบ็อกทั้ง 4 ตัวตั้งค่าคุณสมบัติเริ่มต้นให้ DropDownStyle ให้เป็น DropDownList เพื่อไม่ให้ผู้ใช้งานพิมพ์ทับลงในช่องขณะรันโปรแกรม (ให้เลือกอย่างเดียว)


5. คลิกเพิ่มรายการในคอมโบบ็อกที่ใช้เลือกความเร็วในการสื่อสาร

ความเร็วที่ให้เลือกใช้มีดังนี้
โค๊ด: [Select]
9600
19200
38400
57600
74880
115200

6. คลิกเพิ่มรายการในคอมโบบ็อกที่ใช้เลือกตำแหน่งคอมลัมน์ในการแสดงผล

ค่าตำแหน่งให้เลือกใช้มีดังนี้
โค๊ด: [Select]
00
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15

เหตุที่ตัวเลข 0-9 ต้องมีเลข 0 นำหน้าเนื่องจากรูปแบบของข้อมูลที่ใช้ส่งจองพื้นที่ไว้ 2 ไบต์

7. กดคีย์ Shift แล้วคลิกวัตถุต่าง ๆ ดังรูปตั้งค่าเริ่มต้นให้ Enable เป็น False เพื่อให้ปิดการทำงานไว้ก่อนเมื่อเริ่มรันโปรแกรม


8. ดับเบิลคลิกที่ฟอร์มเพื่อเขียนโค้ด


9. เขียนโค้ดเพื่อให้โปรแกรมสแกนหาพอร์ตอนุกรมที่คอมพิวเตอร์มองเห็น

โค้ด
โค๊ด: [Select]
using System.IO.Ports;
โค๊ด: [Select]
            baudrate_cbb.SelectedIndex = 0;
            string[] ports = SerialPort.GetPortNames();
            port_cbb.Items.AddRange(ports);
            port_cbb.SelectedIndex = 0;
            cRow1_cbb.SelectedIndex = 0;
            cRow2_cbb.SelectedIndex = 0;

10. คลิกที่คอมโบบ็อกที่ใช้เลือกพอร์ต แล้วคลิกเลือกเหตุการณ์กระตุ้นเป็น MouseClick (แล้วดับเบิลคลิก) เพื่อเขียนโค้ดให้ทำงานเมื่อมีเมาส์มาคลิกที่คอมโบบ็อกตัวนี้


11. เขียนโค้ดให้โปรแกรมสแกนหาพอร์ตอนุกรมใหม่ที่คอมพิวเตอร์มองเห็นในจังหวะที่มีการคลิกเมาส์ที่คอมโบบ็อกนี้

โค้ด
โค๊ด: [Select]
            port_cbb.Items.Clear();
            string[] ports = SerialPort.GetPortNames();
            port_cbb.Items.AddRange(ports);
            port_cbb.SelectedIndex = 0;

12. ดับเบิลคลิกที่ปุ่ม Connect เพื่อเขียนโค้ดให้โปรแกรมเปิดพอร์ตเชื่อมต่อ


13. เขียนโค้ดควบคุม

โค้ด
โค๊ด: [Select]
            con_btn.Enabled = false;
            dis_btn.Enabled = true;
            textBox1.Enabled = true;
            textBox2.Enabled = true;
            clr_btn.Enabled = true;
            onLed_btn.Enabled = true;
            offLed_btn.Enabled = true;
            if (serialPort1.IsOpen)
                serialPort1.Close();
            serialPort1.PortName = port_cbb.Text;
            serialPort1.BaudRate = Convert.ToInt32(baudrate_cbb.Text);
            try
            {
                serialPort1.Open();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Message", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

14. ดับเบิลคลิกที่ปุ่ม Disconnect เพื่อเขียนโค้ดปิดการใช้งานพอร์ต


15. เขียนโค้ดควบคุม

โค้ด
โค๊ด: [Select]
            con_btn.Enabled = true;
            dis_btn.Enabled = false;
            textBox1.Enabled = false;
            textBox2.Enabled = false;
            clr_btn.Enabled = false;
            onLed_btn.Enabled = false;
            offLed_btn.Enabled = false;
            if (serialPort1.IsOpen)
                serialPort1.Close();

16. ดับเบิลคลิกทั้ง 3 ปุ่มเพื่อเขียนโค้ด


17. เขียนโค้ดควบคุม (เป็นการส่งข้อความที่เป็นคำสั่งควบคุมการทำงานของ LCD)

โค้ด
โค๊ด: [Select]
            serialPort1.WriteLine("CLSC");
โค๊ด: [Select]
            serialPort1.WriteLine("BLON");
โค๊ด: [Select]
            serialPort1.WriteLine("BLOF");

18. ดับเบิลคลิกทั้ง 2 ปุ่มเพื่อเขียนโค้ด


19. เขียนโค้ดเพื่อล้างข้อความในเท็กบ็อก

โค้ด
โค๊ด: [Select]
            textBox1.Text = "";
โค๊ด: [Select]
            textBox2.Text = "";

20. คลิกที่ textBox1 เลือกเหตุการกระตุ้นเป็น keyDown


21. เขียนโค้ดตรวจจับการกดคีย์เอ็นเตอร์ เมื่อมีการกดให้ส่งข้อความพร้อมคำสั่งควบคุมไปทางพอร์ตอนุกรมโดยรูปแบบประกอบด้วย คำสั่งควบคุม-ตำแหน่งแสดงผล-ข้อความ เรียงลำดับกัน

โค้ด
โค๊ด: [Select]
            if (e.KeyCode == Keys.Enter)
            {
                serialPort1.WriteLine("LCD1" +cRow1_cbb.Text+ textBox1.Text);
            }

22. คลิกที่ textBox2 เลือกเหตุการกระตุ้นเป็น keyDown


23. เขียนโค้ดเช่นเดียวกับ textBox1

โค้ด
โค๊ด: [Select]
            if (e.KeyCode == Keys.Enter)
            {
                serialPort1.WriteLine("LCD2"+cRow2_cbb.Text + textBox2.Text);
            }

24. คลิกที่ฟอร์มเลือกเหตุการณ์กระตุ้นเป็น FormClosing


25. เขียนโค้ดให้ปิดการใช้งานพอร์ตอนุกรมก่อนปิดโปรแกรม

โค้ด
โค๊ด: [Select]
            if (serialPort1.IsOpen)
                serialPort1.Close();
            Application.Exit();
ส่วนโค้ดบอร์ด Arduino
ดำเนินการดังนี้
การใช้งานจอ LCD ที่มีการเชื่อมต่อแบบ i2c จำเป็นต้องติดตั้งไลบรารี่ช่วยงานโดยเข้าไปดาวน์โหลดได้ที่
https://github.com/marcoschwartz/LiquidCrystal_I2C

26. เข้าเวปแล้วดาวน์โหลด


27. ทำการเพิ่มไลบรารี่ลงในโปรแกรม Arduino IDE โดยการเพิ่มจากไฟล์ zip แล้วทำการหาไฟล์ zip ที่ได้จากการดาวน์โหลด


28. เขียนโค้ดรับข้อมูลจากพอร์ตอนุกรมแล้วนำมาประมวลผลเพื่อแสดงผลที่จอ LCD
  (รูปเป็นโค้ดบางส่วน)

โค้ดเต็ม
โค๊ด: [Select]
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2); /* 0x27 for PCF8574 and 0x3F for PCF8574A*/

String inputString = "";          // a String to hold incoming data
String command = "";              // a String to hold command
int col =0;                       // a String to hold column location
String data = "";                 // a String to hold data for display
bool stringComplete = false;      // whether the string is complete

void setup()
{
  Serial.begin(9600);
  inputString.reserve(200);       // reserve 200 bytes for the inputString:
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2, 0);
  lcd.print("Hello, world!");
  lcd.setCursor(0, 1);
  lcd.print("Control by VS C#");
  lcd.setCursor(0, 0);            //reset location
}
void loop()
{
  int x = inputString.length() - 1;

  if (stringComplete) {
    inputString = inputString.substring(0, x);        //delete '\n'
    command = inputString.substring(0, 4);            //detect command
    col= inputString.substring(4, 6).toInt();         //location of column
    data = inputString.substring(6, x);
    if (command == "LCD1")
    {
      lcd.setCursor(col, 0);                  //col,row
      lcd.print(data);
    }
    else if (command == "LCD2")
    {
      lcd.setCursor(col, 1);
      lcd.print(data);
    }
    else if (command == "CLSC")
    {
      lcd.clear();
    }
    else if (command == "BLON")
    {
      lcd.backlight();
    }   
    else if (command == "BLOF")
    {
      lcd.noBacklight();
    }
    inputString = "";                    // clear the string:
    stringComplete = false;
  }
}

void serialEvent() {
  while (Serial.available()) {
    char inChar = (char)Serial.read();
    inputString += inChar;
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

29. ทดสอบการทำงานของโปรแกรม

« แก้ไขครั้งสุดท้าย: ตุลาคม 13, 2018, 03:48:54 PM โดย admin »

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์

admin

  • Administrator
  • Hero Member
  • *****
  • กระทู้: 706
    • ดูรายละเอียด
    • อีเมล์