นี่คือโปรเจกต์ 'Work In Progress' ล่าสุดของพี่ ใช้ ESP32 WROOM กับ เมทริกซ์ LED WS2812b ขนาด 8x32 หลักการคือส่งข้อความจากแอปในมือถือผ่านบลูทูธไปหา ESP32 แล้วข้อความจะวิ่งสกรอลไปทางซ้ายทันที แถมในแอปยังเลือกสีได้ตั้ง 9 สีที่ตั้งไว้ล่วงหน้าอีกด้วย
ความยาวข้อความน่าจะไม่จำกัด (แต่ยังไม่ได้ลองส่งนิยายทั้งเรื่องนะน้อง)
โค้ดที่แอปในมือถือส่งมาจะเป็นตัวเลข 0-8 แทนสีที่ตั้งไว้ ส่วนเลข 9 คือสัญญาณบอกว่ากำลังจะส่งข้อความตามมา
ตอนเปิดเครื่อง ESP32 มันจะส่ง ID ว่า "BT_Text" ออกมา ให้เชื่อมต่อบลูทูธจากมือถือก่อน แล้วค่อยเปิดแอป ระวังนิดนึงสำหรับอัปเดต Android เวอร์ชันใหม่ๆ มันจะขออนุญาตใช้งานบลูทูธเฉพาะเจาะจง ถ้าไม่อนุญาตงานไม่เข้าเลย ตอนติดตั้งแอปครั้งแรกอาจขึ้นข้อความผิดพลาดขออนุญาต ให้กดอนุญาตแล้วเปิดแอปใหม่ ถ้าพลาดไปแล้วแอปไม่ยอมทำงาน ให้เข้าไปที่การตั้งค่าแอปในมือถือ แล้วไปเปิดสิทธิ์บลูทูธให้มันตรงนั้นเลย
ลงลึกเรื่องเทคนิค
การจัดการสตริงแบบไดนามิก
โปรเจกต์นี้สร้างขึ้นจากแนวคิดการจัดการสตริงแบบไดนามิก แม้จะใช้ ESP32 กับเมทริกซ์ WS2812b แต่หลักการพื้นฐานก็คล้ายกับการใช้ไลบรารีสำหรับจอแสดงผลโดยเฉพาะ เช่น MD_Parola สำหรับโมดูล MAX7219 กระบวนการมีดังนี้:
- บัฟเฟอร์สำหรับแสดงผล: โค้ดจะมีบัฟเฟอร์ (อาร์เรย์ของตัวอักษร) ไว้เก็บข้อความที่กำลังจะสกรอล
- ดักจับสัญญาณบลูทูธ: บลูทูธ Classic ในตัว ESP32 (หรือ UART ที่ต่อกับโมดูลอย่าง HC-05) จะคอยฟังข้อมูลที่เข้ามา
- เมื่อแอปในมือถือส่งสตริงมา เช่น
"Hello World\n"ESP32 จะจับข้อมูลนั้นทีละตัวอักษร - อักขระขึ้นบรรทัดใหม่ (
\n) ทำหน้าที่เป็นตัวแบ่ง ส่งสัญญาณว่าจบการส่งแล้ว - สตริงใหม่จะถูกคัดลอกไปยังบัฟเฟอร์ของฟังก์ชันแสดงผลอย่างปลอดภัย และป้ายข้อความจะอัปเดตทันทีเพื่อเริ่มสกรอลข้อความใหม่
สถาปัตยกรรมการต่อแบบ Daisy-Chain
เมทริกซ์ 8x8 แผ่นเดียวเล็กเกินไปสำหรับแสดงคำอ่านได้สบายตา โปรเจกต์นี้ใช้ เมทริกซ์ LED WS2812b ขนาด 8x32 ซึ่งจริงๆ แล้วคือการนำแผง 8x8 จำนวน 4 แผ่นมาต่อแบบ daisy-chain เข้าด้วยกันเป็นกริดต่อเนื่องกว้าง 32 พิกเซล ไลบรารีอย่าง FastLED หรือ NeoPixel จะจัดการเรื่องมัลติเพล็กซ์ให้ ทำให้โซ่ทั้งหมดทำงานเหมือนเป็นจอแสดงผลชุดเดียวที่ต่อเนื่องกัน
อุปกรณ์ที่ต้องใช้
- ESP32 WROOM (ที่มีบลูทูธในตัว)
- โมดูลเมทริกซ์ LED WS2812b ขนาด 8x32
- สมาร์ทโฟนระบบ Android ที่รันแอป Bluetooth Terminal ที่เราทำขึ้น
วิดีโอสาธิต -->