Wednesday, September 24, 2014

Arduino String Queue

Arduino String Queue

อุปกรณ์ในการทดลอง
  1. Arduino 1 บอร์ด
  2. ตัวต้านทาน 10k โอห์ม 1 ตัว
  3. ตัวต้านทาน 330 โอห์ม 2 ตัว
  4. ตัวต้านทานปรับค่าได้ขนาด 10k โอห์ม 1 ตัว
  5. LED 5mm 2 ตัว
  6. Push Button Switch 1 ตัว
  7. จอ 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
Class StringQueue.cpp 

 

  • 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 ก็ยังไม่เต็ม
Code ที่ใช้ในการทดสอบ 



ภาพจากการทดลอง


วิดิโอผลการทดลอง


โจทย์ข้อที่ 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 ได้
Breadboard View 


ภาพการต่อจากบอร์ดจริง

Code ที่ใช้ในการทดลอง

 
 
ภาพจากการทดลอง
เมื่อไม่มีข้อมูลอยู่ใน Queue จะแสดงข้อความ EMPTY ออกจากทางจอ LCD และไฟ LED ด้านขวาติด

เมื่อ Queue มีข้อมูลจนเต็มแล้ว จะแสดงข้อความ FULL ออกจากทางจอ LCD และไฟ LED ทางซ้ายติด
เมื่อกดปุ่มจะนำข้อมูลออกมาจาก Queue และแสดงผลผ่านทางจอ LCD พร้อมทั้งบอกจำนวนข้อมูลที่เหลืออยู่ใน Queue
วิดิโอผลการทดลอง