บทที่ 7: การเขียนโปรแกรมติดต่อกับจอ OLED128x64 0.96” ชนิด i2c

UTEN BOONLIAM Avatar
บทที่ 7 / 26

บทที่ 7: การเขียนโปรแกรมติดต่อกับจอ OLED128x64 0.96” ชนิด i2c

OLED (Organic Light-Emitting Diode) display เป็นจอแสดงผลกราฟิกประเภทหนึ่งที่สร้างจากวัสดุ “สารกึ่งตัวนำอินทรีย์” (Organic Semiconductor) มีลักษณะเป็นชั้นบาง ๆ อยู่ระหว่างขั้วบวก (Anode) และขั้วลบ (Cathode) และสามารถเปล่งแสงได้เมื่อมีกระแสไฟฟ้าไหลผ่าน เรียกกระบวนการนี้ว่า อิเล็คโทรลูมิเนเซนส์ (Electroluminescence) จอภาพ OLED มีข้อดีซึ่งแตกต่างจากจอแสดงผล LCD (Liquid Crystal Display) ทั่วไปคือ ไม่ต้องมีวงจรที่สร้างแสง Backlight ดังนั้นจึงมีความหนาน้อยกว่าและเบากว่า ใช้กำลังไฟฟ้าต่ำ นอกจากนั้นจะไม่มีการเปล่งแสงในบริเวณที่ต้องการให้เป็นสีดำ ในปัจจุบันอุปกรณ์อย่างเช่น โทรทัศน์, สมาร์ทโฟน (Smartphones), แท็บเล็ต (Tablets) ได้เริ่มเปลี่ยนไปใช้จอภาพแบบ OLED กันมากขึ้น

สำหรับบอร์ด Arduino Learning Kit ได้ทำการติดตั้ง OLED 128×64 ชนิด I2C หน้าจอ 9.6นิ้ว ซึ่งเป็นบัสหรือสายสัญญาณเดียวกันกับ LCD16x2 i2c ของบทความที่ผ่านมา ทั้งนี้ในการสั่งงานให้กับอุปกรณ์ i2c ที่อยู่บัสเส้นเดียวกัน ค่า address ของตัวอุปกรณ์จึงมีความสำคัญมาก เพราะถ้ากำหนด address ผิด จะไม่สามารถติดต่อหรือสั่งงานอุปกรณ์ตัวนั้นได้เลย

  1. เขียนโปรแกรม Arduino Uno ติดต่อกับ OLED128x62 i2c

    1. เปิดโปรแกรม Arduino IDE ขึ้นมา เลือกบอร์ดเป็นชนิด Arduino Uno จากนั้นทำการ ดาวน์โหลดไลบรารี่ Adafruit_SSD1306 และ Adafruit_GFX คลิกที่ Sketch -> Include Library -> Manage Libraries ดังตัวอย่างรูปด้านล่าง ทำการติดตั้งให้เรียบร้อย

  1. เปิด Example sketch โดยทำการเปิดตัวอย่างโปรแกรมที่มีชื่อว่า ssd1306_128x64_i2c โดยคลิกที่ File -> Examples -> Adafruit_SSD1306 -> ssd1306_128x64_i2c

  1. ที่บรรทัดที่ 59 ให้แก้ address จากค่า 0x3D เป็นค่า 0x3C จากนั้นทำการ upload sketch ไปยัง Arduino Uno สังเกตดูหน้าจอ OLED

อธิบายโค้ดข้างบนดังนี้

  • โค้ดตั้งแต่บรรทัดที่ 21-53 เป็นการ include library และกำหนดค่าต่าง ๆให้กับโปรแกรมที่ใช้ติดต่อกับ OLED128x64 i2c โดยค่า 128 คือจุด pixel ในแนวนอนหรือแกน X และ 64 คือจุด pixel ในแนวตั้งหรือแกน Y

  • ในฟังก์ชัน setup ที่บรรทัด 59-62 เป็นการตรวจสอบความถูกต้องของการเชื่อมต่อ OLED128x64 บนบัส i2c ว่าเรียบร้อยหรือไม่ ถ้าการเชื่อมต่อไม่สมบูรณ์หรือเกิด Error จะแสดงข้อความ “SSD1306 allocation failed” ออกมาทาง Serial Monitor แต่ถ้าเชื่อมต่อสมบูรณ์หน้าจอ OLED จะแสดงรูปด้านบนขึ้นมา ซึ่งคำสั่งที่ให้แสดงออกทางหน้าจอ OLED คือ display.display(); ทำการหน่วงเวลา 2วินาทีแล้วสั่งเคลียร์หน้าจอด้วยคำสั่ง display.clearDisplay();

  • บรรทัด 73 เป็นการวาดจุดลงบนหน้าจอ OLED ด้วยคำสั่ง display.drawPixel(10, 10, WHITE); โดยจะวาดจุดที่ตำแหน่ง X=10, Y=10

  • บรรทัดที่ 84 – 108 เป็นการเรียกใช้ฟังก์ชันต่าง ๆ ที่เขียนไว้ภายใต้ฟังก์ชัน loop ซึ่งสามารถดูผลของฟังก์ชันต่าง ๆ ผ่านทางหน้าจอ OLED

  • บรรทัดที่ 111 – 114 เป็นคำสั่งในการ invert หน้าจอ คือการกลับขาวเป็นดำ และกลับดำเป็นขาว ซึ่งใช้คำสั่ง display.invertDisplay(true);

  • บรรทัดที่ 116 เป็นการเรียกใช้ฟังก์ชัน testanimate ซึ่งผลของฟังก์ชันนี้จะแสดงรูปดาวตกที่หน้าจอ ซึ่งจะทำงานวนซ้ำไปเรื่อย ๆ ภายในฟังก์ชันนี้

คำสั่งที่น่าสนใจในการทดลองนี้

  • display.display(); แสดงภาพหรือตัวอักษรต่าง ๆบนหน้าจอ OLED

  • display. clearDisplay (); เคลียร์บัฟเฟอร์ของหน้าจอ OLED

  • display.drawPixel(x,y,color); เป็นการวาดจุดลงบนหน้าจอ OLED

  • display.drawLine(x0,y0, x1,y1,color); เป็นการวาดเส้นลงบนหน้าจอ OLED

  • display.setTextSize(number); เป็นการกำหนดขนาดตัวอักษร

  • display.setTextColor(color); เป็นการกำหนดสีให้กับตัวอักษร

  • display.setCursor(x, y); เป็นการกำหนดตำแหน่งของ Cursor

  • display.println(para); เป็นการส่งค่าไปเก็บไว้ที่บัฟเฟอร์ของจอ OLED ก่อนที่จะแสดงออกทางหน้าจอด้วยคำสั่ง display.display();

แบบฝึกหัดสำหรับทบทวนความเข้าใจ

  1. ทำการคอมเมนต์โค้ดตั้งแต่บรรทัดที่ 73 จนถึงบรรทัดที่ 116 โดยการลากเมาส์คลุมบรรทัดดังกล่าวแล้วกดปุ่ม Ctrl + ‘/’ ( กดปุ่ม Ctrl พร้อมกับปุ่ม ‘/’ )

จากนั้นในฟังก์ชัน loop ให้พิมพ์โค้ดตามตัวอย่างด้านล่าง แล้วทำการ upload สังเกตดูที่หน้าจอ OLED

void loop() {
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("Helloworld");
display.display();

}

จากนั้นทดลองให้เปลี่ยนค่าพารามิเตอร์ต่าง ๆในโค้ดที่เราได้เพิ่มเติม สังเกตดูการเปลี่ยนแปลงของผลที่ได้

 

 

 

  1. ทดลองเขียนโปรแกรมในฟังก์ชัน loop โดยให้แสดงข้อความ

  • บรรทัดแรก “Arduino Learning Kit” และบรรทัดที่สองเป็น “Coding is very funny” ให้แสดงตัวหนังสือเป็นสีขาวและหน่วงเวลา 2 วินาที กำหนดขนาดตัวอักษรเท่ากับ 1

  • จากนั้นให้แสดงข้อความเดิม แต่กลับสีตัวอักษรจากขาวเป็นดำแล้วให้หน่วงเวลา 2 วินาที

  • จากนั้นทำการเคลียร์หน้าจอแล้วหน่องเวลา 2 วินาที แล้วให้กลับไปทำขั้นตอนแรก วนซ้ำไปเรื่อย ๆ

 

 

 

  1. เขียนโปรแกรม ESP32(ESP-WROM-32) ติดต่อกับ OLED128x62 i2c

    1. เปิดโปรแกรม Arduino IDE ขึ้นมา เลือกบอร์ดเป็นชนิด NodeMCU-32S จากนั้นทำการ ดาวน์โหลดไลบรารี่อีกตัวหนึ่งมาทดลอง ชื่อว่า SSD1306 คลิกที่ Sketch -> Include Library -> Manage Libraries ดังตัวอย่างรูปด้านล่าง ทำการติดตั้งให้เรียบร้อย

  1. เปิด Example sketch โดยทำการเปิดตัวอย่างโปรแกรมขึ้นมา โดยคลิกที่ File -> Examples -> ESP8266 and ESP32 Oled Drivers for SSD1306 display -> SSD1306SimpleDemo

  1. บรรทัดที่ 66 เปลี่ยนตำแหน่งขาสัญญาณ SDA, SCL จากเดิมในโค้ดคือ D3, D5 เปลี่ยนไปเป็น 21, 22 จากนั้นทำการ upload sketch ให้กับ ESP32 (อย่าลืมกดปุ่ม BOOT ขณะ upload) จากนั้นให้สังเกตผลที่หน้าจอ OLED

อธิบายโค้ดข้างบนดังนี้

  • โค้ดตั้งแต่บรรทัดที่ 33-74 เป็นการดึงไลบรารี่มาใช้งาน, ประกาศและกำหนดค่าตัวแปร และกำหนดค่าต่าง ๆให้กับโปรแกรมที่ใช้ติดต่อและแสดงผลบน OLED128x64 i2c

  • ฟังก์ชัน setup เป็นการกำหนดค่าเริ่มต้นให้กับ OLED และกำหนดรูปแบบและขนาดของตัวอักษร

  • ในการทำงานของฟังก์ชัน loop จะใช้เทคนิคการประกาศตัวแปรพอยน์เตอร์ (บรรทัดที่ 71) ที่นำไปชี้ตำแหน่งฟังก์ชันที่เราต้องการเรียกใช้งาน โดยใช้ตัวแปร demoMode เป็นตัวเลื่อนตำแหน่งของฟังก์ชันไปเรื่อย ๆ จนวนครบรอบมาฟังก์ชันแรกอีกครั้ง โดยมีตัวแปร DEMO_DURATION เป็นตัวแปรที่กำหนดเวลาว่าให้แต่ละฟังก์ชันทำงานนานเท่าไหร่ (มีหน่วยเป็น mSec)

แบบฝึกหัดสำหรับทบทวนความเข้าใจ

  1. ทดลองเปลี่ยนค่าตัวเลขให้กับตัวแปร DEMO_DURATION ที่บรรทัด 70 แล้วดูการเปลี่ยนแปลงบนหน้าจอเทียบกับก่อนเปลี่ยนค่า

 

 

 

  1. ทดลองเขียนโปรแกรมในฟังก์ชัน loop โดยให้แสดงข้อความโดย บรรทัดแรกให้แสดงข้อความ “Arduino Learning Kit” และบรรทัดที่สองเป็น “Coding is very funny” ให้แสดงเป็นเวลา 2 วินาที จากนั้นให้เคลียร์หน้าจอเป็นเวลา 2วินาที แล้วให้กลับมาแสดงข้อความเดิมซ้ำอีก ทำงานวนซ้ำไปเรื่อย ๆ โดยให้ดูคำสั่งในโค้ดตัวอย่างแล้วนำมาประยุกต์ใช้งาน

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *