การแสดงผลด้วยจอ 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. คลิกเพิ่มรายการในคอมโบบ็อกที่ใช้เลือกความเร็วในการสื่อสาร
ความเร็วที่ให้เลือกใช้มีดังนี้
9600
19200
38400
57600
74880
115200
6. คลิกเพิ่มรายการในคอมโบบ็อกที่ใช้เลือกตำแหน่งคอมลัมน์ในการแสดงผล
ค่าตำแหน่งให้เลือกใช้มีดังนี้
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. เขียนโค้ดเพื่อให้โปรแกรมสแกนหาพอร์ตอนุกรมที่คอมพิวเตอร์มองเห็น
โค้ด
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. เขียนโค้ดให้โปรแกรมสแกนหาพอร์ตอนุกรมใหม่ที่คอมพิวเตอร์มองเห็นในจังหวะที่มีการคลิกเมาส์ที่คอมโบบ็อกนี้
โค้ด
port_cbb.Items.Clear();
string[] ports = SerialPort.GetPortNames();
port_cbb.Items.AddRange(ports);
port_cbb.SelectedIndex = 0;
12. ดับเบิลคลิกที่ปุ่ม Connect เพื่อเขียนโค้ดให้โปรแกรมเปิดพอร์ตเชื่อมต่อ
13. เขียนโค้ดควบคุม
โค้ด
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. เขียนโค้ดควบคุม
โค้ด
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)
โค้ด
serialPort1.WriteLine("CLSC");
serialPort1.WriteLine("BLON");
serialPort1.WriteLine("BLOF");
18. ดับเบิลคลิกทั้ง 2 ปุ่มเพื่อเขียนโค้ด
19. เขียนโค้ดเพื่อล้างข้อความในเท็กบ็อก
โค้ด
20. คลิกที่ textBox1 เลือกเหตุการกระตุ้นเป็น keyDown
21. เขียนโค้ดตรวจจับการกดคีย์เอ็นเตอร์ เมื่อมีการกดให้ส่งข้อความพร้อมคำสั่งควบคุมไปทางพอร์ตอนุกรมโดยรูปแบบประกอบด้วย คำสั่งควบคุม-ตำแหน่งแสดงผล-ข้อความ เรียงลำดับกัน
โค้ด
if (e.KeyCode == Keys.Enter)
{
serialPort1.WriteLine("LCD1" +cRow1_cbb.Text+ textBox1.Text);
}
22. คลิกที่ textBox2 เลือกเหตุการกระตุ้นเป็น keyDown
23. เขียนโค้ดเช่นเดียวกับ textBox1
โค้ด
if (e.KeyCode == Keys.Enter)
{
serialPort1.WriteLine("LCD2"+cRow2_cbb.Text + textBox2.Text);
}
24. คลิกที่ฟอร์มเลือกเหตุการณ์กระตุ้นเป็น FormClosing
25. เขียนโค้ดให้ปิดการใช้งานพอร์ตอนุกรมก่อนปิดโปรแกรม
โค้ด
if (serialPort1.IsOpen)
serialPort1.Close();
Application.Exit();
ส่วนโค้ดบอร์ด Arduino
ดำเนินการดังนี้
การใช้งานจอ LCD ที่มีการเชื่อมต่อแบบ i2c จำเป็นต้องติดตั้งไลบรารี่ช่วยงานโดยเข้าไปดาวน์โหลดได้ที่
https://github.com/marcoschwartz/LiquidCrystal_I2C
26. เข้าเวปแล้วดาวน์โหลด
27. ทำการเพิ่มไลบรารี่ลงในโปรแกรม Arduino IDE โดยการเพิ่มจากไฟล์ zip แล้วทำการหาไฟล์ zip ที่ได้จากการดาวน์โหลด
28. เขียนโค้ดรับข้อมูลจากพอร์ตอนุกรมแล้วนำมาประมวลผลเพื่อแสดงผลที่จอ LCD
(รูปเป็นโค้ดบางส่วน)
โค้ดเต็ม
#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. ทดสอบการทำงานของโปรแกรม