[2/2567] ใบงานรายวิชาการประยุกต์ไมโครคอนโทรลเลอร์ สัปดาห์ที่ 16
ใบงานประจำสัปดาห์ รายวิชาการประยุกต์ไมโครคอนโทรลเลอร์
จงเขียนไมโครคอนโทรลเลอร์ โดยกำหนดให้เชื่อมต่อกับโมดูลการแสดงผล lcd16x2 เพื่อควบคุมการแสดงผลให้ได้ตามโจทย์ที่กำหนด. โดยใช้ความรู้ในการเขียนโปรแกรมพื้นฐานที่เรียนในสัปดาห์ที่ผ่านมา นำมาประยุกต์ใช้งาน if , if else , while ,for , switch case
ในสัปดาห์นี้เราจะทำการเรียนรู้ การเขียนโปรแกรมควบคุมการแสดงผลผ่านจอ led 16x2 ซึ่งเป็นโมดูลที่นิยมนำมาใช้ในการเขียนเพื่อแสดงผลตัวอักษรหรือค่าต่างๆ สำหรับไมโครคอนโทรลเลอร์ ซึ่งจะมีวิธีการต่อใช้งานเพื่อส่งข้อมูลหากัน อยู่สองวิธีการด้วยกัน คือ
การต่อตรงเข้ากับ lcd โดยใช้สายทั้งหมด 8 เส้น (รวมขอ Vcc , Gnd ), และการต่อด้วยโมดูลไดร์โดยสื่อสารผ่าน บัส I2C
ณ ที่นี้ผู้เขียนเลือกวิธีการต่อจอ lcd ด้วยโมดูลไดร์ I2C เนื่องจากมีข้อดีคือใช่สายในการต่อใช้งานเพียงแค่ 4 เส้น ทำให้เรายังมีขา pin ที่คงเหลือใช้งานสำหรับการเชื่อมต่อกับอุปกรณ์อิเล็กทรอนิก หรือโมดูลอื่นๆ หากนักเรียนนักศึกษาต้องการเรียนรู้เกี่ยวกับการต่อใช้งานด้วย lcd16x2 แบบต่อตรงให้ หาข้อมูลเพิ่มเติมการต่อใน internet หรือลิ้งดังต่อไปนี้ คลิก!!
ความแตกต่างระหว่างการต่อตรงกับแบบมีโมดูลไดร์หากพิจารณาตามรูปจะเห็นได้ว่าการต่อสายสัญญาณระหว่าง ไมโครคอนโทรลเลอร์กับ lcd1602 แบบชนิดต่อตรงนั้น จะต้องใช้งานสายไฟถึง 8 เส้น (รวม Vcc,Gnd) ถือว่าเป็นการใช้ pin ในการสื่อสารเยอะมากสำหรับการต่อเพื่อใช้งานโมดูลแค่โมดูลเดียว ทำให้เราเหลือสายไฟหรือ pin อื่นๆที่จะใช้เชื่อมต่อกับโมดูลอื่นๆ หรืออุปกรณ์อิเล็กทรอนิกส์อื่นๆ นั้นน้อยลงมีข้อดีคือการสื่อสารแบบนี้จะเป็นการรับส่งข้อมูลที่เร็วมากๆ *แต่การแสดงผลนั้นอาจจะไม่จำเป็นต้องใช้งานคุณสมบัติความเร็วในการรรับส่งข้อมูล.
การใช้งานจอ lcd16x2 แบบต่อตรง
การใช้งานจอ lcd16x2 แบบโมดูลไดร์ I2C
ในการต่อใช้งานจอแสดงผล lcd16x2 เข้ากับไมโครคอนโทรลเลอร์ด้วยโมดูลไดร์ I2C มีการเชื่อมต่อดังต่อไปนี้- Vcc -- > Vcc (5v)
- Gnd --> Gnd
- SCL --> A5
- SDA -- >A4
การใช้งาน LCD1602 I2C กับ Arduino
การใช้งาน LCD1602 I2C เป็นวิธีที่ง่ายและประหยัดพินมากกว่าการต่อแบบปกติ เนื่องจากใช้โปรโตคอล I2C ซึ่งต้องการเพียง 2 สายสัญญาณคือ SDA
(ข้อมูล) และ SCL
(นาฬิกา) โดยสิ่งที่เราจะต้องระบุคือค่า adress ของตัวอุปกรณ์ก่อนเพื่อที่จะสามารถสื่อสารกันได้ เพราะความสามารถในการสื่อสารของ I2C สามารถต่ออุปกรณ์แบบขนานกันได้หลายๆอุปกรณ์ ถัดไปจะแสดงตัวอย่างของ ชุดคำสั่งที่ใช้ในการหาที่อยู่ address ของอุปกรณ์ I2C.
โค้ด I2C Scanner (หา Address ของจอ LCD)
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("Scanning...");
}
void loop() {
for (byte address = 1; address < 127; address++) {
Wire.beginTransmission(address);
if (Wire.endTransmission() == 0) {
Serial.print("I2C device found at address 0x");
Serial.println(address, HEX);
delay(500);
}
}
delay(2000);
}
ผลลัพธ์ใน Serial Monitor จะแสดงที่อยู่ (Address) เช่น 0x27
หรือ 0x3F (ชุดคำสั่งนี้สามารถนำไปใช้งานกับอุปกรณ์อื่นๆได้ที่เป็น interface แบบ I2C ไม่ใช่เฉพาะแต่ lcd1602 เท่านั้น.
โค้ดพื้นฐานการใช้งาน LCD1602 I2C
#include <LCD_I2C.h>
// กำหนดที่อยู่ I2C และขนาดของ LCD (16x2)
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
// เริ่มต้นการทำงานของ LCD
lcd.begin(); // คำสั่งเริ่มต้นโมดูล LCD
lcd.backlight(); // เปิดแสงพื้นหลัง หากไม่ต้องการสามารถกำหนด ปิดได้
// แสดงข้อความ
lcd.setCursor(0, 0); // กำหนดตำแหน่งคอลัมน์ 0 แถว 0
lcd.print("Hello, World!"); // แสดงข้อความ
lcd.setCursor(0, 1); // กำหนดตำแหน่งคอลัมน์ 0 แถว 1
lcd.print("I2C LCD Ready!"); // แสดงข้อความ
}
void loop() {
// ไม่มีกิจกรรมใน loop
}
คำอธิบายโค้ด
LCD_I2C lcd(0x27, 16, 2);
สร้างตัวแปรแบบ object ชื่อ lcd โดยกำหนดพารามิเตอร์ 3 ตัวคือ Address I2C (เช่น0x27
) และขนาดจอ LCD (16 คอลัมน์ x 2 แถว)lcd.begin();
เริ่มต้นการทำงานของโมดูล LCDlcd.backlight();
เปิดแสงไฟพื้นหลังของ LCDlcd.setCursor(คอลัมน์, แถว);
กำหนดตำแหน่งของตัวอักษรที่จะพิมพ์บนจอ LCD ใช้เป็นการมาร์คตำแหน่งเริ่มต้นเพื่อเป็นการบอกว่า ตัวอักษรตัวแรกต้องอยู่ ณ ตำแหน่งใดlcd.print("ข้อความ");
แสดงข้อความบนจอ LCD
ผลลัพธ์
เมื่ออัพโหลดโค้ดไปที่ Arduino:
- จะแสดงข้อความ "Hello, World!" ในแถวแรก
- และข้อความ "I2C LCD Ready!" ในแถวที่สอง
- หากจอไม่แสดงผล ให้ตรวจสอบที่อยู่ I2C อีกครั้งด้วย I2C Scanner
- ตรวจสอบการเชื่อมต่อสาย SDA/SCL
- ปรับไลบรารีหรือเวอร์ชันของ
LiquidCrystal_I2C
หากมีปัญหาเกี่ยวกับความเข้ากันได้
ให้นักเรียนนักศึกษาต่ออุปกรณ์ดังต่อไปนี้แล้วแก้โจทย์ปัญหาตามข้อย่อยที่กำหนด
รายการอุปกรณ์ดังต่อไปนี้
- ไมโครคอนโทรลเลอร์
- lcd 16x2 i2c
- สวิทช์ button 2 button ตัวต้านทาน 1k โอห์ม
ตัวอย่างการเขียนโปรแกรมอ่านค่าจาก button
if(digitalRead(2)==LOW){
Serial.print("button active");
}
ให้นักเรียนนักศึกษาทำไปทีละข้อย่อยแล้วเรียกตรวจ พร้อมอธิบาย
- 1 กำหนดให้นักเรียนนักศึกษาเชื่อมต่อไมโครคอนโทรลเลอร์เข้ากับโมดูล lcd1602 โดยให้แสดงผลการทำงานดังต่อไปนี้ แสดงเลขที่ของนักเรียนนักศึกษาที่บรรทัดแรกค้างไว้ 3 วินาทีแล้วหายไป (นั้งคู่กำหนดให้การเลือกคนใดคนนึ่ง)
- 2 ต่อจากข้อย่อยที่ 1 กำหนดให้เขียนแสดงผลที่จอ lcd1602 ด้วยคำว่า menu1,menu2,menu3,menu4 ตามรูปตัวอย่างโดย menu2 และ menu4 ต้องอยู่ในตำแหน่งที่ 8 .
- 3 ต่อจากข้อย่อยที่ 2 กำหนดให้ใช้เครื่องหมายน้อยกว่าเป็นลูกศรตัวชี้เมนูโดยสามารถกดปุ่ม button1 แล้วเลื่อนตำแหน่งของลูกศรไปยังเมนูอื่นๆได้ กำหนดให้เลื่อนตามลำดับ 1,2,3,4
- 4 ต่อจากข้อย่อยที่ 3 กำหนดให้กดปุ่ม button2 จะเป็นการแสดงผลออกทาง Serial monitor เมื่อลูกศรชี้อยู่ ณ ตำแหน่งนั้นๆเป็นคำตามที่ชี้อยู่ 1 ครั้ง
- 5 ต่อจากข้อย่อยที่ 3 กำหนดให้เมื่อกดปุ่ม button1 แล้วแสดงคำใน Serial monitor ณ ตำแหน่งที่กำลังชี้อยู่แสดงผลทันทีแต่จะไม่สเปมข้อความ กล่าวคือเมื่อลูกศรถูกเปลี่ยนตำแหน่งแล้วให้แสดงผลคำ 1 ครั้งทันทีด้วยคำที่ถูกชี้อยู่ และการกดปุ่ม button2 จะเป็นการเลื่อนตำแหน่งเหมือน button1 แต่เป็นทิศทางตรงกันข้าม.
ความคิดเห็น
แสดงความคิดเห็น