Arduino String Queue
อุปกรณ์ในการทดลอง
- Arduino 1 บอร์ด
- ตัวต้านทาน 10k โอห์ม 1 ตัว
- ตัวต้านทาน 330 โอห์ม 2 ตัว
- ตัวต้านทานปรับค่าได้ขนาด 10k โอห์ม 1 ตัว
- LED 5mm 2 ตัว
- Push Button Switch 1 ตัว
- จอ LCD 16x2 1 ตัว
โจทย์ข้อที่ 1
เขียนโค้ดสาหรับบอร์ด Arduino โดยสร้างเป็น C++ Class ดังต่อไปนี้ => Class StringQueue เป็นโครงสร้างข้อมูลแบบ Queue สาหรับเก็บ String objects สร้างคลาส StringQueue และทดสอบการทำงานโดยใช้โค้ดตัวอย่างต่อไปนี้ และทดสอบโดยใช้ฮาร์ดแวร์จริง (ใช้บอร์ด Arduino และแสดงผลผ่าน Serial Monitor ของ Arduino IDE)
Class StringQueue.h
- StringStack( int capacity=10 ); // constructor
- boolean put( String s ); // ใช้ในการนำค่าไปเก็บใน Queue
- boolean get( String &s ); // ใช้ในการเรียกค่าจาก Queue ออกมา
- int size(); // ใช้เรียกดูขนาดของ Queue ณ ขณะนั้น
- inline boolean isEmpty(); // ใช้ในการตรวจสอบ Queue ถ้าไม่มีข้อมูลอยู่เลยจะ Return True
- inline boolean isFull(); // ใช้ในการตรวจสอบ Queue ถ้าเต็มอยู่เลยจะ Return True
- put( String s ) จะใช้ในการเพิ่มข้อมูลลง Queue โดยที่ขั้นแรกจะตรวจสอบก่อนว่า Queue เต็มหรือเปล่า ถ้าไม่เต็มให้ทำการเพิ่มข้อมูลโดย ให้ buf ตำแหน่งปัจจุบันนั้นเก็บข้อมูลที่รับเข้ามา เมื่อเสร็จแล้ว ก็ทำการเพิ่ม count ไป 1 เพื่อเลื่อนไปตำแหน่งถัดไป
- get( String &s ) จะใช้ในการนำข้อมูลออกมาจาก Queue ผ่านทางแอดเดรสที่เก็บข้อมูลไว้ โดยขั้นแรกจะตรวจสอบก่อนว่า Queue มีข้อมูลหรือเปล่า ถ้ามีก็ให้ s = *(buf+0) และเลื่อนข้อมูลไปทางซ้าย 1 ช่อง
- size() ใช้ในการบอกขนาดของ Queue ในขณะนั้น โดย ส่งค่า count คืนกลับ
- isEmpty() ใช้ในการตรวจสอบว่า Queue มีข้อมูลหรือไม่ โดยการตรวจสอบค่า size() ถ้าไม่เท่ากับ 0 แสดงว่ายังมีข้อมูลอยู่ใน Queue แต่ถ้าเท่ากับ 0 แสดงว่า Queue นั้นว่างเปล่า
- isFull()ใช้ในการตรวจสอบว่า Queue เต็มหรือไม่ โดยการตรวจสอบค่า size() ถ้ามากกว่าหรือเท่ากับ capacity แสดงว่า Queue เต็มแล้ว ถ้าไม่มากกว่าหรือเท่ากับ capacity ก็ยังไม่เต็ม
ภาพจากการทดลอง
วิดิโอผลการทดลอง
โจทย์ข้อที่ 2
ใช้คลาส StringQueue ในข้อที่ 1 นำมาเขียนโค้ด Arduino เพื่อให้มีพฤติกรรมการทำงานดังนี้ กำหนดให้มีความจุเช่น 10 ข้อความ
- บอร์ด Arduino มีวงจรปุ่มกด Get ทำงานแบบ Active-Low (ใช้ตัวต้านทานแบบ Pull-up, 10k)
- ผู้ใช้สามารถส่งข้อความ (ภาษาอังกฤษ) ทีละบรรทัด (ไม่เกิน 16 ตัวอักขระต่อบรรทัด) จากคอมพิวเตอร์ โดยส่งผ่าน Serial Monitor ของ Arduino IDE ไปยังบอร์ด Arduino ใช้ baudrate 115200
- ข้อความแต่ละบรรทัดที่ถูกส่งไปยัง Arduino จะถูกจัดเก็บใน StringQueue ถ้าไม่เต็มความจุ แต่ถ้าเต็มความจุ ไม่สามารถเก็บข้อความใหม่ได้ Arduino จะต้องส่งข้อความ "Full" กลับมา และมี LED "Full" ติด
- เมื่อมีการกดปุ่ม Get แล้วปล่อยหนึ่งครั้ง ข้อความแรก (ถ้ามี) ของ StringQueue จะถูกดึงออกมาแล้วส่งผ่าน Serial Monitor ไปยังคอมพิวเตอร์ และนำไปแสดงผลบนจอ 16x2 LCD ที่ต่อกับบอร์ด Arduino ด้วย แต่ถ้าไม่ข้อความใดๆ Arduino จะต้องส่งข้อความ "Empty" กลับมา เมื่อกดปุ่มแล้วปล่อย และให้มี LED "Empty" ติด
- บรรทัดแรกของ LCD แสดงข้อความที่ถูกอ่านออกมาล่าสุดจาก StringQueue บรรทัดที่สอง ให้แสดงจำนวนข้อความที่มีอยู่ใน StackQueue ในขณะนั้น
- 16x2 LCD module สามารถยืมได้จากห้อง ESL และการเขียนโค้ดเพื่อใช้งาน LCD สามารถใช้ไลบรารี่ของ Arduino ได้
ภาพการต่อจากบอร์ดจริง
Code ที่ใช้ในการทดลอง
ภาพจากการทดลอง
เมื่อไม่มีข้อมูลอยู่ใน Queue จะแสดงข้อความ EMPTY ออกจากทางจอ LCD และไฟ LED ด้านขวาติด |
เมื่อ Queue มีข้อมูลจนเต็มแล้ว จะแสดงข้อความ FULL ออกจากทางจอ LCD และไฟ LED ทางซ้ายติด |
เมื่อกดปุ่มจะนำข้อมูลออกมาจาก Queue และแสดงผลผ่านทางจอ LCD พร้อมทั้งบอกจำนวนข้อมูลที่เหลืออยู่ใน Queue |
วิดิโอผลการทดลอง