บทที่ 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 ผิด จะไม่สามารถติดต่อหรือสั่งงานอุปกรณ์ตัวนั้นได้เลย
-
เขียนโปรแกรม Arduino Uno ติดต่อกับ OLED128x62 i2c
-
เปิดโปรแกรม Arduino IDE ขึ้นมา เลือกบอร์ดเป็นชนิด Arduino Uno จากนั้นทำการ ดาวน์โหลดไลบรารี่ Adafruit_SSD1306 และ Adafruit_GFX คลิกที่ Sketch -> Include Library -> Manage Libraries ดังตัวอย่างรูปด้านล่าง ทำการติดตั้งให้เรียบร้อย
-


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

-
ที่บรรทัดที่ 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();
แบบฝึกหัดสำหรับทบทวนความเข้าใจ
-
ทำการคอมเมนต์โค้ดตั้งแต่บรรทัดที่ 73 จนถึงบรรทัดที่ 116 โดยการลากเมาส์คลุมบรรทัดดังกล่าวแล้วกดปุ่ม Ctrl + ‘/’ ( กดปุ่ม Ctrl พร้อมกับปุ่ม ‘/’ )

จากนั้นในฟังก์ชัน loop ให้พิมพ์โค้ดตามตัวอย่างด้านล่าง แล้วทำการ upload สังเกตดูที่หน้าจอ OLED
void loop() {
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.print("Helloworld");
display.display();
}
จากนั้นทดลองให้เปลี่ยนค่าพารามิเตอร์ต่าง ๆในโค้ดที่เราได้เพิ่มเติม สังเกตดูการเปลี่ยนแปลงของผลที่ได้
-
ทดลองเขียนโปรแกรมในฟังก์ชัน loop โดยให้แสดงข้อความ
-
บรรทัดแรก “Arduino Learning Kit” และบรรทัดที่สองเป็น “Coding is very funny” ให้แสดงตัวหนังสือเป็นสีขาวและหน่วงเวลา 2 วินาที กำหนดขนาดตัวอักษรเท่ากับ 1
-
จากนั้นให้แสดงข้อความเดิม แต่กลับสีตัวอักษรจากขาวเป็นดำแล้วให้หน่วงเวลา 2 วินาที
-
จากนั้นทำการเคลียร์หน้าจอแล้วหน่องเวลา 2 วินาที แล้วให้กลับไปทำขั้นตอนแรก วนซ้ำไปเรื่อย ๆ
-
เขียนโปรแกรม ESP32(ESP-WROM-32) ติดต่อกับ OLED128x62 i2c
-
เปิดโปรแกรม Arduino IDE ขึ้นมา เลือกบอร์ดเป็นชนิด NodeMCU-32S จากนั้นทำการ ดาวน์โหลดไลบรารี่อีกตัวหนึ่งมาทดลอง ชื่อว่า SSD1306 คลิกที่ Sketch -> Include Library -> Manage Libraries ดังตัวอย่างรูปด้านล่าง ทำการติดตั้งให้เรียบร้อย
-

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

-
บรรทัดที่ 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)
แบบฝึกหัดสำหรับทบทวนความเข้าใจ
-
ทดลองเปลี่ยนค่าตัวเลขให้กับตัวแปร DEMO_DURATION ที่บรรทัด 70 แล้วดูการเปลี่ยนแปลงบนหน้าจอเทียบกับก่อนเปลี่ยนค่า
-
ทดลองเขียนโปรแกรมในฟังก์ชัน loop โดยให้แสดงข้อความโดย บรรทัดแรกให้แสดงข้อความ “Arduino Learning Kit” และบรรทัดที่สองเป็น “Coding is very funny” ให้แสดงเป็นเวลา 2 วินาที จากนั้นให้เคลียร์หน้าจอเป็นเวลา 2วินาที แล้วให้กลับมาแสดงข้อความเดิมซ้ำอีก ทำงานวนซ้ำไปเรื่อย ๆ โดยให้ดูคำสั่งในโค้ดตัวอย่างแล้วนำมาประยุกต์ใช้งาน





Leave a Reply