โจทย์ฝึกปฏิบัติสำหรับสัปดาห์นี้
1) เขียนโค้ดสำหรับบอร์ด Arduino โดยสร้างเป็น C++ Class ดังต่อไปนี้
/////////////////////////////////////////////////////////////////////////
class StringStack {
public:
StringStack( int
capacity=10 ); // constructor
boolean put( String s
); // put a String object on stack
boolean get( String
&s ); // get a String object from stack
inline int size(); //
return the number of String objects on the stack
inline boolean
isEmpty(); // return true if stack is empty, otherwise false
inline boolean
isFull(); // return true if stack is full, otherwise false
private:
int capacity; // the
max. capacity of the stack
int count; // used to
count the number of string objects stored
String *buf; // used
to store String objects on stack
};
/////////////////////////////////////////////////////////////////////////
จงสร้างคลาส StringStack และทดสอบการทำงานโดยใช้โค้ดตัวอย่างต่อไปนี้
และทดสอบโดยใช้ฮาร์ดแวร์จริง
(ใช้บอร์ด Arduino และแสดงผลผ่าน Serial
Monitor ของ Arduino IDE)
/////////////////////////////////////////////////////////////////////////
int num = 10; //
capacity
StringStack st( num );
void setup() {
Serial.begin(115200);
}
char buf[20];
String str;
void loop() {
Serial.print(
"\nPut strings: " );
for ( int i=0; i <
num; i++ ) {
str = String( (i+1)*10
);
if ( !st.put( str ) )
{
Serial.println(
"\nPut string error!" );
break;
} else {
Serial.print( str );
Serial.print( "
" );
}
str = NULL;
delay(50);
}
delay(500);
Serial.print(
"\nGet strings: " );
for ( int i=0; i <
num; i++ ) {
if ( st.get( str ) ) {
str.toCharArray( buf,
20 );
Serial.print( buf );
Serial.print( "
" );
} else {
Serial.println(
"\nGet string error!" );
break;
}
delay(50);
}
delay(500);
}
/////////////////////////////////////////////////////////////////////////
2) ใช้คลาส StringStack ในข้อแรก นำมาเขียนโค้ด Arduino เพื่อให้มีพฤติกรรมการทำงานดังนี้
2.1) บอร์ด Arduino มีวงจรปุ่มกด Get
ทำงานแบบ Active-Low (ใช้ตัวต้านทานแบบ Pull-up, 10k)
2.2) ผู้ใช้สามารถส่งข้อความ (ภาษาอังกฤษ) ทีละบรรทัด (ไม่เกิน 20 ตัวอักขระต่อบรรทัด)
จากคอมพิวเตอร์ โดยส่งผ่าน Serial
Monitor ของ Arduino IDE ไปยังบอร์ด Arduino
2.3) ข้อความแต่ละบรรทัดที่ถูกส่งไปยัง Arduino จะถูกจัดเก็บใน
StringStack (เก็บบนกองซ้อน) ถ้าไม่เต็มความจุ แต่ถ้าเต็มความจุ
ไม่สามารถเก็บข้อความใหม่ได้ Arduino
จะต้องส่งข้อความ "Full" กลับมา
2.4) เมื่อมีการกดปุ่ม Get แล้วปล่อยหนึ่งครั้ง
ข้อความบนสุด (ถ้ามี) ของ StringStack จะถูกดึงออกมาแล้วส่งผ่าน Serial Monitor ไปยังคอมพิวเตอร์
แต่ถ้าไม่ข้อความใดๆ Arduino จะต้องส่งข้อความ "Empty" กลับมา
เมื่อกดปุ่มแล้วปล่อย
อุปกรณ์ที่ใช้ในการทดลอง
1.
Arduino Uno rev.3
1
บอร์ด
2. ตัวต้านทาน 10
k-ohm
1
ตัว
3. push
button
1
ตัว
4. สายไฟ
การทดลองที่ 1
1.1 เขียน Class StringStack ทีทำงานได้โดย Code ที่กำหนดมาให้ด้านบน
# Constructor
- รับค่า Capacity มากำหนด ขนาดของ Stack
- กำหนดค่าเริ่มต้นต่างๆ
StringStack::StringStack(int capacity) { // Constructor
count = 0;
this->capacity = capacity;
buf = new String [capacity];
}
# put(String s)
- จะตรวจสอบถ้า ณ ตอนนี้ Stack เต็มหรือไม่? ถ้าไม่ ก็เพิ่มเข้าไป
boolean StringStack::put(String s){
boolean v;
if( isFull() == false ){ // No Full
buf[count] = s;
count += 1;
v = true;
}
else{ // String is Full!
v = false;
}
return v;
}
# get(String s)
- จะตรวจสอบว่า ณ ตอนนี้ Stack ว่างหรือไม่? ถ้าไม่ก็เปลี่ยนตำแหน่งชี้ไปยังตัวก่อนหน้า
boolean StringStack::get(String &s){
boolean v;
if(isEmpty() == false){
count -= 1;
*&s = buf[count];
v = true;
}
else{
v = false;
}
return v;
}
# size()
- จะคืนค่า count ณ ตอนนั้น
inline int StringStack::size(){ return count; }
# isEmpty()
- จะตรวจสอบว่า Stack ณ ขณะนั้นว่างหรือไม่ ?
inline boolean StringStack::isEmpty(){
if( size() <= 0){
return true; // isEmpty
}
else{
return false; // Not! Empty
}
}
# isFull()
- จะตรวจสอบว่า Stack ณ ขณะนั้นเต็มหรือไม่ ?
inline boolean StringStack::isFull(){
if( size() >= capacity){
return true; // isFull
}
else{
return false; // Not! Full
}
}
----------------------------
Output 1
(รุปแสดง Output ที่ได้)
2.1 ออกแบบวงจรปุ่มกดโดย Program Fritzing
|
รูป-การออกแบบวงจรปุ่มกด |
|
รูปแสดงการต่อวงจรปุ่มกด |
Output 2
|
รูป output ที่ได้ |
Code ที่แนบ มา =>
Code :: 2
---------------------------------