สวัสดีครับ มีพี่ จากจังหวัด อุบลราชธานี เข้ามาปรึกษา เกี่ยวกับการวัดอุณหภูมิ ด้วย Sensor DHT22 ต้องการแสดงบนหน้าจอแบบ Real Time และต้องการเก็บข้อมูลลง Database ทางร้านก็เลยเขียนบทความเกี่ยวกับการวัดอุณหภูมิ ความชื้น มาแสดงบนหน้าจอ LCD I2C แล้วกันน่ะครับ Show ในโปรเจคนี้จะพูดถึงสอนการใช้งาน Nodemcu DHT22 แสดงค่าบน จอ LCD น่ะครับ โปรเจคนี้สามารถใช้ร่วมกับ Arduino ได้ทุกรุ่น ด้วยน่ะครับ อุปกรณ์ชุดที่ 1 ใช้เป็น Nodemcu esp8266 V3
การต่อใช้งาน โดยใช้ Nodemcu V.3 + Shield 1.0 อุปกรณ์ชุดที่ 2 ใช้เป็น Arduino Uno R3
การต่อใช้งาน โดยใช้ Arduino Uno R3 มาดู Code ตัวอย่างกันเลย Download Library LCD I2C : http://download.ab.in.th/download.php?file=Arduino-LiquidCrystal-I2C-library-master.zip LCD Adapter IIC I2C Interface for Arduino ข้อดีของ Module LCD Adapter IIC I2C Interface for Arduino ก็คือสามารถช่วยลด ขา Pin จาก 6 ขาเหลือเพียง 2 ขาเท่านั้น และยังช่วยป้องกันการต่อสายไฟสัญญาณรบกวนได้อีกด้วย อุปกรณ์ ที่จำเป็นต้องใช้
จอ LCD จะมี 2 รุ่น แบบ 1602 และ 2004
การต่อวงจร Arduino Uno Module IIC/I2C Interface A4 SDA A5 SCL 5V VCC Gnd Gnd Download Library LiquidCrystal_I2C : http://download.ab.in.th/download.php?file=Arduino-LiquidCrystal-I2C-library-master.zip หมายเหตุ การทดสอบ Library กับ Arduino IDE 1.6.9 สามารถใช้งานได้ครับ หลังจากนั้นมาเริ่มเขียน Code Arduino กันเลย หรือ อาจจะเปิด ในตัวอย่าง ก็สามารถทดสอบ ได้เหมือนกัน เสร็จเรียบร้อยกับการใช้งาน Module IIC/I2C Interface ครั้งหน้าจะมีบทความอะไรอีกติดตามต่อกันได้เลย จ่าา แอดมินเพิ่มเติมให้ จ่าา สำหรับ Arduino IDE V1.6.9 ขึ้นไป จนถึงปัจจุบัน (Arduino IDE 1.6.19) ทางร้านแนะนำว่าให้ใช้ของทางร้านจะสามารถใช้งานได้ ครับ หากไปโหลดจาก Library manager จะได้เป็นเวอร์ชั่นเก่าที่ไม่รอบรับ นะครับจะสามารถคอมไฟล์ได้ แต่ จะเจอปัญหามีอักษร ขึ้นตัวเดียว ทางร้านเลยแนะนำตัวบทความนี้ดีที่สุดครับ หากน้องๆเคยติดตั้ง Library ตัวเก่าไปแล้ว ทางร้านแนะนำให้ ลบของเก่าออกก่อนแล้ว ค่อยโหลดของทางร้านไปติดตั้งเพิ่มเติม ครับ ไม่สามารถติดตั้งทับได้นะ ต้องลบออกก่อนแล้ว ค่อยติดตั้ง ของทางร้าน ครับ การสื่อสารแบบ I2C ใช้สายไฟเพียง 2 เส้นคือสัญญาณ SCL , SDA ซึ่ง 2 เส้นนี้ สามารถต่ออุปกรณ์แบบ I2C ซ้อนทับกันหลาย ๆ อุปกรณ์ได้เลย ดังนั้นการที่จะรู้ว่าจะสื่อสารกับอุปกรณ์ตัวไหน โดยการอ้างอิงจากชื่อตำแหน่ง address ของอุปกรณ์ สำหรับโมดูล I2C LCD นี้สามารถกำหนด address ได้ถึง 8 ตำแหน่ง ทำให้เราสามารถต่อจอ lcd ได้ถึง 8 ตัว โดยใช้สายไฟแค่ 2 เส้น คำว่า LCD ย่อมาจากคำว่า Liquid Crystal Display ซึ่งเป็นจอที่ทำมาจากผลึกคริสตอลเหลว หลักการคือด้านหลังจอจะมีไฟส่องสว่าง หรือที่เรียกว่า Backlight อยู่ เมื่อมีการปล่อยกระแสไฟฟ้าเข้าไปกระตุ้นที่ผลึก ก็จะทำให้ผลึกโปร่งแสง ทำให้แสงที่มาจากไฟ Backlight แสดงขึ้นมาบนหน้าจอ ส่วนอื่นที่โดนผลึกปิดกั้นไว้ จะมีสีที่แตกต่างกันตามสีของผลึกคริสตอล เช่น สีเขียว หรือ สีฟ้า ทำให้เมื่อมองไปที่จอก็จะพบกับตัวหนังสือสีขาว แล้วพบกับพื้นหลังสีต่างๆกัน จอ LCD จะแบ่งเป็น 2 แบบใหญ่ๆตามลักษณะการแสดงผลดังนี้
2. Graphic LCD เป็นจอที่สามารถกำหนดได้ว่าจะให้แต่ละจุดบนหน้าจอกั้นแสง หรือปล่อยแสงออกไป ทำให้จอนี้สามารถสร้างรูปขึ้นมาบนหน้าจอได้ การระบุขนาดจะระบุในลักษณะของจำนวนจุด (Pixels) ในแต่ละแนว เช่น 128x64 หมายถึงจอที่มีจำนวนจุดตามแนวนอน 128 จุด และมีจุดตามแนวตั้ง 64 จุด ในบทความนี้จะกล่าวถึง Character LCD เพียงอย่างเดียว เนื่องจากใช้งานได้ง่าย และนิยมใช้งานในโปรเจคทั่วๆไปมากกว่าครับ การเชื่อมต่อจะมีด้วยกัน 2 แบบ คือ
การใช้งาน Character LCD กับ Arduinoการเชื่อมต่อแบบขนานการเชื่อมต่อแบบขนานแบบ 4 บิต สามารถต่อได้ตามวงจรด้านล่างนี้ เมื่อต่อวงจรเรียบร้อยแล้ว ต่อสาย USB เข้ากับบอร์ด Arduino จะเห็นกล่องสีเหลี่ยมทั้งหมด 16 ตัว (หากเป็นจอ 16x2) ในบรรทัดแรก หากไม่พบกล่อง ให้ปรับความชัดได้จาก VR ที่ต่ออยู่กับขา V0 include <LiquidCrystal.h>LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // RS, E, D4, D5, D6, D7 void setup() { lcd.begin(16, 2); // จอกว้าง 16 ตัวอักษร 2 บรรทัด lcd.print("LCDisplay"); // แสดงผลคำว่า Hello, world! ออกหน้าจอ lcd.setCursor(0, 1); // เลื่อนเคเซอร์ไปบรรทัดที่ 2 ลำดับที่ 0 (ก่อนหน้าตัวอักษรแรก) lcd.print("www.ioxhop.com"); // แสดงผลคำว่า www.ioxhop.com delay(3000); // หน่วงเวลา 3 วินาที lcd.clear(); // ล้างหน้าจอ } void loop() { lcd.setCursor(0, 0); lcd.print(" InFunction "); lcd.setCursor(0, 1); lcd.print(" void loop(){ "); delay(500); // หน่วงเวลา 0.5 วินาที lcd.clear(); // ล้างหน้าจอ delay(500); // หน่วงเวลา 0.5 วินาที } เมื่ออัพโหลดโค้ดลงไปเรียบร้อยแล้ว หากมองไม่เห็นตัวอักษร หรือเห็นไม่ชัด ให้ปรับความคมชัดที่ VR 10K อีกครั้ง เมื่อปรับอยู่ในระดับที่พอดี กดปุ่ม Reset บนบอร์ด Arduino จะได้ผลออกมาตามคลิปด้านล่างเป็นผลลัพธ์ที่ถูกต้อง การควบคุมไฟแบล็คไลท์ย้ายขา A ที่ต่ออยู่กับขั้วบวก มาต่อที่ขา Digital Pin แทน จากนั้นใช้คำสั่ง pinMode() และ digitalWrite() สั่งเปิด-ปิดไฟแบล็คไลท์ได้แบบเดียวกับการควบคุมการติดดับของหลอด LED การเชื่อมต่อแบบอนุกรม (LCD I2C)การเชื่อมต่อแบบอนุกรม จะใช้งานโมดูล I2C Serial Interface Board Module มาเชื่อมต่อระหว่าง Arduino กับจอ LCD วงจรที่เชื่อมต่อจะเป็นไปตามรูปนี้ (กรณีใช้บอร์ดรุ่นอื่น จะต้องต่อ SDA เข้า A4 และ SCL เข้ากับ A5) ดาว์โหลดไลบารี่ได้จาก : LiquidCrystal_I2C.zip แล้วเพิ่มไลบารี่ตามขั้นตอนต่อไปนี้ เปิดโปรแกรม Arduino IDE ขึ้นมา จากนั้นกดไปที่ Tool > Include Library > Add .ZIP Library เลือกไฟล์ที่ได้ดาว์โหลดไว้ในขั้นตอนที่แล้ว จากนั้นกดปุ่ม Open ไลบารี่ได้ถูกเพิ่มเข้ามาแล้ว นำโค้ดต่อไปนี้อัพโหลดลงบอร์ด Arduino includeinclude// Set the LCD address to 0x27 in PCF8574 by NXP and Set to 0x3F in PCF8574A by Ti LiquidCrystal_I2C lcd(0x3F, 16, 2); // จอกว้าง 16 ตัวอักษร 2 บรรทัด รหัสประจำตัว 0x3F void setup() { lcd.begin(); lcd.print("LCDisplay"); // แสดงผลคำว่า Hello, world! ออกหน้าจอ lcd.setCursor(0, 1); // เลื่อนเคเซอร์ไปบรรทัดที่ 2 ลำดับที่ 0 (ก่อนหน้าตัวอักษรแรก) lcd.print("www.ioxhop.com"); // แสดงผลคำว่า www.ioxhop.com delay(3000); // หน่วงเวลา 3 วินาที lcd.clear(); // ล้างหน้าจอ } void loop() { lcd.setCursor(3, 0); lcd.print("InFunction "); lcd.setCursor(2, 1); lcd.print("void loop(){ "); delay(500); // หน่วงเวลา 0.5 วินาที lcd.clear(); // ล้างหน้าจอ delay(500); // หน่วงเวลา 0.5 วินาที } ตรง 0x3F หากอัพโหลดแล้วไม่สามารถใช้งานได้ (ไม่มีอะไรแสดงผลออกทางหน้าจอ) ลองแก้เป็น 0x27 แล้วอัพโหลดเข้าไปใหม่อีกครั้ง ผลที่ได้ก็จะเป็นไปตามคลิปนี้ การเปลี่ยนหมายเลขประจำตัว (I2C Address)ในกรณีที่ต้องการต่อจอหลายๆจอโดยใช้ไมโครฯตัวเดียวกัน สามารถเปลี่ยนหมายเลขประจำตัว หรือ Address ได้จากการจั้มแนวยาว A0 หรือ A1 หรือ A2 ทำให้ A0 หรือ A1 หรือ A2 มีลอจิกเป็น 0 ทำให้หมายเลขประจำตัวเปลี่ยนไปดังตารางด้านล่างนี้ กรณีชิปบนโมดูลเป็นเบอร์ PCF8574 กรณีชิปบนโมดูลเป็นเบอร์ PCF8574A ฟังก์ชั่นสั่งงานจอ LCDlcd.clear() \> ใช้ล้างหน้าจอ เมื่อมีตัวอักษรใดๆอยู่บนหน้าจอ จะถูกล้างออกทั้งหมด lcd.home() \> ใช้ปรับให้เคเซอร์กลับไปอยู่ที่ตำแหน่งแรกด้านซ้าย เมื่อใช้คำสั่ง lcd.print() จะไปเริ่มแสดงผลทางด้านบนซ้าย lcd.setCursor(ลำดับตัวอักษรนับจากทางซ้าย, บรรทัด) \> ใช้ตั้งค่าเคเซอร์ เช่น lcd.setCursor(2, 0); หมายถึงเซ็ตเคเซอร์ไปตัวอักษรที่ 2 นับจากทางซ้าย และอยู่บรรทัดแรก เมื่อใช้คำสั่ง lcd.print() ตัวอักษรตัวแรกจะอยู่ลำดับที่ 3 นับจากทางซ้าย lcd.write(ข้อมูลที่ต้องการเขียนออกไป) \> ใช้สำหรับเขียนข้อมูลออกไปทีละตัวอักษร lcd.print(ข้อมูลที่ต้องการให้เขียนออกไป [, รูปแบบข้อมูล]) \> ใช้เขียนข้อมูลออกไปทั้งข้อความ lcd.cursor() \> ใช้สั่งให้แสดงเคเซอร์บนหน้าจอ lcd.noCursor() \> ใช้สั่งให้ไม่แสดงเคเซอร์บนหน้าจอ lcd.display() \> แสดงตัวอักษรบนหน้าจอ lcd.noDisplay() \> ปิดการแสดงตัวอักษรในหน้าจอ lcd.scrollDisplayLeft() \> เลือนตัวอักษรไปทางซ้าย 1 ตัว lcd.scrollDisplayRight() \> เลื่อนตัวอักษรไปทางขวา 1 ตัว lcd.autoscroll() \> เลื่อนตัวอักษรไปทางขวาอัตโนมัติหากใช้คำสั่ง lcd.print() หรือ lcd.write() เมื่อตัวอักษรเต็มหน้าจอ lcd.noAutoscroll() \> ปิดการเลื่อนตัวอักษรอัตโนมัติ lcd.leftToRight() \> เมื่อใช้คำสั่ง lcd.print() หรือ lcd.write() ตัวอักษรจะเขียนจากซ้ายไปขวา lcd.rightToLeft() \> เมื่อใช้คำสั่ง lcd.print() หรือ lcd.write() ตัวอักษรจะเขียนจากขวาไปซ้าย การทำโหมดประหยัดพลังงาน ปิดหน้าจอ LCDการปิดหน้าจอจะต้องนำคำสั่ง 2 ตัวมาใช้ คือ คำสั่งสำหรับให้หน้าจอไม่แสดงข้อความใดๆออกไป และคำสั่งปิดไฟแบล็คไลท์ ซึ่งการเชื่อมต่อทั้ง 2 แบบที่ได้กล่าวมา โค้ดจะแตกต่างกันเล็กน้อย ทาง IOXhop เขียนเป็นฟังก์ชั่นมาให้ใช้งาน และทดลองง่ายๆแล้ว ดังนี้ การเชื่อมต่อแบบขนาน include
define BacklightPin 7LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { pinMode(BacklightPin, OUTPUT); digitalWrite(BacklightPin, HIGH); lcd.begin(16, 2); lcd.print("LCD Safe Mode"); // แสดงคำว่า LCD Safe Mode ออกทางหน้าจอ } void loop() { LCD_ON(); // เปิดหน้าจอ delay(1000); // หน่วงเวลา 1 วินาที LCD_OFF(); // ปิดหน้าจอ delay(1000); // หน่วงเวลา 1 วินาที } void LCD_ON() { lcd.display(); // เปิดการแสดงตัวอักษร digitalWrite(BacklightPin, HIGH); // เปิดไฟแบล็กไลค์ } void LCD_OFF() { lcd.noDisplay(); // ปิดการแสดงตัวอักษร digitalWrite(BacklightPin, LOW); // ปิดไฟแบล็กไลค์ } ขา A ของจอ LCD จะต้องต่ออยู่กับขา Digital pin 7 เพื่อให้สามารถควบคุมไฟแบล็คไลท์ได้ การเชื่อมต่อแบบอนุกรม (LCD I2C) include
include// Set the LCD address to 0x27 in PCF8574 by NXP and Set to 0x3F in PCF8574A by Ti LiquidCrystal_I2C lcd(0x3F, 16, 2); void setup() { lcd.begin(); lcd.print("LCD Safe Mode"); // แสดงคำว่า LCD Safe Mode ออกทางหน้าจอ } void loop() { LCD_ON(); // เปิดหน้าจอ delay(1000); // หน่วงเวลา 1 วินาที LCD_OFF(); // ปิดหน้าจอ delay(1000); // หน่วงเวลา 1 วินาที } void LCD_ON() { lcd.display(); // เปิดการแสดงตัวอักษร lcd.backlight(); // เปิดไฟแบล็กไลค์ } void LCD_OFF() { lcd.noDisplay(); // ปิดการแสดงตัวอักษร lcd.noBacklight(); // ปิดไฟแบล็กไลค์ } การสร้างตัวอักษร / ใส่รูปภาพ ลงจอ LCDนอกจากจะใช้ตัวอักษร ABCD .... ตัวเลข เครื่องหมายต่างๆแล้ว ยังสามารถสร้างตัวอักษรเองให้เป็นลักษณะของรูปภาพได้ เพื่อเพิ่มความเข้าใจ และความสวยงามของการแสดงผลข้อมูลบนหน้าจอ การสร้างตัวอักษรสามารถสร้างได้จากลิ้ง : http://maxpromer.github.io/LCD-Character-Creator/ ก๊อบโค้ดมาลองอัพเข้า Arduino ได้เลย |