บทที่ 6: การเขียนโปรแกรมติดต่อกับจอ LCD16x2 ชนิด i2c bus

UTEN BOONLIAM Avatar
บทที่ 6 / 26

บทที่ 6: การเขียนโปรแกรมติดต่อกับจอ LCD16x2 ชนิด i2c bus

จอ Liquid Crystal Display (LCD) เป็นจอแสดงผลรูปแบบหนึ่งที่นิยมนำมาใช้งานกันกับระบบสมองกลฝังตัวอย่างแพร่หลาย จอ LCD มีทั้งแบบแสดงผลเป็นตัวอักขระเรียกว่า Character LCD ซึ่งมีการกำหนดตัวอักษรหรืออักขระที่สามารถแสดงผลไว้ได้อยู่แล้ว และแบบที่สามารถแสดงผลเป็นรูปภาพหรือสัญลักษณ์ได้ตามความต้องการของผู้ใช้งานเรียกว่า Graphic LCD นอกจากนี้บางชนิดเป็นจอที่มีการผลิตขึ้นมาใช้เฉพาะงาน ทำให้มีรูปแบบและรูปร่างเฉพาะเจาะจงในการแสดงผล เช่น นาฬิกาดิจิทัล เครื่องคิดเลข หรือ หน้าปัดวิทยุ เป็นต้น

จอ LCD 16×2 Character ที่นิยมวางจำหน่ายจะมีอยู่ 2 แบบด้วยกันคือ LCD แบบปกติที่เชื่อมต่อแบบขนาน (Parallel) และ LCD แบบที่เชื่อมต่ออนุกรม (Serial) แบบ I2C โดยทั้ง 2 แบบตัวจอมีลักษณะเดียวกันเพียงแต่แบบ I2C จะมีบอร์ดเสริมทำให้การสื่อสารแบบ I2C เชื่อมต่อได้สะดวกขึ้น

สำหรับบอร์ด Arduino Learning Kit ได้ทำการติดตั้ง LCD 16×2 ชนิด I2C ทั้งนี้เพื่อเป็นการประหยัดขาของบอร์ดคอนโทรลเลอร์ในการต่อใช้งานเพราะใช้ขาสัญญาณเพียง 2 เส้น และยังมีความสะดวกในการติดตั้งและเชื่อมต่ออีกด้วย

อย่างที่ได้อธิบายไปตั้งแต่ตอนต้น ว่าบอร์ด Arduino Learning Kit สามารถเลือก

ไมโครคอนโทรลเลอร์ได้ถึง 3 ชนิดคือ Arduino Uno, Arduino Nano และ ESP32 แต่โครงสร้างของไมโครคอนโทรลเลอร์ของทั้งสามชนิด จะแบ่งออกได้เป็น 2 แพลตฟอร์มด้วยกัน โดย

  1. Arduino Uno กับ Nano จะมีโครงสร้างที่คล้ายกันและใช้คอมไพเลอร์และไลบรารี่ ตัวเดียวกันในการคอมไพล์ sketch จะแตกต่างกันแค่ขาที่ใช้บนบอร์ด Arduino Learning Kit

  2. ESP32 จะใช้คอมไพเลอร์และไลบรารี่ คนละตัวกับ Arduino Uno และ Nano ดังนั้นในการเขียนโค้ดจะต่างกันอยู่บ้าง

ดังนั้นในบางการทดลอง จะเขียนโค้ดแยกกันระหว่างแพลตฟอร์ม Arduino และ ESP32 และ

บางการทดลองตัวไลบรารี่ตัวเดียวกันก็สามารถใช้ร่วมกันได้ทั้งสองแพลตฟอร์ม ทั้งนี้ขึ้นอยู่กับไลบรารี่แต่ละตัวในแต่ละการทดลอง

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

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

  1. ที่หน้าต่าง Library Manager ให้พิมพ์ชื่อไลบรารี่ LiquidCrystal_I2C ที่ช่อง Filter your search…

  1. เลือกไลบรารี่ LiquidCrystal_I2C by Frank de Bralander จากนั้นคลิก Install ตามรูปด้านบน และเมื่อโปรแกรมทำการติดตั้งเรียบร้อยแล้ว จะขึ้นสถานะ INSTALLED ดังรูปด้านล่าง

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

  1. เมื่อเปิดตัวอย่าง sketch ขึ้นมาแล้วที่บรรทัดที่7 ให้แก้ไขโค้ดคำสั่งจาก LiquidCrystal_I2C lcd (0x27,20,4) ไปเป็น LiquidCrystal_I2C lcd(0x27,16,2) และทำการ comment code บรรทัดที่ 19-22 เหตุผลเพราะจอแอลซีดีที่ติดตั้งอยู่บนบอร์ด Arduino Learning Kit เป็นชนิด 16 x 2 นั่นเอง

  1. เมื่อทำการแก้ไขโค้ดแล้วทำการทดลอง upload โค้ดเข้าไปยัง Arduino Uno จากนั้นดูผลของโปรแกรมที่หน้าจอแอลซีดี (อย่าลืมเลือกพอร์ตให้กับ Arduino Uno)

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

  • บรรทัดที่ 7 เป็นการประกาศออปเจ็คให้ชื่อว่า lcd โดยกำหนดคุณสมบัติคือตำแหน่ง address บนบัส I2C คือ 0x27 และเป็นแอลซีดีชนิด 16×2

  • บรรทัดที่ 11 เป็นการ Initial หรือกำหนดค่าเริ่มต้นให้แก่จอแอลซีดี

  • บรรทัดที่ 14 เป็นการเปิดหลอดไฟ blacklight ให้กับหน้าจอแอลซีดี ส่วนคำสั่งที่ใช้ปิดหลอดไฟจอแอลซีดีคือคำสั่ง lcd.noBacklight();

  • บรรทัดที่ 15 และ 17 เป็นการกำหนดตำแหน่งเริ่มต้นในการแสดงข้อความบนจอแอลซีดี โดยเป็นตำแหน่ง X และ Y ตามลำดับโดยตำแหน่ง X จะมีค่า 0-15 และ Y จะมีค่า 0-1

  • บรรทัดที่ 15 เป็นการกำหนดตำแหน่งเริ่มต้นเป็นบรรทัดแรกที่ตำแหน่งที่4 (x=3, y=0)

  • บรรทัดที่ 16 เป็นคำสั่งให้พิมพ์คำว่า Hello World! ออกทางหน้าจอแอลซีดี จะเห็นได้ว่าตัวอักษร ‘H’ จะอยู่ที่ตำแหน่ง x=3, y=0

  • บรรทัดที่ 17 และ 18 ก็ทำงานเช่นกัน คือพิมพ์คำว่า Ywrobot Arduino! ออกทางหน้าจอแอลซีดี โดยเริ่มที่ตำแหน่ง x=2, y=1

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

  1. ให้ทำการเขียนโค้ดใหม่ โดยให้บรรทัดแรกแสดงคำว่า Arduino Learning Kit และบรรทัดที่สองแสดงคำว่า 123456789ABCDEFG แล้วทำการ upload sketch ที่เขียนลงบน Arduino Uno จากนั้นสังเกตดูที่หน้าจอแอลซีดี ให้วิเคราะห์ปัญหาที่เกิดขึ้นว่าสาเหตุของปัญหาเกิดจากอะไร

 

 

 

  1. เขียนโค้ดให้หลอดไฟจอแอลซีดีติดสว่างและที่บรรทัดแรกแสดงคำว่า Coding is easy และบรรทัดที่สองแสดงคำว่า Keep it funny จากนั้นหน่วงเวลา 1 วินาที

ต่อมาให้หลอดไฟจอแอลซีดีดับและที่บรรทัดแรกแสดงคำว่า what is you name และบรรทัดที่สองแสดงคำว่า My name is ABCD แล้วหน่วงเวลา 1 วินาที แล้วให้ทำงานวนซ้ำกันไปเรื่อย ๆ

 

 

 

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

ก่อนจะเริ่มเขียนโปรแกรมบนตัว ESP-32 ต้องขออรัมภบทเกี่ยวกับ ESP32 อีกรอบหนึ่งหลังจากที่ได้กล่าวมาแล้วในบทคำนำ เพื่อทำให้เข้าใจถึงโครงสร้างและการทำงาน ก่อนที่จะเริ่มเขียนโปรแกรม

ESP-32 ผลิตมาจากบริษัท Espressif โดย ESP-32 เป็นไอซีที่พัฒนาเพิ่มเติมจาก ESP8266 ที่นิยมอย่างมาก เนื่องจากมันเป็นไมโครคอนโทรลเลอร์ที่มีราคาถูก โดยโมดูล WIFI ESP-32 รุ่น ESP-WROOM-32 โมดูล WIFI + Bluetooth 4.2 + Touch/Temp Sensor ทำงานแบบ Dual Core ที่ความเร็ว 160Mhz มี SRAM 512K หน่วยความจำ Flash สำหรับ upload โปรแกรมขนาด 16M มีขา GPIO 36 ขา ความละเอียดในการอ่านค่า ADC 12Bit สามารถเขียนโปรแกรม ผ่าน Arduino IDE เหมือนเขียน Arduino ได้

เอาละ มาเริ่มฝึกเขียนโปรแกรมบน ESP-32 กันเลยครับ

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

  2. เลือกไลบรารี่ LiquidCrystal_PCF8574 by Matthias Hertel จากนั้นคลิก Install

  3. เปิด Example sketch โดยทำการเปิดตัวอย่างโปรแกรมขึ้นมา โดยคลิกที่ File -> Examples -> LiquidCrystal_PCF8574 -> LiquidCrystal_PCF8574_Test

  1. ทำการ upload โค้ดตัวอย่างให้กับ ESP32 โดยในระหว่างการ upload หน้าจอ status ของ Arduino IDE จะขึ้นคำว่า connecting………ให้ทำการกดปุ่ม BOOT บนตัว ESP32 Module

  1. เมื่อทำการ upload เสร็จเรียบร้อยแล้วให้ดูผลของการรันโปรแกรมที่หน้าจอแอลซีดี

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

  • บรรทัดที่ 4 เป็นการประกาศออปเจ็คชื่อว่า lcd โดยค่าพารามิเตอร์ 0x27 คือค่า address ของ LCD I2C

  • บรรทัดที่ 6 เป็นการประกาศตัวแปรชื่อว่า show เป็นแบบชนิด Integer ซึ่งใช้สำหรับเปลี่ยนสถานะการทำงานของแอลซีดีในฟังก์ชัน loop

  • บรรทัดที่ 10 เป็นการประกาศตัวแปรชื่อว่า error เป็นแบบชนิด integer เอาไว้สำหรับรับค่า Error ของการทำงาน และนำไปตรวจสอบว่าเกิด Error ขึ้นหรือไม่ และทำการ print ค่า Error ออกมาทาง Serial Monitor

  • บรรทัดที่ 20,21 เป็นการกำหนดค่าเริ่มต้นให้กับจอแอลซีดี

  • บรรทัดที่ 22-31 เป็นการตรวจสอบค่า Error ถ้าแอลซีดีไม่ได้เชื่อมต่อหรือเสีย หน้าจอ Serial Monitor จะแสดงคำว่า Error: LCD not found. แต่ถ้าไม่เกิด Error ขึ้นจะแสดง Error: : LCD found.

  • ที่บรรทัดที่ 34 จะทำการกำหนดค่า show=0

  • ที่บรรทัดที่ 39-90 เป็นการตรวจสอบค่า show ว่าตรงกับเงื่อนไขใดหรือไม่ โดยใช้ if – elfe

  • ที่บรรทัด 92 ให้ทำการหน่วงเวลา 2 วินาที

  • บรรทัดที่ 93 ทำการเปลี่ยนค่าตัวแปร show โดยการบวกค่าขึ้นไป 1 แล้วทำการ MOD ค่าของตัวแปร show ซึ่งจะเพิ่มขึ้นเรื่อย ๆจนถึง 12 จากนั้นค่าในตัวแปร show จะกลับมาเป็นค่า 0 อีกครั้ง ดังนั้นค่าในตัวแปร show จะมีค่าอยู่ระหว่าง 0-11

  • ที่เงื่อนไข show=0 จะทำการเปิดไฟหน้าจอแอลซีดีแล้วให้ตำแหน่งเริ่มต้นกลับไปที่ตำแหน่ง 0,0 จากนั้นทำการเคลียร์หน้าจอ แล้วส่งข้อความ Hello LCD ออกทางหน้าจอแอลซีดี จากนั้นหน่วงเวลา 1Sec ทำการปิดหลอดไฟหน้าจอแอลซีดี หน่วงเวลา 400mSec จากนั้นทำการเปิดหลอดไฟหน้าจอแอลซีดี

  • ที่เงื่อนไข show=1 ให้แสดงตำแหน่งของ Cursor

  • ที่เงื่อนไข show=2 ให้กระพริบตำแหน่งของ Cursor

  • ที่เงื่อนไข show=3 ให้ปิดการแสดงตำแหน่งของ Cursor และปิดการกระพริบตำแหน่งของ Cursor

  • ที่เงื่อนไข show=4 ให้เปิดการแสดงข้อความบนหน้าจอแอลซีดี

  • ที่เงื่อนไข show=5 ให้แสดงข้อความบนหน้าจอแอลซีดี

  • ที่เงื่อนไข show=7 ให้แสดงข้อความ *** first line. ที่ตำแหน่ง 0,0 และแสดงข้อความ *** second line. ที่ตำแหน่ง 0,1

  • ที่เงื่อนไข show=8, 9,10 และ 11 ให้เลื่อนข้อความที่แสดงบนหน้าจอแอลซีดีไปทางซ้ายหนึ่งตำแหน่ง

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

  1. เขียนโปรแกรมโดยให้เพิ่มเงื่อนไข if-else โดยให้ show=6 แล้วให้ที่หน้าจอแอลซีดีแสดงคำว่า

บรรทัดที่ 1 แสดงคำว่า Coding is easy..

บรรทัดที่ 2 แสดงคำว่า Tenergy Innovat.

 

 

 

  1. ให้เพิ่มเงื่อนไขโดยให้ show=12 แล้วให้หลอดไฟจอแอลซีดีดับเป็นเวลา 2Sec จากนั้นให้กลับมาติดอีกครั้ง ในส่วนของโค้ดจะต้องแก้ไขหรือเพิ่มเติมในส่วนไหนบ้าง?

 

 

 

Leave a Reply

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