[openKB] [kidBright] [kidBright IDE] นาฬิกาและจอ OLED

ในส่วน Plugins ของ kidBright IDE ลองไล่ดูมีชื่อ OLED ด้วย ถ้าใครมี OLED อยู่ข้างๆ ตัวก็ต้องลองต่อกันดูครับ ใช้ได้ทั้งบอร์ด openKB และบอร์ด kidBright (ไม่จำกัดเวอร์ชั่น)

จอแสดงผล OLED

จอ OLED ที่นิยมใช้จะมีขนาด 128×64 จุด ขนาดจะค่อนข้างเล็กเพียง 0.96 นิ้วเท่านั้น ใช้ตัวควบคุมเป็นเบอร์ SSD1306 การเชื่อมต่อจะเป็นแบบ I2C บัส คือมีสายสัญญาณคุยกัน 2 เส้นประกอบด้วย Data (SDA) และ Clock (SCL) แน่นอนว่าทั้ง openKB และ kidBright มีจุดต่อ I2C บัสให้เราเชื่อมต่อ

ต่อสายสัญญาณกันก่อน

การต่อสายสัญญาณสำหรับบอร์ด OpenKB จะใช้สาย JST4AF หัวด้านนึงต่อเข้ากับขั้ว I2C ส่วนอีกด้านเป็น IDC ตัวเมีย ต่อเข้ากับจอ OLED ตำแหน่งขา SCL กับ SDA เรียงลำดับสลับกันอยู่ เวลาต่อต้องต่อให้ตรงตามรูป

สำหรับบอร์ด kidBright จะมีสายชื่อ KB5AF มีสาย 5 เส้น แต่ตอนนี้ขณะเขียนบทความยังไม่มีที่ตัวเลยเลือกใช้เป็นสาย IDC ตัวเมีย2 ด้านแทน ข้อระวังก็คือตำแหน่งไฟเลี้ยง ต้องเลือกเป็น 3V3 ต่อเข้ากับ VDD ห้ามนำจุด 5V ไปต่อเด็ดขาด จอ OLED จะเสียหายทันที

ชุดคำสั่งของ OLED

เนื่องจาก OLED ที่เลือกใช้เป็นเบอร์ SSD1306 และมีตำแหน่งแอดเดรสอยู่ที่ 0x3C จึงไม่ต้องปรับตั้งค่าเหล่านี้ใช้ค่าตั้งต้นมาตรฐานได้เลย

คำสั่งเคลียร์หน้าจอ

คำสั่งแสดงข้อความตัวอักษร ไปยังตำแหน่ง คอลัมน์ และ แถวที่กำหนด

คำสั่งแสดงตัวเลข ไปยังตำแหน่ง คอลัมน์ และ แถวที่กำหนด โดยระบุค่า Precision หรือค่าจำนวนเลขทศนิยมได้

คำสั่งแสดงข้อความตัวอักษรใหญ่เป็น 2 เท่า ไปยังตำแหน่ง คอลัมน์ และ แถวที่กำหนด

คำสั่งแสดงตัวเลขใหญ่เป็น 2 เท่า ไปยังตำแหน่ง คอลัมน์ และ แถวที่กำหนด โดยระบุค่า Precision หรือค่าจำนวนเลขทศนิยมได้

ตัวอย่างที่ 1 แสดงอุณหภูมิที่จอ OLED

เริ่มต้นด้วยการเคลียร์หน้าจอก่อน แล้วแสดงข้อความ นับมาจากซ้าย 5 ตัวอักษร (ตัวอักษรขนาดปกติ) แล้วแสดงข้อความ Temp ใหญ่เป็น 2 เท่า ถัดมาที่บรรทัดที่ 4 (ตัวอักษรขนาดปกติ) ก็แสดงอุณหภูมิ มีเลขทศนิยม 2 ตำแหน่ง

ตัวอย่างที่ 2 แสดงค่าวันที่และเวลา

ก่อนจะเขียนโค้ดต้องตั้งนาฬิกาให้ตรงก่อน kidBright IDE เตรียมเครื่องมือไว้ให้แล้ว

โดยเอาเวลาในเครื่องคอมพิวเตอร์ของเราไปโหลดให้กับตัว openKB หรือ kidBright เมื่อกด OK จะเป็นการโหลดการตั้งค่าเวลาไปทันที

กดปุ่ม OK อีกครั้งเป็นอันเสร็จสิ้นการตั้งค่าเวลาให้นาฬิกา

เพื่อให้นาฬิกายังเดินต่อไปได้เรื่อยๆ แม้ไม่มีไฟเลี้ยง บอร์ด openKB จะมีตัวเก็บประจุแบบ SuperCAB ติดตั้งอยู่เพื่อแบ็คอัพไฟให้นาฬิกาทำงาน

ส่วน kidBright จะต้องหาแบตเตอรี่ลิเที่ยม CR2032 หรือรุ่นใกล้เคียงใส่ให้กับมัน

ชุดคำสั่งของนาฬิกา

อันนี้ไม่ต้องอธิบายมาก ค่อนข้างตรงไปตรงมา สามารถดึงค่าต่างๆ วัน เดือน ปี ชั่วโมง นาที วินาที มาแสดงผล หรือนำไปประมวลผลได้เลย ดังนั้นเพื่อแสดงวันเดือนปี และแสดงเวลา พร้อม แสดงวินาที ก็ได้ผลลัพธ์ดังโค้ดในรูป

การแสดง Time ในโค้ดนี้จะแสดงเฉพาะ ชั่วโมงกับนาทีเท่านั้น ไม่แสดงวินาที บรรทัดที่ 3 จึงนำเอาค่าวินาทีมาแสดง โดยให้ใหญ่ขึ้นเป็น 2 เท่า

โค้ดนี้มีปัญหา

เมื่อค่าตัวเลขของวินาที อยู่ในช่วง 0-9 เนื่องจากการแสดงตัวเลข จะแสดง 0-9 ไม่ใช่ 00-09 ทำให้ค่าตัวเลขชิดด้านซ้าย เมื่อค่าเวลา นับไปถึง 59 แทนที่จะเปลี่ยนเป็น 00 ก็กลายเป็น 09 แทน

การวนลูปแต่ละรอบใช้การ Delay 0.5 เป็นค่าที่ไม่ซิงค์กับค่าหลักวินาที บางครั้งจะเห็นตัวเลขวินาทีเปลี่ยนแปลงเร็วหรือช้าไป

ปัญหานี้จะแก้ในตัวอย่างต่อไป

ตัวอย่างที่ 3 นาฬิกาแบบตรวจสอบค่าวินาที

ตัวอย่างนี้จะสร้างตัวแปร x ขึ้นมาเพื่อบันทึกค่าวินาที ณ ปัจจุบัน เมื่อค่าวินาทีเปลี่ยน ก็ให้บันทึกค่าวินาทีใหม่ ไปเรื่อยๆ โดยถ้าค่าวินาทีเปลี่ยนแต่ละครั้ง ค่อยให้แสดงผล วันเดือนปี และเวลาออกไปยังจอ OLED

สำหรับการแก้ปัญหาเรื่องเลข 9 ที่เกินมา จะใช้วิธีตรวจสอบว่าค่า X เป็น 0 หรือเปล่า ถ้าเป็นจะให้ส่งคำสั่ง แสดงเลข “0 ” พร้อม Space Bar เพื่อให้การเคาะ Space bar ไปลบข้อมูลเดิมที่มี

บางคนอาจถามว่า ทำไมไม่ใช้การเคลียร์หน้าจอ เพื่อลบ ตอบว่า การเคลียร์หน้าจอจะทำจอดับไปชั่วระยะสั้น ๆ ซึ่งดูเหมือนกับว่าการแสดงผลนั้นสะดุด

ตัวอย่างที่ 4 นาฬิกาปลุก แบบตั้งเวลาได้

ถ้าเขียนโค้ดตามไม่ไหว ก็ไปดาวน์โหลด https://pastebin.com/2sFM1gh4 เก็บไว้ให้นามสกุลเป็น .txt ได้เลย

การทำงานของโค้ด

โปรแกรมหลักจะสร้างตัวแปรไว้หลายตัวเพื่อเก็บเวลาที่ใช้ตั้งค่า จกานั้นก็แสดงเวลาที่หน้าจอปกติ

ตรวจสอบว่ามีการกดสวิตช์หรือไม่ ถ้ากดสวิตช์ ให้เข้าสู่ฟังก์ชั่นการตั้งปลุก

ตรวจสอบค่าตัวแปร Flag ซึ่งไว้ตรวจสอบว่ามีการตั้งปลุกหรือไม่ ถ้ามีก็ไปดูชั่วโมงกับนาทีว่า ตรวกับเวลาปัจจุบันหรือไม่ ถ้าตรงกัน ก็เคลียร์ Flag เพื่อยกเลิกการตั้งปลุก สร้างเสียงออกลำโพง เคลียร์หน้าจอ เพื่อลบการตั้งปลุกออก

โหมดการตั้งปลุก

    เมื่อกดสวิตช์ SW1 เข้าสู่โหมดตั้งปลุก แสดงข้อความ Alarm Set ที่หน้าจอ

แสดงเวลาปลุก โดยให้กะพริบที่หลักชั่วโมงก่อน

ถ้ามีการกดสวิตช์ SW2 จะเป็นการเพิ่มค่าหลักชั่วโมง

ถ้ากดสวิตช์ SW1 จะเปลี่ยนไปสู่โหมดตั้งหลักนาที

ที่หลักนาที จะมีการกะพริบ

ใช้ SW2 เพื่อเพิ่มค่าหลักนาที ถ้าเกิน 59 จะสั่งให้เป็น 0

กด SW1 อีกครั้งเพื่อบันทึกค่าการตั้งปลุก

แสดงเวลาการตั้งหลุกที่หน้าจอ

ผลลัพธ์การทำงาน

ดูตามคลิปเลยครับ

https://youtu.be/ISixelVv6rs

Facebook Comments