คำนำ ระบบไมโครคอนโทรลเลอร์นั้นถูกสร้างข้ึนมาเพ่ือให้สามารถ ควบคุมการทางานของอปุ กรณเ์ คร่อื งมอื หรอื เครื่องจกั รไดแ้ บบอัตโนมัติ โดย ไม่ต้องมีคนคอยควบคุมดูแลอย่างใด แต่ระบบไมโครคอนโทรลเลอร์ สมัยก่อนนั้นมีความยุ่งยากซับซ้อนในการนามาใช้งานจึงไม่มีการใช้งานที่ แพร่หลายมากนัก เม่ือชาวอิตาลีได้นาไมโครคอนโทรลเลอร์มาสร้างเป็น บอร์ดสาเร็จรูป โดยจุดประสงค์คือให้มันสามารถใช้งานได้อย่างง่ายดาย เพือ่ ให้บคุ คลทวั่ ไปนน้ั สามารถที่จะนาบอร์ดไมโครคอนโทรลเลอร์สาเร็จรูป นี้ ม า ใ ช้ ง า น ไ ด้ โ ด ย ท่ี ไ ม่ ต้ อ ง มี ค ว า ม รู้ ค ว า ม ช า น า ญ ใ น ร ะ บ บ ไมโครคอนโทรลเลอร์มากนัก ก็สามารถที่จะสร้างสรรค์นวัตกรรมใหม่ๆ ขึ้นมาได้ เอกสารคู่มือการใช้งานบอร์ดไมโครคอนโทรลเลอร์สาเร็จรูปที่มี ช่ือว่า Arduino นี้ถูกจัดทาข้ึนมาเพ่ือให้ผู้ท่ีต้องการศึกษาการเขียน โปรแกรมส่ังงานบอร์ดไมโครคอนโทรลเลอร์สาเร็จรูป Arduino ในระดับผู้ เริ่มต้นนัน้ ไดส้ ามารถเรม่ิ ตน้ เรยี นร้ขู ัน้ ตอนและวิธีการใช้งานโปรแกรม และ การเขียนโปรแกรมส่ังงาน Arduino ได้อย่างง่ายดายได้ด้วยตนเอง ด้วย เนื้อหาท่ีอ่านเข้าใจได้ง่าย และการเขียนโปรแกรมควบคุมสั่งงานบอร์ด Arduino เพ่ือสร้างสรรค์สิ่งต่างๆด้วยไมโครคอนโทรลเลอร์ จะไม่ใช่เรื่อง ยากอีกต่อไป
สารบัญ เร่ือง หน้าที่ 2 19 39 53 62
1 แบบทดสอบกอ่ นเรยี น บทท่ี 1
บทที่ 1 2 ความรูเ้ บ้ืองต้นเก่ียวกบั ไมโครคอนโทรลเลอร์ หัวข้อเร่อื ง • 1.1 ระบบตวั เลขและรหัส • 1.2 ดิจทิ ัลพ้นื ฐาน • 1.3 โครงสรา้ งพื้นฐานของระบบคอมพิวเตอร์ • 1.4 ไมโครคอนโทรลเลอร์ Arduino สาระสาคญั ความรู้เบื้องตน้ เก่ียวกับไมโครคอนโทรลเลอรใ์ นบทน้กี ล่าวถึง ระบบตัวเลขท่ีเกย่ี วข้อง กับไมโครคอนโทรลเลอร์ มหี ัวข้อความรู้ด้านดจิ ิทัลพน้ื ฐานทม่ี ีใชง้ านในไมโครคอนโทรลเลอร์ และความรูท้ วั่ ไปของไมโครคอนโทรลเลอร์ Arduino สมรรถนะประจาหนว่ ยการเรียนรู้ แสดงความรูเ้ กย่ี วกบั ไมโครคอนโทรลเลอร์ Arduino จดุ ประสงค์การเรียนรู้ จุดประสงค์ทัว่ ไป 1. เพ่อื ใหม้ คี วามรู้เกีย่ วกบั ระบบตวั เลขและดิจิทัลพนื้ ฐาน 2. เพ่อื ใหม้ คี วามรเู้ กี่ยวกบั โครงสร้างพื้นฐานของระบบคอมพวิ เตอร์ 3. เพื่อใหม้ ีความรู้เกย่ี วกับไมโครคอนโทรลเลอร์ Arduino จดุ ประสงค์เชิงพฤตกิ รรม 1. บอกวิธกี ารแปลงเลขฐานในระบบตวั เลขและดิจทิ ัลพน้ื ฐานได้ 2. บอกเก่ียวกบั โครงสร้างพนื้ ฐานของระบบคอมพิวเตอร์ได้ 3. บอกเกยี่ วกับไมโครคอนโทรลเลอร์ Arduino ได้ 4. ทาแบบฝึกหดั เสร็จทนั เวลาและทาแบบทดสอบผา่ นเกณฑ์ท่ีกาหนด
3 ความรู้เบ้อื งต้นเกี่ยวกบั ไมโครคอนโทรลเลอร์ ไมโครคอนโทรลเลอร์ ( Microcontroller) มาจากคา 2 คา คา หนึ่งคือ ไมโคร (Micro) หมายถึง ขนาดเล็กและคาว่า คอนโทรลเลอร์ (Controller) หมายถึงตัวควบคุมหรืออุปกรณ์ควบคุม ดงั นน้ั ไมโครคอนโทรลเลอร์ จงึ หมายถึงอปุ กรณค์ วบคุมขนาดเลก็ แตใ่ นตัวอุปกรณ์ควบคุมขนาดเล็กน้ี ได้บรรจุความสามารถที่คล้ายคลึงกับระบบคอมพิวเตอร์ท่ีคนโดยส่วนใหญ่คุ้นเคย กล่าวคือภายใน ไมโครคอนโทรลเลอร์ ได้รวมเอาหน่วยประมวลผลหลกั หน่วยความจา และพอร์ต ซ่งึ เปน็ สว่ นประกอบ หลกั สาคญั ของระบบคอมพวิ เตอร์เข้าไว้ด้วยกันโดยทาการบรรจุเข้าไว้ในตัวถังเดียวกัน ความแตกต่าง ของไมโครคอนโทรลเลอรก์ ับไมโครโปรเซสเซอร์ คือไมโครคอนโทรลเลอร์น้ันมีความสมบูรณ์ภายในตัว ของมันเอง คอื มีส่วนประกอบต่างๆ ครบถ้วน ส่วนไมโครโปรเซสเซอร์น้ันต้องทางานร่วมกับอุปกรณ์ ข้างเคียงท่ีเชื่อมตอ่ จากภายนอก เชน่ หนว่ ยความจา (Memory) หนว่ ยอินพุตเอาต์พุต (I/O) ฯลฯ 1 เพอ่ื ให้เขา้ ใจการทางานของไมโครคอนโทรลเลอร์พร้อมท้ังวงจรต่อพ่วงแบบต่างๆ สิ่งแรกท่ีจะต้องทา ความเข้าใจก่อนที่จะเข้าเร่ืองไมโครคอนโทรลเลอร์จะต้องเข้าใจเกี่ยวกับระบบตัวเลข ระบบการ เข้ารหัส ระบบลอจิกเกต โดยระบบทั้งหมดเป็นการทางานภายในคอมพิวเตอร์ เนื้อหาบทน้ีจะเป็น พ้ืนฐานในการเรยี นรู้ และทาความเขา้ ใจเกย่ี วกบั ไมโครคอนโทรลเลอร์ในบทถดั ไป 1.1 ระบบตัวเลขและรหสั แนวคิดเก่ียวกับจานวนและการนับมีมาแต่โบราณมนุษย์สามารถนับจานวนส่ิงต่างๆ โดยมี ความคดิ วา่ เมือ่ เพมิ่ ส่งิ ใดส่งิ ใดกจ็ ะไดส้ ิ่งน้ัน “มากขึน้ ” และถา้ เอาสิ่งนั้นออกไปจะทาให้สิ่งน้ัน “ลดลง” ต่อเม่ือสังคมเจริญข้ึนก็ใช้วิธีการจับคู่ส่ิงน้ัน เช่น อาจใช้น้ิวมือแทนสิ่งเหล่าน้ัน เช่น หนึ่งนิ้วแทนสัตว์ หนง่ึ ตัวและอาจใชก้ ้อนหินบนั ทกึ จานวนสง่ิ น้นั หรอื อาจใช้ขีดเขียนบนพื้นดิน หรือสลักบนต้นไม้ ต่อมา จึงใช้สัญลักษณ์แทนจานวนขึ้น และพบว่าการนับและการเขียนในสมัยโบราณนั้นจะไม่มี “ศูนย์”มี หลักฐานยืนยันเม่ือปี ค.ศ. ท่ี 9 ใช้เรียกเป็นตัวเลขอาระบิกเป็นช่ือท่ีเรียกตัวเลขท่ีประดิษฐ์ขึ้นข้ึนใน ประเทศอินเดียยคุ โบราณโดยนักคณติ ศาสตร์ชาวอนิ เดียประมาณ 500 ปี ก่อนคริสตศักราชจากน้ันจึง ไปถ่ายทอดไปยังประเทศในแถบยุโรปในยุคกลางท้ังๆ ท่ีเริ่มต้นท่ีประเทศอินเดีย แต่เริ่มรู้จักในฝั่ง ตะวนั ตกในช่อื ว่า ตัวเลขอาระบิก ท้ังน้ีเนื่องจากในยุโรปได้ใช้ตาราของอาหรับ (Arabic texts) เช่น “ The calculation with Hindu numerals” เป็นต้น ทาให้ชาวยุโรปพากันเรียกตัวเลขน้ีว่าตัวเลข อาระบิกและในปัจจุบันจึงเรียกตัวเลขน้ีว่าตัวเลขฮินดูอาระบิกด้วยตัวเลขอาระบิกนี้เรียกในภาษา อาระบิกว่า \"Hindu numerals\",“( ) ية \" أرقا م هندต่อมาเรียกว่า Hindu-Arabic numerals หรือ Indian numerals อันเปน็ สญั ลักษณ์ทใี่ ช้แทนจานวนกนั ท่วั โลก
4 ตัวเลขที่ใชอ้ ย่ใู นปัจจบุ ันซ่ึงเรียกวา่ ตัวเลขฮินดูอาระบิกน้ีใช้แทนด้วยตัวเลข 10 ตัวคือ 1, 2, 3, 4,5, 6, 7, 8, 9 และ 0 ตัวเลขเหล่าน้ีได้มีข้ึนในยุโรปในศตวรรษท่ี 12 โดย Leonardo Pissano ซึ่งเป็นนัก คณติ ศาสตรช์ าวอิตาเลยี น เขาไดร้ ับการศึกษาจากประเทศในแถบแอฟริกาเหนือแล้วนาความรู้กลับมา ใช้ในประเทศอิตาลี ระบบตัวเลขฮินดู เป็นระบบท่ีมีค่าประจา ตาแหน่งค่าของตัวเลขข้ึนกับตาแหน่ง ของตัวเลขน้ัน เช่น “2” ใน 205 มีค่าเป็น 10 เท่าของ “2” ใน 25 ดังนั้นจึงต้องมี “0” เพื่อบอก ตาแหน่งหรือหลกั สิบ ใน“205” ด้วย การค้นพบตวั เลข 0 เกิดขึ้นหลังจากมีสัญลักษณ์แทนจานวนเต็ม 9 จานวนแล้วตัวเลข 0 ใช้แทนตาแหนง่ วา่ งเปล่า เรียกวา่ “ตัวร้ังตาแหน่ง”Place holder2จากความก้าวหน้าทางเทคโนโลยีได้มีการพัฒนาเคร่ืองคอมพิวเตอร์ ขึน้ มาใช้งาน โดยเครื่องคอมพวิ เตอรเ์ ปน็ เครื่องใชไ้ ฟฟ้าซงึ่ ถูกออกแบบมาเพ่ือที่จะรับรู้สภาวะเพียงสอง สภาวะเท่านั้น เพ่ือป้องกันการผิดพลาดของข้อมูลคือ สภาวะมีแรงดันไฟฟ้าโดยเรียกว่าลอจิก 1 และ สภาวะไม่มีแรงดนั ไฟฟา้ โดยเรียกวา่ ลอจกิ 0 ในระบบคอมพิวเตอร์ทีม่ ีความเร็วต่า แรงดันไฟฟ้าสาหรับ ลอจิก 1 จะมีค่าเท่ากับ 5 โวลต์และแรงดันไฟฟ้าสาหรับลอจิก 0 จะมีค่าเท่ากับ 0 โวลต์ แต่สาหรับ คอมพิวเตอร์ท่ีมีความเร็วสูงค่าระดับแรงดันลอจิก 1 จะลดลงเพ่ือลดความร้อนที่เกิดขึ้นกับตัว ประมวลผลกลางดังนัน้ การประมวลผลต่าง ๆ ของคอมพิวเตอร์จึงใช้งานในระบบตัวเลขฐาน 2 หรือท่ี เรียกว่าเลขไบนาร่ี (Binary) ตัวเลขทีใ่ ช้ระบบเลขฐาน 10 คือ 0, 1, 2, … 9 และในระบบเลขฐาน 2 มี เพยี งเลข 0 กับ 1 เท่าน้นั การแปลงเลขฐาน 10 เป็นเลขใดๆ ในการเขยี นโปรแกรมคอมพิวเตอร์จาเป็นต้องใช้เลขฐานหลักๆ 3 เลขฐานได้แก่ เลขฐาน 10 เลขฐาน 2 และเลขฐาน 16 ซ่ึงในแต่ละฐานมีความสัมพันธ์กันจาเป็นจะต้องมีความรู้ในการแปลงเลข ฐานเพอ่ื นาไปใช้ประโยชนใ์ นการเขียนโปรแกรมคอมพิวเตอร์การแปลงเลขฐาน 10 ให้เป็นเลขฐานใดๆ น้ันทาได้โดยการหารเลขฐาน 10 ที่ต้องการแปลงด้วยตัวเลขของเลขฐานท่ีต้องการแปลงและเก็บค่า ผลลัพธ์ โดยเศษของการหารครั้งแรกจะเป็นเลขฐานที่ต้องการแปลงในบิตต่า สุด (LSB: Least significant bit) สว่ นผลหารจะไปหารครง้ั ถัดไปด้วยเลขฐานท่ีต้องการแปลง เศษของการหารในคร้ังน้ี จะเปน็ เลขฐานทต่ี ้องการแปลงในบิตถัดข้ึนมา ส่วนผลลัพธ์ก็นาไปหารด้วยเลขฐานท่ีต้องการแปลงทา อย่างนี้ไปจนกระทง่ั ผลหารมีคา่ เป็น 0
ตัวอยา่ ง การแปลงเลขฐาน 10 เปน็ เลขฐาน 2 5 โจทย์ จงแปลงค่า 4510เปน็ เลขฐาน 2 วธิ ที า ผลลัพธ์ เศษ บิตค่าต่าสดุ (LSB: Least significant bit) 45/2 = 22 1 22/2 = 11 0 11/2 = 51 5/2 = 21 22/2 = 10 1/2 = 0 1 บิตคา่ สงู สดุ (MSB: Most significant bit) คาตอบ 4510 = 1011012 ตัวอย่าง การแปลงเลขฐาน 10 เป็นเลขฐาน 3 โจทย์ จงแปลงคา่ 4510 เป็นเลขฐาน 3 วิธที า ผลลพั ธ์ เศษ 45/3 = 15 0 บิตคา่ ต่าสุด (LSB: Least significant bit) 15/3 = 5 0 5/3 = 1 2 1/3 = 0 1 บติ คา่ สูงสุด (MSB: Most significant bit) คาตอบ 2510= 12003 ตัวอย่าง การแปลงเลขฐาน 10 เป็นเลขฐาน 4 โจทย์ จงแปลงค่า 4510เปน็ เลขฐาน 4 วธิ ที า ผลลัพธ์ เศษ 45/4 = 11 1 บิตค่าตา่ สดุ (LSB: Least significant bit) 11/4 = 2 3 2/4 = 0 2 บติ คา่ สูงสดุ (MSB: Most significant bit) คาตอบ ������������������������ =2314
การแปลงเลขฐาน 10 เปน็ เลขใดๆ 6 การแปลงเลขฐานใดๆ ให้เป็นเลขฐาน 10 ต้องทาความเข้าใจเกี่ยวกับน้าหนักของตัวเลขที่อยู่ใน ตาแหน่งต่างๆ ก่อนน้าหนักของตัวเลขท่ีอยู่ขวาสุด (LSB: Least significant bit) จะมีค่าเท่ากับเลข ฐานนั้นๆ ยกกาลังศนู ย์และเลขตาแหน่งถัดมาจะมีน้าหนักเท่ากับเลขฐานนั้นๆ ยกกาลังหน่ึงเป็นเช่นน้ี ไปเร่ือยๆครบทกุ หลักสาหรับการหาค่าเลขฐานใดๆ ให้เป็นเลขฐานสิบจะหาได้จากการรวมกันของผล คณู ในตัวเลขในตาแหน่งต่างๆ กบั น้าหนกั ของตวั เลขในตาแหน่งน้นั ๆ ดงั ตัวอยา่ ง ตัวอย่าง การแปลงเลขฐาน 8 เปน็ เลขฐาน 10 โจทย์ จงแปลงเลขฐาน 8 ของเลข 765438 ใหเ้ ป็นเลขฐาน 10 วธิ ีทา น้าหนัก 84 83 82 81 80 เลข ผลคูณ 76 5 4 3 7×84=28672 6×83=3072 5×82=320 4×81=32 3×80=3 765438= 28672+3072+320+32+3 =3209910 ตัวอยา่ ง การแปลงเลขฐาน 5 เปน็ เลขฐาน 10 โจทย์ จงแปลงเลขฐาน 5 ของเลข 434215 ให้เปน็ เลขฐาน 10 วิธที า 54 53 52 51 50 นา้ หนัก 2 1 2×51=10 1×50=1 เลข 4 3 4 ผลคูณ 4×54=2500 3×53=375 4×52=100 43421������= 2500+375+100+10+1 =2986������������ ตวั อยา่ ง การแปลงเลขฐาน 2 เป็นเลขฐาน 10 โจทย์ จงแปลงเลขฐาน 2 ของเลข 110102ใหเ้ ปน็ เลขฐาน 10 วิธีทา 21 20 2 2 2นา้ หนัก 432 1 0 เลข 1 1 0 1×21=2 0×20=0 ผลคูณ 1×24=16 1×23=8 0×22=0 11010������= 16+8+0+2+0 =26������������
ตวั อย่าง การแปลงเลขฐาน 5 เป็นเลขฐาน 10 51 7 โจทย์ จงแปลงเลขฐาน 5 ของเลข 434215 ใหเ้ ปน็ เลขฐาน 10 วธิ ีทา 5 50 2 54 53 52 2×5=10 1 1 นา้ หนัก 21=2 1×1=1 625 125 25 1 20=1 เลข 4 3 4 1×2=2 0 ผลคณู 4×625=2500 3×125=375 4×25=100 0×1=0 434215= 2500+375+100+10+1 =298610 ตวั อย่าง การแปลงเลขฐาน 2 เปน็ เลขฐาน 10 โจทย์ จงแปลงเลขฐาน 2 ของเลข 110102ใหเ้ ป็นเลขฐาน 10 วธิ ีทา น้าหนกั 24=16 23=8 22=4 เลข 1 1 0 ผลคูณ 1×16=16 1×8=8 0×4=0 110102= 16+8+0+2+0 =2610 ระบบเลขฐาน 16 ระบบเลขฐาน 16 (HEX: Hexadecimal) เป็นเลขท่ีถูกเรียกใช้ในระบบคอมพิวเตอร์ซึ่งใช้ แทนตัวเลขท่ีเป็นเลขฐาน 2 เพ่ือให้ง่ายต่อการใช้งานเนื่องจากเลขฐาน 2 มีแค่เลข 0 และ 1 เท่าน้ัน ดงั เช่น 1000100101102 แตเ่ ม่ือเขยี นเปน็ เลขฐาน 16 จะไดเ้ พยี ง 89616 ในระบบเลขฐาน2 ท่ีมีเพียง เลข 2 ตัวคือ 0 กับ 1 ในระบบเลขฐาน 10 มีเลข10 ตัวคือ 0, 1, 2, … 9 และในระบบเลขฐาน 16 มี ตัวเลข16 ตัว โดย 10 เลขแรกใช้เลขเดียวกับเลขฐาน 10 คือ 0 ถึง9 ส่วนที่เหลืออีก 6 ตัว จะใช้ ตวั อกั ษรภาษาอังกฤษแทนคอื A, B, C, D, E, Cและ F ดงั ตารางที่ 1-1
8 ตารางท่ี 1-1 ความสัมพนั ธข์ องเลขฐาน เลขฐาน 10 เลขฐาน 2 เลขฐาน 16 0 0000 0 1 0001 1 2 0010 2 3 0011 3 4 0100 4 5 0101 5 6 0110 6 7 0111 7 8 1000 8 9 1001 9 10 1010 A 11 1011 B 12 1100 C 13 1101 D 14 1110 E 15 1111 F การแปลงเลขฐานระหว่างเลขฐาน 2 กบั เลขฐาน 16 ในการแปลงเลขฐาน 2 ใหเ้ ปน็ เลขฐาน 16 สามารถทาได้โดยการแบ่งกล่มุ ตัวเลขของเลขฐาน 2เรมิ่ จากขวาไปซา้ ยเป็นกลุ่มๆ ละ 4 บติ และใช้จากตารางแสดงความสมั พันธข์ องเลขฐานในการแปลง เลขฐานไดโ้ ดยตรงดังตัวอยา่ ง
ตัวอย่าง การแปลงเลขฐาน 2 ให้เป็นเลขฐาน 16 โดยการแบ่งกลมุ่ ตัวเลข 9 โจทย์ จงแปลงคา่ 1001111101012 เปน็ เลขฐาน 16 วิธที า แบ่งกลมุ่ ตัวเลขของเลขฐาน 2 เร่ิมจากขวาไปซา้ ยเป็นกลุ่มๆละ 4 บิต 1001 1111 0101 จากโจทย์ 9F5 คาตอบ 1001111101012 = 9F5������ ตัวอยา่ ง การแปลงเลขฐาน 16 ใหเ้ ปน็ เลขฐาน 2 โดยการแบ่งกลุ่มตัวเลข โจทย์ จงแปลงคา่ A72B16เป็นเลขฐาน 2 วิธีทา A 7 2 B จากโจทย์ 1010 0111 0010 1011 คาตอบ A72B16 = 10100111001010112 การแปลงเลขฐาน 10 กับเลขฐาน 16 ในการแปลงเลขฐาน 10 ให้เป็นเลขฐาน 16 สามารถทาได้ 2 แนวทางคอื 1. แปลงเลขฐาน 10 ใหเ้ ปน็ เลขฐาน 2 ก่อนใชว้ ธิ กี ารกระจายตามนา้ หนกั ของแต่ละบิตแลว้ ทาการ แปลงเลขฐาน 2 ใหเ้ ปน็ เลขฐาน 16 ดังตวั อยา่ ง ตัวอย่าง การแปลงเลขฐาน 10 ใหเ้ ป็นเลขฐาน 16 โดยการแปลงเป็นเลขฐาน 2 กอ่ น โจทย์ จงแปลงคา่ 4510เป็นเลขฐาน 16 วธิ ที า นา้ หนกั บติ ฐาน 2 32 16 8 4 2 1 4510 กระจายได้ 1 0 1 10 1 คาตอบ 4510= 32+0+8+4+0+1 = 1011012= 0010 11012= 2DH
ตัวอยา่ ง การแปลงเลขฐาน 10 ให้เป็นเลขฐาน 16 10 โจทย์ จงแปลงคา่ 171410 เปน็ เลขฐาน 16 วิธีทา น้าหนกั บิต 1024 512 256 128 64 32 16 8 4 2 1 171410 1 1 0 1 0 1 1 0 0 1 0 คาตอบ 171410 = 11010110010 2 =0110 1011 0010 2 =6B216 2. แปลงโดยตรงทาได้โดยการหารเชน่ เดยี วกบั การแปลงเลขฐาน 2 เปน็ เลขฐาน 10 ตา่ งตรงที่ใช้ 16 เป็นตัวหาร ดังตวั อยา่ ง ตวั อย่าง การแปลงเลขฐาน 10 ใหเ้ ป็นเลขฐาน 16 โดยการหาร โจทย์ แปลงค่า 23410เปน็ เลขฐาน 16 วธิ ที า ผลหาร เศษ 234/16 14 10 =A 14/16 0 14 =E คาตอบ 23410= EA16 ตวั อย่าง การแปลงเลขฐาน 10 ให้เป็นเลขฐาน 16 โดยการหาร โจทย์ แปลงคา่ 4510เปน็ เลขฐาน 16 วธิ ีทา ผลหาร เศษ 45/16 2 13 =D 2/16 0 2 =2 คาตอบ 4510 = 2D16 การแปลงเลขฐาน 16 กับเลขฐาน 10 ในการแปลงเลขฐาน 16 ให้เป็นเลขฐาน 10 สามารถทาได้ 2 แนวทางคอื 1. แปลงเลขฐาน 16 ใหเ้ ปน็ เลขฐาน 2 กอ่ นแล้วทาการแปลงจากเลขฐาน 2 ที่ไดใ้ หเ้ ป็นเลขฐาน 10 อีกครั้ง ดงั ตวั อยา่ ง
ตัวอย่าง การแปลงเลขฐาน 16 ใหเ้ ป็นเลขฐาน 10 โดยการแปลงเป็นเลขฐาน 2 กอ่ น 11 โจทย์ จงแปลงคา่ 6B216เปน็ เลขฐาน 10 วธิ ีทา จากโจทย์ 6 B 2 ฐาน2 110 1011 0010 น้าหนกั ฐาน 2 1024 512 256 128 64 32 16 8 4 2 1 1 1 0 1 0 11 0010 คาตอบ (1024+512+0+128+32+16+0+0+2+0) = 171410 2. แปลงโดยตรงโดยรวมจากน้าหนกั ของแต่ละหลกั ดังตวั อยา่ ง ตัวอย่าง การแปลงเลขฐาน 16 ให้เปน็ เลขฐาน 10 โดยรวมจากนา้ หนักในแตล่ ะหลกั โจทย์ จงแปลงค่า 6B216เป็นเลขฐาน 10 วิธีทา 162 161 160 นา้ หนกั ฐาน 16 6 B(11) 2 6B216 = (6×162)+(11×161)+(2×160) = 1536+176+2 คาตอบ =171410 ตัวอยา่ ง การแปลงเลขฐาน 16 ใหเ้ ปน็ เลขฐาน 10 โดยรวมจากนา้ หนกั ในแต่ละหลกั โจทย์ จงแปลงค่า ABC16 เปน็ เลขฐาน 10 วิธีทา 162 161 160 น้าหนกั ฐาน 16 A(10) B(11) C(12) ABC16 = (10×162 )+(11×161)+(12×160) = 2560+176+12 คาตอบ = 274810 1.2 ดิจิทัลพื้นฐาน ดิจทิ ัล (Digital) เปน็ การอธบิ ายเทคโนโลยีอเิ ล็กทรอนิกส์ท่ใี ชส้ รา้ ง เกบ็ และประมวลขอ้ มูลในลักษณะ 2 สถานะทเ่ี รยี กว่าลอจิก คอื บวกแสดงดว้ ยลอจิก 1 และไมบ่ วกแสดงดว้ ยลอจกิ 0 ดงั นน้ั ขอ้ มลู สง่ ผา่ น หรือเกบ็ ด้วยเทคโนโลยดี ิจทิ ลั เปน็ การแสดงดว้ ยลอจิก 0 และ 1 แต่ละค่าของตาแหนง่ สถานะ
เหล่านี้เป็นการอ้างแบบ (Binary digital) ดิจิทัลมีความเกี่ยวข้องกับไมโครคอนโทรลเลอร์ทั้งฮาร์ดแวร์และ 12 ซอฟตแ์ วร์ สาหรบั หนว่ ยการเรียนน้ีจะกลา่ วถึงระดบั แรงดันไฟฟ้าของ ลอจิกดิจิทัล และคุณสมบัติของลอจิก เกตชนิดตา่ งๆ ท่เี กย่ี วข้องกับการใช้งานของไมโครคอนโทรลเลอร์ ดังนี้ ระดับลอจิกระดับลอจกิ ทใ่ี ช้งานในวงจรจริง สถานะของ ลอจิกดิจิทัล 2 สถานะจะแทนค่าด้วยแรงดันไฟฟ้าคือ ลอจิก 0 แทนแรงดนั 0 โวลต์ และลอจิก 1 แทนแรงดัน 5 โวลต์ แตใ่ นเปน็ ความจรงิ อุปกรณ์ท่ีนามาใช้งานจะสามารถ รับรู้ลอจกิ ไดก้ ว้างพอสมควร โดยการรับรู้ลอจิก 0 ก็ไม่จาเป็นต้องมีค่าแรงดันเป็น 0 โวลต์โดยสามารถที่จะ รับรู้ค่าของแรงดันท่ีสูงกว่า 0 โวลต์ได้เล็กน้อยและในทานองเดียวกันลอจิก 1 ก็ไม่จาเป็นต้องเป็น 5 โวลต์ เชน่ กนั สาหรับไมโครคอนโทรลเลอร์ในปจั จุบันบางเบอรบ์ างตระกูลใชแ้ รงดันไฟเลย้ี งทตี่ ่า กว่า 5 โวลต์ ลอจิก 1 ก็มขี นาดแรงดันท่ตี ่าลงไปด้วย โดยคา่ ลอจิก 1 จะเปน็ ค่าใกลเ้ คยี งกับแรงดนั ไฟเล้ียงในวงจร ลอจิกเกตของเลขฐาน 2 ระบบเลขฐาน 2 สามารถนาลอจิกผ่านวงจรต่างๆ เพ่ือให้ได้ลอจิกที่เปลี่ยนไปโดยวงจรดังกล่าว เรียกว่า วงจรลอจิกเกตโดยมวี งจรต่าง ๆ ดังน้ี 1. แอนดเ์ กต (AND gate) 2. ออรเ์ กต (OR gate) 3. เอ็กซค์ ลซู ฟี ออร์เกต (XOR gate) 4. แนนดเ์ กต (NAND gate) 5. นอร์เกต (NOR gate) 6. นอ็ ตเกต (NOT gate) แอนด์เกต (AND gate) แอนเกต (AND Gate) อนิ พุต เอาต์พุต แอนด์เกต เปน็ วงจรทม่ี อี ินพตุ ต้ังแต่ 2 AB 0 อนิ พตุ ขึน้ ไป เมื่อนาค่าลอจิกมาผา่ นวงจรแลว้ 00 0 ให้คา่ ลอจกิ ทางเอาตพ์ ตุ ท่มี ีความสัมพันธ์กบั 01 0 อนิ พุต คอื เมื่ออินพตุ ทุกอินพุตมีลอจกิ เป็น 1 10 0 จะส่งผลให้ลอจิกทางเอาต์พุตเปน็ ลอจกิ 1 แต่ 11 1 ถา้ หากอินพุตมีคา่ ลอจกิ 0 ในอินพตุ ใดอนิ พุต หนึ่งหรอื ทง้ั หมดจะส่งผลให้ลอจกิ ทางเอาต์พุต เปน็ ลอจิก 0
ออรเ์ กต (OR gate) 13 ออร์เกตเป็นวงจรที่มีอินพุตต้ังแต่ 2 ออร์เกต (OR Gate) Q อินพตุ ขึ้นไป เมื่อนาคา่ ลอจิกมาผา่ นวงจรแลว้ อนิ พุต เอาต์พุต ใหค้ ่าลอจกิ ทางเอาต์พุตทมี่ ีความสัมพนั ธก์ บั A B อินพุตคอื เมื่ออินพุตใดอินพตุ หน่งึ หรอื ทุก 0 0 Q อนิ พุตมลี อจกิ เปน็ 1 จะส่งผลใหล้ อจิกทาง 0 1 0 เอาต์พุตเปน็ ลอจกิ 1 หากทุกอนิ พตุ มคี ่าลอจิก 01 0 1 จะสง่ ผลใหเ้ อาต์พุตมีลอจิก 0 1 11 1 เอก็ ซ์คลซู ฟี ออร์เกต (XOR gate) เอ็กคลซู ฟี ออร์เกต เป็นวงจรท่ีมีอินพุต เอก็ ซค์ ลูซฟี ออร์เกต ต้ังแต่ 2 อนิ พตุ เมือ่ นาคา่ ลอจิกมาผ่านวงจร (XOR Gate) แลว้ ใหค้ ่าลอจิกทางเอาต์พุตทมี่ ีความสมั พันธ์ กบั อนิ พตุ คอื เม่ืออินพตุ ทั้งสองอนิ พุตมคี ่า อนิ พุต เอาตพ์ ุต ลอจกิ เดยี วกัน (ลอจิก 0 ท้ังสองอนิ พุต หรอื ลอจิก 1 ท้ังสองอนิ พตุ )จะทา ใหเ้ อาต์พตุ มคี ่า AB Q ลอจกิ เป็น 0 และถ้าอินพตุ มีคา่ ลอจิกตา่ งกนั ส่งผลใหล้ อจกิ ทางเอาต์พุตเป็นลอจิก 1 00 0 01 1 10 1 11 0 นอ็ ตเกต (NOT gate) นอ็ ตเกตหรือบางครงั้ เรียกว่าอนิ เวอรเ์ ตอร์ น็อตเกต (NOT gate) เปน็ วงจรทีม่ ีอินพตุ เพยี งอนิ พุตเดยี ว เม่ือนาค่า อนิ พุต เอาต์พุต ลอจิกมาผ่านวงจรแลว้ ให้คา่ ลอจิกทางเอาต์พตุ มีค่า ลอจิกตรงข้ามกบั อินพตุ AB QA 01 1 10 0
แนนดเ์ กต (NAND gate), นอรเ์ กต (NOR gate) 14 แนนด์เกตเปน็ การรวมกันสองลอจกิ เกตคือ แอนดเ์ กตกับน็อตเกต โดยเอาต์พุตของแอนดเ์ กตถูกสง่ ให้กับน็อตเกต ดังน้ันเอาตพ์ ตุ ของแนนด์เกตจะมสี ภาวะตรงกนั ข้ามกบั แอนดเ์ กต นอร์เกตเป็นการรวมกันสองลอจกิ เกตคอื ออร์เกตกับนอ็ ตเกต โดยเอาตพ์ ุตของออร์เกตถกู สง่ ให้กับนอ็ ตเกต ดังนน้ั เอาต์พตุ ของนอร์เกตจะมีสภาวะตรงกันข้ามกบั ออร์เกต 1.3 โครงสรา้ งพืน้ ฐานของระบบคอมพวิ เตอร์ ถา้ พดู ถึงระบบคอมพิวเตอร์แล้วหลายท่านอาจมองถึงเคร่ืองคอมพิวเตอร์ที่ใช้งานกันท่ัวไปท่ีมีจอภาพ ตวั เคร่อื ง แป้นพิมพ์ เหล่านี้ แต่ในความเป็นจริงระบบคอมพิวเตอร์ไม่จาเป็นต้องมีหน้าตาอย่างท่ีรู้จัก กันเทา่ นนั้ เพียงแตจ่ ะต้องประกอบด้วยสว่ นต่างๆ ดงั นี้ 1. ส่วนรับขอ้ มลู หรืออินพุต (Input) 2. สว่ นสง่ ขอ้ มูลหรือเอาตพ์ ตุ (Output) 3. สว่ นประมวลผลกลาง (Central processing unit) 4. ส่วนเก็บขอ้ มูลหรือคาสั่งทเี่ รยี กวา่ หนว่ ยความจา (Memory) อินพุต หนว่ ยประมวลผลกลาง เอาตพ์ ุต หนว่ ยความจา รปู ที่ 1-2 โครงสร้างพื้นฐานของระบบคอมพิวเตอร์ โดยสว่ นต่าง ๆ ท้งั หมดประกอบข้นึ ดว้ ยอุปกรณ์วงจรอิเล็กทรอนิกส์ ดังน้ันถ้าหากวงจรอิเล็กทรอนิกส์ ใด ๆ ก็ตามท่ีมีส่วนประกอบครบทั้ง4 ส่วนท่ีกล่าวมาข้างต้นก็จะเป็นระบบคอมพิวเตอร์ทันที ซ่ึงไม่ จาเป็นตอ้ งมีลักษณะเหมอื นกบั คอมพิวเตอรส์ ่วนบุคคล (PC: Personal computer) ที่ใช้งานกันทว่ั ไป สว่ นรบั ขอ้ มลู หรืออินพุต เป็นสว่ นหรอื วงจรท่ใี ช้เช่อื มตอ่ คอมพวิ เตอร์กบั อุปกรณ์ภายนอกโดยทาหน้าท่ีแปลงสญั ญาณจาก อปุ กรณ์ภายนอกให้มีระดับลอจกิ ทเ่ี หมาะสมกับวงจรภายใน เรยี กทับศัพท์ว่าวงจรอินเตอร์เฟช (Interface circuit) เพ่ือส่งต่อให้หน่วยประมวลผลใชเ้ ปน็ ขอ้ มูลประกอบการประมวลผลตามชดุ คา ส่ัง ท่ีได้เขยี นขน้ึ เช่นวงจรแป้นพิมพ์เปน็ วงจรทเี่ ปลย่ี นพลงั งานกลจากการกดแป้นพมิ พเ์ ป็นพลังงานไฟฟา้ ในระดบั แรงดัน 5 โวลตแ์ ละ 0 โวลต์เพื่อเปน็ ลอจิก 1 และลอจกิ 0
สว่ นส่งขอ้ มลู หรอื เอาต์พุต 15 เป็นส่วนหรือวงจรที่ใช้เช่ือมต่อคอมพิวเตอร์กับอุปกรณ์ภายนอก โดยทาหน้าท่ีรับสัญญาณไฟฟ้าจาก หน่วยประมวลผลท่ีเป็นลอจิก 1 และลอจิก 0 ที่ระดับแรงดัน 5 โวลต์และ 0 โวลต์ ส่งให้กับอุปกรณ์ ภายนอกท่ีนาระดบั แรงดนั นี้ไปใช้งาน ส่วนประมวลผลกลาง ส่วนประมวลผลกลางเป็นหัวใจของระบบคอมพิวเตอร์ โดยทาหน้าที่คิดประมวลผลซึ่งมีส่วนการ ประมวลผลทางคณิตศาสตร์และลอจิก (Arithmetic and logic unit) หรือที่เรียกว่าทับศัพท์ว่า ALU โดยการประมวลผลจะกระทา ตามชุดคาส่ังท่เี ก็บไว้ในหนว่ ยความจา สว่ นเกบ็ ขอ้ มลู หรอื คาสัง่ ท่ีเรียกวา่ หนว่ ยความจา เปน็ สว่ นที่ใช้เก็บขอ้ มูลหรือใชเ้ กบ็ ชดุ คาสง่ั ทีเ่ ขยี นขึ้นเพือ่ ให้ระบบคอมพิวเตอร์ทางานอย่างใดอย่าง หนง่ึ ตามตอ้ งการ โดยหนว่ ยความจาท่ีใช้ในระบบคอมพวิ เตอร์มี 2 แบบด้วยกันคือ 1.หน่วยความจาถาวร เป็นหน่วยความจาท่ีมักใช้เก็บโปรแกรม ซึ่งหน่วยความจาชนิดน้ีจะต้อง เปน็ หนว่ ยความจาท่ีสามารถคงขอ้ มูลไว้ได้แมก้ ระทัง้ ไม่มีไฟเลย้ี ง เพ่ือรักษาคาสั่งหรือโปรแกรมไว้เม่ือมี ไฟเลย้ี งจ่ายให้แก่ระบบ คอมพิวเตอร์จะได้สามารถทางานได้ จากคุณสมบัติดังกล่าว มีหน่วยความจา กลุ่มหน่งึ ท่ีรกั ษาข้อมลู ไว้ไดแ้ ต่มีคุณสมบัติอืน่ เพ่ิมเตมิ ขนึ้ มาคือเป็นหนว่ ยความจาที่สามารถอ่านได้เพียง อย่างเดยี วหรือเรยี กกันว่า ROM (Read only memory) ซ่ึงมอี ยู่หลายชนดิ ได้แก่ a) ROM คณุ สมบัติ โปรแกรมจากโรงงานและลบไมไ่ ด้ b) PROM คณุ สมบตั ิ โปรแกรมเองไดค้ รัง้ เดยี วและลบไม่ได้ c) EPROM คุณสมบัติ โปรแกรมเองได้หลายครั้งและลบได้ดว้ ยแสง UV d) E2PROM คุณสมบัติ โปรแกรมเองได้หลายครง้ั และลบได้ด้วยไฟฟา้ e) Flash memory คุณสมบัติ โปรแกรมเองได้หลายครั้งและลบได้ด้วยไฟฟ้า โดย สแตามกาตร่าถงรละบหหวร่าืองแEก2้ไPขRขO้อมMูลกทับี่จัดFเlกa็บshไวm้ในeยmูนิoตrขyอคงหือกนา่วรยลคบวหามรือจแาทก่ี้ไเรขียขก้อวม่าูล\"ซบ่ึงล็อEก2\"PR(BOloMckจ)ะกไรดะ้ ขท้อา ในระดับไบต์ 2. หน่วยความจาช่ัวคราว เป็นหน่วยความจาท่ีใช้พักข้อมูลในระหว่างการประมวลผล โดยเป็น หนว่ ยความจาที่สามารถอ่านไดแ้ ละเขียนขอ้ มูลกลบั ได้ในระดบั ไฟเลีย้ งปกติ และรักษาขอ้ มูลไว้ได้ตราบ ที่ยังมีไฟเล้ียงอยู่ หรือรักษาข้อมูลไว้ได้ตราบที่ยังไม่มีข้อมูลใหม่มาทับข้อมูลเดิม จากคุณสมบัติที่ ตอ้ งการดังกล่าวมหี น่วยความจาที่มใี ห้ใชง้ านเพียงแต่จะไม่สามารถรักษาข้อมูลไว้ได้ถ้าไม่มีไฟเลี้ยง ซึ่ง หน่วยความจาแบบน้ีสามารถอ่านและเขียนข้อมูลแบบสุ่มตาแหน่งได้ท่ีเรียกว่า RAM (Random access memory)
1.4 ไมโครคอนโทรลเลอร์ Arduino 16 \"Arduino is an open-source electronics prototyping platform based on flexible, easy-to-use hardware and software. It's intended for artists, designers, hobbyists, and anyone interested in creatinginteractive objects or environments.\" [ www.arduino.cc] “Arduino เป็นแพลตฟอร์มต้นแบบ ด้านอเิ ล็กทรอนิกส์แบบโอเพน่ ซอรส์ ซ่ึงใช้ฮาร์ดแวร์และซอฟท์แวร์ที่ยืดหยุ่นและใช้งานง่าย มีไว้สาหรับศิลปิน นัก ออกแบบ งานอดิเรกและทุกคนท่สี นใจในการสร้างวัตถุเชงิ โต้ตอบหรือสภาพแวดล้อม” โครงการ Arduino เดิมก่อตั้งมาด้วยผู้ร่วมก่อต้ัง 5 คน ได้แก่ Massimo Banzi, David Cuartielles,David Mellis, Tom Igoe, และ Gianluca Martino โดยเร่ิมโครงการมาตั้งแต่ช่วงปี 2005 ความหมายของคาว่า Arduino แปลว่า เพื่อนแท้ (Strong friend หรือ Brave friend) ในภาษาอิตาลี โดยผู้ก่อตั้งมีความต้ังใจให้ราคา ของอุปกรณ์น้ันถูกเมื่อเทียบกับไมโครคอนโทรลเลอร์ตระกูลอ่ืน ๆ เพื่อให้ทุกคนสามารถเข้าถึงได้โดยง่าย แพลตฟอร์ม Arduino ได้ออกแบบมาเพื่อให้ใช้งานง่าย ผู้ใช้งานไม่จาเป็นต้องมีความรู้เก่ียวกับโครงสร้าง สถาปัตยกรรมภายในซีพียูโดยรเู้ พยี งว่าบอรด์ Arduino ทีเ่ ลอื กมาใช้งานน้ันมีขาท่ีใช้งานอะไรบ้างมีคุณสมบัติต่างๆ อะไรบ้างก็สามารถใช้งานได้ ด้วยประสบการณ์และจานวณการใช้งานของผู้ใช้จานวนมาก Arduino จึงถูกใช้งาน ด้านต่างๆ มากมาย เนื่องจากการเขียนโค้ดโปรแกรมควบคุมการทางานของ Arduino มีความง่ายและยืดหยุ่น สามารถใช้งานในระดับสูงได้อีกด้วย เครื่องมือท่ีใช้สาหรับเขียนโค้ดควบคุมมีเวอร์ช่ันท่ีสามารถรันได้ในทุก ระบบปฏิบัติการไม่ว่าจะเป็น แมคอินทอช วินโดวส์หรือแม้กระท้ังลีนุกซ์ก็ตามทาให้ได้รับความนิยมเป็นอย่างสูง แพลตฟอรม์ Arduino ประกอบไปดว้ ย ฮารต์ แวร์, ซอฟตแ์ วร์ ฮารต์ แวร์ (Hardware) เป็นบอร์ดอิเล็กทรอนิกส์ขนาดเล็กที่มีไมโครคอนโทรลเลอร์เป็นช้ินส่วนหลัก ประกอบร่วมกับอุปกรณ์ อิเล็กทรอนิกส์อ่นื ๆ เพื่อใหง้ ่ายตอ่ การใช้งานหรอื ท่ีเรียกกันว่า “บอร์ด Arduino” โดยบอร์ด Arduino ก็มีหลายรุ่น ให้เลือกใช้ตามความเหมาะสมของงาน โดยในแต่ละรุ่นอาจมีความแตกต่างกันในเร่ืองของขนาดของบอร์ด หรือ สเปค เชน่ จานวนของขารบั ส่งสัญญาณ, แรงดันไฟท่ใี ช้, ประสิทธภิ าพของ MCU เปน็ ต้น ซอฟตแ์ วร์ (Software) - ภาษาที่ใช้เขียนโค้ดควบคุมบอร์ด Arduino เป็นภาษาสาหรับเขียนโปรแกรมควบคุมที่มีไวยากรณ์แบบ เดียวกับภาษา C/C++ - Arduino IDE เป็นเคร่ืองมือสาหรบั เขียนโคด้ โปรแกรม การคอมไพลโ์ ปรแกรม (การแปลงไฟล์ภาษาซีให้เป็น ภาษาเครอื่ ง) และอปั โหลดโปรแกรมลงบอรด์ ตวั อย่างบอรด์ Arduino ที่นยิ มนามาใช้งาน รปู ที่ 1-3 บอร์ด Arduino UNO รูปที่ 1-4 บอร์ด Arduino Nano
17 แบบทดสอบหลงั เรยี น บทท่ี 1
18 แบบทดสอบกอ่ นเรยี น บทท่ี 2
19 บทที่ 2 การเขียนโปรแกรมภาษาซีสาหรับไมโครคอนโทรลเลอร์ หวั ขอ้ เรอื่ ง 2.1 ขน้ั ตอนในการพฒั นาโปรแกรม 2.2 ภาษาซีสาหรบั ไมโครคอนโทรลเลอร์ สาระสาคัญ การเขยี นโปรแกรมควบคมุ การทางานไมโครคอนโทรลเลอร์ด้วยภาษาซี เป็นการเขียนโปรแกรมท่ี มีความยดื หย่นุ มากกว่าและสามารถพฒั นางานได้เรว็ กวา่ การเขียนโปรแกรมดว้ ยภาษาแอสเซมบลี การ เขยี นโปรแกรมเพอ่ื ควบคุมการทางานของ Arduino ยึดหลักวิธีการเขียนตามไวยากรณ์ภาษาซี ดังน้ัน เม่อื สามารถเขียนโปรแกรมควบคุมการทางานไมโครคอนโทรลเลอร์ Arduino นี้ได้ก็สามารถนาความรู้ ไปเขยี นโปรแกรมภาษาซีไมโครคอนโทรลเลอร์อ่ืนๆ ได้ สมรรถนะประจาหน่วยการเรยี นรู้ แสดงความรู้เกี่ยวกับการเขียนผังงาน (Flow chart) การตรวจสอบความถูกต้องของการเขียน โปรแกรมจากผังงาน และสามารถเขียนโปรแกรมจากผังงาน จดุ ประสงค์การเรียนรู้ จุดประสงคท์ ั่วไป 1. เพอ่ื ใหม้ คี วามร้เู ก่ียวกับข้ันตอนในการพัฒนาโปรแกรม 2. เพอ่ื ใหม้ คี วามรู้เกยี่ วกับภาษาซสี าหรบั ไมโครคอนโทรลเลอร์ 3. เพ่อื ให้มคี วามรเู้ ก่ียวกับการสรา้ งฟงั กช์ ่ันรองขน้ึ ใช้เอง จดุ ประสงค์เชิงพฤตกิ รรม 1. บอกเกย่ี วกับขน้ั ตอนในการพัฒนาโปรแกรมได้ 2. บอกเกี่ยวกบั ภาษาซสี าหรบั ไมโครคอนโทรลเลอร์ได้ 3. บอกวิธกี ารสร้างฟังกช์ น่ั รองข้ึนใชเ้ องได้ 4. ทาแบบฝึกหัดเสร็จทันเวลาและทาแบบทดสอบผ่านเกณฑ์ทก่ี าหนด
การเขยี นโปรแกรมภาษาซีสาหรบั ไมโครคอนโทรลเลอร์ 20 การใช้งานไมโครคอนโทรลเลอร์นอกจากจะต้องมีวงจรไมโครคอนโทรลเลอร์และมีส่วน ของวงจรเชื่อมต่อ กับอปุ กรณ์ภายนอกเพ่อื ใช้ในการควบคมุ งานตา่ งๆ ตามต้องการที่เรียกว่าฮาร์ดแวร์ (Hardware) แล้วจาเป็นต้องมี ชุดคาส่ังหรือโปรแกรมไว้สาหรับสั่งงานให้ไมโครคอนโทรลเลอร์ทางานตามท่ีต้องการซ่ึงเรียกว่าซอฟท์แวร์ (Software) ในบทนี้เปน็ การเรยี นร้หู ลักการเขยี นโปรแกรมควบคมุ การทางานของไมโครคอนโทรลเลอร์ 2.1 ขัน้ ตอนในการพฒั นาโปรแกรม โปรแกรมคอมพิวเตอร์ท่นี ามาใช้งานได้น้ันไม่สามารถเร่ิมต้นจากการเขียนคาสั่งด้วยภาษาคอมพิวเตอร์ได้ ทันที จะต้องมกี ารวิเคราะห์ วางแผนและปฏิบตั ติ ามกระบวนการทางาน ซง่ึ แบ่งออกเป็น 5 ขั้นตอน คอื 1. วิเคราะห์ปัญหา โดยจะเริ่มจากการวิเคราะห์ผลลัพธ์ที่ต้องการ (Output) แล้วย้อนกลับไปยังข้อมูลท่ี นาเข้าส่รู ะบบ (Input) ตลอดจนขอ้ มลู อื่น ๆ ทเ่ี กีย่ วข้องในการท่จี ะนาไปใชใ้ นการ ประมวลผล 2. ออกแบบวิธกี ารแกป้ ญั หา เม่ือทราบผลลัพธ์ท่ีต้องการและข้อมูลที่นาเข้าสู่ระบบแล้ว ต้องกาหนดการ วางแผนในการแก้ปัญหา โดยใช้วิธีเขียนลาดับข้ันตอนการแก้ปัญหาที่เรียกว่าอัลกอริทึม (Algorithm ) และใช้ เคร่ืองมือสาหรับช่วยในการเขียนอัลกอริทึมเช่น การเขียนรหัสจาลอง (Pseudo code) การเขียนผังงาน (Flowchart) เปน็ ต้น 3. เขียนโปรแกรม เลือกภาษาคอมพิวเตอร์ท่ีเหมาะสม โดยพิจารณาจากความสามารถของผู้เขียน โปรแกรมและประสิทธิภาพของภาษาคอมพิวเตอร์นัน้ ๆ ให้เหมาะสมกับระบบงานที่ต้องการแล้วเขียนชุดคาสั่งเป็น ภาษาคอมพิวเตอร์ตามอัลกอริทมึ ทไ่ี ด้ออกแบบไว้ 4. ทดสอบและแกไ้ ขโปแกรม ภายหลังจากเขยี นโปรแกรมเสร็จส้ิน จะต้องทาการทดสอบโปรแกรมเพ่ือหา ขอ้ ผดิ พลาด (Error) ซ่ึงข้อผิดพลาดท่ีพบในขั้นตอนการทดสอบโปรแกรมนั้นจะต้องนามาปรับปรุงแก้ไขโปรแกรม เพ่อื ใหส้ ามารถทางานไดต้ ามตอ้ งการ 5. จัดทาเอกสารประกอบ เม่ือโปรแกรมผ่านการทดสอบแล้วก็จะต้องจัดทาเอกสารประกอบซ่ึงมี รายละเอียดของวิธีการใช้งานโปรแกรม วิธีการติดตั้งโปรแกรม ตลอดจนขั้นตอนในการพัฒนาโปรแกรม รวมถึง อัลกอริทึมและโปรแกรมต้นฉบับ (Source code) เพ่ือประโยชน์ในกรณีท่ีต้องการแก้ไขหรือปรับปรุงโปรแกรม ภายหลงั ขนั้ ตอนวิธี หรอื Algorithm (ภาษาไทย : อลั กอรทิ ึม) หมายถึงกระบวนการแกป้ ญั หาท่ีสามารถเข้าใจได้ มี ลาดบั หรือวิธกี ารในการแก้ไขปญั หาใดปัญหาหน่ึงอยา่ งเปน็ ข้ันเป็นตอนและชัดเจน เมอ่ื นาเขา้ อะไรแล้วจะต้องได้ผล ลัพธ์เช่นไร ซึ่งแตกต่างจากการแก้ปัญหาแบบสามัญสานึก หรือ ฮิวริสติก (Heuristic) โดยท่ัวไปข้ันตอนวิธีจะ ประกอบด้วย วิธีการเป็นข้ันๆ และมีส่วนท่ีต้องทาแบบวนซ้าหรือเวียนเกิดโดยใช้ตรรกะ และ/หรือ ในการ เปรียบเทียบในขน้ั ตอนตา่ งๆ จนกระทง่ั เสร็จสนิ้ การทางาน ในการทางานอย่างเดียวกันเราอาจจะเลือกข้ันตอนวิธีที่ต่างกันเพ่ือแก้ปัญหาได้โดยท่ีผลลัพธ์ที่ ได้ในขั้น สุดท้ายจะออกมาเหมือนกันหรือไม่ก็ได้ และจะมีความแตกต่างท่ีจานวนและชุดคาส่ังท่ีใช้ต่างกันซ่ึงส่งผลให้เวลา และขนาดหนว่ ยความจาที่ต้องการตา่ งกัน หรือเรยี กได้อีกอย่างว่ามคี วามซบั ซ้อนต่างกัน
21 การนาขั้นตอนวิธีไปใช้ไม่จากัดเฉพาะการเขียนโปรแกรมคอมพิวเตอร์แต่สามารถนาไปใช้กับ ปัญหาอื่นๆ ได้เช่น การออกแบบวงจรไฟฟ้า, การทางานเคร่ืองจักรกล, หรือแม้กระท่ังปัญหาใน ธรรมชาติ เช่น วิธขี องสมองมนุษย์ในการคิดเลขหรอื วธิ ีการขนอาหารของแมลง ผังงาน (Flowchart) คือ รูปภาพ (Image) หรือสัญลักษณ์ (Symbol) ท่ีใช้เขียนแทนขั้นตอน คาอธิบาย ข้อความ หรือคาพูดท่ีใช้ในอัลกอริทึม (Algorithm) เพราะการนาเสนอขั้นตอนของงานให้ เข้าใจตรงกันระหว่างผเู้ กี่ยวข้อง ดว้ ยคาพดู หรอื ข้อความทาไดย้ ากกวา่ ผงั งานในการเขยี นโปรแกรมเปน็ รูปทรงเลขาคณิต ท่ีบรรจุรายละเอียดกระบวนการประมวลผล โดยมีรปู ทรงในการใชง้ านหลักๆ (เฉพาะงานไมโครคอนโทรลเลอร์) ดงั นี้ ตารางที่ 2-1 ผังงานหลกั ทใ่ี ชง้ านไมโครคอนโทรลเลอร์ รปู ทรง ชนิดการประมวลผล ตัวอยา่ งเส้นทาง จดุ เรมิ่ ต้นหรอื จดุ สิน้ สุด ของโปรแกรม กระบวนการประมวลผล การตัดสินใจ ชุดกระบวนการท่เี ตรยี ม ไว้แลว้ (โปรแกรมยอ่ ย) จุดเช่อื มในหนา้ เดียวกนั จุดเช่ือมในหนา้ อืน่
ตัวอย่างการเขยี นลาดับขนั้ ขัน้ ตอนวธิ ี และการแปลงเป็นผงั งาน 22 ยกตัวอยา่ งในชีวติ ประจาวันเพอื่ ให้ง่ายต่อการจนิ ตนาการ โจทย์การทาไข่เจยี วหมสู บั ข้นั ท่ี 1 เขียนลาดบั ขน้ั (Algorithm) 1. เตรยี มวสั ดุ ไข่,หมูสับ,กระทะ,เตาไฟ,น้ามันพืช,ถว้ ย,จาน 2. เอากระทะต้งั ไฟ (อนุ่ กระทะ) 3. ใสน่ า้ มนั พืช 4. ตอกไข่ใสถ่ ว้ ยใสห่ มสู ับ 5. ตจี นเข้ากนั 6. ถา้ กระทะรอ้ นใสไ่ ขล่ งไป 7. รอให้หน่ึงด้านสุก 8. กลบั ดา้ น 9. รอให้ดา้ นที่ 2 สุก 10. ตกั ออกใส่จาน (เสร็จ) ข้นั ท่ี 2 แปลงลาดบั ขนั้ เปน็ ผังงาน (Flowchart) เรมิ่ B เตรยี มวสั ดุ ไข่,หมูสับ, ใสไ่ ข่ลงกระทะ กระทะ... ด้าน 1 ไมใ่ ช่ เอากระทะตงั้ ไฟ สุกหรอื ไม่ ใส่นา้ มนั พชื ใช่ ตอกไข่ใส่ถ้วยใสห่ มสู ับ กลบั ด้าน ตไี ข่ ดา้ น 2 ไม่ใช่ สุกหรอื ไม่ เขา้ กนั ไมใ่ ช่ หรอื ไม่ ไมใ่ ช่ ใช่ ใช่ ตกั ใส่จาน กระทะร้อน เสร็จ หรอื ไม่ ใช่ B
ตัวอยา่ งการเขยี นโปรแกรมไมโครคอนโทรลเลอร์ 23 ตวั อย่างจงเขยี นโปรแกรมไฟกระพริบ LED ทตี่ ่ออยู่ที่ขา D13 ขน้ั ท่ี 1 เขยี นลาดบั ขนั้ (Algorithm) ขัน้ ท่ี 2 แปลงลาดับขน้ั เป็นผงั งาน (Flowchart) 1. กาหนดชือ่ LED กบั ขาที่เชือ่ มต่อ START 2. กาหนดโหมดของขาใชง้ าน กาหนดช่ือ LED 3. เขยี นลอจกิ 1 ไปท่ีขาเช่อื ม LED เขียนลอจกิ 1 ไปทข่ี า 4. หนว่ งเวลา 5. เขยี นลอจกิ 2 ไปที่ขาเชือ่ ม LED หน่วงเวลา 6. หน่วงเวลา เขียนลอจกิ 0 ไปท่ขี า 7. กระโดดกลับไปทาในขัน้ ตอนท่ี 3 หน่วงเวลา ข้ันท่ี 3 แปลงผงั งานเปน็ โปรแกรม // turn the LED on (HIGH is the voltage level) #define LED 13 // wait for a second void setup() // turn the LED off by making the voltage LOW { // wait for a second pinMode(LED, OUTPUT); } void loop() { digitalWrite(LED, HIGH); delay(1000); digitalWrite(LED, LOW); delay(1000); } 2.2 ภาษาซีสาหรับไมโครคอนโทรลเลอร์ ไมโครคอนโทรลเลอร์ไม่ว่าจะเป็นตระกูลใดก็ตามจะทางานได้ก็ต่อเมื่อมีชุดคาส่ังที่สั่งให้ทางานตามท่ีต้องการท่ี เรียกว่าโปรแกรม โดยคาสั่งหรือโปรแกรมที่ไมโครคอนโทรลเลอร์เข้าใจและสามารถทางานได้อยู่ในรูปของรหัส ลอจิก 0 และ 1 หากนาลอจิกมาจับกลมุ่ ก็เป็นเลขฐาน 16 ทีเ่ รียกวา่ ภาษาเคร่อื งซึ่งภาษาเคร่อื งเปน็ ภาษาท่ีมนุษย์ไม่ สามารถเข้าใจได้เนื่องจากเป็นเลขฐาน 16 ทั้งหมด ดังนั้นในการเขียนโปรแกรมจึงจาเป็นต้องใช้ภาษาที่มนุษย์ สามารถเข้าใจได้ โดยภาษาท่ีมนุษย์เขา้ ใจไดแ้ ละใกลเ้ คียงกับภาษาเคร่ืองมากท่ีสุดคือภาษาแอสเซมบลีแต่เน่ืองจาก การพฒั นางานโดยใช้ภาษาแอสเซมบลีเปน็ ไปไดย้ ากและซับซ้อน เพื่อให้ง่ายและรวดเร็วต่อการพัฒนาโปรแกรมใช้ งานไมโครคอนโทรลเลอรภ์ าษาทีเ่ หมาะสมคอื ภาษาซี
โครงสรา้ งของภาษาซี 24 ภาษาซีเป็นภาษาที่ได้รบั ความนยิ มสงู เปน็ ภาษาโครงสร้างงา่ ยต่อการทาความเข้าใจง่ายต่อการนาไปพัฒนา ต่อ สามารถเขียนโปรแกรมแยกเป็นส่วนๆ โดยแต่ละส่วนสามารถเรียกใช้งานได้จากส่วนอ่ืนของโปรแกรมทาให้ สามารถแบ่งงานให้หลายคนไปพัฒนาได้ การเขียนโปรแกรมเป็นส่วนๆ เรียกว่าฟังก์ชั่น โครงสร้างของภาษาซีมี ส่วนประกอบ 2 ส่วนคือ ส่วนหัวโปรแกรมและส่วนตัวโปรแกรมส่วนตัวโปรแกรมจะมีฟังก์ช่ันหลักช่ือว่า main( ) เพอื่ เป็นสว่ นหลักในการทางาน และอาจมฟี งั กช์ ่ันอื่นทผี่ ูใ้ ช้เขียนขน้ึ เพอ่ื ใชง้ านเรยี กวา่ ฟังก์ชน่ั รอง หัวโปรแกรม ตัวโปรแกรม ฟงั ก์ชน่ั หลัก main( ) ฟงั กช์ นั่ รองทเ่ี ขยี นเพิ่มขึน้ รปู ที่ 2-1 โครงสร้างภาษาซี โครงสรา้ งของภาษาซสี าหรบั Arduino โครงสร้างภาษาซสี าหรบั Arduino ถกู จดั ใหมใ่ หง้ า่ ยตอ่ ผูใ้ ช้งานเบอื้ งต้นซ่ึงผู้ออกแบบไดจ้ ดั วาง ใหผ้ ใู้ ชง้ านได้ใชง้ านงา่ ยซง่ึ โครงสร้างหลกั ๆ จะมเี พียง 2 สว่ นเทา่ นั้นคอื 1. setup เป็นสว่ นทีเ่ ก็บฟังกช์ ั่นท่ีทางานครงั้ เดยี ว 2. loop เป็นสว่ นทเ่ี ก็บฟงั กช์ นั่ ที่เม่อื ทางานครบแล้วจะวนกลับมาทาซา้ ใหม่ตง้ั แต่ตน้ แตถ่ ้าตอ้ งการเขยี นโปรแกรมขน้ั สูงสามารถเขียนในส่วนหวั โปรแกรมและส่วนของฟงั กช์ นั่ รองท่ี เขยี นข้ึนใชง้ านเองเพ่ือใหใ้ ชง้ านสะดวกมากย่ิงข้ึนได้เชน่ เดียวกบั ภาษาซีมาตรฐาน หัวโปรแกรม ตวั โปรแกรม ตัวโปรแกรม ฟงั ก์ชัน่ ท่ีทางานคร้งั เดียว setup( ) ฟังก์ช่ันทท่ี างานคร้งั เดยี ว setup( ) ฟงั กช์ นั่ ทีเ่ วยี นกลับทางานวนซา้ loop( ) ฟังกช์ ัน่ ท่ีเวยี นกลบั ทางานวนซา้ loop( ) ฟังกช์ ่นั รองท่เี ขยี นข้ึนเอง (พนื้ ฐาน) (ข้ันสูง) รูปท่ี 2-2 โครงสร้างภาษาซสี าหรบั Arduino
ตวั อย่างโปรแกรมทเี่ ขยี นด้วยโครงสร้างแบบพื้นฐาน 25 void setup() ฟงั กช์ ัน่ ที่ทางานคร้ังเดยี ว setup( ) { ฟงั ก์ช่นั ท่เี วยี นกลับทางานวนซ้า loop( ) Serial.begin (9600); pinMode (2,OUTPUT); pinMode (3,OUTPUT); pinMode (4,OUTPUT); pinMode (5,OUTPUT); } void loop() { digitalWrite (2,HIGH); digitalWrite (3,LOW); digitalWrite (4,LOW); digitalWrite (5,LOW); delay (200); digitalWrite (2,LOW); digitalWrite (3,HIGH); digitalWrite (4,LOW); digitalWrite (5,LOW); delay (200); digitalWrite (2,LOW); digitalWrite ( 3,LOW); digitalWrite (4,HIGH); digitalWrite( 5,LOW); delay (200); digitalWrite (2,LOW); digitalWrite (3,LOW); digitalWrite (4,LOW); digitalWrite (5,HIGH); delay (200); }
ตัวอยา่ งโปรแกรมทเ่ี ขยี นดว้ ยโครงสร้างแบบขัน้ สงู (ทใ่ี หผ้ ลแบบเดยี วกับขน้ั พืน้ ฐาน) 26 #define LED1 2 หวั โปรแกรม #define LED2 3 #define LED3 4 #define LED4 5 char LED_pin[] = {LED1,LED2,LED3,LED4}; void send2port(byte data); void setup() ฟังก์ชน่ั ทที่ างานครงั้ เดียว setup( ) { ฟังก์ช่นั ที่เวยี นกลับทางานวนซา้ loop( ) Serial.begin (9600); for (char i=0;i<4;i++) { pinMode (LED_pin[i],OUTPUT); } } void loop() { send2port(0B1000);delay(200); send2port(0B0100);delay(200); send2port(0B0010);delay(200); send2port(0B0001);delay(200); } void send2port(byte data) ฟังกช์ ัน่ รองท่ีเขยี นขน้ึ เอง { if (data & 1 ){digitalWrite(LED_pin[0],HIGH);} else {digitalWrite(LED_pin[0],LOW);} if (data & 2 ){digitalWrite(LED_pin[1],HIGH);} else {digitalWrite(LED_pin[1],LOW);} if (data & 4 ){digitalWrite(LED_pin[2],HIGH);} else {digitalWrite(LED_pin[2],LOW);} if (data & 8 ){digitalWrite(LED_pin[3],HIGH);} else {digitalWrite(LED_pin[3],LOW);} }
ตัวแปรในภาษาซี 27 การประกาศตัวแปรคือการจองพื้นที่ในหน่วยความจาเพื่อนาไปใช้งานในฟังก์ช่ัน โดยการใช้ชื่อตัวแปรแทนการ กาหนดเปน็ คา่ แอดเดรสของหนว่ ยความจารปู แบบของการประกาศตัวแปรเปน็ ดังนี้ ชนิดของตัวแปร ช่อื ตัวแปร; หรือ ช่อื ตวั แปรที่1,ชื่อตัวแปรที่ 2,…; ชนิดของตวั แปร หลักการต้ังชอื่ ตวั แปรในภาษาซี หลักการตง้ั ชือ่ ตวั แปรมีขอ้ กาหนดหลักๆอยู่ 4 ประการด้วยกนั คือ 1. ชอ่ื ทีต่ ง้ั ตอ้ งไมซ่ ้ากับคาสงวนของภาษาซี (คาที่ภาษาซีมใี ชง้ านอยแู่ ล้ว) 2. การใช้ตวั อกั ษรใหญ่กบั ตวั อักษรเลก็ ถอื ว่าเป็นคนละตัว 3. ตวั แรกของชอ่ื ตวั แปรตอ้ งเปน็ ตัวอักษรเท่านนั้ ตวั ถัดไปเปน็ ตัวเลขได้ 4. ช่ือตัวแปรห้ามเวน้ วรรค ชนิดของตวั แปรในภาษาซีสาหรับไมโครคอนโทรลเลอร์ Arduino ตารางท่ี 2-2 ชนิดของตวั แปรในภาษาซสี าหรบั ไมโครคอนโทรลเลอร์ Arduino ชนิด ขนาด ขอบเขต บิต ไบต์ boolean 81 true, false char 81 -128 ถึง +127 unsigned char 81 0 ถงึ 255 byte 81 0 ถงึ 255 int 16 2 -32768 ถึง +32767 unsigned int 16 2 0 ถึง 65535 long 32 4 -2147483648 ถงึ +2147483647 unsigned long 32 4 0 ถึง 4294967295 float 32 4 ±3.4E±38 (~7 digits) double 64 8 ±1.7E±308 (~15 digits)
พอยน์เตอร์ 28 พอยน์เตอร์เปน็ ตัวชีต้ าแหน่งข้อมลู ของตวั แปรอน่ื ท่ีเกบ็ ในหนว่ ยความจาโดยตัวพอยนเ์ ตอร์เป็นตัวเก็บตาแหน่งแทน การเกบ็ ข้อมูล ในการใช้งานพอยน์เตอร์จะใช้เครื่องหมาย * นาหน้าและใช้เคร่ืองหมาย & เม่ือต้องการค่าตาแหน่ง ของตัวแปรอ่นื โดยมรี ูปแบบดังนี้ รูปแบบ ชนดิ ของตัวแปร * ช่อื ตัวแปร; ตัวอย่าง int *n; int i; i=10; n=&i; อาร์เรย์ อาร์เรย์เปน็ การเพิ่มความสามารถในการเกบ็ ข้อมูลของตวั แปรให้สามารถเก็บเป็นชุดได้ โดยใช้ช่ือตัวแปร เดมิ ได้ การใช้งานตวั แปรอารเ์ รยจ์ ะใชเ้ ครอ่ื งหมาย [ ] ตอ่ ท้ายตัวแปรโดยภายในวงเล็บเป็นตวั เลข ซ่ึงสามารถใช้งาน ไดห้ ลายมิติ มรี ูปแบบดงั น้ี รปู แบบ ชนดิ ของตวั แปร ชอ่ื ตัวแปร[ตวั เลข]; // เปน็ อาร์เรย์ 1 มติ ิ ชนดิ ของตวั แปร ชอ่ื ตัวแปร[ตวั เลข,ตวั เลข]; // เปน็ อาร์เรย์ 2 มติ ิ ชนิดของตวั แปร ชือ่ ตวั แปร[ตวั เลข,ตวั เลข,ตวั เลข]; // เปน็ อารเ์ รย์ 3 มติ ิ ตวั อยา่ งอาร์เรย์ 1 มติ ิ ตวั อยา่ งอาร์เรย์ 2 มิติ ������[0,1] ������[0,2] int ������[4]; int ������[3,3]; ������[0,0] ������[1,1] ������[1,2] ������[2,1] ������[2,2] ������[0] ������[1] ������[2] ������[3] ������[1,0] ตัวอยา่ งอารเ์ รย์ 3 มิติ ������[2,0] ������[0,0,0] ������[1,0,0] ������[0,1,0] ������[0,2,0] ������[2,0,0] ������[1,1,0] ������[1,2,0] ������[2,1,0] ������[2,2,0]
ตวั ดาเนนิ การในภาษาซี 29 ตวั ดาเนินการในภาษาซีแบ่งตามลกั ษณะการกระทา ได้ 5 กล่มุ ด้วยกันคอื 1. ตัวกระทาทางคณิตศาสตร์ 2. ตวั กระทาทางลอจิกระดับบิต 3. ตัวกระทาบลู นี 4. ตวั กระทาเปรยี บเทยี บ 5. ตวั กระทาประสม โดยในแต่ละลักษณะมรี ายละเอียดดงั ตอ่ ไปน้ี ตารางท่ี 2-3 ตัวกระทาทางคณติ ศาสตร์ เครอื่ งหมาย การกระทา ตวั อยา่ ง คาอธิบาย + บวก x = ������ + ������; xเท่ากับค่าในตวั แปร ������ บวกกับค่าในตัวแปร ������ - ลบ x = ������ − ������; x เท่ากับคา่ ในตวั แปร ������ ลบดว้ ยค่าในตวั แปร ������ * คูณ x = ������ ∗ ������; x เท่ากบั ค่าในตวั แปร ������ คูณด้วยค่าในตัวแปร ������ / หาร x = ������/������; x เท่ากบั ค่าในตวั แปร ������ หารดว้ ยคา่ ในตวั แปร ������ % หารเอาเศษ x = ������%������; x เทา่ กบั เศษของการหารระหวา่ งตัวแปร ������ กบั ตัวแปร ������ ตารางท่ี 2-4 ตัวกระทาทางลอจิก ตวั อย่าง คาอธิบาย เครอ่ื งหมาย การกระทา x = ������&������; xเทา่ กบั คา่ ในตัวแปร ������ แอนด์กับคา่ ในตัวแปร ������ & แอนด์ | ออร์ x = ������|������; x เทา่ กับคา่ ในตัวแปร ������ ออร์กับคา่ ในตวั แปร ������ ^ เอ็กซค์ ลซู ฟิ ออร์ x = ������^������; x เท่ากบั คา่ ในตัวแปร ������ เอ็กซ์คลูซิฟออร์กบั ������ ~ วันคอมพลีเมนต์ x=~������; x เท่ากับคา่ ตรงข้ามของคา่ ในตวั แปร ������ << เลอ่ื นไปทางซา้ ย x = x<<1; เลือ่ นข้อมูลใน x ไปทางซ้ายไป 1 บติ >> เลอ่ื นไปทางขวา x = x ≫ 2; เลื่อนขอ้ มลู ใน x ไปทางขวาไป 2 บิต
ตารางที่ 2-5 ตวั กระทาบลู นี 30 เครื่องหมาย การกระทา คาอธบิ าย && แอนด์ เชอ่ื มเง่อื นไข 2 เงือ่ นไขด้วยคา วา่ “และ” || ออร์ เชื่อมเงอ่ื นไข 2 เงอ่ื นไขดว้ ยคา วา่ “หรอื ” ! อินเวริ ์ส ใช้ตรวจสอบตวั แปรว่าเท่ากับศูนย์หรือไม่เชน่ if (!x) ตารางที่ 2-6 ตัวกระทาการเปรียบเทียบ เคร่อื งหมาย การกระทา ตัวอยา่ ง คาอธบิ าย x มากกวา่ 10 > มากกวา่ x>10 x นอ้ ยกว่า 10 x มากกว่าหรือเทา่ กบั 10 < นอ้ ยกว่า x<10 x น้อยกวา่ หรือเทา่ กับ 10 x เทา่ กบั 10 >= มากกวา่ หรือเท่ากับ x>=10 x ไม่เทา่ กับ 10 <= นอ้ ยกวา่ หรอื เท่ากับ x<=10 = = เทา่ กบั x= =10 != ไม่เท่ากับ x!=10 ไวยากรณ์ภาษาซี 1. ประกาศชื่อแทน เปน็ การประกาศใช้ชื่ออ่ืนแทนคา่ ท่ตี อ้ งการเพอื่ ใหส้ ะดวกตอ่ การเขยี น โปรแกรม รปู แบบเป็นดงั น้ี #define constantName value constantName: ชื่อที่ตอ้ งการกาหนดตั้ง value: ค่าทตี่ ้องการกาหนดให้ชอื่ นนั้ มีคา่ เทา่ กับ ตวั อยา่ ง #define LED 13 หมายถงึ กาหนดให้คาว่า LED มีคา่ เทา่ กบั 13
31 2. การรวมไฟล์อื่นเข้ามารว่ ม เปน็ การประกาศไฟลอ์ ่นื ๆ เข้ามารวมกบั ตวั โปรแกรมก่อนการคอมไพล์ รปู แบบเปน็ ดงั นี้ #include <file> #include \"file\" file: ชื่อไฟล์ท่ีต้องการนาเข้ามารวมกบั โค้ดโปรแกรมที่กาลงั เขยี นข้นึ ตวั อย่าง #include <SPI.h> หมายถงึ ใหโ้ ปรแกรมคอมไพลเลอร์ทาการรวมไฟล์ท่ชี ือ่ SPI.h กอ่ นทาการคอมไพล์ 3. การใส่หมายเหตลุ งในโค้ดโปรแกรม เป็นการใสข่ อ้ ความใดๆ ลงในโคด้ โปรแกรมเพื่อท่ีจะอธิบาย โปรแกรมหรือเพื่อบันทกึ ความจาวา่ โค้ดในตาแหนง่ น้นั ๆ เขียนขึน้ เพื่อประสงค์ส่งิ ใด การใสห่ มายเหตุ จะตอ้ งใสเ่ คร่อื งหมายเพือ่ ให้คอมไพล์เลอร์ขา้ มการคอมไพล์ในส่วนน้ี รปู แบบเป็นดงั นี้ //................ ใชใ้ นกรณีบรรทดั เดยี ว /*..............*/ ใชใ้ นกรณีหลายบรรทัด 4. การใสเ่ ครื่องหมายทา้ ยฟงั ก์ชัน่ ภาษาซเี ปน็ ภาษาทมี่ ีการใสเ่ ครือ่ งหมายท้ายฟังก์ชน่ั ซง่ึ เปน็ สิ่งท่ีแตกตา่ ง และโดดเดน่ กว่าโปรแกรมในภาษาอื่นๆ โดยมีหลกั คิดดงั น้ี ; สาหรับฟังก์ชน่ั ทที่ างานเสรจ็ สิน้ ในตวั /*..............*/ ใช้ในกรณหี ลายบรรทัด ฟังกช์ น่ั การดาเนนิ การแบบทางเลือก ในการเขียนโปรแกรมเพอื่ ให้ไมโครคอนโทรลเลอร์ทางานในส่ิงที่ต้องการ นอกจากฟังก์ชั่นท่ีสั่งให้ทางานเป็นลาดับ แลว้ จาเป็นตอ้ งใช้ฟังก์ชน่ั ท่มี ีการทางานแบบให้เลือกเส้นทางการทางาน โดยการทาตามเง่ือนไข หรือการให้ทาซ้า แบบมเี งือ่ นไขหรือไมม่ ีเง่อื นไข โดยฟังกช์ น่ั ท่มี กี ารทางานแบบทางเลอื กในภาษาซมี ีดว้ ยกัน 4 ฟังก์ชนั่ คือ
1. ฟังก์ชั่น if 32 2. ฟงั กช์ น่ั if-else 3. ฟังก์ชน่ั if-else if-else 4. ฟังกช์ ั่น switch ฟงั กช์ ัน่ if (ทางเลือกเดียว) ฟังกช์ น่ั if เป็นฟังก์ช่ันทม่ี ีการตรวจสอบเงอื่ นไข โดยถา้ เงือ่ นไขเปน็ จรงิ จะทางานตามชุดฟังก์ชั่นท่ีกาหนด ไว้ รูปแบบเป็นดงั นี้ if (เงอื่ นไขทตี่ รวจสอบ) ผังงาน โคด้ โปรแกรม *หากชุดฟังก์ชน่ั ท่ีให้ทางานเมื่อเงอื่ นไขเปน็ จริงมเี พียงฟงั กช์ ่ันเดียว ไมต่ ้องใส่วงเลบ็ ปกี กา {…} ก็ได้ ฟังกช์ ่นั if-else (สองทางเลือก) การตรวจสอบเงือ่ นไขท่มี ชี ุดฟงั กช์ ั่นให้ทางานเมื่อเงอ่ื นไขเป็นจรงิ และมีชดุ ฟังก์ช่ันให้ทางานเม่ือเงื่อนไข เปน็ เท็จ เราจะใชฟ้ งั กช์ ่ัน if-else มาใช้งาน มีรปู แบบดงั น้ี if (เงื่อนไขทต่ี รวจสอบ) else ผังงาน โค้ดโปรแกรม
33 ฟงั ก์ช่ัน if-else if....else (หลายทางเลือก) เป็นฟังกช์ นั่ ทม่ี กี ารตรวจสอบเงอ่ื นไขหลายเง่อื นไข และมชี ดุ ฟงั ก์ชน่ั ทเ่ี ตรียมให้ทางานในแต่ละเง่ือนไขหากเง่อื นไข นน้ั ๆ ถูกตอ้ ง if (เงื่อนไขท่ีตรวจสอบ) else if (เง่ือนไขทต่ี รวจสอบ) ผังงาน โค้ดโปรแกรม ฟงั ก์ชั่น switch...case (หลายทางเลือก) ฟังก์ชัน่ switch…case เปน็ ฟงั ก์ชนั่ หลายทางเลอื กอีกฟงั ก์ชัน่ หนึง่ ท่มี กี ารทางานคลา้ ยๆ ฟังกช์ ั่น if-else if…else ตา่ งตรงท่กี ารตรวจสอบเง่ือนไขจะใชก้ ารตรวจสอบการเทา่ กันของตวั แปรท่ีใช้ตรวจสอบเทา่ น้ัน โดยเม่ือ ตรวจสอบคา่ แล้วเท่ากับคา่ ทก่ี าหนดให้ทาฟงั ก์ชัน่ ท่ีเตรยี มไว้ ผังงาน โค้ดโปรแกรม
ฟงั ก์ชัน่ การดาเนินการแบบวนซา้ 34 การเขยี นโปรแกรมส่ังงานไมโครคอนโทรลเลอร์ ต้องมีการทางานแบบวนซ้าหรือวนรอบเพื่อที่จะทางาน ในชุดคาสั่งเดิม ลักษณะการทางานมีทั้งแบบมีเงื่อนไขหรือไม่มีเง่ือนไข ในภาษาซีมีฟังก์ชั่นสั่งงานให้ ไมโครคอนโทรลเลอรท์ างานซา้ มีดังน้ี 1. ฟังกช์ ่ัน for 2. ฟังกช์ ัน่ while 3. ฟังกช์ น่ั while(1) 4. ฟังกช์ น่ั do-while ฟงั ก์ช่นั for ฟังก์ชน่ั for เปน็ ฟังกช์ น่ั ทใ่ี ช้ในกรณที ่ที ราบจานวนรอบท่ีจะทางานซา้ โดยมีรปู แบบดังน้ี รปู แบบ ผังงาน ตวั อย่าง โคด้ โปรแกรม คาอธบิ าย for(int i=0;i<10;i++) ประกาศและกาหนดตัวแปรนับรอบเป็นตัวแปร i เป็นตัวแปร { ชนดิ integer โดยให้มคี ่าเริม่ ตน้ เท่ากับศูนย์ ทาวนซ้าไปเร่ือยๆ หากคา่ ตวั แปรยังน้อยกว่า 10 โดยในรอบถดั ไปให้เพ่ิมค่าในตัว digitalWrite (13,HIGH); แปรนับรอบขนึ้ 1 ค่าฟังก์ช่ันการดาเนินการแบบวนซ้าฟังก์ช่ัน delay (500); for digitalWrite (13,LOW); delay (500); }
ฟังกช์ ่ัน while 35 ฟังกช์ นั่ while เปน็ ฟังกช์ ่ันที่ใหท้ างานวนซา้ หรือวนรอบโดยมีการตรวจสอบเงื่อนไขก่อนถ้าหากเง่ือนไข เป็นจริงจะทางานตามชดุ ฟังก์ชั่นท่ีเตรียมไว้ เม่ือทางานในชุดฟังก์ช่ันที่เตรียมไว้เสร็จจะมีการวนกลับไปตรวจสอบ เงอื่ นไขอกี หากเงอื่ นไขเปน็ จรงิ จะทางานในชุดฟงั ก์ช่นั ทเี่ ตรียมไวโ้ ดยทาแบบน้ีไปเรื่อยๆ จนกว่าเง่ือนไขจะเป็นเท็จ จะออกจากวงรอบการทาซา้ โดยมีรูปแบบดงั นี้ รปู แบบ ผงั งาน ตวั อย่าง โคด้ โปรแกรม คาอธิบาย i=0; ตรวจสอบก่อนวา่ เงื่อนไขเป็นจรงิ อยหู่ รอื ไม่ ( i ยังน้อย while (i<10) กว่า 10 ) หากเง่อื นไขเป็นจริงให้ทางานทีเ่ ตรียมไว้ { เม่อื ทางานครบใหก้ ลบั มาตรวจสอบเงื่อนไขใหม่วนซ้า ไปเรอื่ ยๆ จนกวา่ เงอ่ื นไขจะเป็นเท็จ digitalWrite (13,HIGH); delay (500); digitalWrite (13,LOW); delay(500); i++; } ฟังก์ช่นั while(1) ฟังก์ชั่น while เป็นฟังก์ชั่นที่ให้ทางานวนซ้าหรือวนรอบไม่รู้จบ เนื่องจาก 1 คือเป็นจริงตลอดไปใน โปรแกรม Arduino กค็ ือฟังก์ชั่น loop( ) นน่ั เอง
ฟังก์ชั่น while(1) 36 ฟังกช์ ่นั while เปน็ ฟังกช์ ัน่ ทีใ่ หท้ างานวนซ้าหรือวนรอบไมร่ ู้จบ เนือ่ งจาก 1 คือเปน็ จริงตลอดไปใน โปรแกรม Arduino กค็ ือฟังกช์ ่นั loop( ) นัน่ เอง รปู แบบ ผังงาน ฟังก์ชน่ั do-while ฟงั กช์ ัน่ do-while เปน็ ฟงั กช์ ่ันที่ให้ทางานวนซา้ หรอื วนรอบ โดยมกี ารตรวจสอบเงื่อนไขการทางานคล้าย กับฟังกช์ ัน่ while ต่างตรงทฟี่ ังกช์ ่นั do-while จะทางานในชดุ ฟงั กช์ น่ั ท่ีเตรียมไว้ทาซ้าไปกอ่ น 1 รอบแล้วจงึ ตรวจสอบเงื่อนไข รูปแบบ ผังงาน ตัวอยา่ ง โค้ดโปรแกรม คาอธบิ าย i=0; do ทางานในฟงั ก์ช่ันที่เตรียมไว้ แล้วตรวจสอบเง่ือนไข { ว่าตัวแปร i ยงั มคี า่ น้อยกว่า 10 หรือไม่หากยังน้อย กวา่ ให้วนกลับไปทาใหม่ซ้าๆ จนกว่าเง่ือนไขจะเป็น digitalWrite (13,HIGH); เท็จ delay (500); digitalWrite (13,LOW); delay (500); i++; } while (i<10)
37 แบบทดสอบหลงั เรยี นบทท่ี 2
38 แบบทดสอบกอ่ นเรยี นบทท่ี 3
39 บทที่ 3 การสร้างฟังกช์ ัน่ รองขน้ึ ใช้เอง หวั ข้อเรื่อง 3.1 การสร้างฟังกช์ ั่นรองข้ึนใช้เอง 3.2 ขอบเขตของตวั แปร สาระสาคญั การเขียนโปรแกรมควบคมุ การทางานไมโครคอนโทรลเลอร์ด้วยภาษาซี เป็นการเขียนโปรแกรม ท่ีมีความยืดหยุ่นมากกว่าและสามารถพัฒนางานได้เร็วกว่าการเขียนโปรแกรมด้วยภาษาแอสเซมบลี การเขียนโปรแกรมเพื่อควบคุมการทางานของ Arduino ยึดหลักวิธีการเขียนตามไวยากรณ์ภาษาซี ดงั น้ันเมอ่ื สามารถเขยี นโปรแกรมควบคุมการทางานไมโครคอนโทรลเลอร์ Arduino นี้ได้ก็สามารถนา ความรไู้ ปเขียนโปรแกรมภาษาซีไมโครคอนโทรลเลอรอ์ น่ื ๆ ได้ สมรรถนะประจาหน่วยการเรียนรู้ ร้แู ละเขา้ ใจในการเขยี นฟงั ก์ชั่นไมโครคอนโทรลเลอร์ จุดประสงคก์ ารเรยี นรู้ จดุ ประสงค์ทัว่ ไป 1. เพ่ือให้มคี วามรูเ้ กยี่ วกับข้ันตอนในการพัฒนาโปรแกรม 2. เพอ่ื ให้มคี วามรูเ้ ก่ยี วกบั การสรา้ งฟงั กช์ ั่นรองขึน้ ใช้เอง จุดประสงค์เชิงพฤติกรรม 1. บอกเกีย่ วกบั ข้ันตอนในการพัฒนาโปรแกรมได้ 2. บอกวธิ กี ารสร้างฟังก์ช่นั รองขนึ้ ใชเ้ องได้ 3. ทาแบบฝกึ หัดเสรจ็ ทันเวลาและทาแบบทดสอบผา่ นเกณฑ์ที่กาหนด
3.1 การสรา้ งฟงั กช์ ั่นรองขน้ึ ใช้เอง 40 ฟังก์ช่ันต่างๆ ที่ได้กล่าวมาแล้วเป็นฟังก์ชั่นที่ภาษาซีมีให้ใช้งาน แต่ถ้าหากผู้ใช้งานต้องการ ฟังก์ชนั่ ทม่ี ีการทางานตามลักษณะเฉพาะส่วนอย่างใดอย่างหน่ึงท่ีมีการเรียกใช้งานซ้าๆ หรือเพื่อแยก งานให้เป็นส่วนๆ ให้ง่ายต่อการเขียนโปรแกรมสามารถเขียนขึ้นเพ่ือใช้งานเองได้ การจัดวางตาแหน่ง ของฟงั ก์ชน่ั รองสามารถทาได้สองแบบคือ 1. วางก่อนฟังก์ช่ันที่เรียกใช้งาน ตาแหน่งการวางลักษณะในน้ีไม่ต้องประกาศรูปแบบของ ฟังก์ช่ัน(Prototype) ซ่ึงจะต้องวางฟังก์ช่ันรองต่อจากหัวโปรแกรมและก่อนฟังก์ชั่น setup การวาง ลักษณะน้ีมีข้อดตี รงท่ไี ม่ตอ้ งเขียนประกาศรปู แบบ แต่จะทาให้ฟังก์ช่ันท่ีใช้งานหลัก (setup,loop) ถูก ดนั ลงไปท้ายๆ โปรแกรมซึ่งหากมีฟังก์ชั่นรองหลายๆ ฟังก์ช่ันย่ิงถูกดันไปล่างๆ ของโปรแกรมมากขึ้น หากโปรแกรมมฟี ังกช์ ่ันรองหลายสิบหลายร้อยบรรทัดจะส่งผลให้หาโปรแกรมหลักเพื่อเขียนโปรแกรม ยากข้นึ การแกไ้ ขโปรแกรมกจ็ ะยากข้ึนตาม 2. วางหลังฟังก์ช่ันท่ีเรียกใช้งาน ตาแหน่งการวางลักษณะน้ีจะต้องประกาศรูปแบบของ ฟังก์ช่ัน(Prototype) ซึ่งจะต้องมีเครื่องหมาย ; ปิดท้ายด้วย โดยประกาศไว้ในท้ายของส่วนหัว โปรแกรมการวางลกั ษณะน้มี ขี ้อดีตรงทฟ่ี ังกช์ ัน่ หลัก (setup, loop) ยังอยู่ตอนบนของโปรแกรมตลอด ไมว่ ่าจะมฟี งั ก์ชั่นรองกีฟ่ งั กช์ น่ั ก็ตามทาใหก้ ารตรวจสอบแก้ไขปรับปรงุ ในครง้ั หลงั ทาได้สะดวก หัวโปรแกรม หวั โปรแกรม ตวั โปรแกรม ประกาศรปู แบบฟงั ก์ช่นั รอง ฟังกช์ นั่ รอง ฟังก์ช่ันท่ี setup( ) ตวั โปรแกรม ฟงั ก์ชน่ั loop( ) ฟงั กช์ ่ันท่ี setup( ) ฟังกช์ ่ัน loop( ) ฟังก์ชัน่ รอง (วางก่อนฟงั ก์ชั่นทเี่ รียกใช้งาน) (วางหลงั ฟงั ก์ช่นั ที่เรยี กใช้งาน)
รปู ที่ 2-3 โครงสรา้ งการจัดวางฟังกช์ ัน่ รองในภาษาซี 41 วางก่อนฟงั ก์ช่นั ท่เี รยี กใชง้ าน วางหลังฟงั ก์ช่นั ที่เรียกใชง้ าน #define LED1 2 #define LED1 2 #define LED2 3 #define LED2 3 #define LED3 4 #define LED3 4 void pattern1 (void) void pattern1 (void); { void pattern2 (void); void pattern3 (void); digitalWrite (LED1,HIGH); void setup() digitalWrite (LED2,LOW); { digitalWrite (LED3,LOW); } pinMode (LED1,OUTPUT); void pattern2 (void) pinMode (LED2,OUTPUT); { pinMode (LED3,OUTPUT); digitalWrite (LED1,LOW); } digitalWrite (LED2,HIGH); void loop() digitalWrite (LED3,LOW); { } pattern1(); delay(200); void pattern3 (void) pattern2(); delay(200); { pattern3(); delay(200); digitalWrite (LED1,LOW); } digitalWrite (LED2,LOW); void pattern1 (void) { digitalWrite (LED3,HIGH); digitalWrite (LED1,HIGH); } digitalWrite (LED2,LOW); void setup() digitalWrite (LED3,LOW); { } pinMode (LED1,OUTPUT); void pattern2 (void) { pinMode (LED2,OUTPUT); digitalWrite (LED1,LOW); pinMode (LED3,OUTPUT); digitalWrite (LED2,HIGH); } digitalWrite (LED3,LOW); void loop() } { void pattern3 (void) { pattern1(); delay(200); digitalWrite (LED1,LOW); pattern2(); delay(200); digitalWrite (LED2,LOW); pattern3(); delay(200); digitalWrite (LED3,HIGH); } }
ฟังก์ชน่ั รองท่ีเขยี นขึน้ ใช้เองมีดว้ ยกนั 4 ประเภทคอื 42 - ฟงั ก์ชน่ั ทีไ่ ม่รบั คา่ และไม่สง่ คนื ค่า - ฟังก์ช่นั ทร่ี ับค่าแต่ไมส่ ง่ คืนค่า - ฟังกช์ นั่ ทีไ่ ม่รับค่าแต่สง่ คนื คา่ - ฟังก์ชน่ั ทร่ี ับคา่ และส่งคนื ค่า ฟงั ก์ช่นั ทไ่ี มร่ ับค่าและไมส่ ่งคนื คา่ เป็นฟังก์ชั่นรองท่ีเขียนขึ้นโดยการรวมชุดฟังก์ช่ันเพื่อให้ทางานอย่างหนึ่งอย่างใดเป็นอิสระ จากฟงั ก์ชน่ั หลกั ไมม่ ีการรบั คา่ ใดๆ จากฟงั กช์ ั่นหลกั เพ่อื นาใชง้ านในตวั ของฟังก์ชั่นรอง และไม่มีการส่ง คา่ ใดๆ กลับมายังฟงั ก์ชน่ั หลกั ทเ่ี ปน็ ผู้เรียกใช้งาน ซึ่งขอ้ กาหนดในการประกาศใช้ของฟังก์ช่ันประเภทน้ี มี ดงั น้ี 1. ขอ้ กาหนดในการไม่รับค่า ทาโดยใส่ (void) หลังช่อื ฟังกช์ ั่น 2. ขอ้ กาหนดในการไมส่ ่งคืนคา่ ทาโดยใส่ void หนา้ ชอ่ื ฟงั กช์ ่ัน ตวั อย่างโปรแกรมที่มีฟงั กช์ นั่ รองท่ีไมร่ บั คา่ และไม่สง่ คนื ค่า void pattern1(void);
รายละเอยี ดโคด้ โปรแกรม 43 - บรรทัดที่ 4, 5, 6 เปน็ การประกาศรูปแบบของฟังก์ชั่นรองที่จะเขียนข้ึนใช้งาน (มี ; ปิดท้าย) และเป็น ฟงั กช์ ่นั ท่ไี ม่รับคา่ และไมส่ ง่ คนื คา่ (มี void หน้าฟังก์ช่ันและหลังฟังก์ชน่ั ) - บรรทัดที่ 14, 15, 16 เป็นการเรียกใช้งานโดยการชื่อฟังก์ชั่นท่ีต้องการตามด้วย ( ) ท่ีภายในว่างเปล่า เนอื่ งจากไมม่ กี ารส่งค่าเข้าในฟงั กช์ ัน่ - บรรทัดท่ี 19-24 เป็นฟังก์ช่ันรองฟังก์ชั่นแรกท่ีเขียนข้ึนใช้งานโดยภายในบรรจุฟังก์ชั่นท่ีต้องการให้ ทางานเมื่อมกี ารเรียกใช้ - บรรทดั ที่ 25-30, บรรทดั ที่ 25-30, บรรทัดที่ 31-36 เปน็ ฟงั ก์ชั่นรองถัดๆ มาทเี่ ขยี นขนึ้ ใช้งาน ฟงั ก์ช่ันทร่ี ับคา่ แต่ไม่สง่ คนื คา่ เปน็ ฟังกช์ ่ันทีเ่ ขียนขน้ึ เพอ่ื แบง่ ยอ่ ยการทางานของฟงั กช์ ่นั หลัก โดยมีการส่งคา่ จากฟงั ก์ช่ันหลักในขั้นตอน การเรยี กใชฟ้ ังก์ชน่ั รองเพ่อื ใหฟ้ ังก์ชน่ั รองทีเ่ ขยี นขึน้ นาไปประมวลผลอยา่ งใดอย่างหน่ึงตามท่ผี ู้สร้างฟังก์ชั่นต้องการ ซ่ึงข้อกาหนดในการประกาศใชข้ องฟังกช์ น่ั ประเภทนีม้ ีดังน้ี 1. ขอ้ กาหนดในการรบั ค่า ทาโดยกาหนดชนิดตัวแปร พร้อมตัวแปรที่จะรับค่าท้ายชื่อฟังก์ชั่นรองท่ีสร้าง ขึน้ เชน่ (byte data) 2. ขอ้ กาหนดในการไมส่ ่งคืนค่า ทาโดยใส่ void หน้าชอื่ ฟังก์ชนั่ ตัวอยา่ งโปรแกรมทีม่ ีฟังก์ช่นั รองท่รี บั ค่าและไมส่ ่งคืนคา่ void send2port(byte data);
รายละเอียดโค้ดโปรแกรม 44 - บรรทัดที่ 6 เป็นการประกาศรปู แบบของฟงั ก์ช่ันรองที่จะเขียนข้ึนใช้งาน (มี ; ปิดท้าย) เป็นฟังก์ชั่นท่ีไม่ มีการส่งคืนค่า (มี void อยู่หน้าฟังก์ชั่น) แต่เป็นฟังก์ชั่นที่รับค่าเพียงอย่างเดียว โดยในวงเล็บหลัง ฟังกช์ ั่นจะเป็นตวั แปรที่ใชส้ าหรบั รบั คา่ ซึ่งจะตอ้ งประกาศชนดิ ของตัวแปรพร้อมชื่อตัวแปรสาหรับรับค่า ไว้ในวงเล็บทา้ ยฟงั กช์ ่ัน - บรรทดั 17-20 เป็นการเรยี กใชฟ้ ังกช์ ่นั รองโดยการเรียกชือ่ ฟังก์ชั่นรองพร้อมส่งค่าเข้าไปในฟังก์ช่ันโดย คา่ ทสี่ ่งไปจะใส่ในวงเล็บทา้ ยช่ือฟังก์ชั่นรองที่เรียกใช้ ค่าท่ีส่งไปจะเข้าไปเก็บไว้ในตัวแปรท่ีฟังก์ชั่นรอง ประกาศไว้ เชน่ send2port(0B1000); เป็นการเรียกใช้ฟังก์ชั่น send2portโดยส่งค่าตัวเลข 1000 ซึ่ง เปน็ เลขฐานสองเขา้ ไปในฟังก์ชนั่ รองนั้นดว้ ย ค่าตัวเลขดังกล่าวจะถูกเก็บไว้ในตัวแปร data ซ่ึงฟังก์ชั่น รองได้เตรยี มเอาไว้ - บรรทัดท่ี 20-28 เป็นฟังก์ช่ันรองท่ีเขียนข้ึน ภายในฟังก์ช่ันมีการนาค่าท่ีถูกส่งเข้ามาผ่านตัวแปร data นามาใช้งาน ฟังก์ชั่นทไ่ี มร่ บั ค่าแต่สง่ คืนค่า เป็นฟังก์ชน่ั ทเ่ี ขยี นข้ึนเพ่ือแบ่งย่อยการทางานของฟังก์ชั่นหลัก เพียงแต่ไม่ได้ส่งข้อมูลเข้าโปรแกรมเพ่ือ ช่วยให้ทาการประมวลผลแตม่ ีการส่งขอ้ มลู กลับมายังฟังก์ชั่นหลกั เชน่ ฟังก์ชั่นตรวจสอบการกดสวิตช์ซ่ึงฟังก์ช่ันน้ีไม่ จาเป็นต้องรับข้อมูลใดมาประมวลผลมีเพียงตรวจสอบว่ามีการกดสวิตช์หรือไม่แล้วส่งค่าการกดสวิตช์กลับไปยัง ฟงั กช์ ่นั หลักเพ่ือนาไปใช้งานตอ่ ไป โดยค่าทีส่ ่งกลบั ผเู้ ขยี นโปรแกรมจะเป็นผู้กาหนดข้ึนมาเอง เช่น เมื่อสวิตช์ 1 ถูก กดใหส้ ่งค่า 1 กลับและเมื่อสวติ ช์ 2 ถูกกดใหส้ ง่ คา่ 2 หากไม่มีการกดใดๆ ให้สง่ กลับคา่ 0 เป็นต้น การเขยี นฟังกช์ นั่ รองลักษณะน้มี ีขอ้ กาหนดในการประกาศใช้ของฟังกช์ ัน่ ดงั นี้ 1. ข้อกาหนดในการไม่รบั ค่า ทาโดยใส่ (void) หลังช่ือฟังก์ชั่น 2. ข้อกาหนดในการสง่ คืนคา่ ทาโดยใส่กาหนดชนดิ ของขอ้ มูลท่ีจะส่งคนื หนา้ ช่อื ฟังก์ช่ันรอง ทสี่ ร้างขึ้น ตวั อย่างโปรแกรมท่มี ีฟงั กช์ ัน่ รองที่ไมร่ บั คา่ แต่ส่งคืนคา่ byte readSW(void);
45 รายละเอยี ดโคด้ โปรแกรม - บรรทัดที่ 4 เป็นการประกาศรปู แบบของฟังก์ชั่นรอง byte readSW(void); ซึง่ เปน็ ฟังกช์ ั่นทีม่ ีการส่งค่า กลับคนื ฟงั ก์ชั่นหลัก โดยคา่ ทส่ี ่งกลับมีขนาดเป็นค่าของตวั แปร byte - บรรทดั ที่ 13 เป็นการเป็นการเรียกใช้ฟังก์ชั่นรอง byte x=readSW(); เม่ือฟังก์ช่ันรองทางานเสร็จส้ิน จะส่งค่าเข้ามายังตัวแปร x ซึ่งเป็นตัวแปรได้ประกาศชนิดท่ีมีขนาดท่ีเพียงพอที่สามารถรับข้อมูลที่ สง่ กลบั มาจากฟงั ก์ชัน่ รองนไ้ี ด้ - บรรทดั 19-27 เป็นฟงั กช์ นั่ รองที่เขียนขึน้ เพือ่ ใชง้ านที่มกี ารส่งค่าคนื ไปยังฟังกช์ ั่นหลัก - บรรทดั ท่ี 21 การประกาศตัวแปรที่มชี นิดเดยี วกันกับค่าทฟี่ ังก์ชัน่ รองสง่ ออก - บรรทัดท่ี 26 ฟงั กช์ ่ัน return เป็นฟังก์ช่ันที่ใช้สาหรับส่งค่าออกจากฟังก์ช่ันรอง โดยค่าที่ส่งออกจะอยู่ ในตัวแปรทา้ ยฟังก์ชั่น return ซ่ึงมีขนาดเดียวกนั กับชนดิ ของค่าทีป่ ระกาศของฟังก์ช่นั ฟังกช์ ่ันทรี่ ับค่าและส่งคนื คา่ เป็นฟังก์ช่ันท่ีเขียนข้ึนเพื่อแบ่งย่อยการทางานของฟังก์ชั่นหลักโดยมีการส่งค่าจากฟังก์ช่ันหลักเพื่อให้ ฟังกช์ ัน่ รองท่เี ขียนขนึ้ นาไปประมวลค่าอย่างใดอย่างหนงึ่ และสง่ ค่ากลบั มายงั ฟังก์ชนั่ หลกั ซง่ึ ฟังกช์ นั่ รองชนิดนม้ี ักใช้ บอ่ ยเม่อื ต้องการสร้างกลุ่มฟังก์ชั่นที่ต้องการคานวณส่ิงใดสิ่งหน่ึงโดยมีข้อมูลท่ีใช้ในการคานวณนั้นๆ ด้วยและเมื่อ คานวณเสร็จสิ้นฟังก์ชั่นหลักมีความต้องการผลการคานวณน้ันด้วยเช่น ฟังก์ช่ันแปลงค่าจากการอ่านค่าจากเทอร์ มิสเตอร์ NTC และตอ้ งการผลเป็นอุณหภูมิ ซ่ึงขอ้ กาหนดในการประกาศใชข้ องฟังก์ช่ันประเภทน้ีมีดงั น้ี 1. ข้อกาหนดในการรบั คา่ ทาโดยกาหนดชนดิ ตัวแปร พร้อมตวั แปรท่จี ะรบั คา่ ท้ายชอื่ ฟงั ก์ชั่น รองที่สรา้ งขน้ึ เช่น (int x) 2. ข้อกาหนดในการส่งคืนคา่ ทาโดยใสก่ าหนดชนิดของขอ้ มูลทจี่ ะส่งคนื หน้าชือ่ ฟังก์ชัน่ รอง
ตัวอย่างโปรแกรมทีม่ ีฟังกช์ น่ั รองที่รบั ค่าและสง่ คนื ค่า double Thermistor(int RawADC); 46 รายละเอยี ดโค้ดโปรแกรม - บรรทัดท่ี 2 เป็นการประกาศรูปแบบของฟังก์ช่ันรอง double Thermistor(int RawADC); ที่จะเขียน ขน้ึ ใชง้ าน (มี ; ปดิ ท้าย) เปน็ ฟงั กช์ ั่นท่มี กี ารรับค่าและสง่ ค่ากลบั คนื ฟังกช์ น่ั หลกั โดยคา่ ท่ีรับจะถูกเก็บไว้ ในตัวแปรช่ือ RawADC ถูกกาหนดให้เป็นชนิด integer และส่งคืนค่ากลับมีขนาดเป็นค่าของตัวแปร double - บรรทดั ท่ี 9 เป็นการเรยี กใช้ฟงั กช์ น่ั รอง float Temp=Thermistor(analogRead(NTC)); โดยส่งค่าเข้า ฟังก์ชั่นรองในวงเล็บหลังชื่อฟังก์ชั่น และประกาศตัวแปรไว้รับค่า (Temp) ท่ีได้จากการส่งกลับจาก ฟังก์ชั่นรอง จากตัวอย่างจะเห็นว่าใช้ตัวแปรท่ีใช้รับค่ามีขนาดเล็กกว่าค่าที่ส่งกลับดังนั้นจะมีข้อมูล หายไปบางสว่ น แต่ถ้าหากผู้เขียนโปรแกรมยอมรับการสูญหายของข้อมูลนั้นได้โดยผลการทางานของ โปรแกรมยงั เทา่ เดมิ ก็สามารถทาได้ - บรรทดั ที่ 14-21 เป็นฟังก์ชนั่ รองทเ่ี ขยี นขึ้นมาเพื่อประมวลผลตามต้องการท่ีมีการรับค่าเข้ามาคานวณ และส่งค่ากลบั คืนยังฟงั กช์ นั่ หลกั 3.2 ขอบเขตของตัวแปร ขอบเขตของตัวแปรหมายถึงบริเวณหรือตาแหน่งหรือพิกัดของตัวแปรที่ฟังก์ช่ันสามารถเรียกใช้งานได้ ทงั้ นข้ี น้ึ อยกู่ ับตัวแปรตวั น้ันๆ ว่าประกาศไวท้ จี่ ุดใด โดยขอบเขตของตัวแปรมีด้วยกนั 2 แบบ 1. ตวั แปรประเภทโกลบอล (global) เปน็ ตัวแปรทปี่ ระกาศนอกฟงั กช์ ั่นซง่ึ จะประกาศไว้ใน ส่วนของหัวโปรแกรม ตัวแปรเหล่านี้สามารถถูกนาไปใช้งานได้ทุกฟังก์ชั่น หรืออาจกล่าวได้ว่าทุกฟังก์ช่ัน สามารถมองเหน็ ตวั แปรประเภทน้ี
47 2. ตวั แปรประเภทโลคอล (local) เปน็ ตัวแปรท่ีประกาศภายในฟังก์ชั่นซ่ึงสามารถใช้งานได้เฉพาะภายใน ฟังก์ช่ันที่ประกาศเท่านั้นนอกฟังก์ชั่นไม่สามารถใช้งานได้ หรืออาจกล่าวได้ว่าตัวแปรโลคอลมองเห็น เฉพาะภายในเท่านัน้ ตัวอย่างการประกาศตวั แปรในขอบเขตที่ต่างกนั ตัวอยา่ งการประกาศตวั แปรในขอบเขตท่ีตา่ งกัน รายละเอยี ดโคด้ โปรแกรม - บรรทัดที่ 1,2 เป็นการประกาศตัวแปร LED1, LED2 ซ่ึงประกาศอยู่นอกฟังก์ชั่นเป็นการประกาศตัว แปรในตาแหน่งโกลบอล นั่นหมายความว่าทุกฟังก์ชั่นจะสามารถใช้ (มองเห็น) ตัวแปรนี้ได้สามารถ นาไปใช้งานได้ เช่นในฟังก์ชั่น setup ได้นาไปกาหนดโหมดการทางานในฟังก์ช่ัน pinMode และใน ฟงั กช์ นั่ loop ได้นาไปใช้ในฟงั ก์ชัน่ digitalWrite - บรรทดั ท่ี 10 เปน็ การประกาศตวั แปร i ซึ่งจะนาไปใช้นับรอบในคาส่ัง forโดยตัวแปรนี้จะมองเห็นและ ใชง้ านไดเ้ ฉพาะภายในฟงั ก์ชั่น loop เทา่ นนั้ นอกฟงั กช์ ่นั (เช่นฟังก์ชั่น setup ในตัวอย่าง) ไม่สามารถ ใชง้ านตัวแปรนไ้ี ด้ หรอื กลา่ วไดว้ า่ มองไม่เหน็ ตัวแปร i นี้ 3.4 ขอบเขตของตวั แปร การใช้งานตัวแปรท่มี ีจานวนตัวแปรมากๆ อาจเกดิ การสับสนในการใช้งานได้ ภาษาซีสามารถ จดั รวมกล่มุ ตวั แปรเพอ่ื ให้เกิดความสะดวกต่อการเรยี กใช้งานได้ ซึ่งตัวแปรที่นามารวมกลุ่มนั้นสามารถ รวมกลุ่มตัวแปรทเ่ี ปน็ ชนดิ แตกต่างกนั ได้ โดยมีวธิ กี ารประกาศด้วยกัน 2 แบบคอื 1. แบบสตัคเจอร์ (Structure) 2. แบบยเู นยี น (Union) โดยในแต่ละแบบมีคณุ สมบตั ใิ นการจัดการทแ่ี ตกต่างกนั
Search