Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore ไมโครคอนโทรลเลอร์และการประยุกต์

ไมโครคอนโทรลเลอร์และการประยุกต์

Description: ไมโครคอนโทรลเลอร์และการประยุกต์

Search

Read the Text Version

378 3. ผลการทดลอง รูปที่ 15.2 ผลการทดลองวงจรทดสอบการใชงานหนว ยความจำอีอีพรอม และแสดงผลลพั ธผ า น Virtual Terminal ทม่ี า: ผเู ขียน จากรูปที่ 15.2 แสดงผลการทดลองวงจรทดสอบการใชงานหนวยความจำอีอีพรอมและ แสดงผลลัพธผาน Virtual Terminal โดยผลลัพธที่ไดคือ 21 เนื่องจากคาดังกลาวนี้ถูกเก็บไว ณ ตำแหนงทอ่ี านขอ มูลออกมา ตัวอยา งท่ี 15.2 ทดสอบอานคาท่ีเก็บไวท่ีหนว ยความจำอีอีพรอม การทำงาน: ตัวอยางนี้แสดงวิธีการทดสอบอานขอมูลจากตำแหนงดังกลาวจากตำแหนงเดิมอีกคร้ัง และแสดงผลลัพธผา น Virtual Terminal วธิ ีทำ 1. สวนวงจรทดลอง เชื่อมตออปุ กรณภ ายนอก เขา กบั บอรด Arduino ดังตวั อยางที่ 15.1 2. สวนโปรแกรม #include <EEPROM.h> byte x; void setup() { Serial.begin(9600); x = EEPROM.read(0); Serial.print(\"x = \"); Serial.println(x);

379 } void loop() { } คำอธิบาย: กำหนดตัวแปรชือ่ x ทีม่ ชี นดิ ขอ มูลเปน แบบ byte ฟงกชัน Setup(): ดึงขอมูลจากตำแหนงที่ 0 ดวยฟงกชัน EEPROM.read() กอนที่จะแสดง ผลลัพธท ดี่ ึงออกมาผาน Virtual Terminal ฟง กช ัน loop(): - รปู ท่ี 15.3 ผลการทดลองการอานขอมลู จากหนวยความจำอีอีพรอม และแสดงผลลพั ธผ า น Virtual Terminal ท่ีมา: ผเู ขยี น จากรูปที่ 15.3 แสดงผลการทดลองการอานขอมูลจากหนวยความจำอีอีพรอมและแสดงผล ลัพธผาน Virtual Terminal ซึ่งพบวาผลลัพธยังคงมีคาเปน 21 ถึงแมวาบอรด Arduino จะถูก เขียนทบั ดว ยโปรแกรมหรอื ชดุ คำสั่งใหม ตัวอยางที่ 15.3 ทดสอบอานคา ท่เี กบ็ ไวทหี่ นว ยความจำออี ีพรอมและนำมาควบคุมการแสดงผลผาน แอลอีดี 7 สว น การทำงาน: ตัวอยางนีแ้ บงออกเปน 2 สว น สว นที่ 1 แสดงการเขยี นขอมลู ลงหนวยความจำอีอีพรอม ตำแหนงที่ 1 และสวนที่ 2 แสดงวิธีการอานขอมูลจากหนวยความจำอีอีพรอมตำแหนงที่ 1 และนำ ขอมูลที่ดึงมาแสดงผลลัพธผ านแอลอีดี 7 สวนดงั น้ี

380 วธิ ีทำ สว นท่ี 1 1. สวนวงจรทดลอง เชื่อมตออปุ กรณภ ายนอก เขากบั บอรด Arduino ดงั ตัวอยางที่ 15.1 2. สวนโปรแกรม #include <EEPROM.h> byte x; void setup() { Serial.begin(9600); EEPROM.write(1, 3); x = EEPROM.read(1); Serial.println(x);} void loop() {} คำอธิบาย: กำหนดตัวแปรชือ่ x ทม่ี ีชนดิ ขอมลู เปน แบบ byte ฟงกชัน Setup(): เขียนขอมูลที่มีคาเทากับ 3 ลงหนวยความจำตำแหนงที่ 1 ดวยฟงกชัน EEPROM.write() และดึงขอมูลจากตำแหนงดังกลาวดวยฟงกชัน EEPROM.read() กอนที่จะแสดง ผลลพั ธทีด่ งึ ออกมาผา น Virtual Terminal ฟงกชัน loop(): - 3. ผลการทดลอง รูปที่ 15.4 ผลการทดลองการเขยี นและอานขอมลู ลงหนวยความจำอีอพี รอม ตำแหนงท่ี 1 และแสดงผลลพั ธผา น Virtual Terminal ทมี่ า: ผูเขยี น

381 สวนที่ 2 1. สวนวงจรทดลอง รูปที่ 15.5 วงจรทดลองอานขอมูลจากหนว ยความจำอีอีพรอมตำแหนงท่ี 1 และแสดงผลลัพธผ า นแอลอดี ี 7 สวน ทมี่ า: ผูเขียน คำอธิบาย: กำหนดตำแหนง ขาท่เี ชือ่ มตอกบั บอรด Arduino ดงั นี้ 1. ขา a ของแอลซีดี 7 สว นเชอ่ื มตอ กับตำแหนง ขาท่ี 2 ของบอรด Arduino 2. ขา b ของแอลซีดี 7 สวนเช่อื มตอกับตำแหนง ขาท่ี 3 ของบอรด Arduino 3. ขา c ของแอลซีดี 7 สวนเชอ่ื มตอ กบั ตำแหนง ขาท่ี 4 ของบอรด Arduino 4. ขา d ของแอลซีดี 7 สว นเช่ือมตอ กบั ตำแหนงขาที่ 5 ของบอรด Arduino 5. ขา e ของแอลซีดี 7 สว นเชอื่ มตอกบั ตำแหนงขาท่ี 6 ของบอรด Arduino 6. ขา f ของแอลซดี ี 7 สวนเช่อื มตอ กบั ตำแหนงขาที่ 7 ของบอรด Arduino 7. ขา g ของแอลซดี ี 7 สว นเชอื่ มตอ กับตำแหนง ขาที่ 8 ของบอรด Arduino 2. สวนของโปรแกรม #include <EEPROM.h> byte num; void setup() { pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT);

382 pinMode(7, OUTPUT); pinMode(8, OUTPUT); num = EEPROM.read(1); if(num == 0){ show_zero(); } else if(num == 1){ show_one(); } else if(num == 2){ show_two(); } else if(num == 3){ show_three(); } else if(num == 4){ show_four(); } else if(num == 5){ show_five(); } else if(num == 6){ show_six(); } else if(num == 7){ show_seven(); } else if(num == 8){ show_eight(); } else{ show_nine(); } } void loop() {} void show_zero(){ digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH);

383 digitalWrite(7, HIGH); digitalWrite(8, LOW); } void show_one(){ digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); } void show_two(){ digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, LOW); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(8, HIGH); } void show_three(){ digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, HIGH); } void show_four(){ digitalWrite(2, LOW); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, HIGH); digitalWrite(8, HIGH); } void show_five(){ digitalWrite(2, HIGH);

384 digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, LOW); digitalWrite(7, HIGH); digitalWrite(8, HIGH); } void show_six(){ digitalWrite(2, LOW); digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); } void show_seven(){ digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(7, LOW); digitalWrite(8, LOW); } void show_eight(){ digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, HIGH); digitalWrite(7, HIGH); digitalWrite(8, HIGH); } void show_nine(){ digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(4, HIGH); digitalWrite(5, HIGH); digitalWrite(6, LOW); digitalWrite(7, HIGH);

385 digitalWrite(8, HIGH); } คำอธิบาย: กำหนดตัวแปรชือ่ num ท่ีมีชนดิ ขอมลู เปนแบบ byte ฟงกชัน Setup(): กำหนดใหขา 2, 3, 4, 5, 6, 7 และ 8 ของบอรด Arduino มีสถานะ เริ่มตนเปนโหมดเอาตพุต อานขอมูลจากหนวยความจำอีอีพรอมตำแหนงที่ 1 เก็บไวในตัวแปร num และตรวจสอบเงื่อนไขของคา num เพื่อเรียกใชฟงกชันท่ีตรงกับคาของ num โดยฟงกชันทั้งหมดจะ ทำหนา ที่แสดงผลของตวั เลขผา นแอลอดี ี 7 สว น ดังนี้ num = 0, เรียกใชฟ งกช นั show_zero() เพื่อแสดงเลข 0 ผานแอลอดี ี 7 สว น num = 1, เรียกใชฟ ง กชนั show_one() เพ่อื แสดงเลข 1 ผานแอลอดี ี 7 สวน num = 2, เรียกใชฟง กชัน show_two() เพ่ือแสดงเลข 2 ผา นแอลอีดี 7 สวน num = 3, เรียกใชฟ ง กช นั show_three() เพ่ือแสดงเลข 3 ผา นแอลอดี ี 7 สวน num = 4, เรยี กใชฟ ง กชัน show_four() เพอ่ื แสดงเลข 4 ผา นแอลอดี ี 7 สว น num = 5, เรยี กใชฟง กชนั show_five() เพ่อื แสดงเลข 5 ผานแอลอีดี 7 สวน num = 6, เรยี กใชฟง กช นั show_six() เพอ่ื แสดงเลข 6 ผา นแอลอีดี 7 สว น num = 7, เรยี กใชฟง กชัน show_seven() เพื่อแสดงเลข 7 ผา นแอลอดี ี 7 สวน num = 8, เรยี กใชฟ ง กช นั show_eight() เพื่อแสดงเลข 8 ผา นแอลอดี ี 7 สวน num = 9, เรยี กใชฟงกช ัน show_nine() เพอื่ แสดงเลข 9 ผา นแอลอดี ี 7 สว น 3. ผลการทดลอง รปู ท่ี 15.6 ผลการทดลองอา นขอมลู จากหนวยความจำออี ีพรอมตำแหนง ที่ 1 และแสดงผลลพั ธผา นแอลอดี ี 7 สว น ทม่ี า: ผเู ขียน

386 จากรปู ที่ 15.6 แสดงผลการทดลองอา นขอ มลู จากหนวยความจำอีอพี รอมตำแหนง ท่ี 1 และ แสดงผลลพั ธผ า นแอลอดี ี 7 สว น พบวา ผลลัพธแสดงเลข 3 ผานแอลอดี ี 7 สว น เนือ่ งจากคา ดังกลาว ถูกเก็บไวในหนว ยความจำออี ีพรอมตำแหนง ที่ 1 อยางไรก็ตามจากที่กลาวไวตอนนี้วาหนวยความจำอีอีพรอมสามารถอาน และเขียนไดเพียง ประมาณ 1 แสนครั้ง ดังนั้นในหัวขอถัดไปจะแนะนำฟงกชันอื่นๆ ที่สามารถเขาถึงหนวยความจำ ออี พี รอมไดเ ชน กนั โดยไมไดมกี ารเขียนขอ มูลโดยตรงซ่ึงสามารถชว ยลดจำนวนคร้ังการเขียนขอมูลลง หนวยความจำออี พี รอมลงได 4. ฟงกชนั EEPROM.update() เปน ฟงกช นั ที่ใชส ำหรบั เขียนขอมลู ที่มีขนาดไมเ กิน 1 ไบต (0 – 255) ไปยงั ตำแหนงหน่ึงของ หนวยความจำอีอีพรอมเชนเดียวกันกับฟงกชัน EEPROM.write() แตจะแตกตางจากฟงกชันดังกลา ว ตรงที่หากใชฟงกชัน EEPROM.update() จะเกิดการเขียนขอมูลก็ตอเมื่อขอมูลใหมตางจากคาขอมูล เดมิ ที่บรรจุอยูใ นตำแหนง เดียวกนั จงึ เปรียบเสมือนการแกไ ขขอมูล รปู แบบ EEPROM.update(address, value) พารามิเตอร 1. address คอื ตำแหนงทีอ่ ยขู องหนว ยความจำอีอีพรอมท่ตี องการใชสำหรบั แกไขขอมูล 2. value คอื คาขอ มูลท่ตี องการแกไขลงหนวยความจำอีอพี รอมซงึ่ มีขนาดไมเ กิน 1 ไบต ตัวอยา งที่ 15.4 ทดสอบใชฟงกชนั EEPROM.update() แทนฟงกช นั EEPROM.write() การทำงาน: จากตัวอยา งท่ี 15.1 และ 15.2 ขอมูลท่ีถกู เขยี นไวท ห่ี นวยความจำอีอีพรอมตำแหนง ท่ี 0 คือ 21 โดยจะเขียนขอมลู ใหมทบั ตำแหนงเดิมโดยใช ฟงกช ัน EEPROM.update() วิธที ำ 1. สวนวงจรทดลอง เชอ่ื มตออปุ กรณภายนอก เขากับบอรด Arduino ดังตัวอยา งที่ 15.1

387 2. สว นโปรแกรม #include <EEPROM.h> byte x; void setup() { Serial.begin(9600); x = EEPROM.read(0); Serial.print(\"Before update: x = \"); Serial.println(x); EEPROM.update(0, 18); x = EEPROM.read(0); Serial.print(\"After update: x = \"); Serial.println(x); } void loop() {} คำอธิบาย: กำหนดตัวแปรชอ่ื x ที่มีชนดิ ขอมูลเปน แบบ byte ฟงกชัน Setup(): กอนการแกไขขอมูลทำการอานขอมูลจากหนวยความจำอีอีพรอม ตำแหนงที่ 1 และแสดงผาน Virtual Terminal และทำการแกไขขอมูลที่ตำแหนงเดิมดวยฟงกชัน EEPROM.update() โดยแกไขคาขอมูลเปน 18 และแสดงการอานขอมูลจากตำแหนงเดิมโดยแสดง ผลลพั ธอกี ครัง้ ผาน Virtual Terminal ฟง กช ัน loop(): - รูปที่ 15.7 ผลการทดลองการแกไ ขขอมูลนหนวยความจำอีอพี รอมดว ยฟงกช ัน EEPROM.update() และแสดงผลลพั ธผาน Virtual Termainal ทีม่ า: ผเู ขยี น

388 จากรูปที่ 15.7 แสดงผลการทดลองการแกไขขอมูลนหนวยความจำอีอีพรอมดวยฟงกชัน EEPROM.update() และแสดงผลลัพธผาน Virtual Termainal พบวาหลังจากใชฟงกชัน EEPROM.update() ขอมูลทต่ี ำแหนง 0 ถกู แกไ ขเปน 18 การเขียนขอมูลดวยฟงกชัน EEPROM.write() และ EEPROM.update() จะสามารถเขียน ขอมูลที่มีขนาดสูงสุดไดเพยี ง 1 ไบต ในหวั ขอ ถดั ไปจะกลาวถงึ ฟงกช นั ทีส่ ามารถอานและเขียนขอมูลที่ มีขนาดสงู กวา 1 ไบต 5. ฟงกชัน EEPROM.put() ฟงกช นั EEPROM.put() เปนฟงกช นั ท่ีใชส ำหรับเขยี นขอมูลลงหนวยความจำอีอีพรอม โดย ขอมลู ท่ีถกู เขียนลงสามารถมีขนาดที่ใหญกวา 1 ไบต หรือเปนออปเจ็คได รูปแบบ EEPROM.put(address, data) พารามเิ ตอร 1. address คอื ตำแหนงท่ีอยูของหนว ยความจำอีอพี รอมที่ตองการใชส ำหรบั เขียนขอมูล 2. data คือ คา ขอมลู ที่ตอ งการเขยี นลงหนวยความจำออี ีพรอม 6. ฟงกช นั EEPROM.get() ฟงกชนั EEPROM.get() เปน ฟง กชันท่ีใชส ำหรบั อา นขอมลู จากหนว ยความจำอีอีพรอม โดย ขอมลู ที่ถูกอานสามารถมีขนาดท่ใี หญก วา 1 ไบต หรือเปนออปเจ็คได รูปแบบ EEPROM.get(address, data)

389 พารามเิ ตอร 1. address คอื ตำแหนงท่อี ยูของหนว ยความจำออี พี รอมท่ตี องการใชส ำหรับอา นขอมูล 2. data คือ คาขอมูลที่ตองการอานจากหนวยความจำอีอีพรอมและเก็บผลลัพธไวที่คา ดังกลา วนี้ อยา งไรก็ตามเน่ืองหนวยความจำอีอีพรอมในแตละตำแหนงจะเก็บขอมูลขนาดไมเกิน 1 ไบต หากเขยี นขอมูลชุดแรกลงหนวยความจำตำแหนง ใดๆ จำเปนตอ งคำนวณตำแหนง หนวยความจำถัดไป ทีว่ า งและสามารถนำมาใชสำหรบั เกบ็ ขอมลู ชุดท่สี องหรอื ชดุ อื่นๆ ถัดไปได โดยใชฟ ง กช นั ชอ่ื typeof() ซงึ่ เปน ฟงกช นั ทใ่ี หผลลัพธเปน ขนาดของตัวแปร 1 ตัวแปรทใ่ี ชเปนคาพารามิเตอรร ปู แบบเปนดงั น้ี รปู แบบ sizeof(variable) พารามเิ ตอร 1. variable คือ ตวั แปรที่ตองการคำนวณหาขนาด ตัวอยา งท่ี 15.5 ทดสอบใชฟงกชัน EEPROM.put() และ EEPROM.get() การทำงาน: เกบ็ คา 2 คาไวใ นหนว ยความจำอีอีพรอมดงั น้ี 1. เก็บขอมลู จำนวนจริงชนดิ float ดังน้ี x = 415.10 2. เกบ็ อักขระแบบอารเ รยช นดิ char ดงั นี้ y[] = “Hello” ซึ่งจากทั้งสองคาสังเกตไดวามีขนาดเกิน 255 ดังนั้นแตละคาจึงไมสามารถเก็บไวใน หนวยความจำอีอีพรอมเพียง 1 ตำแหนงได ดังนั้นการเก็บขอมูลคาที่ 2 จึงจำเปนตองคำนวณคา ตำแหนง ถดั ไปท่ีใชส ำหรบั เก็บขอ มลู โดยใชฟ ง กชัน sizeof() พจิ ารณาไดจ ากโปรแกรม วิธีทำ 1. สวนวงจรทดลอง เชื่อมตออุปกรณภายนอก เขา กบั บอรด Arduino ดังตวั อยางที่ 15.1 2. สวนโปรแกรม #include <EEPROM.h> void setup() {

390 Serial.begin(9600 ; float x = 415.1; char y[] = \"Hello\"; EEPROM.put(0, x); EEPROM.put(sizeof(x), y); EEPROM.get(0, x); EEPROM.get(sizeof(x), y); Serial.print(\"x = \"); Serial.println(x); Serial.print(\"y = \"); Serial.println(y); } void loop() {} คำอธิบาย: ฟงกชัน Setup(): ประกาศตัวแปรชื่อ x ที่มีชนิดขอมูลเปนจำนวนจริงแบบ float และตัว แปรอารเ รยช่ือ y ท่มี ีชนิดขอ มูลเปน อกั ขระ โดยเกบ็ x ไวในตำแหนงที่ 0 ของหนวยความจำอีอีพรอม จากนั้นเก็บ y ไวในตำแหนงถัดไปของหนวยความจำอีอีพรอม โดยตำแหนงที่ใชเก็บ y สามารถทำได โดยใชคำสั่ง sizeof(x) และขั้นตอนสุดทายทดสอบอานทั้งสองคามาแสดงผลลัพธผาน Virtual Terminal ฟง กชัน loop(): - 3. ผลการทดลอง รูปที่ 15.8 ผลการทดลองการเขยี น - อานขอมูลนหนวยความจำอีอพี รอมดว ยฟงกชัน EEPROM.put() และ EEPROM.get() ทม่ี า: ผเู ขยี น

391 จากรูปที่ 15.8 แสดงผลการทดลองการอานเขียนขอมูลในหนวยความจำอีอีพรอมดวย ฟงกชัน EEPROM.put() และ EEPROM.get() ซึ่งพบวาสามารถเขาถึงตำแหนงหนวยความจำเพื่อ เขียน และอา นขอมูลท้ังสองชดุ ไดอ ยา งถูกตอง 7. บทสรปุ อีอีพรอม คือหนวยความจำชนิดหน่ึงที่สามารถอาน เขียน ลบ และแกไขขอมูลที่ถูกเกบ็ ไวใน ตำแหนงตางๆ ภายในหนวยความจำไดโดยใชสัญญาณไฟฟาสำหรับจัดการขอมูล สำหรับพื้นที่การ จัดเก็บขอมูลหนวยความจำอีอีพรอมคอื 1 กิโลไบต จุดเดนของหนวยความจำอีอีพรอมคือขอมูลทีถ่ กู เก็บไวจะยังคงอยูถึงแมวาจะหยุดจายไฟเลี้ยง ดังนั้นการเขียนขอมูลลงหนวยความจำอีอีพรอมจึง เปรยี บเสมอื นการบันทกึ ขอมูล อยางไรกต็ ามการนำหนวยความจำอีอีพรอมมาใชส ำหรับการอาน และ การเขยี นขอมูลจะสามารถดำเนินการไดท้ังหมดอยูท่ีประมาณ 1 แสนครัง้ โปรแกรม Arduino IDE มี ฟงกชันที่สำคัญสำหรับจัดการหนวยความจำอีอีพรอม ดังนี้ ฟงกชัน EEPROM.write() เปนฟงกชันที่ ใชสำหรับเขียนขอมูลที่มีขนาดไมเกิน 1 ไบต (0 – 255 ไปยังตำแหนงหนึ่งของหนวยความจำ อีอีพรอม ฟงกชัน EEPROM.read() เปนฟงกชันที่ใชสำหรับอานขอมูลที่มีขนาดไมเกิน 1 ไบต (0 – 255 จากตำแหนง หนึ่งของหนวยความจำอีอีพรอม ฟงกชัน EEPROM.update() เปนฟงกชันที่ใช สำหรับเขียนขอมูลทีม่ ีขนาดไมเกิน 1 ไบต (0 – 255 ไปยังตำแหนงหนึ่งของหนวยความจำอีอีพรอม โดย EEPROM.update() จะเกิดการเขยี นขอมูลก็ตอเมื่อขอ มูลใหมตางจากคา ขอ มูลเดิมท่ีบรรจอุ ยูใน ตำแหนงเดียวกันจึงเปรียบเสมือนการแกไขขอมูล ฟงกชัน EEPROM.put() เปนฟงกชันที่ใชสำหรับ เขียนขอมูลลงหนวยความจำอีอีพรอม โดยขอมูลที่ถูกเขียนลงสามารถมีขนาดที่ใหญกวา 1 ไบต และ ฟง กช นั EEPROM.get() เปนฟง กชันทีใ่ ชส ำหรับอา นขอมูลจากหนว ยความจำอีอีพรอม โดยขอมูลที่ถูก อานสามารถมขี นาดทใี่ หญกวา 1 ไบต หรือเปนออปเจค็ ได

392 แบบฝก หดั ทา ยบท บทที่ 15 1. หนวยความออี พี รอมคอื อะไร 2. หนว ยความออี พี รอมมีพืน้ ที่สำหรบั จดั เกบ็ ขอ มลู อยทู เ่ี ทา ใด 3. จุดเดนของหนว ยความจำอีอพี รอมคอื อะไร 4. หนว ยความจำอีอพี รอมสามารถถกู อาน เขียนไดประมาณก่ีคร้งั 5. ฟง กช นั ท่ใี ชส ำหรับอานขอมลู จากหนว ยความจำอีอีพรอมมชี ื่อวา อะไร 6. คาสูงสดุ ทีฟ่ งกชนั EEPROM.write() สามารถเขียนขอมลู ลงหนวยความจำออี พี รอมไดค ือเทาใด 7. ความแตกตางระหวางฟงกชัน EEPROM.write() และ EEPROM.put() คืออะไร 8. จากโปรแกรมที่กำหนดใหจงหาผลลัพธสุดทายของ z (คำนวณเอง โดยหามนำโปรแกรมไป ประมวลผล) #include <EEPROM.h> byte x; byte y; byte z; void setup() { Serial.begin(9600); EEPROM.write(0, 21); EEPROM.write(1, 14); x = EEPROM.read(0); y = EEPROM.read(1); z = x + y; EEPROM.write(1, z); x = EEPROM.read(1); Serial.println(x); } void loop() { }

393 เอกสารอา งองิ กอบเกียรติ สระอุบล. (2561). พัฒนา IoT บนแฟรตฟอรม Arduino และ Raspberry Pi. กรุงเทพฯ: หสม สำนักพิมพ อินเตอรมเี ดยี . ประภาส พุมพวง. (2561). การเขียนและการประยุกตใชงานโปรแกรม Arduino. กรุงเทพฯ: ซีเอ็ด ยูเคชั่น. Bell, C. (2016). MySQL for the Internet of Things. United States: Apress. Nandanwar, V.G., Kashif, M.M. and Ankushe, R.S. (2017). Portable Weight Measuring Instrument. Proceedings of the International Conference on Recent Trends in Electrical, Electronics and Computing Technologies, July 30-31 2017. (pp. 44 – 48). India: IEEE.

แผนบรหิ ารการสอนประจำบทที่ 16 การสรา งไลบรารสี ำหรบั โปรแกรม Arduino IDE หวั ขอเนือ้ หา 1. ไฟลส ว นหัว 2. ไฟลห ลัก 3. การสรา งไลบรารี 4. การสรางไลบรารสี ำหรบั แอลอดี ี 7 สวน 5. บทสรุป แบบฝก หัด เอกสารอา งองิ วัตถปุ ระสงคเ ชิงพฤติกรรม เมอื่ ผเู รียน เรยี นจบบทนแ้ี ลว ผเู รยี นควรมคี วามสามารถ ดังนี้ 1. อธบิ ายเกยี่ วกับการสรางไลบรารีข้ึนใชง านเองได 2. อธิบายเก่ียวกับการสรางไฟลสว นหัวสำหรบั ไลบรารีได 3. อธบิ ายเก่ยี วกบั การสรางไฟลหลักสำหรับไลบรารไี ด 4. เขยี นโปรแกรมเพือ่ สรา งไลบรารีขึน้ ใชงานเอง และทดลองเรียกใชง าน 5. มีความต้งั ใจในการเรยี นและการฝก ปฏบิ ัติการเขียนโปรแกรม วิธีการสอนและกิจกรรมการเรยี นการสอนประจำบท 1. บรรยายเนอื้ หาในแตล ะหัวขอ พรอมยกตัวอยางประกอบ โดยใชเ อกสารคำสอน และสื่อ power point 2. ทดลองปฏิบัติจริง โดยการสรางไลบรารีสำหรับโปรแกรม Arduino IDE และทดสอบ เรียกใชง านผานฟงกช นั setup() หรือ loop() 3. ผสู อนสรปุ เนอ้ื หา 4. ทำแบบฝก หัดเพ่ือทบทวนบทเรยี น 5. เปดโอกาสใหผเู รยี นถามขอสงสยั 6. ผสู อนทำการซักถาม

396 สอ่ื การเรยี นการสอน 1. เอกสารคำสอนวิชาการประยุกตใ ชง านไมโครคอนโทรลเลอร 2. ส่อื power point การวัดผลและการประเมิน 1. การเขา เรียนตรงตอเวลา และการแตงกาย 2. ความรวมมอื และความรบั ผดิ ชอบตอ การเรยี น 3. การถาม-ตอบ 4. การสง งานที่ไดรับมอบหมายภายในเวลาทก่ี ำหนด 5. การทำแบบฝกหดั ทม่ี ีความถูกตอ งไมนอ ยกวา 80%

บทที่ 16 การสรางไลบรารสี ำหรับโปรแกรม Arduino IDE ในบทนี้จะกลาวถึงวิธีการสรางไลบรารีอยางงายสำหรับโปรแกรม Arduino IDE ขอดีของการ สรางไลบรารีคือชวยประหยัดเวลาในการพัฒนาโปรแกรมทั้งสำหรับผูพัฒนา (กอบเกียรติ สระอุบล, 2561) และผใู ชงานท่ีนำไลบรารไี ปใชงาน โดยการสรา งไลบรารจี ำเปน ตองมไี ฟลหลกั อยา งนอ ย 2 ไฟล คอื ไฟลส ว นหวั (Header File และไฟลหลัก 1. ไฟลสว นหัว ไฟลสวนหัวคือ ไฟลที่มีนามสกุล .h คือไฟลที่ใชเก็บขอมูลตวั แปร และฟงกชันทั้งหมดที่มีอยู ในไฟลหลัก (เดชฤทธิ์ มณีธรรม, 2559) โดยจะเปนเพียงการประกาศชื่อตัวแปร และชื่อฟงกชันเพียง เทานนั้ โดยคาตัวแปร หรอื การทำงานภายในฟง กช นั จะถกู สรา งไวภายในไฟลห ลักท้ังหมด โดยรปู แบบการสรา งไฟลสว นหวั เปน ดงั ตารางท่ี 16.1 ตารางท่ี 16.1 โครงสรางไฟลสวนหัว 1 #ifndef (ชื่อไฟลส วนหวั )_h 2 #define (ชื่อไฟลส วนหวั )_h 3 #include \"Arduino.h\" 4 /* 5 พน้ื ที่เขยี นการโปรแกรม 6 */ 7 #endif จากตารางที่ 16.1 การเขียนโปรแกรมประกอบดวยกำหนดชื่อตัวแปร และฟงกชันทั้งหมดท่ี ถูกใชงานภายในพื้นที่การเขียนโปรแกรม อยางไรก็ตามภายนอกพื้นที่การเขียนโปรแกรมมีคำสั่งท่ี สำคัญที่อยูบรรทัดที่ 1, 2 และ 7 ซึ่งเปนคำสั่งที่มีไวสำหรับตรวจสอบชื่อไลบรารซี ้ำหรือไม เนื่องจาก หากชื่อไลบรารีที่สรางขึ้นใหมมีอยูแลวโปรแกรมจะไมทำงานตามคำสั่งภายในไลบรารีที่สรางขึ้นใหม โดยอธิบายการทำงานแตละบรรทัดดงั นี้

398 บรรทดั ที่ 1: ตรวจสอบวา ชอ่ื ไลบรารถี ูกกำหนดไวแลว หรือไมซ ่ึงกรณีที่ยังไมมีการกำหนดชื่อ ไฟลด ังกลาว เง่ือนไขเปน จรงิ จึงทำงานในบรรทดั ถดั ไป บรรทัดท่ี 2: กำหนดใหสรางไลบรารไี วสำหรับการเรียกใชง าน บรรทัดที่ 3: เรียกใชงานไลบรารีของ Arduino โดยการสรางไลบรารีสำหรับโปรแกรม Arduino IDE จะตองมีการเรยี กใชไ ลบรารดี งั กลา วเสมอ บรรทัดท่ี 7: ส้นิ สดุ คำสั่งเงือ่ นไขบรรทัดท่ี 1 รูปที่ 16.1 แสดงตัวอยางการสรางไฟลสวนหัวชื่อ “ledblink.h” ซึ่งมีการประกาศฟงกชัน สำหรบั ใชง าน 2 ฟงกช ันคือ ฟง กช ัน LEDBlinK( และ ฟงกชัน LEDBlink2Times() โดยทัง้ 2 ฟงกชัน มกี ารรบั พารามิเตอรจำนวน 2 คา คอื pin สำหรับแทนตำแหนง ขาของบอรด Arduino และ mstime แทนการหนวงเวลาในหนวยมลิ ลวิ ินาที #ifndef ledblink_h #define ledblink_h #include \"Arduino.h\" void LEDBlink(int pin, int mstime); void LEDBlink2Times(int pin, int mstime); #endif รปู ท่ี 16.1 ตัวอยางการสรางไฟลสว นหวั ชอ่ื “ledblink.h” ท่มี า: ผูเขียน 2. ไฟลห ลัก ไฟลหลักสำหรับการสรางไลบรารีคือไฟลทีเ่ ก็บคาตัวแปร และคำสั่งทั้งหมดของตัวแปร และ ฟงกชันทั้งหมดที่ถูกประกาศภายในไฟลสวนหัว โดยจะมีนามสกุลเปน “.cpp” โดยรูปแบบการสราง ไฟลห ลกั เปน ดงั ตารางที่ 16.2

399 ตารางที่ 16.2 โครงสรางไฟลหลกั 1 #include \"Arduino.h\" 2 #include \"ชอ่ื ไฟลส วนหัว.h\" 3 /* 4 พน้ื ท่ีเขยี นการโปรแกรม 5 */ จากตารางที่ 16.2 การเขียนโปรแกรมประกอบดวยกำหนดตัวแปร และคำสั่งภายในฟงกชนั ทั้งหมดทถี่ กู ประกาศไวท ี่ไฟลส ว นหวั อยูภ ายในพืน้ ทีก่ ารเขยี นโปรแกรม #include \"Arduino.h\" #include \"ledblink.h\" void LEDBlink(int pin, int mstime){ digitalWrite(pin, HIGH); delay(mstime); digitalWrite(pin, LOW); delay(mstime); }void LEDBlink2Times(int pin, int mstime){ digitalWrite(pin, HIGH); delay(mstime); digitalWrite(pin, LOW); delay(mstime); digitalWrite(pin, HIGH); delay(mstime); digitalWrite(pin, LOW); delay(mstime); } รูปที่ 16.2 ตวั อยางการสรางไฟลห ลักชือ่ “ledblink.cpp” ท่มี า: ผูเขยี น

400 รูปที่ 16.2 แสดงตัวอยางการสรางไฟลหลักชื่อ “ledblink.cpp” ซึ่งบรรจุชุดคำสั่งภายใน ฟงกช นั ท้ังหมดท่ีประกาศไวท่ีไฟลสว นหวั โดยมีรายละเอยี ดดงั น้ี ฟงกชัน LEDBlink() : แสดงการสลับสถานะของ pin จำนวน 1 รอบโดยกำหนดการหนวง เวลาการของเปล่ยี นสถานะในแตละชว งเปน mstime มิลลิวนิ าที ฟงกชัน LEDBlink2Times() : แสดงการสลบั สถานะของ pin จำนวน 2 รอบโดยกำหนดการ หนวงเวลาการของเปล่ียนสถานะในแตล ะชว งเปน mstime มิลลิวินาที 3. วิธีการสรางไลบรารี หัวขอนี้จะกลาวถึงขั้นตอนการสรางไลบรารีสำหรับใชงาน โดยตัวอยางประกอบการใชงาน ประกอบดว ย 2 ไฟลคอื ไฟลสว นหัวและไฟลหลักจากหัวขอท่ี 16.1 (ledblink.h) และจากหวั ขอ 16.2 (ledblink.cpp ตามลำดับ โดยมขี น้ั ตอนการดำเนินการเปน ดงั นี้ ลำดับที่ 1: สรางโฟลเดอรขึ้นมาใหม โดยจากตัวอยางตั้งชื่อโฟลเดอรเปน “myArduino_Library”และนำไฟล “ledblink.h” และ “ledblink.cpp” บรรจุไวในโฟลเดอร ดังกลา ว ลำดับท่ี 2: นำโฟลเดอรด ังกลาวน้ีไปเก็บไวท ี่ “arduino\\libraries” รปู ที่ 16.3 การนำโฟลเดอรเ กบ็ ไลบรารที ่สี รางใหมเ ก็บไวท ี่ “arduino\\libraries” ทีม่ า: ผเู ขียน

401 ลำดับที่ 3: เพิ่มไฟลไปยัง Arduino IDE เปดโปรแกรม Arduino IDE เลือก Sketch -> Add file -> ledblink และเมื่อสังเกตที่ Sketch -> Include Libraly จะพบไลบรารีช่ือ “myArduino_Library” ซง่ึ คอื ไลบรารีทสี รางขึน้ ใหม รูปที่ 16.4 ไลบรารีท่ีสรา งข้ึนใหม ทมี่ า: ผเู ขียน ลำดับที่ 4: กรณีที่ผูใชงานตองการใชงานไลบรารีดังกลาว ใหเขาในสวนของ editor ไดโดย เลือกที่ Sketch -> Include Library -> myArduino_Library ซึ่งจะมีการประกาศไฟลสวนหัว (Header File) ของไลบรารดี ังกลาวที่สวนบนสุดของโปรแกรม (สนธยา นงนุช, 2560) รูปที่ 16.5 การประกาศไฟลส วนหวั สำหรบั เรียกใชงาน ไลบรารที ีส่ รางขึ้นใหม ทม่ี า: ผูเขยี น

402 หลังจากนั้นสามารถเรียกใชฟงกชันทั้งหมดภายในไลบรารี ledblink ซึ่งประกอบดวย LEDBlink() และ LEDBlink2Times() ไดท ง้ั ผานฟงกช นั setup() และ loop() ตัวอยางที่ 16.1 ตัวอยางการสงั่ การทำงานของหลอดแอลอีดี 1 หลอดใหเกดิ การกระพริบ 1 ครั้ง การทำงาน: หลอดแอลอีดีจะแสดงสถานะของการ “ติด” และ “ดับ” เพียง 1 ครั้งผานการเรียกใช งานไลบรารี “myArduino_Library” วิธีทำ 1. สวนวงจรทดลอง รูปที่ 16.6 วงจรทดลองการไฟกระพริบของจากหลอดแอลอดี ี 1 หลอด ผา นการเรียกใชไ ลบรารี “myArduino_Library” ที่มา: ผเู ขียน คำอธิบาย: ตอ หลอดแอลอดี เี ขากับตำแหนงขาที่ 3 ของบอรด Arduino โดยจากภาพหากกำหนดใหมี สถานะ “HIGH” ออกจากขา 3 เพื่อทำใหหลอดแอลอีดีมีสถานะ “ติด” แตหากกำหนดใหมีสถานะ “LOW” ออกจากตำแหนงขา 3 ดงั กลาวสงผลใหห ลอดแอลอีดมี สี ถานะ “ดับ” 2. สวนโปรแกรม #include <ledblink.h> int pin = 3; void setup() { pinMode(pin,OUTPUT); LEDBlink(pin, 1000); }

403 void loop() {} คำอธิบาย: สวนบนสุดของโปรแกรมมีการประกาศใชงานไลบรารี “myArduino_Library” ผานชื่อ ไฟลสวนหัว คือ “ledblink.h” และกำหนดตัวแปรภายนอกฟงกชัน pin สำหรับอางอิงตำแหนงขาที่ เช่อื มตอกับหลอดแอลอดี :ี โดยจากตัวอยางคอื เช่ือมตอแอลอีดีกบั ตำแหนง ขา 3 ของบอรด Arduino ฟงกชนั Setup():กำหนดใหต ำแหนง ขาท่ี 3 ของบอรด Arduino ทำหนาท่เี ปน เอาตพตุ และ เรียกใชงานฟงกชัน LEDBlink() เพื่อแสดงสถานะของการ “ติด” และ “ดับ” ของหลอดแอลอีดีเพียง 1 คร้ังโดยกำหนดชว งการหนวงเวลาเปน 1 วินาที ฟงกช นั loop(): - หมายเหตุ: 1) หากเรียกใชฟงกชัน LEDBlink() ภายในฟงกชัน loop( จะไมสามารถสังเกตเห็นการ กระพริบเพียง 1 ครั้งจากหลอดแอลอีดี แตจะเกิดการกระพริบแบบไมมีที่สิ้นสุด เนื่องจากฟงกชัน loop() จะวนรอบการทำงานไมมีที่สน้ิ สดุ 2) หากตองการเปลี่ยนเปนการควบคุมใหหลอดแอลอีดีเกิดการกระพริบ 2 ครั้งสามารถ ทำไดโดยการเปลี่ยนฟงกช นั LEDBlink() เปน ฟง กชนั LEDBlink2Times() 4. การสรา งไลบรารีสำหรบั แอลอดี แี บบ 7 สวน หัวขอนี้จะกลาวถึงตัวอยางการสรางไลบรารีสำหรับควบคุมการทำงานแอลอีดีแบบ 7 สวน โดยภายในไลบรารปี ระกอบดวย 2 ไฟล คือไฟลสว นหวั “seg7.h” และไฟลหลัก “seg7.cpp” #ifndef seg7_h #define seg7_h #include \"Arduino.h\" void AssignpinMode(int pin_a, int pin_b, int pin_c, int pin_d, int pin_e, int pin_f, int pin_g); void showOutput(int pin_a, int pin_b, int pin_c, int pin_d, int pin_e, int pin_f, int pin_g, boolean a, boolean b, boolean c, boolean d, boolean e, boolean f, boolean g); #endif รปู ที่ 16.7 ตัวอยางการสรา งไฟลสว นหวั ช่ือ “seg7.h” ทีม่ า: ผเู ขียน

404 รูปที่ 16.7 แสดงตวั อยางการสรางไฟลสวนหวั ชื่อ “seg7.h” ซ่ึงมกี ารประกาศฟงกชันสำหรับ ใชงาน 2 ฟง กชันคือ ดงั น้ี 1. ฟงกชัน AssignpinMode( คือฟงกชันสำหรับกำหนดโหมดการทำงานตำแหนงขาทั้ง 7 ขาของบอรด Arduino เปนสถานะของเอาตพุตทั้งหมดโดยพารามิเตอรทั้ง 7 คาจะถูกเชื่อมตอกับ ตำแหนงขาของแอลอีดี 7 สวนเปนดงั ตารางท่ี 16.3 ตารางท่ี 16.3 ความสัมพันธระหวางคา พารามิเตอรสำหรบั ฟงกช ัน AssignpinMode( และตำแหนง ขาท่ีเช่อื มตอ กับแอลอีดี 7 สว น พารามเิ ตอร ตำแหนงขาแอลอีดี 7 สวน pin_a a pin_b b pin_c c pin_d d pin_e e pin_f f pin_g g 2. ฟงกชัน showOutput( คือฟงกชันสำหรับกำหนดสถานะของการทำงานตำแหนงขาทั้ง 7 ขาของบอรด Arduino ที่เชื่อมกับแอลอีดี 7 สวน โดยพารามิเตอรที่ 8 – 14 แทนสถานะของ พารามิเตอรที่ 1 – 7 ตามลำดับโดยกรณีที่พารามิเตอรสำหรับแสดงสถานะมีคาเปน ‘1’ ความหมาย คือแทนสถานะ “HIGH” แตหากพารามิเตอรสำหรับการแสดงสถานะมีคาเปน ‘0’ ความหมายคือ แทนสถานะ “LOW” ตัวอยา งการสรา งไฟลห ลกั ชื่อ “seg7.cpp” #include \"Arduino.h\" #include \"seg7.h\" void AssignpinMode(int pin_a, int pin_b, int pin_c, int pin_d, int pin_e, int pin_f, int pin_g){ pinMode(pin_a, OUTPUT); pinMode(pin_b, OUTPUT);

405 pinMode(pin_c, OUTPUT); pinMode(pin_d, OUTPUT); pinMode(pin_e, OUTPUT); pinMode(pin_f, OUTPUT); pinMode(pin_g, OUTPUT); } void showOutput(int pin_a, int pin_b, int pin_c, int pin_d, int pin_e, int pin_f, int pin_g, boolean a, boolean b, boolean c, boolean d, boolean e, boolean f, boolean g){ if(a == 1){ digitalWrite(pin_a, HIGH); } else{ digitalWrite(pin_a, LOW); } if(b == 1){ digitalWrite(pin_b, HIGH); } else{ digitalWrite(pin_b, LOW); } if(c == 1){ digitalWrite(pin_c, HIGH); } else{ digitalWrite(pin_c, LOW); } if(d == 1){ digitalWrite(pin_d, HIGH); } else{ digitalWrite(pin_d, LOW); } if(e == 1){ digitalWrite(pin_e, HIGH); }

406 else{ digitalWrite(pin_e, LOW); } if(f == 1){ digitalWrite(pin_f, HIGH); } else{ digitalWrite(pin_f, LOW); } if(g == 1){ digitalWrite(pin_g, HIGH); } else{ digitalWrite(pin_g, LOW); } } โปรแกรมขางตนแสดงตัวอยางการสรางไฟลหลักชื่อ “seg7.cpp” ซึ่งมีการบรรจุคำสั่ง ทั้งหมดไวภายในฟงกชันที่ประกาศไวในไฟลสวนหัว โดยภายในฟงกชัน showOutput() จะมีการ ตรวจสอบคาของพารามิเตอร สำหรับแสดงสถานะ คือหากพารามิเตอรมีคาเปน ‘1’ จะแสดงสถานะ “HIGH” ที่ตำแหนงขาที่สัมพันธกันผานฟงกชัน digitalWrite() ในทางกลับกันหากพารามิเตอรมีคา เปน ‘0’ จะแสดงสถานะ “LOW” ท่ตี ำแหนงขาที่สัมพันธก ันผา นฟงกช นั digitalWrite() ตวั อยา งท่ี16.2 โปรแกรมควบคุมแอลอีดี 7 สวนแบบคอมมอนแคโทดเพื่อแสดงผลเปนตัวเลข 1 การทำงาน: หลอดแอลอดี ี 7 สว นจะแสดงผลออกเปนเลข 1 วิธที ำ 1. สวนวงจรทดลอง

407 รปู ท่ี 16.8 วงจรทดลองหลอดแอลอีดี 7 สวนแบบคอมมอนแคโทด แสดงผลเปนตวั เลข 1 ควบคุมผานไลบรารี “Seg7” ทม่ี า: ผูเขียน คำอธิบาย: ตอ หลอดแอลอีดี 7 สวนเขากับวงจรทดลองโดยตำแหนง a, b, c,…,g ของหลอดแอลอีดี 7 สว นถูกตอเขา กบั ขาที่ 0 – 6 ตามลำดับ 2. สว นโปรแกรม #include <seg7.h> int pin_a = 0; int pin_b = 1; int pin_c = 2; int pin_d = 3; int pin_e = 4; int pin_f = 5; int pin_g = 6; void setup() { AssignpinMode(pin_a, pin_b, pin_c, pin_d, pin_e, pin_f, pin_g); showOutput(pin_a, pin_b, pin_c, pin_d, pin_e, pin_f, pin_g, 0, 1, 1, 0 ,0, 0, 0); } void loop() { }

408 คำอธิบาย: สวนบนสุดของโปรแกรมมีการประกาศใชงานไลบรารี “Seg7” ผานชื่อไฟลสวนหัว คือ “seg7.h” และกำหนดตัวแปรภายนอกฟงกชัน 7 ตัวแปรคือ pin_a, pin_b, pin_c, pin_d, pin_e, pin_f และ pin_g สำหรับอางอิงตำแหนงขาที่เชื่อมตอกับแอลอีดีแบบ 7 สวนโดยจากตัวอยางคือ เชื่อมตอ ผา นตำแหนงขา 0 – 6 ตามลำดับ ฟงกชัน Setup(): เรียกใชงานฟงกชัน AssignpinMode() เพื่อกำหนดโหมดการทำงาน ตำแหนง ขาของบอรด Arduino ที่เชื่อมตอกับแอลอดี ี 7 สวนเปนโหมดสงออกสัญญาณทั้งหมด และ เรียกใชฟ ง กชัน showOutput() เพือ่ ควบคุมการแสดงผลผา นแอลอดี ี 7 สวน ฟง กชนั loop(): - 5. บทสรุป การสรางไลบรารีเพื่อใชงานมีขอดีคือชวยประหยัดเวลาในการพัฒนาโปรแกรมทั้งสำหรับ ผูพัฒนา และผูใชงานที่นำไลบรารีไปใชงาน โดยการสรางไลบรารีจำเปนตองมีไฟลหลักอยางนอย 2 ไฟล คือไฟลส ว นหัว (Header File) และไฟลห ลกั ไฟลส ว นหัวคือ ไฟลท ม่ี ีนามสกุล .h คอื ไฟลท ่ใี ชเก็บ ขอมูลตัวแปร และฟงกชันทั้งหมดที่มีอยูในไฟลหลัก โดยจะเปนเพียงการประกาศชื่อตัวแปร และช่ือ ฟงกชันเพียงเทานั้น โดยคาตัวแปร หรือการทำงานภายในฟงกชันจะถูกสรางไวภายในไฟลหลัก ทั้งหมด สวนอีกไฟลที่สำคัญคือ ไฟลหลักซึ่งถูกสรางเพื่อใชสำหรับเก็บคาตัวแปร และคำสั่งทั้งหมด ของตวั แปร และฟง กชนั ท้ังหมดทถี่ ูกประกาศภายในไฟลส วนหวั โดยจะมนี ามสกลุ เปน “.cpp”

409 แบบฝกหัดทายบท บทท่ี 16 1. การสรา งไลบรารเี พอ่ื ใชงานเองมีประโยชนอ ยา งไร 2. การสรางไลบรารจี ำเปน ตอ งสรางไฟลทีส่ ำคญั ทงั้ หมดก่ีไฟลอะไรบา ง 3. ไฟลส ว นหัวคอื อะไร 4. จากไฟลหลักทก่ี ำหนดให จงสรา งไฟลส ว นหวั #include \"Arduino.h\" #include \"tt.h\" void test(){ // ชุดคำสั่ง } 5. ไฟลท้ังหมดของไลบรารีที่ถูกสรางข้นึ ใหมจ ะตองถูกนำไปเกบ็ ไวต ำแหนง ใดในโปรแกรม Arduino IDE

410 เอกสารอา งอิง กอบเกียรติ สระอุบล. (2561). พัฒนา IoT บนแฟรตฟอรม Arduino และ Raspberry Pi. กรุงเทพฯ: หสม สำนกั พิมพ อนิ เตอรม ีเดีย. เดชฤทธิ์ มณีธรรม. (2559). คัมภีรการใชงาน ไมโครคอนโทรลเลอร Arduino. กรุงเทพฯ: ซีเอ็ด ยูเคช่นั . สนธยา นงนุช. (2560). การใชงาน ESP32 เบื้องตน. ชลบุรี: รานไอโอเอ็กซฮอ บ.

บรรณานุกรม กอบเกียรติ สระอุบล. (2561). พัฒนา IoT บนแฟรตฟอรม Arduino และ Raspberry Pi. กรงุ เทพฯ: หสม สำนกั พมิ พ อินเตอรมเี ดยี . ดอนสัน ปงผาบ และ ทิพวัลย คำน้ำนอง. (2557). ไมโครคอนโทรลเลอร PIC และการประยุกตใช งาน. กรงุ เทพฯ: สำนกั พมิ พ ส.ส.ท. ดอนสัน ปงผาบ. (2560). ภาษาซแี ละ Arduino อานงาย เขาใจงา ย. กรงุ เทพฯ: ซีเอด็ ยเู คชั่น. เดชฤทธิ์ มณีธรรม. (2559). คัมภีรการใชงาน ไมโครคอนโทรลเลอร Arduino. กรุงเทพฯ: ซีเอ็ด ยูเคชั่น. เดชฤทธิ์ มณีธรรม. (2559). คัมภีรการใชงาน ไมโครคอนโทรลเลอร MCS51. กรุงเทพฯ: ซีเอ็ด ยูเคช่ัน. ทีมงานสมารทเลิรนนิ่ง. (2553). เรียนรูไมโครคอนโทรลเลอร PIC ดวยภาษา Basic. กรุงเทพฯ: สมารท เลริ นนง่ิ . ทีมงานสมารทเลิรนนิ่ง. (2554). Advanced PIC Microcontroller in C : การประยุกตใชงาน PIC ขัน้ สงู ดวยภาษา C. กรุงเทพฯ: สมารทเลิรนนิ่ง. ทีมงานสมารทเลิรนนิ่ง. (2555). เรียนรูไมโครคอนโทรลเลอร MCS-51 ดวยภาษา C. กรุงเทพฯ: สมารทเลิรน นง่ิ . ธวัชชยั เลื่อนฉวี และ อนรุ ักษ เถื่อนฉวี. (2527). ดจิ ิตอลเทคนิคเลม 1. กรุงเทพฯ: มติ รนราการพมิ พ. นพ มหิษานนท. (2557 . ออกแบบและทดสอบวงจรดวย Proteus. กรุงเทพฯ: คอรฟ งชั่น. ประจิน พลังสันติกุล. (2549). การเขียนโปรแกรมควบคุมไมโครคอนโทรลเลอร AVR ดวยภาษาซี กบั WinAVR (C Compiler) กรุงเทพฯ: บรษิ ทั แอพซอฟตเทค จำกัด. ประจิน พลังสันติกุล. (2553). เรียนรูการเขียนโปรแกรมภาษา C ควบคุม PIC MCU จากตัวอยาง และโคดภาษา C ดวย CSS C คอมไพเลอร. กรงุ เทพฯ: บรษิ ทั แอพซอฟตเทค จำกัด. ประภาส พุมพวง. (2561). การเขียนและการประยุกตใชงานโปรแกรม Arduino. กรุงเทพฯ: ซีเอ็ด ยูเคชัน่ . มงคล ลี้ประกอบบุญ. (2549). ไมโครคอนโทรลเลอร 8051 และการประยุกตใช. ขอนแกน: หนวย สารบรรณ งานบริหารและธุรการ คณะวิศวกรรมศาสตร มหาวิทยาลยั ขอนแกน.

412 วิลาศิณี วิสิทธ์ิกาศ วรพจน กรแกววัฒนกลุ และ ชัยวัฒน ลม้ิ พรจติ รวไิ ล. (2551). ทดลองและใชงาน ไมโครคอนโทรลเลอร ATmega128 ดวยโปรแกรมภาษา C กับซอฟตแวร Wiring. กรงุ เทพฯ : อนิ โนเวตีฟ เอ็กพอรเิ มนต. สนธยา นงนุช. (2560). การใชง าน ESP32 เบ้ืองตน . ชลบุรี: รานไอโอเอก็ ซฮ อ บ. อภชิ าติ ภพู ลบั . (2552). เขยี นโปรแกรมควบคุม Microcontroller ดว ยภาษา C, Assembly และ VB. กรุงเทพฯ: บริษทั ไอดซี ี อินโฟ ดิสทรบิ ิวเตอร เซน็ เตอร จำกัด. อลงกรณ พรมที. (2551). อุปกรณที่ยึดอยูบนผิวและการใชงานไมโครคอนโทรลเลอร. อุดรธานี: มหาวทิ ยาลัยราชภัฏอดุ รธาน.ี เอกชัย มะการ. (2552). เรียนรู เขาใจ ใชงาน ไมโครคอนโทรลเลอรตระกูล AVR ดวย Arduino. กรงุ เทพฯ: บริษทั อีทที ี จำกัด. Adith, J. B. (2015). Arduino by Example. Birmingham: Packt Publishing Ltd. Barrett, S.F. (2013). Arduino Microcontroller Processing for Everyone!. United States: Morgan & Claypool Publishers. Bell, C. (2016). MySQL for the Internet of Things. United States: Apress. Borowik, B. (2011). Interfacing PIC Microcontrollers to Peripherial Devices. United States: Springer Dordrecht. Davis II, R.J. (2013). Arduino LCD Projects. United States: CreateSpace Independent Publishing Platform. Don, W. (2015). Arduino Electronics Blueprints. Birmingham: Packt Publishing Ltd. Jeremy, B. (2013). Exploring Arduino: Tools and Techniques for Engineering Wizardry. Indianapolis: John Wiley & Sons, Inc. Jestop, C., Marimuthu, B. and Chithra, K. (2017). Ultrasonic water level indicator and controller using AVR microcontroller. Proceedings of the International Conference on Information Communication and Embedded Systems, Febuary 23-24 2017. (pp. 1 – 6). China: IEEE. John, D. W., Josh, A. and Harald, M. (2011). Arduino Robotics. New York: Apress Open. Margolis, M. (2011). Arduino Cookbook. United States: O’Reilly Media, Inc. Nandanwar, V.G., Kashif, M.M. and Ankushe, R.S. (2017). Portable Weight Measuring Instrument. Proceedings of the International Conference on Recent Trends in Electrical, Electronics and Computing Technologies, July 30-31 2017. (pp. 44 – 48). India: IEEE.

413 Omar, J., Shahnawaz, K. and Zainulabideen. (2012). PC BASED WIRELESS STEPPERMOTOR CONTROL. Degree of Bachelor of Science in Electrical Engineering, Department of Electrical Engineering, Blekinge Institute of Technology, Karlskrona, Sweden. Tero, K. and Kimmo, K. (2011). Make: Arduino Bots and Gadgets. Canada: O’Reilly Media, Inc. Tero, K., Kimmo, K. and Ville, V. (2014). Make: Sensors. Canada: Maker Media. Inc. Wilmshutst, T. (2007). Designing Embeded Systems with PIC Microcontrollers Principles and Application. United Kingdom: Newnes.

ภาคผนวก



ภาคผนวก ก ใบงาน





ใบงานท่ี 1 เร่อื ง การควบคมุ หลอดแอลอีดี วิชา ไมโครคอนโทรลเลอรและการประยุกตใ ชงาน ชือ่ – สกลุ …………………………………………… รหัสนักศึกษา……………………………………………….. ชอ่ื – สกุล ………………………………………….. ช่อื – สกลุ ………………………………………….. รหสั นักศกึ ษา……………………………………………….. รหัสนักศกึ ษา……………………………………………….. วตั ถุประสงค เพอ่ื ใหผูเรยี นมีความรแู ละทักษะดังนี้ 1. เพือ่ เรยี นรตู ำแหนง ขาบนบอรด Arduino Uno R3 ทีส่ ามารถเช่ือมตอกับหลอดแอลอีได 2. เพ่ือเรยี นรูการเขยี นโปรแกรมโดยใช Arduino IDE เพื่อควบคมุ หลอดแอลอดี ี 3. เพอ่ื ใชโปรแกรม Proteus ในการจำลองพฤติกรรมการทำงานของวงจรทดลอง ทฤษฎี แอลอีดี (Light Emitting Diode: LED คือไดโอดเปลงแสงซึ่งปจจุบันมีใหเลือกใชงาน หลากหลายสีโดยใชไ ฟเล้ยี งประมาณ 5 โวลตโ ดยจะตอ งตอ ไฟเลยี้ ง ทข่ี ้วั แอโนด และท่ีขัว้ แคโทดจะถูก ตอลงกราวด การตอแอลอีดีกับบอรด Arduino Uno R3 จะตองตอเขากับตำแหนงขาที่รับสัญญาณแบบ ดิจิทัลที่อยูบนบอรด ซึ่งโดยทั่วไปจะนิยมตอใชงานอยูระหวางตำแหนงที่ 0 – 7 อยางไรก็ตาม เนื่องจากแอลอีดีเปนอุปกรณประเภทรอรับสัญญาณจากบอรด ดังนั้นจึงตองกำหนดสถานะเริ่มตน ของตำแหนงขาที่เช่ือมตอ กับหลอดแอลอดี เี ปน แบบเอาตพุตผา นฟงกชัน pinmode() และการควบคุม สถานะการทำงานของหลอดแอลอีดีสามารถทำไดโดยการเรยี กใชง านผานฟง กชัน digitalWrite() การสง สัญญาณจากบอรด Arduino เพ่อื ไปควบคุมหลอดแอลอีดสี ามารถทำได 2 วิธี ดังน้ีวิธี ที่ 1 คือการสงสถานะ “HIGH” เพื่อควบคุมใหหลอดแอลอดี มี ีสถานะ “ติด” โดยจะตองตอขั้วแอโนด เขากับขาของบอรดและตอขั้วแคโทดลงกราวด วิธีที่ 2 คือการสงสถานะ “LOW” เพื่อควบคุมให หลอดแอลอีดีมีสถานะ “ติด” โดยจะตองตอขั้วแคโทดเขากับขาของบอรดและตอขั้วแอโนดเขากับ แรงดัน 5 โวลต

420 รูปที่ 1 วงจรสำหรบั การทดลอง ท่มี า: ผูเขยี น ข้นั ตอนการทดลอง 1. ออกแบบวงจรเพื่อใชใ นการแสดงการติด – ดับ ของหลอดแอลอีดี ซึ่งในการทดลองน้ีจะกำหนดให สง ขอ มูลออกทางขา 0 – 7 โดยจะกำหนดใหห ลอดแอลอดี ีทีเ่ ชื่อมตอกบั ตำแหนงขาที่ 0 – 3 มีสถานะ “ติด” และ “ดับ” พรอมกัน ซึ่งจะมีสถานะที่ตรงกันขามกับหลอดแอลอีดีที่เชื่อมตอกับตำแหนงขาท่ี 4 – 7 ที่มสี ถานะมีสถานะ “ติด” และ “ดับ” พรอ มกันเชนกนั โดยชว งเวลาการติดของหลอดแอลอีดี ที่เชื่อมตอกับตำแหนงขาที่ 0 – 3 คือ 300 มิลลิวินาที และชวงเวลาการติดของหลอดแอลอีดีท่ี เช่ือมตอกับตำแหนง ขาที่ 4 – 7 คอื 500 มลิ ลวิ นิ าที 2. เขียนโปรแกรมเพอื่ ใหเ กดิ ผลลพั ธ ดงั ที่กลา วไวในขัน้ ตอนที่ 1 int led0 = 0; int led1 = 1; int led2 = 2; int led3 = 3; int led4 = 4; int led5 = 5; int led6 = 6; int led7 = 7; void setup() { pinMode(……, ……..); pinMode(……, ……..); ….. } void loop() { digitalWrite(led0, HIGH);

421 digitalWrite(led1, ……); digitalWrite(led2, ……); …… delay(……..); digitalWrite(led0, LOW); digitalWrite(led1, ……); digitalWrite(led2, ……); …… delay(……..); } 3. สงั เกตและอธิบายสวนของโปรแกรมที่เขยี นขน้ึ อยางละเอยี ด คำอธิบาย ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… 4. ปรบั แกวงจรโดยสลับข้วั แคโทดไปตอ กับขาของบอรดทดลองและตอขั้วแอโนดกบั แรงดัน 5 โวลต และทดสอบเขียนโปรแกรมใหผลทำงานเปน ไปในลักษณะเดิม 5. สรปุ ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………………………………………

ใบงานที่ 2 เรอ่ื ง การรับขอมูลจากวงจรรับขอ มูล วชิ า ไมโครคอนโทรลเลอรแ ละการประยุกตใชง าน ชื่อ – สกุล …………………………………………… รหัสนักศกึ ษา……………………………………………….. ชือ่ – สกลุ ………………………………………….. ชอื่ – สกลุ ………………………………………….. รหสั นักศกึ ษา……………………………………………….. รหสั นกั ศกึ ษา……………………………………………….. วตั ถุประสงค เพ่อื ใหผเู รยี นมีความรแู ละทักษะดงั น้ี 1. เพ่ือเรยี นรูตำแหนง ขาบนบอรด Arduino Uno R3 ทสี่ ามารถเชือ่ มตอกับสวิตซได 2. เพือ่ เรยี นรูการเขียนโปรแกรมรับขอ มลู จากสวิตซส ูบอรด Arduino 3. เพ่ือใชโ ปรแกรม Proteus ในการจำลองพฤติกรรมการทำงานของวงจรทดลอง ทฤษฎี สวิตซคืออุปกรณที่นำหนาที่เปนตัวสงสัญญาณไปยังวงจร จึงเปนอุปกรณที่ทำหนาที่เปน อินพุตใหกับวงจรทดลอง โดยมีขาสำหรับการใชงานจริง 2 ขา โดยขาหนึ่งจะตองรับสถานะ “HIGH” อีกขาหนง่ึ รับสถานะ “LOW” โดยสญั ญาณที่สงไปยงั วงจรทดลองข้ึนอยูสถานะปจจุบันของสวิตซซ่ึงมี 2 สถานะคือ กด หรือ ปลอย การสรางวงจรสวิตซสามารถทำได 2 วิธีคือ วงจรสวิตซที่มีการทำงานที่สถานะ “HIGH” คือ วงจรที่จะสงสถานะ “LOW” ไปยังวงจรทดลองในกรณีที่ผูใชไมไดเริ่มกดสัมผัสที่ปุม และสงสถานะ “HIGH” ในกรณีที่มีการสัมผัสปุม และ วงจรสวิตซที่มีการทำงานที่สถานะ “LOW” คือวงจรที่จะสง สถานะ “HIGH” ไปยังวงจรทดลองในกรณีที่ผูใชไมไดเริ่มกดสัมผัสที่ปุม และสงสถานะ “LOW” ใน กรณีท่ีมกี ารสัมผัสปุม

424 รปู ที่ 1 วงจรสวิตซทม่ี ีการทำงานทีส่ ถานะ “HIGH” ที่มา: ผูเ ขียน รูปท่ี 2 วงจรสวติ ซท ม่ี ีการทำงานท่สี ถานะ “LOW” ที่มา: ผเู ขยี น การตอสวิตซกับบอรด Arduino Uno R3 จะตองตอเขากับตำแหนงขาที่รับสัญญาณแบบ ดิจิทัลที่อยูบนบอรด ซึ่งโดยทั่วไปจะนิยมตอใชงานอยูระหวางตำแหนงที่ 0 – 7 อยางไรก็ตาม เนื่องจากสวิตซเปนอุปกรณประเภทสงสัญญาณสูบอรด ดังนั้นจึงตองกำหนดสถานะเริ่มตนของ ตำแหนงขาที่เชื่อมตอกับสวิตซเปนแบบอินพุตผานฟงกชัน pinMode() และการรอรับสัญญาณจาก สวิตซสามารถทำไดโ ดยการเรยี กใชงานผานฟงกช ัน digitalRead() เบาซ (Bounce) ของสัญญาณคือปญหาที่เกิดจากการสัมผัสสวิตซในระยะเวลาที่นาน จนกระทั่งโปรแกรมวนกลับมารับคำสั่งเดิมอีกครั้งจึงเปนสาเหตุใหโปรแกรมตรวจจับการสมั ผัสสวิตซ มากกวา 1 ครั้งทั้งที่ในความเปนจริงผูใชงานประสงคทีจ่ ะสัมผัสเพียงคร้ังเดียว ซึ่งจากปญหาดังกลา ว สามารถแกไดโดยการดีเบาซ (Debounce ซึ่งมีหลายวิธี เชน การใชการหนวงเวลา หรือการรอการ หยดุ สัมผัสสวิตซ

425 รปู ที่ 3 วงจรสำหรบั การทดลอง ที่มา: ผูเ ขียน ขน้ั ตอนการทดลอง 1. ออกแบบวงจรเพื่อใช วงจรสวติ ซท่มี กี ารทำงานทส่ี ถานะ “LOW” ในการควบคมุ การติด – ดับ ของ หลอดแอลอีดี ซึ่งในการทดลองนี้จะกำหนดใหหากกดสวิตซ sw1 หลอดแอลอีดี led1 จะแสดง สถานะการติด – ดับ โดยหากกดสวิตซดังกลาวอีกครั้งหลอดแอลอีดีหลอดดังกลาวจะดับ โดยสวิตซ sw2 จะใชส ำหรับควบคมุ หลอดแอลอีดี led2 ใหมกี ารทำงานเชนเดียวกันกบั คูของ sw1 และ led1 2. เขยี นโปรแกรมเพอื่ ใหเกิดผลลพั ธ ดงั ท่ีกลาวไวใ นขั้นตอนท่ี 1 3. สงั เกตและอธบิ ายสวนของโปรแกรมท่ีเขยี นข้ึนอยางละเอยี ด คำอธิบาย ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… 4. ปรับแกว งจรโดยเปลีย่ นวงจรสวิตใหมเ ปน วงจรสวิตซทมี่ ีการทำงานทส่ี ถานะ “HIGH” และ ทดสอบเขียนโปรแกรมใหผลทำงานเปนไปในลักษณะเดิม

426 5. สรุป ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………………………………………

ใบงานท่ี 3 เรือ่ ง การควบคุมแอลอีดี 7 สวน วชิ า ไมโครคอนโทรลเลอรและการประยุกตใ ชง าน ชอื่ – สกลุ …………………………………………… รหัสนักศึกษา……………………………………………….. ชื่อ – สกลุ ………………………………………….. ชือ่ – สกุล ………………………………………….. รหสั นักศกึ ษา……………………………………………….. รหสั นักศึกษา……………………………………………….. วัตถุประสงค เพื่อใหผ เู รียนมคี วามรูและทักษะดังน้ี 1. เพอื่ เรียนรูตำแหนงขาบนบอรด Arduino Uno R3 ทส่ี ามารถเชือ่ มตอกบั หลอดแอลอี 7 สว นได 2. เพอื่ เรียนรูการเขียนโปรแกรมโดยใช Arduino IDE เพื่อควบคุมหลอดแอลอดี ี 7 สว น 3. เพ่ือใชโ ปรแกรม Proteus ในการจำลองพฤติกรรมการทำงานของวงจรทดลอง ทฤษฎี แอลอีดี 7 สวนคอื การนำหลอดแสดงผลมาจัดวางเรียงกันใหม ลี ักษณะทส่ี ามารถแสดงผลได อยางหลากหลาย เชนสามารถนำแอลอีดี 7 สวนมาแสดงตัวเลข 0 – 9 และตัวอักษรภาษาอังกฤษใน บางตัวอยางไรก็ตาม ผูใชง านจำเปน ตองเลือกตอ ขาของแอลอดี ี 7 สวนใหถ ูกตอง แอลอีดี 7 สวน แบง ออกเปน 2 ประเภทคอื แบบคอมมอนแอโนด และแบบคอมมอนแคโทด โดยหากใชงานแบบคอมมอนแอโนดตองตอขาคอมมอนเขากับแรงดัน 5 โวลตและหากตองการให หลอดแอลอีดีสวนใดมีสถานะ “ติด” ใหสงสถานะ “HIGH” ไปยังสวนดังกลาว แตหากตอแบบ คอมมอนแคโทดตองตอขาคอมมอนเขากับ กราวด และหากตองการใหหลอดแอลอีดสี วนใดมสี ถานะ “ติด” ใหสงสถานะ “LOW” ไปยังสวนดงั กลาว

428 รปู ท่ี 1 รปู แบบของแอลอดี ี 7 สว น ท่ีมา: ผูเ ขียน สำหรับกรณีที่ตองการใชงานแอลอีดี 7 สวนมากกวา 1 ตัวสามารถทำไดโดยใชงานแอลอีดี 7 สวนแบบมัลติเพล็กต ซึ่งขอดี คือ จะชวยประหยัดจำนวนพอรตโดยจะใชเพียง 8 บิตและใชขาใน การเลือกตำแหนงการแสดงผล ตามจำนวนของแอลอีดี 7 สวนที่เลือกใชงาน เชนเลือกใชงานแอลอีดี 7 สวนแบบมลั ติเพลก็ ตจ ำนวน 2 ตัวกจ็ ะใชขาของพอรต เพ่ิมอีก 2 บิตรวมเปนทงั้ หมด 10 บิต เปนตน รูปที่ 2 แอลอีดี 7 สวนแบบมัลติเพล็กต ที่มา: ผูเขียน

429 รูปที่ 3 วงจรสำหรบั การทดลอง ทม่ี า: ผเู ขยี น ขั้นตอนการทดลอง 1. ออกแบบวงจรเพื่อใชในการแสดงการติด – ดับ ของหลอดแอลอีดี 7 สวนแบบคอมมอนแคโทดใน ทกุ ๆ 1 วินาทีดงั น้ี วนิ าทที ี่ 1: สว น a มีสถานะ “ติด” เพียงสว นเดียว วนิ าทีท่ี 2: สว น b มีสถานะ “ตดิ ” เพยี งสว นเดยี ว วินาทที ี่ 3: สวน c มสี ถานะ “ติด” เพียงสว นเดยี ว วินาทีที่ 4: สว น d มีสถานะ “ติด” เพยี งสว นเดียว วินาทีท่ี 5: สว น e มีสถานะ “ติด” เพยี งสวนเดยี ว วนิ าทที ่ี 6: สวน f มสี ถานะ “ตดิ ” เพยี งสวนเดียว กลบั ไปวนซ้ำ โดยเรม่ิ ในวินาทีที่ 1 ใหม 2. เขยี นโปรแกรมเพอื่ ใหเกดิ ผลลัพธ ดังทก่ี ลา วไวในขนั้ ตอนท่ี 1 3. สังเกตและอธบิ ายสวนของโปรแกรมท่เี ขียนข้นึ อยางละเอยี ด คำอธิบาย ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ……………………………………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………………………………………