ไอเดียคร่าวๆ
พี่กำลังหานาฬิกาอ่านง่ายๆ ไว้ตั้งในห้องฟังเพลง พอดีเพิ่งเริ่มเล่น Arduino เลยคิดว่าเอาเป็นโปรเจคที่สองของพี่เลยดีกว่า ใช้ LED matrix 8x8 แบบ 4 ใน 1 ที่ซื้อไว้นานแล้ว แล้วก็เพิ่มฟีเจอร์อื่นๆ เข้าไปอีกหน่อย
มันจะแสดง วันในสัปดาห์, เดือน, ปี, เวลา, อุณหภูมิ และความชื้น แสดงวนไปสองสามรอบแล้วก็เข้าสู่โหมดสลีป: จอจะดับและลดการใช้พลังงานเพื่อประหยัดแบตเตอรี่ พอเซ็นเซอร์ตรวจจับการเคลื่อนไหว (PIR) ตรวจพบอะไร (ไฟ LED มุมขวาล่างจะกระพริบสั้นๆ เป็นสัญญาณ) มันก็จะเรียกฟังก์ชันอินเตอร์รัพต์ขึ้นมา แล้วลูปหลักก็จะกลับมาทำงานอีกครั้ง
สคริปต์ Sketch นี่แก้ไขง่ายมาก จะปรับค่าต่างๆ เช่น เวลาหน่วง หรือจำนวนรอบการแสดงผล ก็ทำได้ หรือจะเพิ่มให้มันแสดงข้อความที่เราตั้งเองก็ยังได้
พี่รู้ว่าโปรเจค LED matrix, นาฬิกา, เซ็นเซอร์วัดอุณหภูมิและตรวจจับการเคลื่อนไหว เป็นของพื้นฐานมากสำหรับ Arduino แต่มันก็ทำงานได้ตรงตามที่พี่ต้องการดี และในอนาคตพี่อาจจะเพิ่ม WiFi เข้าไปให้มันแสดงพยากรณ์อากาศ, ข่าวสารหัวข้อต่างๆ ได้อีกด้วย
SPI Cascade ขนาดยักษ์: LED Matrix 32x8
Matrix ขนาด 8x8 แผ่นเดียวมันง่าย แต่ถ้าต่อสี่แผ่นเข้าด้วยกันให้เป็นป้ายสกรอลยาวเหยียด 32 คอลัมน์แบบไม่ขาดตอนล่ะก็ ต้องจัดการกับสัญญาณนาฬิกาฮาร์ดแวร์ SPI (Serial Peripheral Interface) แบบจัดหนักเลย โปรเจค Arduino 32x8 LED Matrix Info Display นี้ใช้ไลบรารี <MD_MAX72xx.h> เพื่อทำการ shift ไบต์ข้อมูลแบบต่อเนื่องข้าม MAX7219 ทั้งสี่ตัว ทำให้ข้อความยาวๆ สกรอลได้อย่างเนียนสนิท เหมาะมากสำหรับทำตัวนับซับ YouTube หรือแสดงราคาบิทคอยน์!
การตั้งค่าฮาร์ดแวร์ของ Matrix (MD_Parola)
ไลบรารีมาตรฐานพวกนี้จะใช้ไม่ได้เลยถ้าโมดูลฮาร์ดแวร์จีนทั่วไปที่เราซื้อมา มีการเดินสายภายในที่แตกต่างกัน!
- กับดักเรื่องโครงสร้าง: มีการออกแบบ PCB ต่างกันถึง 4 แบบสำหรับโมดูล Matrix พวกนี้ (
FC-16, PAROLA, GENERIC) ถ้าเลือกผิดประเภท ข้อความจะกลับด้าน ซ้ายเป็นขวา คว่ำหัว และเลื่อนย้อนหลังแบบสุดเหวี่ยง! - คุณต้องกำหนด Hardware Type ให้ถูกต้องในเครื่องมืออันทรงพลังอย่าง MD_Parola!
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW // โมดูลแผ่นแดงทั่วไปที่พบได้บ่อยที่สุด! #define MAX_DEVICES 4 // บอก Arduino Uno ว่ามันต้องจัดการกับชิปทั้งหมด 4 ตัว! #define CS_PIN 10 MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
อัลกอริทึมการสกรอลข้อความแบบ Non-Blocking
ห้ามใช้ delay() ล้อมรอบฟังก์ชัน display() ทั่วไปเด็ดขาด ไม่งั้น Uno จะค้างสนิท และคุณจะอัปเดตข้อมูลข้อความจากอินเทอร์เน็ตไม่ได้!
- ไลบรารี
MD_Parolaใช้การจัดการเวลาแบบ Non-Blocking แบบจัดเต็ม! - แค่โยน
myDisplay.displayAnimate()ลงไปในloop()อย่างหลวมๆ - ทุกๆ มิลลิวินาที โค้ด C++ จะถามว่า: ถึงเวลาที่จะเลื่อนพิกเซลไปทางซ้ายหนึ่งคอลัมน์แล้วหรือยัง?
- ถ้าใช่ มันจะเลื่อนข้อมูลไปยัง
Device 2, Device 3ต่อกันไปเอง โดยที่เราไม่ต้องสนใจเลย! - Data Injection: คุณสามารถสั่ง
myDisplay.displayText("HELLO WORLD!", PA_CENTER, 100, 1000, PA_SCROLL_LEFT, PA_SCROLL_LEFT);แล้วข้อความยาวๆ ก็จะสไลด์สวยงามจากขวาไปซ้ายให้เห็น!
ของที่ต้องมีสำหรับป้ายยักษ์
- Arduino Uno/Nano (ความสามารถมาตรฐาน)
- MAX7219 Dot Matrix Display Block ขนาด 32x8 (แบบ 4 ใน 1) (ห้ามต่อ LED matrix 8x8 แยกสี่แผ่นด้วยจัมเปอร์แบบหลวมๆ นะน้อง ให้ซื้อ PCB แผ่นใหญ่แผ่นเดียวที่บัดกรี Matrix 4 อันไว้ด้วยกันเลย ไม่งั้นสัญญาณนาฬิกา SPI จะเพี้ยน!)
- แหล่งจ่ายไฟภายนอก 5V 3 แอมป์ (ถ้า LED สีแดงทั้งหมด 256 ดวงสว่างพร้อมกันเต็มที่ในเวลาเดียวกัน มันจะทำลายพอร์ต USB มาตรฐานแบบไม่ใยดี!)
การตั้งค่า
นี่คือการตั้งค่าทดลองของพี่ ดูรายละเอียดเพิ่มเติมได้จาก schematic นะ:
โค้ดของโปรเจค
โปรเจคนี้ต้องใช้ไลบรารีมาตรฐาน 2 ตัว:
- stdio.h
- Wire.h
และไลบรารีเสริมอีก 4 ตัว:
- DS1302.h
- LedControlMS.h
- LowPower.h
- AM2320.h
ไลบรารี LedControlMS.h แสดงตัวอักษรแบบกว้าง 5 LED ต่อเมทริกซ์ ซึ่งเมทริกซ์เรากว้าง 8 LED เลยเหลือพื้นที่ว่าง 3 LED พี่ไม่ชอบเลยเขียนฟังก์ชันเสริมขึ้นมาเอง มันแสดงตัวอักษรแบบกว้าง 6 LED ได้ เริ่มคอลัมน์ไหนก็ได้ แถมข้ามเมทริกซ์ได้ด้วย แสดงข้อความหลายบรรทัดก็จัดไป
วิธีตั้งวันที่และเวลา: ไปตั้งค่าให้ถูกต้องในบรรทัดที่ 147 (เวอร์ชันเสริมคือบรรทัด 166) จากนั้นเอา comment ออกที่บรรทัด 86 (เวอร์ชันเสริมคือบรรทัด 99) แล้วอัพโหลดรันโค้ดซะ พอเสร็จแล้วก็กลับมา comment บรรทัดนั้นไว้เหมือนเดิม แล้วอัพโหลดโค้ดอีกที (ไม่งั้นทุกครั้งที่เปิดเครื่อง เวลาจะถูกรีเซ็ตกลับไปเป็นค่าในโค้ดนะจ๊ะ)
โปรเจคเสร็จแล้ววว
เอาไปใส่ในกรอบรูปซะเลย สวยปะล่ะ
หมายเหตุ: หลังทำเสร็จพบว่าเซ็นเซอร์ตรวจจับการเคลื่อนไหวที่วางไว้ด้านบนมันไม่ค่อยไว พี่เลยย้ายมาไว้ที่แผงหน้าหน้าตรงๆ ซะเลย งานนี้ห้ามช็อตนะตัวนี้
สัญญาอนุญาต (License)
เอาโค้ดไปใช้ส่วนตัวได้ตามสบายเลยจ้า แต่ห้ามเอาไปขายนะ
มีอะไรสงสัยหรืออยากปรึกษาเกี่ยวกับโปรเจค ก็สามารถติดต่อมาคุยกันได้