Assignment IV
1) เขียนโค้ดสำหรับบอร์ด
Arduino โดยสร้างเป็น C++ Class ดังต่อไปนี้
=> Class StringQueue เป็นโครงสร้างข้อมูลแบบ Queue สำหรับเก็บ String objects สร้างคลาส StringQueue และทดสอบการทำงานโดยใช้โค้ดตัวอย่างต่อไปนี้ และทดสอบโดยใช้ฮาร์ดแวร์จริง (ใช้บอร์ด Arduino และแสดงผลผ่าน Serial Monitor ของ Arduino IDE)
2) ใช้คลาส StringQueue ในข้อแรก นำมาเขียนโค้ด Arduino เพื่อให้มีพฤติกรรมการทำงานดังนี้ กำหนดให้มีความจุเช่น 10 ข้อความ
2.1) บอร์ด Arduino มีวงจรปุ่มกด Get ทำงานแบบ Active-Low (ใช้ตัวต้านทานแบบ Pull-up, 10k)
2.2) ผู้ใช้สามารถส่งข้อความ (ภาษาอังกฤษ) ทีละบรรทัด (ไม่เกิน 16 ตัวอักขระต่อบรรทัด) จากคอมพิวเตอร์ โดยส่งผ่าน Serial Monitor ของ Arduino IDE ไปยังบอร์ด Arduino ใช้ baudrate 115200
2.3) ข้อความแต่ละบรรทัดที่ถูกส่งไปยัง Arduino จะถูกจัดเก็บใน StringQueue ถ้าไม่เต็มความจุ แต่ถ้าเต็มความจุ ไม่สามารถเก็บข้อความใหม่ได้ Arduino จะต้องส่งข้อความ "Full" กลับมา และมี LED "Full" ติด
2.4) เมื่อมีการกดปุ่ม Get แล้วปล่อยหนึ่งครั้ง ข้อความแรก (ถ้ามี) ของ StringQueue จะถูกดึงออกมาแล้วส่งผ่าน Serial Monitor ไปยังคอมพิวเตอร์ และนำไปแสดงผลบนจอ 16x2 LCD ที่ต่อกับบอร์ด Arduino ด้วย แต่ถ้าไม่ข้อความใดๆ Arduino จะต้องส่งข้อความ "Empty" กลับมา เมื่อกดปุ่มแล้วปล่อย และให้มี LED "Empty" ติด
2.5) บรรทัดแรกของ LCD แสดงข้อความที่ถูกอ่านออกมาล่าสุดจาก StringQueue บรรทัดที่สอง ให้แสดงจำนวนข้อความที่มีอยู่ใน StackQueue ในขณะนั้น
2.6 16x2 LCD module สามารถยืมได้จากห้อง ESL และการเขียนโค้ดเพื่อใช้งาน LCD สามารถใช้ไลบรารี่ของ Arduino ได้
=> Class StringQueue เป็นโครงสร้างข้อมูลแบบ Queue สำหรับเก็บ String objects สร้างคลาส StringQueue และทดสอบการทำงานโดยใช้โค้ดตัวอย่างต่อไปนี้ และทดสอบโดยใช้ฮาร์ดแวร์จริง (ใช้บอร์ด Arduino และแสดงผลผ่าน Serial Monitor ของ Arduino IDE)
2) ใช้คลาส StringQueue ในข้อแรก นำมาเขียนโค้ด Arduino เพื่อให้มีพฤติกรรมการทำงานดังนี้ กำหนดให้มีความจุเช่น 10 ข้อความ
2.1) บอร์ด Arduino มีวงจรปุ่มกด Get ทำงานแบบ Active-Low (ใช้ตัวต้านทานแบบ Pull-up, 10k)
2.2) ผู้ใช้สามารถส่งข้อความ (ภาษาอังกฤษ) ทีละบรรทัด (ไม่เกิน 16 ตัวอักขระต่อบรรทัด) จากคอมพิวเตอร์ โดยส่งผ่าน Serial Monitor ของ Arduino IDE ไปยังบอร์ด Arduino ใช้ baudrate 115200
2.3) ข้อความแต่ละบรรทัดที่ถูกส่งไปยัง Arduino จะถูกจัดเก็บใน StringQueue ถ้าไม่เต็มความจุ แต่ถ้าเต็มความจุ ไม่สามารถเก็บข้อความใหม่ได้ Arduino จะต้องส่งข้อความ "Full" กลับมา และมี LED "Full" ติด
2.4) เมื่อมีการกดปุ่ม Get แล้วปล่อยหนึ่งครั้ง ข้อความแรก (ถ้ามี) ของ StringQueue จะถูกดึงออกมาแล้วส่งผ่าน Serial Monitor ไปยังคอมพิวเตอร์ และนำไปแสดงผลบนจอ 16x2 LCD ที่ต่อกับบอร์ด Arduino ด้วย แต่ถ้าไม่ข้อความใดๆ Arduino จะต้องส่งข้อความ "Empty" กลับมา เมื่อกดปุ่มแล้วปล่อย และให้มี LED "Empty" ติด
2.5) บรรทัดแรกของ LCD แสดงข้อความที่ถูกอ่านออกมาล่าสุดจาก StringQueue บรรทัดที่สอง ให้แสดงจำนวนข้อความที่มีอยู่ใน StackQueue ในขณะนั้น
2.6 16x2 LCD module สามารถยืมได้จากห้อง ESL และการเขียนโค้ดเพื่อใช้งาน LCD สามารถใช้ไลบรารี่ของ Arduino ได้
โค้ดการทำงาน
จากโจทย์สามารถทำการทดลองได้
โค้ดการทำงาน 3 ไฟล์ คือ ไฟล์ StringQueue.h, StringQueue.cpp และ StringQueue.ino ดังนี้
ส่วนที่ 1 StringQueue.h
ในส่วนแรกนี้เป็นส่วนของ Header File ของการเก็บข้อมูล String ในรูปแบบของ Queue ในส่วนของไฟล์นี้ จะมีการสร้าง Class StringQueue ที่ประกอบด้วย Method ดังนี้
ในส่วนแรกนี้เป็นส่วนของ Header File ของการเก็บข้อมูล String ในรูปแบบของ Queue ในส่วนของไฟล์นี้ จะมีการสร้าง Class StringQueue ที่ประกอบด้วย Method ดังนี้
- StringQueue เป็น Constructor ของคลาสนี้ ซึ่งจะรับค่า Argument เป็น int ซึ่งเป็นค่าความจุของ StringQueue นี้
- enqueue เป็น Method ที่รีเทิร์นค่าเป็น Boolean ที่ใช้สำหรับใส่ค่า String เข้าไปใน Queue จะรับ Argument เป็น String ที่ต้องการจะใส่
- dequeue เป็น Method ที่รีเทิร์นค่าเป็น Boolean ที่ใช้สำหรับดึงค่า String ออกจาก Queue จะรับ Argument เป็น Address ของ String สำหรับเอาไว้เก็บค่า String ที่ต้องการจากก Queue ไปไว้ใน Address นั้น
- size เป็น Method ที่รีเทิร์นค่าเป็น int ที่ใช้สำหรับตรวจสอบค่าปริมาณของข้อมูลที่มีอยู่ปัจจุบันภายใน Queue
- isEmpty เป็น Method ที่รีเทิร์นค่าเป็น Boolean ที่ใช้สำหรับตรวจสอบว่า Queue นั้น ว่างเปล่าหรือไม่
- isFull เป็น Method ที่รีเทิร์นค่าเป็น Boolean ที่ใช้สำหรับตรวจสอบว่า Queue นั้น เต็มหรือไม่
ส่วนที่ 2 StringQueue.cpp
ส่วนที่ 2 นี้ เป็นไฟล์ .cpp ที่ใช้สำหรับใส่รายละเอียดการทำงานของ Method
ต่างๆ ตามที่ไฟล์ .h ได้สร้างเอาไว้ โดยแต่ละ Method
มีรายละเอียด ดังนี้
- StringQueue จะทำการกำหนดให้ String
Pointer ชี้ไปที่ object ใหม่ ที่เป็น String
Array ที่มีค่า capacity ของ Array เท่ากับค่า capacity ที่รับเข้ามา
- enqueue จะทำการตรวจสอบก่อนว่า String Queue ปัจจุบันนั้นเต็มหรือไม่ ถ้าไม่เต็ม จะไปกำหนดให้ค่าของ String Queue ในตำแหน่ง Address ของหางที่ว่างอยู่ มีค่าเท่ากับ String ที่รับเข้ามา และรีเทิร์นค่าเป็น True แต่ถ้า String Queue ปัจจุบันนั้นเต็ม แสดงว่าไม่สามารถ enqueue ได้ จะทำการรีเทิร์น False
- dequeue จะทำการตรวจสอบก่อนว่า String Queue ปัจจุบันนั้นว่างหรือไม่ ถ้าไม่ว่างหรือมีข้อมูลอยู่ จะไปทำการกำหนดให้ค่าของ Address String ที่รับค่าเข้ามาชี้ไปที่ค่าของ String ในตำแหน่ง Address ที่เป็นหัวของ String Queue และรีเทิร์นค่าเป็น True แต่ถ้า String Queue ปัจจุบันนั้นว่าง แสดงว่าไม่มีข้อมูลอยู่ไม่สามารถ dequeue ได้ จะทำการรีเทิร์น False
- size จะทำการรีเทิร์นค่า count ซึ่งเป็นตัวแปรที่เอาไว้นับจำนวนข้อมูลที่อยู่ใน Queue
- isEmpty จะทำการตรวจสอบค่าตัวแปร count ซึ่งเป็นตัวนับจำนวนข้อมูลใน Queue ถ้ามีค่าเท่ากับ 0 แสดงว่าไม่มีข้อมูลอยู่ใน Queue หรือ Queue นั้นว่างนั่นเอง ก็จะให้รีเทิร์น True แต่ถ้าไม่เท่ากับ 0 แสดงว่ามีข้อมูลอยู่ใน Queue จะทำการรีเทิร์น False
- isFull
จะทำการตรวจสอบค่าตัวแปร count ซึ่งเป็นตัวนับจำนวนข้อมูลใน Queue ถ้ามีค่าเท่ากับ capacity แสดงว่า Queue นั้นเต็ม ก็จะให้รีเทิร์น True แต่ถ้าไม่เท่ากับ capacity แสดงว่า Queue ไม่เต็ม จะทำการรีเทิร์น False
ในส่วนที่ 3 นี้เป็นส่วนของไฟล์ .ino ที่ใช้สำหรับกำหนดฟังก์ชันการทำงานต่างๆ ให้กับบอร์ด Arduino ดังนี้
โค้ดส่วน A เป็นส่วนของการ include library, การประกาศตัวแปร
และการกำหนดค่าต่างๆ โดย library ที่ใช้มี 2 library คือ StringQueue ที่เราสร้างมาเอง และ LiquidCrystal
ที่เป็น library ของการใช้งานจอ LCD
16x2 ต่อมาเป็นการประกาศตัวแปรต่างๆ จากนั้นเป็นส่วนของ void
setup() มีการเปิด Serial port(115200) มีการกำหนดค่า
Input และ Output ให้กับขา และมีการกำหนดค่าเริ่มต้นให้กับจอ
lcd 16x2
โค้ดส่วน B เป็นส่วนของการอ่านค่าจาก Serial Port โดยจะให้เข้า while Loop เมื่อ Serial.available() มีค่ามากกว่า 0 คือ เมื่อผู้ใช้งานมีการป้อน Input ผ่านทาง
Serial Port จะทำให้เข้า while loop นี้
จากนั้นจะทำการอ่านค่า input ที่รับมา ไม่เกิน 20 ตัวอักษา และใช้ฟังก์ชัน
enqueue เป็นตัวเก็บข้อมูลที่รับเข้ามาไว้ใน String
Queue และแสดงค่าที่รับเข้ามาได้ผ่านจอ LCD แต่ถ้า
Queue เต็มแล้ว ก็จะให้แสดงคำ
โค้ดส่วน C เป็นส่วนของการตรวจสอบการกดปุ่มจากผู้ใช้งาน
โดยถ้ามีการกดปุ่มแล้วปล่อยปุ่มกด จะมีการเรียกใช้ฟังก์ชัน dequeue สำหรับการดึงข้อมูลออกมาจาก String Queue โดยถ้า
String Queue มีข้อมูลอยู่ภายในก็จะทำการดึงข้อมูลออกมา
และแสดงผลผ่านทางจอ LCD ว่าได้ข้อมูลอะไรออกมา และแสดงจำนวนข้อมูลที่เหลืออยู่ภายใน
String Queue ด้วย แต่ถ้า String Queue นั้นว่าง หรือ isEmpty ก็จะ
ให้หน้าจอ LCD แสดงคำว่า "Empty" และให้ไฟ LED สีเขียวมีสถานะติด
|
ภาพการต่อวงจรจริงและผลการทำงาน
ภาพแสดงการทำงานเมื่อเริ่มทำการอัพโหลดโค้ด Queue จะว่าง ทำให้ไฟสีเขียวติด
ภาพแสดงการทำงานเมื่อทำการป้อนคำว่า “embedded
system” เข้าไปใน Queue
ภาพแสดงการทำงานเมื่อทำการป้อนค่าจน Queue เต็ม ทำให้ไฟสีแดงติด
ภาพแสดงการทำงานเมื่อทำการดึงค่าจาก Queue จนหมด ทำให้มีค่า Size เท่ากับ 0
ภาพแสดงการทำงานเมื่อทำการกดปุ่มเพื่อดึงค่าในขณะที่ Queue ทำให้แสดงคำว่า “Empty”
สามารถดูผลการทดสอบการทำงานได้จากลิงก์ : http://youtu.be/8_68JHYp6yg