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 02 ใบเนื้อหา หน่วยที่ 2 การพัฒนาโปรแกรมด้วยภาษาซี

02 ใบเนื้อหา หน่วยที่ 2 การพัฒนาโปรแกรมด้วยภาษาซี

Published by Worawut Tangnorakul, 2019-09-18 02:50:04

Description: 02 ใบเนื้อหา หน่วยที่ 2 การพัฒนาโปรแกรมด้วยภาษาซี

Search

Read the Text Version

ใบเน้ือหา หน่วยที่ 2 ชือ่ วชิ า ไมโครคอนโทรลเลอร์ รหัสวิชา 3105-2007 สอนคร้งั ท่ี 2-3 ชอ่ื หน่วย ภาษาซีสาหรับ Arduino จานวนคาบ 3 หนว่ ยที่ 2 การพฒั นาโปรแกรมด้วยภาษาซี ไมโครคอนโทรลเลอร์ ไม่ว่าจะเป็นตระกูลใดก็ตามจะทางานได้ก็ต่อเม่ือมีชุดคาส่ังท่ีสั่งให้ทางาน ตามที่ต้องการที่เรียกว่าโปรแกรม โดยคาสั่งหรือหรือโปรแกรมที่ไมโครคอนโทรลเลอร์เข้าใจและ สามารถทางานได้อยู่ในรูปของรหัสลอจิก 0 และ 1 หากนาลอจิกมาจับกลุ่มก็เป็นเลขฐาน 16 ท่ี เรียกว่าภาษาเครื่อง ซึ่งภาษาเครื่องเป็นภาษาท่ีมนุษย์ไม่สามารถเข้าใจได้ เน่ืองจากเป็นเลขฐาน 16 ทงั้ หมด ดังน้ันในการเขียนโปรแกรมจงึ จาเปน็ ต้องใชภ้ าษาทมี่ นษุ ยเ์ ข้าใจได้ โดยภาษาท่ีมนุษย์เข้าใจได้ และใกล้เคียงกับภาษาเครื่องมากที่สุด คือ ภาษาแอสเซมบลี แต่เน่ืองจากการพัฒนางานโดยใช้ภาษา แอสแซมบลีเป็นไปได้ยากและซับซ้อน เพื่อให้ง่ายและรวดเร็วต่อการพัฒนาโปรแกรมใช้งาน ไมโครคอนโทรลเลอร์ภาษาท่เี หมาะสม คอื ภาษาซี 2.1 โครงสรา้ งภาษาซสี าหรับ Arduino ภาษาซีสาหรับ Arduino จะจัดแบ่งรูปแบบโครงสร้างของการเขียนโปรแกรมออกเป็น ส่วนยอ่ ยๆหลายสว่ น โดยเรยี กแต่ละสว่ นว่า ฟงั ก์ชนั และเม่อื นาฟังก์ชันมารวมเข้าดว้ ยกนั ก็จะเรยี กวา่ โปรแกรม โดยโครงสร้างการเขียนโปรแกรมของ Arduino นั้น มีโครงสร้างง่ายต่อการทาความเข้าใจ งา่ ยตอ่ การนาไปพฒั นาตอ่ สามารถเขยี นโปรแกรมแยกเป็นสว่ นๆ ประกอบด้วย 3 สว่ นใหญ่ ดงั ภาพท่ี 2-1 # header setup() loop() ภาพท่ี 2-1 โครงสร้างภาษาซีสาหรับ Arduino 1) header ในส่วนนี้จะมีหรือไม่ก็ได้ ถ้ามีต้องกาหนดไว้ในส่วนเริ่มต้นของโปรแกรม ซึ่งส่วน ของ header ได้แก่ ส่วนท่ีเป็น Compiler Directive ต่างๆรวมไปถึงส่วนของการประกาศตัวแปร และคา่ คงทต่ี า่ งๆทีจ่ ะใชใ้ นโปรแกรม

2) setup() ในส่วนน้ีเป็นฟังก์ชันบังคับที่ต้องกาหนดให้มีในทุกๆโปรแกรม ถึงแม้ว่าในบาง โปรแกรมจะไม่ต้องการใช้งานก็ยังจาเป็นต้องประกาศไว้ด้วยเสมอ เพียงแต่ไม่ต้องเขียนคาส่ังใดไว้ใน ระหว่างวงเล็บปีกกา { } ท่ีใช้เป็นตัวกาหนดขอบเขตของฟังก์ชัน โดยฟังก์ชันนี้จะใช้สาหรับบรรจุ คาส่ังในส่วนท่ีต้องการให้โปรแกรมทางานเพียงรอบเดียวตอนเร่ิมต้นทางานของโปรแกรมคร้ังแรก เท่าน้ัน ซ่ึงได้แก่ คาสั่งเกี่ยวกับการ Setup ค่าการทางานต่างๆ เช่น การกาหนดหน้าที่การใช้งานของ PinMode การกาหนดค่า Baud rate สาหรับใช้งานพอร์ตสื่อสารอนุกรม การเรียกใช้ไลบราร่ี เป็น ต้น 3) loop() เป็นส่วนฟังก์ชันบังคับท่ีต้องกาหนดให้มีในทุกๆโปรแกรม โดยจะใช้บรรจุคาสั่งท่ี ต้องการให้โปรแกรมทางานเป็นวงรอบซ้าๆกันไปไม่รู้จบ ซ่ึงถ้าเปรียบเทียบกับรูปแบบของ ANCI-C ส่วนนี้กค็ ือ ฟงั ก์ชนั main() นนั้ เอง ตัวอย่างท่ี 2-1 โครงสรา้ งการเขียนโปรแกรมภาษาซสี าหรับ Arduino header # include <Servo.h> // สงั่ ผนวกไฟล์ ช่อื Servo.h เข้ามาใชโ้ ปรแกรม setup() int Servo1 = 9; // กาหนดให้ Servo1 แทน Pin Digital-9 loop() Servo myservo; // สร้าง object ชอ่ื myservo เพอื่ ควบคมุ Servo void setup() { myservo.attach(9); // กาหนดให้ใช้ขา Digital-9 สรา้ งสญั ญาณควบคุม Servo } void loop() { myservo.write(180); // กาหนดคา่ ตาแหนง่ ให้กบั Servo = 180 องศา }

2.2 ตวั แปรในภาษาซี ตัวแปร (Variables) ตัวแปร หมายถึง กลุ่มของตัวอักษร ตัวเลข และ เครื่องหมายใดๆ ที่ รวมกันเป็นชื่อ เพื่อใช้กาหนดเป็นตัวแทนของค่าข้อมูลท่ีเราต้องการจะอ้างถึงในโปรแกรม ทั้งนี้ก็ เน่ืองจากวา่ ในการทางานของโปรแกรมจริงๆนน้ั จะใชค้ ่าตวั เลขทีผ่ ู้ใชก้ าหนดให้ มาทาการประมวลผล ซ่ึงในการเขียนโปรแกรมถ้าเราต้องเขียนโปรแกรมโดยกาหนดเป็นค่าตัวเลขให้กับโปรแกรมตรงๆเลย ก็จะทาให้โปรแกรมที่เราเขียนข้ึนเต็มไปด้วยค่าตัวเลขต่างๆ มากมาย ซ่ึงยากต่อการอ่าน ยากต่อการ ทาความเข้าใจ และยากต่อการตรวจสอบความถูกต้องและอาจทาให้เกิดความผิดพลาดได้ง่ายด้วย ดังนน้ั ทกุ ภาษา จึงยอมใหม้ ีการกาหนดชอื่ ข้นึ มาใชง้ านแทนคา่ ตัวเลข เพอื่ ให้เขยี นโปรแกรมไดส้ ะดวก และง่ายต่อการอ่าน ทาความเขา้ ใจ ได้มากยิง่ ข้นึ ซึ่งลักษณะของข้อมูล อาจมีทั้งแบบท่ีเป็นค่าซึ่งสามารถเปลี่ยนแปลงได้ (variable) หรือ อาจ เป็นแบบที่มีค่าคงท่ีไม่สามารถเปล่ียนแปลงได้ (constant) ในการประกาศใช้งานตัวแปร จาเป็นต้อง ประกาศชนิดของตวั แปร หรอื บางคร้ังอาจมีการกาหนดคา่ เรมิ่ ต้นใหก้ ับตัวแปรด้วยก็ได้ 2.2.1 ชนิดของตัวในภาษาซที เ่ี ก่ียวข้องกบั Arduino ถา้ หากว่าเราจะเปรยี บเทยี บว่า ตวั แปร คือ ภาชนะสาหรบั บรรจุสิ่งของ และ ข้อมลู คือ สง่ิ ของ ที่เราต้องการจะเก็บ จะเห็นได้ว่า ส่ิงของต่างๆรอบๆตัวเรานั้น จะมีคุณสมบัติท่ีแตกต่างกันไป ดังน้ัน ในการเลือกภาชนะสาหรบั ใช้บรรจสุ ่ิงของ เราก็จาเปน็ ต้องเลือกชนิดของภาชนะให้มคี วามเหมาะสมที่ จะใช้เก็บส่ิงของด้วย ซ่ึงสิ่งแรกท่ีต้องพิจาณาคือ เราจะต้องรู้จักคุณสมบัติของสิ่งของที่ต้องการจะ จัดเก็บ และ จุดประสงค์การ ใช้งาน ก่อน จากนั้นจึงจัดหาภาชนะที่มี ขนาด และ รูปทรงของ ภาชนะ เหมาะสมที่จะใช้เก็บสิ่งของเพ่ือให้สามารถจัดเก็บ และ นาสิ่งของออกมาใช้งาน ได้อย่างง่าย ประหยดั มากท่สี ดุ ชนิดของตัวแปรในภาษาซี มี 2 ชนดิ คือตัวแปรที่ใช้เกบ็ จานวนเต็ม และเก็บจานวนจริง โดยมีรายละเอยี ดดังตารางที่ 2-1 และตารางท่ี 2-2 ตารางที่ 2-1 ชนิดของตัวแปรในภาษาซีที่ใช้เกบ็ จานวนเต็ม ชนิด ขนาด(byte) ขอบเขต char 1 -128 ถึง +127 หรือ 0 ถงึ 255 unsigned char 1 0 ถงึ 255 signed char 1 -128 ถงึ +127 int 2 หรอื 4 -32,768 ถึง +32,767 หรอื - 2,147,483,648 ถึง +2,147,483,647 unsigned int 2 หรือ 4 0 ถึง 65,535 หรือ 0 ถงึ 4,294,967,295 short 2 -32,768 ถงึ +32,767 unsigned short 2 0 ถึง 65,535 long 4 -2,147,483,648 ถึง +2,147,483,647 unsigned long 4 0 ถึง 4,294,967,295

ตารางที่ 2-2 ชนดิ ของตัวแปรในภาษาซที ใ่ี ชเ้ ก็บจานวนจรงิ ชนิด ขนาด(byte) ขอบเขต float 4 1.2E-38 ถงึ 3.4E+38 double 8 2.3E-308 ถงึ 1.7E+308 long double 10 3.4E-4932 ถงึ 1.1E+4932 2.2.2 คณุ สมบัตเิ ฉพาะของตวั แปร สาหรับตัวแปรชนิดที่ใช้เก็บค่าเลขจานวนเต็ม (Char และ int) น้ัน ในภาษาซี ไม่ได้มีการ จาแนก ชนิดของตวั แปร เพ่อื ใชเ้ กบ็ คา่ ตวั เลขทเ่ี ป็น ค่าบวก หรือ คา่ ลบ เปน็ การเฉพาะ แตภ่ าษาซี จะ ใช้วิธีการเพิ่ม คาส่ังสาหรับกาหนดคุณสมบัติเฉพาะให้กับตัวแปรไว้อีก 4 คาสั่ง สาหรับใช้กาหนด คุณสมบัติของตัวแปรแบบนี้ให้มีคุณสมบัติที่เฉพาะเจาะจงลงไปอีกเป็นต้นว่า จะใช้ตัวแปรในการเก็บ ค่าตัวเลขท่ีเป็นค่าบวกอย่างเดียวหรือต้องการเก็บค่าตัวเลขแบบคิดเคร่ืองหมายด้วย เพ่ือให้ผู้ใช้ สามารถปรับแกค้ ณุ สมบตั ิในการใชง้ านของตัวแปรให้มคี ณุ สมบัตใิ กลเ้ คียงกบั ความตอ้ งการใชง้ านมาก ขึ้นไปอีก และเพือ่ จากัดขอบเขตการใช้งานของตวั แปรใหต้ รงกับจดุ ประสงค์มากย่ิงขน้ึ และยังเป็นการ ช่วยให้ประหยัดจานวนของหน่วยความจาที่ใช้สร้างตัวแปรด้วยและทาให้โปรแกรมทางานได้เร็วขึ้น กว่าเดิมอีกด้วย โดยในภาษาซีจะมีคาสั่ง ที่ใช้สาหรับระบุคุณสมบัติเฉพาะของตัวแปรที่ใช้เก็บค่าเลข จานวนเตม็ 4 คาส่งั คือ  unsigned ใช้ระบใุ ห้เก็บคา่ เลขจานวนเตม็ ในตัวแปรเฉพาะคา่ ทเ่ี ปน็ บวกเทา่ นน้ั  signed ใช้ระบุให้เกบ็ ค่าเลขจานวนเตม็ ในตัวแปรทัง้ ค่า บวก และ ลบ  Shot ใช้ระบุใหเ้ ก็บค่าเลขจานวนเตม็ ในตวั แปรที่มีคา่ นอ้ ยกวา่ int  Long ใช้ระบุให้เกบ็ ค่าเลขจานวนเต็มในตวั แปรทม่ี ีคา่ มากกว่า int เป็น 2 เท่า โดยคาส่ังทั้ง 4 น้ีจะใช้นาหน้าชนิดของตัวแปร เพื่อบอกให้ Compiler รับรู้ว่าตัวแปรท่ีเรา ประกาศสรา้ งขน้ึ มาใชง้ านน้นั มีคุณสมบตั เิ ปน็ อย่างไร เชน่ char ch1; //กาหนดให้ ch1 เก็บค่า -128 ถงึ +27 sign char ch2' //กาหนดให้ ch2 เก็บค่า -128 ถึง +27 unsigned char ch3; //กาหนดให้ ch2 เก็บคา่ -128 ถงึ +27 int num1; //กาหนดให้ num1 เกบ็ คา่ ค่าได้ -32768 ถึง +32767 signed int num2; //กาหนดให้ num2 เก็บคา่ ค่าได้ -32768 ถงึ +32767 unsigned int num3; //กาหนดให้ num3 เกบ็ คา่ ค่าได้ 0 ถงึ 65535 short int num4; //กาหนดให้ num4 เก็บคา่ ค่าได้ -32768 ถึง +32767 sing short int num5; //กาหนดให้ num5 เก็บคา่ ค่าได้ -32768 ถึง +32767 unsigned short in num6;//กาหนดให้ num6 เก็บคา่ คา่ ได้ 0 ถงึ 65535

2.2.3 การประกาศตัวแปร การประกาศตัวแปร คือ การต้ังชื่อเพ่ือเป็นตัวแทนในการจองพื้นท่ีในหน่วยความจา เพื่อ นาไปใช้งานในฟังก์ชัน่ โดยการใช้ชื่อตวั แปรแทนการกาหนดเป็นค่าแอดเดรสของหน่วยความจา การนยิ ามชอื่ ตวั แปรกระทาในรูป ชนดิ ของตัวแปร ช่อื ตัวแปร; ชนดิ ของตัวแปร ชื่อตัวแปรท่ี1,ชื่อตวั แปรท่ี2,...; ตัวอย่างท่ี ... การประกาศตัวแปร int a,b,c; // ประกาศตวั แปรชนิด char ชอ่ื a b และ c unsigned int d; // ประกาศตวั แปรชนิด unsigned int ชอื่ d การกาหนดข้างบน หมายถึง จองพ้นื ท่ีเกบ็ ไว้แตไ่ ม่ไดก้ าหนดค่าเริม่ ต้นให้กับพื้นที่ (เหมือนไป หยิบแก้วน้ามาแกว้ หน่งึ โดยไมส่ นใจว่าแก้วมนี า้ อยู่เทา่ ใด) ถา้ เราจะกาหนด ค่าเริ่มต้นให้ดว้ ย กระทา ไดโ้ ดยใช้เครือ่ งหมาย = ตามดว้ ยค่าคงทีต่ ามหลงั ชอื่ ตัวแปรทกี่ าลงั ถูกกาหนดนั้นๆ เชน่ char a,b=5,c; //ประกาศตวั แปรชนิด char กาหนดค่า b ใหม้ คี า่ เป็น 5 char a=4,b=8,c=F //ประกาศตวั แปรชนดิ char กาหนดค่า a ใหม้ คี ่าเปน็ 4 b ใหม้ ีคา่ เปน็ 8 และ c ให้มีค่าเปน็ F 2.2.4 ขอ้ กาหนดการต้ังชื่อตัวแปรในภาษาซี 1) ชือ่ ของตัวแปรตอ้ งประกอบไปด้วยตวั อกั ษร ตวั เลข และ ยอมใหใ้ ช้เครื่องหมายพิเศษ อีก 2 ตวั คือเคร่ืองหมาย Under Line (_) และ Dollar Sign ($) มาใชใ้ นการตงั้ ชอื่ ได้ โดยชอื่ ต้อง เรียงติดทั้งหมดห้ามมีการเวน้ วรรค และมคี วามยาวไม่เกนิ 32 ตวั อกั ษร 2) ชื่อของตัวแปรทก่ี าหนด จะใช้เฉพาะตวั อกั ษรทงั้ หมด หรือ ตัวอกั ษรผสมกบั ตัวเลข หรอื อาจผสมกับเครือ่ งหมาย _ และ $ ด้วยก็ได้ แต่ตอ้ งเรมิ่ ตน้ ชอื่ ดว้ ยตวั อักษรเปน็ ลาดับแรกเสมอ ห้ามตั้งช่ือโดยเรม่ิ ตน้ ด้วยตวั เลข หรอื เคร่ืองหมาย 3) ชอ่ื ของตัวแปร ตอ้ งกาหนดด้วยตวั อกั ษรท่ีเปน็ ตวั อักษรพมิ พเ์ ล็กเทา่ น้ัน และในภาษาซี จะถอื ว่าตวั อักษรท่เี ป็นตัวอกั ษรพิมพ์ใหญ่ และ ตวั อักษรพิมพเ์ ล็ก มคี วามหมายตา่ งกัน เช่น \"LED\" และ \"led\" และ \"Led\" ภาษาซี จะถือวา่ เป็นคนละช่อื กัน 4) ในการต้งั ชื่อตัวแปร หา้ มนาคาสงวน (Reserve Word) มาใช้ต้งั ช่อื ซ่ึงคาสงวนได้แก่ ช่อื คาสั่ง และ ช่ือ Internal Function ตา่ งๆ ที่สรา้ งไวแ้ ล้วในตัว ภาษา คาสงวน (Reserved Word) เป็นคาเฉพาะที่ได้กาหนดขึ้นมา เพ่ือใช้ในตัวภาษาโดยเฉพาะ ซึ่ง ผู้เขียนโปรแกรมไม่สามารถนามาใช้เป็นชื่อ (Indentifiers) ได้ เช่น ไม่สามาถนาไปใช้เป็นตัวแปร (Variables) หรือ ช่ือโปรแกรมได้ คาสงวนในภาษาซี ตามมาตรฐานสถาบันมาตรฐานแห่งชาติ สหรัฐอเมริกา (American National Standards Institute) โดย คาสงวนสาหรับภาษาซีมาตรฐาน (Standard C) มที ง้ั หมด 32 คา ดงั นี้

ตารางที่ 2-3 คาสงวนสาหรับภาษาซมี าตรฐาน (Standard C) auto const double float int short struct unsigned break continue else for long signed switch void case default enum goto register sizeof typedef volatile char do extern if return static union while ตารางที่ 2-4 ตวั อย่างคาสงวนภาษาซีสาหรบั Arduino auto const double float int short struct unsigned break continue else for long signed switch void case default enum goto register sizeof typedef volatile char do extern if return static union while HIGH LOW INPUT OUTPUT SERIAL DISPLAY P1 HALF_P1 DDRB PINB PORTB PB0 byte & ++ <= ตัวอยา่ งท่ี 3-1 การตงั้ ช่อื ตวั แปรทีใ่ ชไ้ ด้และใช้ไมไ่ ด้ ใช้ได้ ใชไ้ มไ่ ด้ เหตผุ ลทีใ่ ช้ไม่ได้ a1 1a ข้นึ ต้นด้วยตวั เลข data7 data 7 เวน้ วรรคระหวา่ งคา led else ใชค้ าสงวนตัง้ ช่ือตวั แปร num_8 num..8 ใช้เครอื่ งหมาย .. ระหวา่ งคา key3 key ! ใช้เครือ่ งหมาย ! ตอ่ ทา้ ยตัวแปร 2.3 คา่ คงที่ คา่ คงที่ (Constant) คือ ขอ้ มลู ทีถ่ กู กาหนดไวแ้ ลว้ เมือ่ นามาเขยี นโปรแกรมควบคุม ค่าคงทจ่ี ะ ถูกนามาถา่ ยคา่ ให้ตัวแปรเพ่อื นาไปใชง้ านต่อไป ในภาษา Arduino มกี ารกาหนดคา่ ตัวแปรทแ่ี บบ ค่าคงที่ (constant) ไว้จานวนหนึ่งให้ผ้ใู ชเ้ รยี กใช้เพอ่ื อานวยความสะดวกและช่วยใหส้ ามารถอ่าน ความหมายของคาส่งั ในโปรแกรมไดง้ า่ ยและตรงความหมายมากยิง่ ข้ึน • FALSE เป็นคา่ คงที่แบบ Boolean มคี า่ เปน็ ศูนย์ หรอื เทจ็ หรอื FALSE • TRUE เปน็ ค่าคงทแ่ี บบ Boolean มคี ่าเป็นค่าใดๆ ทไ่ี มใ่ ช้ ศูนย์ ซ่งึ อาจเปน็ 1 หรอื -1 หรอื ค่าอืน่ ใดก็ได้ทีไ่ มใ่ ชศ่ นู ย์ จะถอื เป็น จริง หรอื FALSE ทง้ั หมด • HIGH ใช้แทนสถานะโลจกิ HIGH หรอื Logic \"1\" • LOW ใช้แทนสถานะโลจกิ LOW หรอื Logic \"0\" • INPUT ใชใ้ นการกาหนดคา่ สถานะ Input ให้กับฟังก์ชน่ั pinMode() • OUTPUT ใช้ในการกาหนดคา่ สถานะ Output ใหก้ บั ฟงั ก์ชน่ั pinMode()

นอกจากค่าคงที่ในส่วนที่มีการ จอง หรือ กาหนดไว้แล้วจาก Compiler ใน Arduino ยังมี ค่าคงท่ี อีกแบบหน่ึง ซ่ึง ก็คือ ค่าคงท่ีแบบตัวเลขจานวนเต็มท่ีถูกกาหนดจากผู้ใช้เอง ซ่ึงได้แก่ค่าคงท่ี อยู่ในรูปของค่าตัวเลขจานวนเตม็ แบบต่างๆ แตเ่ นื่องจาก คุณสมบตั ิของตวั แปร สาหรับ ใชใ้ นการเก็บ ค่าตัวเลขจานวนเต็มน้ันจะมีอยู่มากมายหลายแบบ เช่น sinned, unsigned, short, long ดังนั้นใน การกาหนดค่าตัวเลขให้กับ Compiler ก็ต้องมีการระบุให้ Compiler ทราบด้วยว่า ตัวเลขท่ีกาหนด ไปนั้นเป็นค่าตัวเลขแบบใน โดย Arduino กาหนดให้ใช้ รหัสตัวอักษร ต่อท้ายตัวเลข เพ่ือกาหนดค่า คุณสมบัติเฉพาะของตัวเลข ตามต้องการโดยใช้รหัสตัวอักษร U และ L ต่อท้ายตัวเลขเพื่อบ่งบอกถึง คุณสมบัติเฉพาะของตัวเลขในแบบที่เราต้องการ ซ่ึงจะใช้ตัวอักษรตัวเล็ก หรือ ตัวใหญ่ก็ได้มี ความหมายเหมือนกนั คอื • u หรือ U ใช้บอกให้ Compiler รวู้ า่ ตัวเลขท่กี าหนดเป็นแบบ unsigned เช่น 33U • l หรือ L ใชบ้ อกให้ Compiler รวู้ า่ ตวั เลขท่กี าหนดเปน็ แบบ Long เช่น 100000L • ul หรือ UL ใช้บอกให้ Compiler รู้วา่ ตัวเลขทก่ี าหนดเป็นแบบ unsigned long เชน่ 132767UL ถ้ามีการการกาหนดค่าคงที่แบบตัวเลขจานวนเต็ม โดยไม่มีการใช้รหัสตัวอักษร U หรือ L กากับต่อท้ายค่าตัวเลขด้วย โปรแกรม Compiler จะถือว่าค่าตัวเลขนั้นเป็นแบบ int ซ่ึงจะยอมให้ กาหนดค่าตัวเลขได้ไม่เกิน 65535 เท่านั้น ถ้าค่าเกินกว่าน้ันจะทาให้การทางานเกิดความผิดพลาด ตัวอยา่ งการกาหนดค่าตวั เลขทม่ี ักใช้กันผิดๆบ่อยๆ เช่น การใชง้ านคาสัง่ delay ซ่ึงตอ้ งผา่ นคา่ สาหรับ กาหนดการหน่วงเวลา ให้กับคาส่ังด้วยค่าตัวเลขแบบ unsigned long ซึ่งมีรูปแบบของการใช้งาน คาสั่งเป็น delay(unsigned long msec); โดยการกาหนดค่า delay ท่ีมีค่ามากกว่า 65535 แบบที่ ถูกตอ้ งตอ้ งกาหนดเปน็ delay (60000UL) 2.4 ตวั ดาเนินการในภาษาซี การเขียนโปรแกรมจาเป็นจะต้องมีการดาเนินการระหว่างค่าหรือข้อมูลต่างๆอยู่ตลอดเวลา โดยในการดาเนินการดงั กล่าวจะประกอบด้วย ตัวดาเนินการ (Operator) ทาหน้าที่รวมค่าต่างๆ และ กระทากับค่าต่างๆ ให้เป็นค่าเดียวกัน ตัวถูกดาเนินการ (Operand) อาจเป็นค่าคงท่ี ตัวแปร หรือ ฟังก์ชันก็ได้ และนิพจน์ (Expression) คือ ข้อความหรือประโยคท่ีเขียนอยู่ในรูปสัญลักษณ์ โดยนา ค่าคงท่ี ตวั แปร หรอื ฟังก์ชนั มาสัมพันธก์ บั ตัวดาเนินการ Operand 1 (ตัวแปร) Operand 2 (คา่ คงที่) M+8 Operator นพิ น ภาพท่ี 2-1 ลักษณะของ ตัวดาเนนิ การ ตัวถกู ดาเนนิ การ และนิพจน์

2.4.1 ตัวดาเนินการทางคณติ ศาสตร ตัวดาเนินการทางคณิตศาสตร์ (Arithmetic Operators) ใช้เปน็ ตวั เช่ือมในการเขียนโปรแกรม เพ่ือหาผลลัพธ์จากการคานวณ ซ่ึงสามารถกระทากับข้อมูลได้หลายรูปแบบ เช่น บวก ลบ คูณ หาร เป็นตน้ ตารางที่ 2-5 ตวั ดาเนนิ การทางคณติ ศาสตร์ การทางาน ตัวดาเนินการ การบวก + การลบ - การคณู * การหาร / การหารคิดเศษ (Modulus) ไม่สามารถใชง้ านกบั % ข้อมลู ชนิดตัวแปรชนิดเลขทศนิยม เพ่ิมคา่ ขนึ้ หน่งึ ค่า ++ ลดคา่ ลงหนึง่ ค่า -- บวกเพ่ิมเท่ากบั คา่ ทางขวามือ += ลดลงเทา่ กับค่าทางขวามอื -= คณู ด้วยเท่ากบั ค่าทางขวามอื *= หารดว้ ยเทา่ กับค่าทางขวามอื /= หารคิดเศษเท่ากบั คา่ ทางขวามอื %= ตัวอย่างที่ 2-2 การใช้งานตวั ดาเนินการทางคณิตศาสตร์ Int value, I, j; Float result; Value = 12/5; //value = 2 (หารแลว้ ได้จานวนเตม็ 2) Value = 13 % 5; //value = 3 (หารแลว้ เหลือเศษ 3) Value = 6*3/4; //value = 4 โดยนา 6 คณู กบั 3 ก่อน แล้วหารด้วย 4 Value = 6*3%4; //value = 2 โดยนา 6 คูณกับ 3 กอ่ น แล้วหารคิดเศษด้วย 4 Result = 12/5; //result = 2.0 (หารไม่คดิ เศษ) Result = 12.5/5.0; //result = 2.4 (หารแบบตวั แปรชนดิ เลขทศนยิ ม) Result = 12.5%5.0; //result = 0 (ไม่สามารถใช้ % ตัวแปร float) Result = 122.5*5.0; //result = 6.125 x 102 I = j++; //ให้ I = j ก่อน จากนั้นทาคาส่งั j++ ดังน้นั ถ้าก่อนทา //คาส่ัง j = 4 หลังทาคาส่งั จะได้ i=4 และ j=5

I = ++j; //ใหเ้ พิ่มค่า j ก่อน จากน้นั ให้ i=j ดังนน้ั ถ้ากอ่ นทา //คาสงั่ j=4 หลังทาคาสง่ั จะได้ i=5 และ j=5 X+=5; //มผี ลลพั ธเ์ ท่ากบั x=x+5; x-=10; //มีผลลพั ธเ์ ท่ากบั x=x-10; x*=y; //มีผลลัพธ์เท่ากับ x=x*y; x/=y; //มผี ลลพั ธเ์ ทา่ กับ x=x/y; x%=y; //มีผลลพั ธเ์ ทา่ กบั x=x%y; 2.4.2 ตวั ดาเนนิ การเปรยี บเทยี บ ตวั ดาเนนิ การเปรียบเทียบ(Relational Operators) เปน็ เครื่องหมายท่ีใช้เพ่ือทดสอบ เงื่อนไขหรอื เปรยี บเทยี บค่าตวั แปรตา่ งๆ โดยข้อมูลทนี่ ามาเปรียบเทียบจะตอ้ งเป็นข้อมูลประเภท เดียวกัน ผลลพั ธ์ท่ีได้จะเป็นคา่ ทางลอจกิ คอื จริง (T/True) หรอื เท็จ(F/False) ตารางท่ี 2-5 ตวั ดาเนินการเปรียบเทยี บ การทางาน ตัวดาเนนิ การ มากกว่า > มากกวา่ หหรอื เท่ากับ >= < นอ้ ยกวา่ <= นอ้ ยกวา่ หหรือเท่ากับ == เทา่ กับหรอื เทา่ กัน != ไม่เท่ากับหรอื ไมเ่ ท่ากนั ตวั อยา่ งที่ 2-3 การใช้งานตวั ดาเนนิ การดา้ นความสมั พนั ธ์ 5>7; //ผลลัพธ์ 0 เพราะเง่อื นไขนน้ั เปน็ เทจ็ 10<=20; //ผลลพั ธ์ 1 เพราะเงอ่ื นไขนั้นเปน็ จริง 10>=20; //ผลลพั ธ์ 0 เพราะเง่อื นไขน้นั เปน็ เทจ็ 8==13>5; //ผลลพั ธ์ 0 การทางาน 8==(13>5) 8==10 //ผลลพั ธ์ 1 การทางาน (14>5)<31<31 14>5<3; //ผลลพั ธ์ 0 การทางาน (a<b)<5(0หรือ1)>50 A<b>5; A<b<5; //ผลลัพธ์ 0 การทางาน (a<b)<5(0หรอื 1)<51 //ผลลพั ธ์ 0 การทางาน (a>b)>2(0หรอื 1)>20 A<5>2;

2.4.3 ตัวดาเนินการทางตรรกะ ตัวดาเนินการทางตรรกะ(Logical Operators) เปน็ เคร่อื งหมายทีใ่ ชเ้ ชอื่ มเงอ่ื นไข 2 เงอ่ื นไข หรือมากกวา่ เพือ่ ใหก้ ารเปรียบเทียบมีความละเอยี ดมากขนึ้ โดยขอ้ มูลทนี่ ามาเปรยี บเทียบจะตอ้ งเป็น ขอ้ มลู ประเภทเดยี วกนั ผลลพั ธท์ ไ่ี ดจ้ ะเปน็ คา่ ทางลอจกิ คือ จรงิ (T/True) หรือ เท็จ(F/False) ตารางที่ 2-6 ตวั ดาเนินการทางตรรกะ ตัวดาเนนิ การ การทางาน && ทาลอจิก AND ให้ผลลัพธ์เป็นจริง เมื่อเงื่อนไขท่ี นามาตรวจสอบเปน็ จรงิ ทั้งคู่ II ทาลอจิก OR ให้ผลลัพธ์เป็นจริง เม่ือเง่ือนไขที่ นามาตรวจสอบเป็นจริงหนง่ึ เงื่อนไข ! ทาลอจิก NOT ให้ผลลัพธ์เป็นจริง เม่ือเงื่อนไขเป็น เทจ็ และให้ผลลพั ธเ์ ปน็ เท็จ เมอื่ เง่อื นไขเป็นจรงิ ตัวดาเนินการทางตรรกะ && และ II จะกระทาจากทางซ้ายมือไปทางขวามือ สาหรับตัว ดาเนินการทางตรรกะ ! จะกระทาจากทางขวามือไปทางซ้ายมือ และให้กระทา !, && และ II ตามลาดับ ในกรณีที่มีตัวดาเนินการตรรกะ ตัวดาเนินการด้านความสัมพันธ์ หรือตัวดาเนินการทาง คณิตศาสตร์ อยู่ในนิพจน์เดียวกัน ให้กระทาตัวดาเนินการทางคณิตศาสตร์ ตัวดาเนินการด้าน ความสัมพนั ธ์ และตัวดาเนินการตรรกะ ตามลาดบั ตัวอยา่ งที่ 2-4 การใชง้ านตวั ดาเนินการตรรกะ c>=0 && c<=9; //การทางาน (c>=0) && (c<=9) ผลลพั ธ์ 1 เมอื่ c มีคา่ //ตงั้ แต่ 0 ถงึ 9 a+1==b II ! f(x); //การทางาน ((a+1)==b) II (!(f(x))) a>b && c<d; //การทางาน (a<b)&&(c<d) ถา้ (a>b) เป็นเทจ็ a&&b II c && d; //การทางาน (a && b) II (c && d) ถา้ (a && b) เป็นจริง //จะได้ 1 เมือ่ นามาทาการ OR กับ (c && d) ผลลัพธ์ 1 2.4.4 ตวั ดาเนนิ การระดับบติ ตัวดาเนนิ การทางบิต (Bitwise Operators) เป็นตวั ดาเนินการท่ีเข้าถึงระดบั บติ ซ่ึงจะเปน็ การ กระทาบิตต่อบิต คือ บติ 0 ของจานวนที่ 1 จะกระทากบั บิต 0 ของจานวนที่ 2 บติ 1 ของจานวนที่ 1 จะกระทากบั บติ 1 ของจานวนท่ี 2 และ บิต n ของจานวนที่ 1 จะกระทากบั บติ n ของจานวนที่ 2 ขอ้ มูลของบติ มเี พียง \"1\" และ \"0\" เท่านนั้

ตารางท่ี 2-7 ตัวดาเนินการทางบิต การทางาน การแอน (AND) แบบบิต ตวั ดาเนินการ การออร์ (OR) แบบบิต & ทาลอจิกเอก็ คลซู พี -ออร์ (X-OR) แบบบติ I กลับค่าขอ้ มูลแบบบติ ^ เลอ่ื นบติ ไปทางซ้ายมือ ~ เลื่อนบติ ไปทางขวามือ << เลือ่ นบิตทางซา้ ยเท่ากบั ค่าทางขวามอื ครั้ง >> เลอ่ื นบิตทางขวาเท่ากบั คา่ ทางขวามอื คร้งั <<= แอนดด์ ว้ ยเทา่ กบั ค่าทางขวามอื >>= ออร์ด้วยเทา่ กบั คา่ ทางขวามอื &= เอ็กคลซู พี -ออร์ เทา่ กับค่าทางขวามือ I= ^= ตวั อยา่ งท่ี 2-5 การใชง้ านตัวดาเนนิ การทางบิต 0x34 & 0x78; // ผลลพั ธ์ 0x30 0x34 I 0x78; // ผลลพั ธ์ 0x7C 0x34^0x78; // ผลลัพธ์ 0x44 0x78; // ผลลพั ธ์ 0xED 0xFF56 >> 4; // ผลลพั ธ์ 0x0FF5 0x0001 << 5; // ผลลัพธ์ 000040 x <<= 4; // มีผลลพั ธ์เทา่ กับ x = x<<4; x& = 0xF5; // มผี ลลพั ธเ์ ทา่ กบั x = x & 0xF5;

2.5 ไวยกรณในภาษาของ Arduino 2.5.1 ; (เซมโิ คลอน – semicolon) เคร่ืองหมายเซมโิ คลอน ใชเ้ ขยี นแจง้ ว่า จบคาส่ัง ตัวอยา่ งที่ 2-6 int a = 12; บรรทัดคาสั่งท่ีลืมเขียนปิดท้ายด้วยเซมิโคลอน จะทาให้แปลโปรแกรมไม่ผ่าน โดยตัวแปร ภาษาอาจจะแจ้งให้ทราบวา่ ไม่พบเครื่องหมายเซมิโคลอน หรือแจ้เป็นการผิดพลาดอนื่ ๆ บางกรณี ท่ีตรวจสอบบรรทัดทแี่ จ้งว่าเกดิ การผดิ พลาดแลว้ ไมพ่ บทีผ่ ดิ ให้ตรวจสอบบรรทดั ก่อนหนา้ นั้น 2.5.2 { } (วงเลบ็ ปกี กา – Curly brace) เคร่อื งหมายวงเล็บปีกกา เป็นส่วนสาคัญของภาษาซี โดยมกี ารใชง้ านต่างตาแหนง่ สร้างความ สบั สนให้กับผทู้ เ่ี ร่มิ ต้น วงเล็บปีกกาเปดิ { จะต้องเขียนตามดว้ ยวงเล็บปีกกาปิด } ด้วยเสมอ หรือที่เรียกว่าวงเล็บต้อง ครบคู่ ในซอฟต์แวร์ Arduino IDE ที่ใชเ้ ขียนโปรแกรมจะมีความสามารถในการตรวจสอบการครบคู่ ของเครอ่ื งหมายวงเลบ็ ผู้ใชง้ านเพยี งแค่คลกิ ทวี่ งเล็บ มันจะแสดงวงเลบ็ ท่ีเหลอื ซง่ึ เปน็ ค่ขู องมัน 2.5.3 // และ /*...* หมายเหตุบรรทดั เดียวและหลายบรรทัด หมายเหตุบรรทดั เดยี วและหลายบรรทดั เป็นส่วนของโปรแกรมทีผ่ ใู้ ชเ้ ขยี นเพ่มิ เติมวา่ โปรแกรม ทางานอย่างไร โดยส่วนที่เป็นหมายเหตุจะไม่ถูกคอมไพล์ ไม่นาไปประมวลผลมีประโยชน์มาก สาหรับการตรวจสอบโปรแกรมภายหลงั หรือใชแ้ จ้งให้เพ่ือนร่วมงานหรือบคุ คลอ่นื ทราบว่าบรรทัดน้ีใช้ ทาอะไร ตวั หมายเหตุภาษาซีมี 2 ประเภท คือ 1) หมายเหตบุ รรทัดเดียว เขียนเครื่องหมายสเลช // 2 ตวั หน้าบรรทดั 2) หมายเหตุหลายบรรทัด เขียนเคร่ืองหมายสเลช / คู่กับดอกจัน * คร่อมข้อความที่เป็น หมายเหตุ เชน่ /* blabla */ 2.5.4 # define เป็นคาสั่งท่ีใช้งานมาก ในการกาหนดค่าคงท่ีให้กับโปรแกรม ในการกาหนดค่าคงท่ีไม่ได้ เปลืองพื้นท่ีหน่วยความจาของไมโคคอนโทรลเลอร์แต่อย่างไร เม่ือถึงขึ้นตอนแปลภาษาคอมไพเลอร์ จะแทนท่ตี วั อกั ษรขอ้ ความด้วยคา่ ที่กาหนดไว้ ใน Arduino จะใช้ คาส่งั #define ตรงกับภาษาซี รปู แบบ #define constantName value ตัวอยา่ งที่ 2-7 #define ledPin 3 เปน็ การกาหนดให้ตวั แปร ledPin เท่ากับค่าคงที่ 3

2.5.5 # include ใชส้ ั่งให้รวมไฟลอ์ ่นื ๆ เข้ากับไฟลโ์ ปรแกรมของเรากอ่ น แลว้ จึงทาการคอมไพล์โปรแกรม รูปแบบ #include <file> #include \"file\" ตัวอย่างท่ี 2-8 #include <stdio.h> #include \"lcd.h\" บรรทัดท่ี 1 จะส่ังให้เรียกไฟล์ stdio.h มารวมกับไฟล์โปรแกรมของเรา โดยค้นหาไฟล์จาก ตาแหน่งท่เี กบ็ ไฟล์ระบบของ Arduino โดยปกติเป็นไฟลม์ าตรฐานท่ีมาพร้อมกบั Arduino บรรทดั ท่ี 2 สั่งใหร้ วมไฟล์ lcd.h มารวมกับไฟล์โปรแกรมของเรา โดยหาไฟล์จากตาแหน่งท่ี อยูข่ องไฟลภ์ าษาซขี องเราก่อน ปกตเิ ป็นไฟลท์ ี่ผใู้ ช้สรา้ งขน้ึ เอง 2.6 ฟังกชนั ควบคมุ การทางาน 2.6.1 ฟังกชนั แบบทางเลอื ก ในการเขียนโปรแกรมเพ่ือให้ไมโครคอนโทรลเลอร์ทางานในส่ิงที่ต้องการ นอกจากฟังก์ชันที่ส่ัง ให้ทางานเป็นลาดับแล้ว จาเป็นตอ้ งใช้ฟังก์ชันท่ีมีการทางานแบบให้เลือกเส้นทางการทางาน โดยการ ทาตามเง่ือนไข หรือการให้ทาซ้าแบบมีเงื่อนไขหรือไม่มีเงื่อนไข โดยฟังก์ชันท่ีมีการทางานแบบ ทางเลอื กในภาษาซี มีดงั นี้ 1) ฟังกชนั if ทางเลอื กเดียว การทางานของฟังก์ชัน if เป็นฟังก์ชันแบบทางเลือกเดียว คือ ถ้าเง่ือนไขในการเปรียบเทียบ เป็นจริงจะทาฟังก์ชัน หรือคาส่ังระหว่างปีกกาเปิด และปีกกาปิด แต่ถ้าไม่จริงหรือเป็นเท็จจะจบการ ทางาน รปู แบบ If (expression) { statement } โดยที่ expression เงอ่ื นไขทตี่ อ้ งการตรวจสอบ statement ชดุ ฟังก์ชันทจ่ี ะทาเม่อื เงื่อนไขเป็นจริง

Start If (เงือ่ นไข) เท็จ จริง ชดุ ฟงั ก์ชัน End ภาพท่ี 2-2 โฟลวช์ ารต์ การทางานของฟงั ก์ชัน if ทางเลือกเดยี ว ที่มา : ดอนสัน ปงผาน.(2553).ไมโครคอนโทรลเลอรแ์ ละการประยกุ ต์ใช้งาน 1.หนา้ 105 ตวั อยา่ งท่ี 2-9 // กาหนดให้ตวั แปร a เป็นตวั แปรชนิด char #include<stdio.h> // เคลียร์จอภาพ void main() // ตรวจสอบว่า a มากกวา่ 0 หรอื ไม่ { char a ; // ถ้าเงือ่ นไขเปน็ จรงิ ใหแ้ สดง Positive Number clrscr() If (a>0) // กาหนดใหต้ วั แปร track เปน็ ตัวแปรชนิด char { // อา่ นคา่ ลอจกิ ทข่ี า 1 แลว้ นาไปเก็บในตวั แปร SW1 printf(“Positive Number”); // ตรวจสอบเงอื่ นไข SW1 เป็นลอจิก 0 หรอื ไม่ } // ถ้าเงื่อนไขเป็นจริง สง่ ลอจกิ 1 ออกทขี่ า 13 } ตวั อยา่ งท่ี 2-10 viod loop () { char SW1 ; SW1=digitalRead(pin1); If (SW1==LOW) { digitalWrite(13,HIGHT); } }

2) ฟงั กชัน if สองทางเลอื ก การทางานของฟังก์ชัน if สองทางเลือกต้องใช้ร่วมกับ else คือ ถ้าเง่ือนไขในการเปรียบเทียบ เปน็ จรงิ จะทาชุดฟงั ก์ชันท่ี 1 แต่ถ้าเงื่อนไขเป็นเทจ็ จะทาชดุ ฟงั ก์ชันท่ี 2 ซึง่ อย่หู ลัง else รปู แบบ If (expression) { statement 1 } else { statement 2 } โดยที่ expression เงื่อนไขทีต่ ้องการตรวจสอบ statement 1 ชุดฟงั กช์ นั ทีจ่ ะทาเมอื่ เงอ่ื นไขเป็นจริง statement 2 ชุดฟังก์ชนั ทีจ่ ะทาเมอื่ เง่ือนไขเป็นเทจ็ Start If (เงอื่ นไข) เท็จ จริง ชดุ ฟังกช์ ันท่ี 2 ชุดฟงั กช์ นั ที่ 1 End ภาพท่ี 2-3 โฟลว์ชารต์ การทางานของฟงั ก์ชัน if สองทางเลือก ท่ีมา : ดอนสัน ปงผาน.(2553).ไมโครคอนโทรลเลอรแ์ ละการประยกุ ตใ์ ชง้ าน 1.หนา้ 106

ตัวอยา่ งที่ 2-11 // กาหนดให้ตวั แปร a เปน็ ตัวแปรชนิด char #include<stdio.h> // เคลียร์จอภาพ void main() // รอรบั คา่ ตัวเลขจานวนเตม็ ไปเกบ็ ในตัวแปร num { char num ; // ตรวจสอบว่าnum มากกวา่ หรอื เท่ากบั 50 หรือไม่ clrscr() // ถ้าเงอ่ื นไขเปน็ จรงิ ใหแ้ สดง Pass scanf(“%d”,&num); If (num>=50) // ถา้ เงอื่ นไขเป็นเท็จ ให้แสดง Fail { printf(“Pass”); } else { printf(“Fail”); } } ตัวอย่างที่ 2-12 viod loop () { char SW1 ; // กาหนดให้ตวั แปร track เปน็ ตวั แปรชนิด char SW1=digitalRead(pin1); // อ่านคา่ ลอจกิ ทขี่ า 1 แล้วนาไปเกบ็ ในตวั แปร SW1 If (SW1==LOW) // ตรวจสอบเงอ่ื นไข SW1 เปน็ LOW หรอื ไม่ { digitalWrite(13,HIGH); // ถา้ เง่อื นไขเปน็ จริง ส่งลอจิก 1 ออกทข่ี า 13 } else { digitalWrite(13,LOW); // ถา้ เงื่อนไขเปน็ เทจ็ สง่ ลอจกิ 0 ออกท่ีขา 13 } การทางาน โปรแกรมจะตรวจสอบคา่ ตัวแปร SW1 ถ้าSW1 มีสถานะเป็น LOW เงื่อนไขเปน็ จริง โปรแกรมจะทาฟังก์ชัน digitalWrite(13,HIGH) ซึ่งต่อท้ายฟังก์ชัน if แต่ถ้าค่าตัวแปร SW1 มี สถานะเป็นอย่างอ่ืนเงื่อนไขเป็นเท็จ โปรแกรมจะข้ามมาทาฟังก์ชัน digitalWrite(13,HIGH) ในส่วน ของ else

3) ฟงั กชัน if หลายทางเลอื ก การทางานของฟังกช์ ัน if หลายทางเลอื ก จะทาการเปรียบเทียบเง่ือนไขที่ 1 ถ้าเง่ือนไขเปน็ จรงิ จะทาชดุ ฟงั กช์ ันที่ 1 แตถ่ ้าเปน็ เทจ็ จะทาการเปรยี บเทียบกบั เงื่อนไขที่ 2 ถ้าเง่อื นไขท่ี 2 เปน็ จรงิ จะทา ชุดฟังก์ชนั ท่ี 2 แต่ถา้ เปน็ เทจ็ จะทาชุดฟังก์ชันที่ 3 รปู แบบ If (expression 1) { statement 1 } else if (expression 2) { statement 2 } else { statement 3 } โดยท่ี expression 1 และ expression 2 เง่อื นไขท่ีต้องการตรวจสอบ statement 1 และ statement 2 ชุดฟงั กช์ นั ท่ีจะทาเม่อื เง่อื นไขเป็นจริง statement 3 ชุดฟงั ก์ชันท่ีจะทาเมือ่ เง่ือนไขเป็นเท็จ

Start จรงิ ชุดฟังก์ชันที่ 1 If (เงื่อนไขที่ 1) ชดุ ฟังก์ชันท่ี 2 เทจ็ จริง else If (เงื่อนไขท่ี 2) เทจ็ else ชุดฟงั กช์ ันที่ 3 End ภาพท่ี 2-4 โฟลว์ชารต์ การทางานของฟงั ก์ชนั if หลายทางเลือก ที่มา : ดอนสนั ปงผาน.(2553).ไมโครคอนโทรลเลอรแ์ ละการประยกุ ตใ์ ชง้ าน 1.หนา้ 107 ตวั อย่างท่ี 2-13 // กาหนดให้ตวั แปร a เป็นตวั แปรชนิด char #include<stdio.h> void main() // รอรบั คา่ ตวั เลขจานวนเต็ม ไปเกบ็ ในตัวแปร score { // ตรวจสอบ scoce >=80 หรือไม่ // scoce >=80 char score ; // แสดงขอ้ ความ grade=Good ออกจอ clrscr() // เคลยี ร์จอภาพ scanf(“%d”,&score); // ตรวจสอบ scoce >=50 หรือไม่ If (score>=80) // scoce >=50 { // แสดงขอ้ ความ grade=Pass ออกจอ printf(“grade=Good”); } // scoce <50 else If (score>=50) { // แสดงขอ้ ความ grade=Fail ออกจอ printf(“grade=Pass”); } else { printf(“grade=Fail”); }

การทางาน โปรแกรมจะตรวจสอบเง่ือนไขที่ 2 ถ้าค่าตัวแปร score ถ้ามีค่าตั้งแต่ 80 ข้ึนไป โปรแกรมจะส่งข้อความ grade=Pass ออกพอร์ตอนุกรม แต่ถ้าค่าตัวแปร score มีค่าต่ากว่า 80 โปรแกรมจะทาการตรวจสอบ เงื่อนไขท่ี 2 ถ้าค่าตัวแปร score มีค่าตั้งแต่ 50 ข้ึนไปเงื่อนไขเป็นจริง โปรแกรมจะส่งข้อความ grade=Pass ออกพอร์ตอนุกรม ถ้าค่าตัวแปร score มีค่าต่ากว่า 50 ลงไป โปรแกรมจะสง่ ข้อความ grade=Fail ออกพอรต์ อนกุ รม ในสว่ นของ else 4) ฟังกชนั switch ฟังก์ชัน switch เป็นฟังก์ชันที่ใช้ในการเปรียบเทียบข้อมูลเหมาะสาหรับการเปรียบเทียบ ข้อมูลหลายๆ ทางเลือก และฟังก์ชัน switch จะไม่สามารเปรียบเทียบข้อมูลแบบมากกว่าหรือน้อย กวา่ เหมอื นกบั ฟงั กช์ นั if ไดแ้ ตจ่ ะเปรียบเทียบข้อมูลกับคา่ คงทีต่ ัวอกั ษรหรือตวั แปร รปู แบบ switch (variable) { case constant 1 : statement 1; break; case constant 2 : statement 2; break; default : statement 3 } โดยที่ variable ตวั แปรทีต่ ้องการตรวจสอบ constant 1 ถึง constant 2 ค่าคงที่ใช้เปรยี บเทียบกบั เงือนไขที่ตอ้ งการตรวจสอบ ถ้าตรงกับกรณใี ดก็จะทาฟงั กช์ นั ใน statement นน้ั statement 1 ถึง statement 2 ชดุ ฟงั ก์ชันท่ี 1 ถงึ 2 statement 3 ชุดฟังก์ชันทก่ี าหนดใหโ้ ปรแกรมทางาน ในกรณีท่เี งื่อนไขไมต่ รงกับ กรณใี ดๆ การทางานของฟังก์ชัน switch จะนาตัวแปรที่ต้องการตรวจสอบ(variable) มาเปรียบเทียบ กับค่าคงที่ใชเ้ ปรยี บเทียบกับเงือนไขท่ีตอ้ งการตรวจสอบ (constant 1 ถึง constant 2) ซึ่งถ้าตรงกับ กรณีใด(case) หรือเง่ือนไขใดจะทาฟังก์ชันที่อยู่หลังเง่ือนไขนั้น (statement 1 ถึง statement 2) แล้วจบการทางานของฟังก์ชนั switch แตถ่ ้าไม่ตรงกับกรณีใดหรือเงือ่ นไขใดจะทาชุดฟังก์ชันที่อยู่หลัง default (statement 3) ซึ่ง ฟังก์ชัน default จะมีหรือไม่ก็ได้ ซึ่งฟังก์ชัน switch เหมาะสาหรับการเปรียบเทียบข้อมูลหลาย ๆ เง่ือนไข

Start switch(ตัวแปร) case คา่ คงที่ 1 จรงิ ชุดฟังก์ชนั ท่ี 1; break; เท็จ จรงิ ชดุ ฟงั ก์ชันที่ 2; break; case คา่ คงท่ี 2 เทจ็ default ชุดฟังก์ชนั ท่ี 3 End ภาพที่ 2-5 โฟลวช์ าร์ตการทางานของฟังก์ชนั switch ที่มา : ดอนสนั ปงผาน.(2553).ไมโครคอนโทรลเลอร์และการประยกุ ต์ใชง้ าน 1.หน้า 109 ตัวอยา่ งที่ 2-14 โปรแกรมเพื่อตรวจสอบตัวเลข 1 2 3 4 และ 5 # include <stdio.h> viod main ( ) { char key ; clrscr ( ) ; // เคลียรจ์ อภาพ printf (“Enter Number (1-5) = ”); // ใหแ้ สดง Enter Number (1-5) = key=getche( ); // ใหร้ อรบั คา่ การแปน้ พมิ พ์ แลว้ นาไปเกบ็ ในตวั แปร key switch (key) {case ‘1’ : printf (“\\n a Number one”) ;break; // ตวั แปร track=1 ให้แสดง Number one case ‘2’ : printf (“\\n a Number two”) ;break; // ตวั แปร track=2 ใหแ้ สดง Number two case ‘3’ : printf (“\\n a Number three”) ;break; // ตวั แปร track=3 ใหแ้ สดง Number three case ‘4’ : printf (“\\n a Number four”) ;break; // ตัวแปร track=4 ใหแ้ สดง Number four case ‘5’ : printf (“\\n a Number five”) ;break; // ตวั แปร track=5 ใหแ้ สดง Number five default : printf (“\\n Other Number”) ; // เม่อื ไมต่ รงกบั case ใดๆเลย ใหแ้ สดง Other Number } getch ( ); }

การทางาน โปรแกรมจะแสดงข้อความ Enter Number (1-5) = แล้วรอรับค่าการกด แป้นพิมพ์ 1 ตัวเลข มาเก็บไว้ท่ีตัวแปร key ฟังก์ชัน switch ทาการเปรียบเทียบค่ากับตัวแปร track ถ้าค่าของตัวแปร track ตรงกับ case ใดจะทาคาสั่งใน case น้ัน ถ้าไม่ตรงกับ case ใด จะหยุด ทางาน ตวั อยา่ งที่ 2-15 โปรแกรมเพ่อื ตรวจสอบตวั เลข 1 2 3 4 และ 5 viod loop ( ) { char track ; // กาหนดใหต้ ัวแปร track เป็นตัวแปรชนดิ char track=readsensor(); switch (track) // ตรวจสอบคา่ ในตวั แปร track { case 1 : turnLeft(); break; // ตัวแปร track=1 ให้ทาฟงั ก์ชนั turnLeft() case 2 : forward(); break; // ตวั แปร track=2 ให้ทาฟงั กช์ นั forward() case 3 : turnRight(); break; // ตวั แปร track=3 ให้ทาฟงั ก์ชนั turnRight() default : stop(); // ไม่ตรงกบั เงอ่ื นไขใด ทาฟังกช์ นั stop() } การทางาน โปรแกรมจะตรวจสอบค่าในตัวแปร track ฟังก์ชัน switch ทาการเปรียบเทียบค่า กับตวั แปร key ถ้าค่าของตวั แปร key ตรงกับ case ใดจะทาคาสั่งใน case น้นั ถ้าไมต่ รงกับ case ใด จะแสดงข้อความ Other Number ทอ่ี ยู่หลัง ถา้ มีคา่ เปน็ 1 ใหท้ าฟังก์ชัน turnLeft() ถ้าเป็น 2 ให้ทาฟงั ก์ชัน forward() ถา้ เป็น 3 ใหท้ าฟังก์ชัน turnRight() ถา้ ไมต่ รงกับเง่อื นไขท่ผี ่านมา ให้ทาฟังกช์ ัน stop() 3.6.2 ฟงั กชันการดาเนินการแบบวนรอบ การเขยี นโปรแกรมส่ังงานในไมโครคอนโทรลเลอร์ ต้องมกี ารทางานแบบวนซ้า หรอื วนรอบ เพ่ือทจี่ ะทางานในชดุ คาสง่ั เดิม ลกั ษณะการทางานมที ัง้ แบบมเี งอื่ นไข หรอื ไมม่ เี ง่ือนไข ในภาษาซมี ี ฟงั ก์ชันส่ังงานให้ไมโครคอนโทรลเลอรท์ างานซา้ มดี ังนี้ 1) ฟงั กชนั for ฟังก์ชัน for เป็นฟังก์ชันวนลูปหรือวนรอบใช้ในการเขียนโปรแกรมท่ีมีลักษณะการทางาน วนรอบซ้า ๆ กันเพื่อลดขนาดของโปรแกรมแลเพ่ิมความเร็วในการประมวลผลการทางานของฟังชัน for เร่ิมจากการกาหนดค่าเริ่มต้นให้กับตัวแปรแล้วจึงตรวจสอบเงื่อนไข ถ้าเงื่อนไขเป็นจริงจะทาชุด ฟังก์ชันในปีกกาเปิดและปิด จากนั้นทาการเพิ่มค่าหรือลดค่าให้กับตัวแปร แล้วทาการตรวจสอบ เงอ่ื นไข ถ้าเงือ่ นไขเปน็ จริงจะทาตอ่ แต่ถา้ เงอื่ นไขเป็นเท็จจะออกจากลปู ข้อควรระวัง เครื่องหมายปีกกาเปิดและปิดในฟังก์ชัน for ถ้าไม่ใส่จะทาฟังก์ชันเดียวเท่านั้น และฟังกช์ นั for จะไม่มีเครือ่ งหมายเซมคิ อลอนปิดทา้ ย

รปู แบบ for (init-expression ; condition-expression ; increment-expression) { statement ; } โดยที่ init-expression ค่าเรม่ิ ต้นของตัวแปรทีน่ ามาเป็นเงือ่ นไข condition-expression เงือ่ นไขท่ใี ชใ้ นการตรวจสอบ ถ้าเง่ือนไขเป็นจริงจะทางาน ตามชุดฟังก์ชนั ในเครื่องหมายปีกกา increment-expression ฟงั ก์ชนั ทก่ี ระทากับตัวแปรเพ่ิมค่าหรือลดคา่ statement ชุดฟังกช์ นั ทีจ่ ะทาเมื่อเง่ือนไขเป็นจรงิ Start การกาหนดคา่ เร่มิ ตน้ เทจ็ ตรวจสอบเงอ่ื นไข การเพ่มิ หรือการลดคา่ End จริง ชุดฟังกช์ นั ภาพที่ 2-6 โฟลวช์ ารต์ การทางานของฟงั ก์ชนั for ท่ีมา : ดอนสัน ปงผาน.(2553).ไมโครคอนโทรลเลอร์และการประยุกต์ใชง้ าน 1.หนา้ 111 ตัวอยา่ งท่ี 2-16 // กาหนดให้ตวั แปร count เปน็ ตัวแปรชนดิ char # include <stdio.h> // เคลยี รจ์ อภาพ viod main ( ) // ใชฟ้ งั กช์ ัน for เพอ่ื วนรอบ 5 รอบ { char count ; clrscr ( ) ; for (count=1;count<5;count++ ”);

printf(“Loop=%d\\n”,count ); // ใหแ้ สดง Loop= คา่ ในตวั แปร ออกจอ getch ( ); } การทางาน โปรแกรมจะทาฟังกช์ ัน for โดยสรา้ งตัวแปร count และให้มคี า่ เรม่ิ ตน้ เป็น 1 และ ตรวจสอบค่าในตัวแปร count ถ้ามีค่าน้อยกว่า 5 แสดงว่าเงื่อนไขเป็นจริง ทาฟังก์ชันที่อยู่ระหว่าง เครื่องหมายปีกกา คือ แสดงคาว่า Loop ตามด้วยตัวเลข แล้วกลับไปเพิ่มค่าตัวแปร count (count ++) 1 ค่า แล้วตรวจสอบค่าในตัวแปร count อีก ถ้ามีค่าน้อยกว่า 5 แสดงว่าเง่ือนไขยังเป็นจริง ทา ฟงั ก์ชนั ทอ่ี ยู่ระหว่างเครื่องหมายปีกกคือ แสดงคาว่า Loop ตามด้วยตัวเลข แล้วกลบั ไปเพ่มิ คา่ ตัวแปร count (count ++) 1 คา่ ทาซา้ จนกระทัง้ ตวั แปร count มคี ่าเทา่ กับ 5 ส่งผลให้เงื่อนไขเปน็ เท็จ กจ็ ะ ไมท่ าฟังกช์ ันท่ีอยรู่ ะหวา่ งเครือ่ งหมายปกี กา ตัวอย่างที่ 2-17 viod loop ( ) { for (char i=0;i<10;i++) // ใช้ฟงั กช์ นั for เพือ่ วนรอบ 10 รอบ { digitalWrite(13,HIGH); // สง่ ลอจกิ HIGH ออกทขี่ า 13 delay(500); // หนว่ งเวลา 500 ms digitalWrite(13,LOW); // ส่งลอจกิ LOW ออกทข่ี า 13 delay(500); // หน่วงเวลา 500 ms } การทางาน โปรแกรมจะทาฟังก์ชัน for โดยสร้างตัวแปร i และให้มีค่าเริ่มต้นเป็น 0 และ ตรวจสอบค่าในตัวแปร i ถ้ามีค่าน้อยกว่า 10 แสดงว่าเง่ือนไขเป็นจริง ทาฟังก์ชันท่ีอยู่ระหว่าง เคร่ืองหมายปีกกา แล้วกลับไปเพิ่มค่าตัวแปร i (i++) 1 ค่า แล้วตรวจสอบค่าในตัวแปร i อีก ถ้ามีค่า น้อยกว่า 10 แสดงว่าเงื่อนไขยังเป็นจริง ทาฟังก์ชันท่ีอยู่ระหว่างเครื่องหมายปีกกา แล้วกลับไปเพ่ิม ค่าตัวแปร i (i++) 1 ค่า ทาซ้าจนกระทั้งตัวแปร i มีค่าเท่ากับ 10 ส่งผลให้เง่ือนไขเป็นเท็จ ก็จะไม่ทา ฟงั ก์ชนั ทอ่ี ยรู่ ะหวา่ งเครอ่ื งหมายปีกกา 2) ฟังกชนั while ฟังก์ชัน while เป็นฟังก์ชันวนลูปหรือวนรอบ ใช้ในการเขียนโปรแกรมท่ีมีลักษณะการ ทางานวนรอบซ้าๆ กัน การทางานเร่ิมจากตรวจสอบเงื่อนไขก่อน ถ้าเงื่อนไขเป็นจริงจะทาชุดฟังก์ชนั ภายในปีกกาเปิดและปิด แต่ถ้าเง่ือนไขเป็นเท็จจะออกจากลูป while

รปู แบบ while (expression) { statement ; } โดยที่ expression เง่ือนไขท่ใี ชใ้ นการตรวจสอบ statement ชุดฟงั กช์ นั ทจ่ี ะทาเม่อื เง่ือนไขเปน็ จรงิ Start เท็จ while(เง่อื นไข) End จรงิ { ชดุ ฟงั กช์ ัน } ภาพท่ี 2-7 โฟลว์ชารต์ การทางานของฟังก์ชนั while ท่มี า : ดอนสัน ปงผาน.(2553).ไมโครคอนโทรลเลอรแ์ ละการประยกุ ต์ใช้งาน 1.หนา้ 115 ตัวอยา่ ง 2-18 viod loop ( ) while (digitalRead(12)==LOW) // ใชฟ้ ังกช์ นั while วนรอบเม่ือขา 12 = LOW { digitalWrite(13,HIGH); // สง่ ลอจิก HIGH ออกที่ขา 13 delay(500); // หน่วงเวลา 500 ms digitalWrite(13,LOW); // ส่งลอจกิ LOW ออกที่ขา 13 delay(500); // หนว่ งเวลา 500 ms } การทางาน โปรแกรมจะทาฟงั กช์ นั while โดยตรวจคา่ ลอจิกท่ีขา 12 ถ้ามคี ่าเปน็ LOW แสดง ว่าเงื่อนไขเป็นจริง ทาฟังก์ชันที่อยู่ระหว่างเครื่องหมายปีกกา ทาซ้าจนกระท้ังค่าลอจิกที่ขา 12 มีค่า เปน็ HIGH สง่ ผลให้เงื่อนไขเป็นเท็จ ก็จะไมท่ าฟงั กช์ นั ท่อี ย่รู ะหว่างเคร่ืองหมายปกี กา

3) ฟงั กชนั do while ฟังก์ชัน do while เป็นฟังก์ชันวนลูปหรือวนรอบ ใช้ในการเขียนโปรแกรมท่ีมีลักษณะการ ทางานวอนรอบซา้ ๆ กนั การทางานของฟังก์ชัน do while จะทาชดุ ฟงั กช์ นั กอ่ นจากนั้นจะทาการ ตรวจสอบเง่ือนไข ถ้าเง่ือนไขเป็นจริงก็จะทาชุดฟังก์ชันในลูปต่อ แต่ถ้าเงื่อนไขเป็นเท็จจะออกจาก การวนรอบ รูปแบบ do { statement ; } while (expression); โดยท่ี statement ชดุ ฟังกช์ ันทท่ี างานครง้ั แรก และจะทางานอีกครั้งเมื่อเงื่อนไขเป็นจริง expression เงื่อนไขท่ีใช้ในการตรวจสอบ ถ้าเง่ือนไขเป็นจริงจะทางานตามชุด ฟังก์ชนั ในเคร่ืองหมายปกี กา ถา้ เงอ่ื นไขเปน็ เท็จจะออกจากลูปของฟงั ก์ชัน do-while Start do { ชุดฟงั กช์ นั } while(เงอ่ื นไข) จรงิ เท็จ End ภาพที่ 2-8 โฟลว์ชารต์ การทางานของฟังก์ชนั do-while ทม่ี า : ดอนสัน ปงผาน.(2553).ไมโครคอนโทรลเลอรแ์ ละการประยกุ ตใ์ ช้งาน 1.หน้า 114

ตัวอยา่ งท่ี 2-19 // เริ่มตน้ ฟงั ก์ชันวนรอบ do-while viod loop ( ) do // ส่งลอจกิ HIGH ออกที่ขา 13 { // หน่วงเวลา 500 ms // สง่ ลอจิก LOW ออกทข่ี า 13 digitalWrite(13,HIGH); // หน่วงเวลา 500 ms delay(500); digitalWrite(13,LOW); // ใชฟ้ งั ก์ชนั while วนรอบเมอ่ื ขา 12 = LOW delay(500); } while (digitalRead(12)==LOW) การทางาน โปรแกรมจะทาฟังก์ชันที่อยู่ระหว่างเครื่องหมายปีกกาก่อน แล้วจึงจะตรวจสอบ ค่าโดยใช้ฟังก์ชัน while ถ้าค่าลอจิกท่ีขา 12 ถ้ามีค่าเป็น LOW แสดงว่าเง่ือนไขเป็นจริง จะกลับไป ทาซ้าฟังก์ชันท่ีอยู่ระหว่างเครื่องหมายปีกกาจนกระท้ังค่าลอจิกที่ขา 12 มีค่าเป็น HIGH ส่งผลให้ เงอ่ื นไขเปน็ เทจ็ ก็จะไม่กลับวนกลบั ไปทาฟงั กช์ นั ทอี่ ยู่ระหว่างเครือ่ งหมายปกี กาซา้ 2.7 ฟังกชนั่ ใชง้ านของ Arduino ฟังกช์ ั่นใชง้ านของ Arduino พืน้ ฐานท่ีมใี ห้เพือ่ ความสะดวกสาหรบั การเขยี นโปรแกรม ซงึ่ มใี น ชดุ โปรแกรม เพอ่ื ใหผ้ ใู้ ช้เรยี กใชง้ าน เช่น 2.7.1 กลมุ่ ฟงั กชันสาหรบั ใช้งานขาพอรต Digital I/O digitalRead() digitalWrite() pinMode() 2.7.2 กล่มุ ฟังกชันสาหรบั ใช้งานขาพอรต Analog I/O analogRead() analogReference() analogWrite() 2.7.3 กลมุ่ ฟงั กชันเก่ยี วกบั การหนว่ งเวลา(Time) delay() delayMicroseconds() 2.7.4 กลมุ่ ฟงั กชนั เกี่ยวกบั อนิ เตอรรัปต ากภายนอก (External Interrupts) attachInterrupt() detachInterrupt() 2.7.5 กลุ่มฟงั กชนั เกย่ี วกบั อนิ เตอรรัปต ากภายใน (Internal Interrupts) interrupts() noInterrupts()

2.7.6 กล่มุ ฟงั กชันเก่ยี วกับการสอ่ื สารอนกุ รม (Serial Communication) Serial.begin(speed) Serial.avaliable() Serial.print(data) Serial.printin(data)


Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook