ไวยากรณ์ของ Arduino ภาษาการเขียนโปรแกรม Arduino: แนวคิดพื้นฐาน Arduino คืออะไร
อาจเป็นเรื่องยากมากที่จะเริ่มงานด้านไอที หากเพียงเพราะการดูเทคโนโลยีรอบข้าง จึงเป็นไปไม่ได้ที่จะแยกความสนใจ "เหล็ก" ออกจากซอฟต์แวร์ ในอีกด้านหนึ่งความปรารถนาที่จะสร้างอุปกรณ์ที่ไร้ที่ติ รูปร่างเซ็นเซอร์จำนวนมากและความเป็นไปได้ที่ไร้ขีดจำกัด ในทางกลับกัน ความลึกลับของการประมวลผลข้อมูล ความปรารถนาที่จะเพิ่มประสิทธิภาพสูงสุดโดยไม่ละเลยฟังก์ชันการทำงาน Arduino เป็นก้าวแรกสู่สิ่งประดิษฐ์ที่ยอดเยี่ยม โดยไม่จำเป็นต้องมีความรู้เชิงลึกเกี่ยวกับวงจรหรือประสบการณ์ในการเขียนโปรแกรม
Arduino คืออะไร
หากคุณเรียกจอบว่าจอบ Arduino ก็เป็นคอนสตรัคเตอร์สำหรับผู้ที่เบื่อการสร้างภาพที่ไร้ประโยชน์และต้องการให้ชีวิตน้อยๆ แก่พวกเขา ในกรณีที่ง่ายที่สุด Arduino - แผงวงจรพิมพ์ซึ่งมีตัวควบคุม, คริสตัลออสซิลเลเตอร์, ADC / DAC, ตัวเชื่อมต่อหลายตัว, ไดโอดและปุ่มต่างๆ ที่เหลือคืองานของเจ้าของ: ถ้าคุณต้องการ - สร้างหุ่นยนต์ ถ้าคุณต้องการ - แพลตฟอร์มฮาร์ดแวร์และซอฟต์แวร์สำหรับบ้าน "อัจฉริยะ" หรือลืมประโยชน์ที่ใช้งานได้จริงและสนุกไปกับมัน
แน่นอนมันขึ้นอยู่กับ คุณต้องการไปไกลแค่ไหนกับการทดลองของคุณ ไม่ว่าคุณจะต้องการกลั่นกรองความสนุกหรือสร้างแพลตฟอร์ม Arduino ด้วยเงินของคุณเอง คุณจะต้องปรับปรุงทั้งในด้านการออกแบบฮาร์ดแวร์และในการศึกษาภาษาการเขียนโปรแกรม เพิ่มเติมเล็กน้อยเกี่ยวกับหลังวันนี้
Arduino ค่อนข้างจำกัดในแง่ของความเป็นไปได้ในการเขียนโปรแกรม โดยเฉพาะเมื่อเปรียบเทียบกับ Raspberry Pi เนื่องจากเกณฑ์การเข้าต่ำอย่างไม่เหมาะสม (บทช่วยสอนพื้นฐานใช้รูปแบบ A4 3 แผ่น) จึงไม่จำเป็นต้องพึ่งพาภาษามากมายโดยไม่ต้องเชื่อมต่อโมดูลเพิ่มเติม มันขึ้นอยู่กับ C/C++ แต่ด้วยความช่วยเหลือของ IDE และไลบรารีต่างๆ คุณจะสามารถเข้าถึง Python, C#, Go และความสนุกแบบเด็กๆ เช่น Snap! และ ArduBlock เราจะพูดถึงวิธีการใช้เมื่อใดและกับใคร
ซี/ซี++
ภาษาพื้นฐานของแพลตฟอร์ม Arduino ซึ่งมีการปรับเปลี่ยนและทำให้ง่ายขึ้นบางส่วนใช้ในเชลล์ซอฟต์แวร์มาตรฐาน คุณสามารถค้นหาคำสั่งที่มีอยู่ทั้งหมด "สำหรับผู้เริ่มต้น" แต่ไม่มีใครขัดขวางไม่ให้คุณใช้คุณสมบัติดั้งเดิมของภาษา C ++ ไม่จำเป็นต้องใช้ส่วนเสริม หากคุณต้องการเล่นกับ C "บริสุทธิ์" ที่บริการของคุณคือโปรแกรมที่ออกแบบมาตามชื่อที่สื่อถึงสำหรับการโต้ตอบกับ Windows และ AVR series MK ซึ่งใช้กับ Arduino มากกว่า คู่มือโดยละเอียดคุณสามารถอ่านได้ที่นี่
อาร์ดูบล็อก
ย้ายจากภาษาสำหรับผู้ใหญ่ไปเป็นภาษา Scratch ที่เด็ก ๆ ชื่นชอบเป็นการชั่วคราวหรือเปลี่ยนเป็น Ardublock ที่นี่ทุกอย่างเหมือนกัน แต่ปรับให้เข้ากับแพลตฟอร์มของคุณ: บล็อกสี, ตัวสร้าง, ชื่อรัสเซีย, ตรรกะง่ายๆ ตัวเลือกนี้เหมาะสำหรับผู้ที่ไม่คุ้นเคยกับการเขียนโปรแกรมเลย เช่นเดียวกับในภาษาโลโก้ คุณสามารถย้ายเต่าเสมือนบนระนาบเสมือนได้ ด้วยความช่วยเหลือจากการดำเนินการง่ายๆ คุณสามารถทำให้เด็กสนใจในการตีความจริงของการกระทำในโปรแกรมของเขา
อย่างไรก็ตาม หากต้องการใช้งาน คุณต้องติดตั้ง . เวอร์ชันล่าสุดเป็นการดีกว่าที่ไม่ควรพลาดมันค่อนข้างซับซ้อนเหมาะสำหรับการเริ่มต้นภายในสิ้นปี 2556 ในการติดตั้ง ให้เปลี่ยนชื่อไฟล์ที่ดาวน์โหลดเป็น “ardublock-all” และวางไว้ในโฟลเดอร์ “My Documents/Arduino/tools/ArduBlockTool/tool” ถ้าไม่มีเราสร้างมันขึ้นมา หากคุณไม่เข้าใจบางสิ่งนี่คือรายละเอียดเพิ่มเติม
งับ!
เมื่อเทียบกับ Ardublock แล้ว Snap! มีคุณสมบัติขั้นสูงในรูปแบบของบล็อกเพิ่มเติม ความสามารถในการใช้รายการและฟังก์ชั่น นั่นคือสแนป! โดยทั่วไปแล้วมันคล้ายกับภาษาโปรแกรมสำหรับผู้ใหญ่อยู่แล้ว ยกเว้นว่าคุณยังต้องเล่นตัวสร้างโค้ด
เพื่อที่จะใช้ภาษานี้ คุณจะต้องไปที่ snap4arduino.org และดาวน์โหลดส่วนประกอบที่จำเป็นสำหรับระบบปฏิบัติการของคุณ คุณสามารถดูตัวอย่างการติดตั้ง การใช้งาน และวิดีโอได้ที่นี่
หลาม
คุณสามารถตั้งโปรแกรมบน Arduino ได้อย่างเป็นทางการโดยใช้ภาษา Piet เป็นอย่างน้อย เพราะด้วยความอุตสาหะ คุณจะคอมไพล์ทุกอย่างลงในรหัสเครื่องได้ แต่เนื่องจากความจริงที่ว่า Python เป็นหนึ่งในภาษาที่ได้รับความนิยมมากที่สุดด้วยการผสมผสานความซับซ้อน / ความสามารถที่เกือบจะเหมาะสมที่สุด การเลี่ยงการใช้งานใน Arduino จึงเป็นเรื่องไร้สาระ คุณสามารถเริ่มเรียนรู้ Python ด้วยไฟล์ .
ดังนั้น คุณต้องมีไลบรารี PySerial (ก่อนหน้านี้ คุณอาจใช้ไลบรารีนี้เพื่อสื่อสารกับพอร์ตคอมพิวเตอร์) และ vPython คุณสามารถอ่านเกี่ยวกับวิธีตั้งค่าทุกอย่างถูกต้องและทำให้ใช้งานได้ในที่สุดตามลำดับ
ไปและภาษาอื่นๆ
เช่นเดียวกับที่ Arduino สื่อสารกับ Python ผ่านไลบรารี PySerial มันสามารถสื่อสารกับ Java, c Java, HTML และสิ่งที่คุณต้องการ Arduino เป็นแพลตฟอร์มที่ได้รับความนิยมมากพอที่คำถามซ้ำซากเช่นการเลือกภาษาที่สะดวกไม่ได้หยุดนักวิจัยคนอื่น สิ่งเดียวที่เจ้าของกระดานขนาดเล็กนี้ต้องการก็คือการคิดบางสิ่งที่น่าสนใจอย่างน่าอัศจรรย์ และเครื่องมือที่มีประโยชน์จะต้องถูกค้นพบอย่างหลีกเลี่ยงไม่ได้
คำสั่งภาษา การเขียนโปรแกรม Arduino
ชื่อพารามิเตอร์ | ความหมาย |
หัวข้อบทความ: | คำสั่งภาษาการเขียนโปรแกรม Arduino |
รูบริก (หมวดใจความ) | การเขียนโปรแกรม |
ภาษาการเขียนโปรแกรม Arduino ขึ้นอยู่กับภาษาซี หากคุณต้องการดูคำสั่งของภาษานี้ ให้รันคำสั่งเมนูในสภาพแวดล้อมการเขียนโปรแกรม วิธีใช้ / สารบัญ. คำสั่งถูกจัดกลุ่มเป็นสามคอลัมน์:
· โครงสร้าง: คำสั่งสำหรับเขียนโครงสร้างโปรแกรม - ลูป, แบรนช์, วากยสัมพันธ์, ตัวดำเนินการเลขคณิตและตรรกะ, ตัวดำเนินการเปรียบเทียบและการจัดการบิต
· ตัวแปร: ตัวแปรต่างๆ คล้ายกับที่ใช้ใน C มีเพียงไม่กี่ตัวเท่านั้นที่ใช้กับ Arduino:
โอ สูง- ระดับสูง, ลอจิก 1, +5 โวลต์บนพิน Arduino
โอ ต่ำ- ระดับต่ำ ลอจิก 0.0 โวลต์บนขา Arduino
โอ ป้อนข้อมูล- กำหนดผู้ติดต่อ Arduino เป็นอินพุต (รับข้อมูลจากอุปกรณ์ภายนอก)
โอ เอาต์พุต- การกำหนดผู้ติดต่อ Arduino เป็นเอาต์พุต (การถ่ายโอนข้อมูลไปยังอุปกรณ์ภายนอก, การควบคุมหน่วยพลังงาน)
· ฟังก์ชั่น: ฟังก์ชั่นที่ใช้ในการทำงานร่วมกับ Arduino จะกล่าวถึงโดยละเอียดในบทเรียนต่อไปนี้
หมายเหตุ 1: โครงสร้างและตัวแปรจะคล้ายกับที่ใช้ในโปรแกรมภาษาซี กล่าวคือ หากคุณทราบแล้ว ภาษาที่กำหนด- เชี่ยวชาญการเขียนโปรแกรม Arduino และในทางกลับกันได้อย่างง่ายดาย การเรียนรู้ภาษาโปรแกรม Arduino จะช่วยให้คุณเชี่ยวชาญภาษา C และอื่น ๆ
โน้ต 2: คำอธิบายของคำสั่งในคำแนะนำที่แนบมากับสภาพแวดล้อมจะได้รับบน ภาษาอังกฤษซึ่งอาจเป็นปัญหาได้ การแปลคำอธิบายเป็นภาษารัสเซียมีอยู่ในเว็บไซต์ Arduino.ru
หมายเหตุ 3: สามารถรับคำอธิบายของคำสั่งในโปรแกรมได้โดยเลือกคำสั่งนี้และดำเนินการ วิธีใช้ / ค้นหาในวิธีใช้.
ไวยากรณ์ภาษาการเขียนโปรแกรม Arduino
คล้ายกับที่ใช้ในภาษาซี:
· ; - เครื่องหมายอัฒภาค ระบุจุดสิ้นสุดของบรรทัด ตัวอย่างการใช้งาน:
int นำ = 13;
ในกรณีที่ไม่มี; ในตำแหน่งที่ควรจะเป็นเมื่อคุณพยายามโหลดโปรแกรมเข้าไป โปรแกรมอาร์ดุยโน่จะไม่โหลดและจะแสดงข้อผิดพลาดที่ด้านล่างของหน้าต่าง
· { } - วงเล็บเหลี่ยม วงเล็บปีกกาเปิดคือจุดเริ่มต้นของบล็อก วงเล็บปีกกาปิดคือจุดสิ้นสุดของบล็อก
การตั้งค่าเป็นโมฆะ () {
pinMode (นำ, เอาต์พุต);
· // – ความคิดเห็น สิ่งที่เขียนในบรรทัดหลังอักขระเหล่านี้ ตัวควบคุมไม่รับรู้ นี่คือบันทึกย่อสำหรับโปรแกรมเมอร์
ล่าช้า (1,000); // รอหนึ่งวินาที (1,000 มิลลิวินาที)
· #รวม<назавние библиотеки.h> - การเชื่อมต่อห้องสมุด - ชุดของโปรแกรม เช่น เพื่อควบคุมไฟแสดงสถานะ LCD:
#รวม
บันทึก: เครื่องหมายอัฒภาคหลัง # ไม่จำเป็นต้องรวม
คำสั่งภาษาการเขียนโปรแกรม Arduino - แนวคิดและประเภท การจำแนกประเภทและคุณสมบัติของหมวดหมู่ "คำสั่งภาษาโปรแกรม Arduino" 2017, 2018
ภาษาการเขียนโปรแกรมแต่ละภาษามีชุดคำสั่งควบคุมที่ให้การดำเนินการโค้ดเดียวกันหลายครั้ง (ลูป) การเลือกส่วนย่อยของโค้ดที่เหมาะสม (เงื่อนไข) และคำแนะนำสำหรับการออกจากส่วนย่อยของโค้ดปัจจุบัน
Arduino IDE ยืมการควบคุมที่จำเป็นส่วนใหญ่มาจาก C/C++ ไวยากรณ์ของพวกเขาเหมือนกันกับ C ด้านล่างเราจะอธิบายสั้น ๆ ไวยากรณ์ของพวกเขา
ถ้างบ
คำสั่ง if อนุญาตให้คุณดำเนินการส่วนย่อยของโปรแกรมโดยขึ้นอยู่กับผลลัพธ์ของการตรวจสอบเงื่อนไขบางอย่าง หากตรงตามเงื่อนไข รหัสโปรแกรมจะถูกดำเนินการ หากไม่ตรงตามเงื่อนไข รหัสโปรแกรมจะถูกข้ามไป ไวยากรณ์สำหรับคำสั่ง if เป็นดังนี้:
ถ้า(เงื่อนไข) ( statement1; statement2; )
เงื่อนไขสามารถเป็นการเปรียบเทียบตัวแปรหรือค่าที่ส่งกลับโดยฟังก์ชัน เกณฑ์หลักสำหรับเงื่อนไข if คือคำตอบจะต้องเป็นจริง (จริง) หรือเท็จ (เท็จ) เสมอ ตัวอย่างเงื่อนไขสำหรับคำสั่ง if:
ถ้า(a!=2) ( ) ถ้า(x<10) { } if(znak==’B’) { }ภายในวงเล็บที่เขียนไว้ภายในเงื่อนไข คุณสามารถรันโค้ดได้
ผู้ที่เริ่มเรียนรู้การเขียนโปรแกรมมักจะทำผิดพลาดในการเทียบค่าของตัวแปรที่กำหนดด้วยเครื่องหมาย "=" บันทึกดังกล่าวระบุอย่างชัดเจนถึงการกำหนดค่าให้กับตัวแปร ดังนั้น เงื่อนไขจะเป็น "จริง" เสมอ นั่นคือจะเป็นจริง การตรวจสอบว่าตัวแปรเท่ากับค่าใดค่าหนึ่งจะแสดงด้วยเครื่องหมายเท่ากับสองเท่า (==) เสมอ
คุณสามารถใช้สถานะของฟังก์ชันเป็นเงื่อนไขได้ เช่น
ถ้า(init()) ( Serial.print("ตกลง"); )
ตัวอย่างข้างต้นจะดำเนินการดังต่อไปนี้: ขั้นตอนแรกคือการเรียกใช้ฟังก์ชัน init() ฟังก์ชันนี้ส่งคืนค่าที่จะตีความเป็น "จริง" หรือ "เท็จ" ข้อความ "ตกลง" จะถูกส่งหรือไม่ส่งเลยทั้งนี้ขึ้นอยู่กับผลลัพธ์ของการเปรียบเทียบ
ถ้า...คำสั่งอื่น
คำสั่ง if แบบขยายคือคำสั่ง if….else ช่วยให้มั่นใจว่าโค้ดชิ้นหนึ่งจะทำงานเมื่อเงื่อนไขเป็นจริง (จริง) และโค้ดชิ้นที่สองจะทำงานหากเงื่อนไขไม่เป็นจริง (เท็จ) ไวยากรณ์ของคำสั่ง if….else เป็นดังนี้:
ถ้า (เงื่อนไข) ( // คำสั่ง A ) อื่น ( // คำสั่ง B )
คำสั่ง "A" จะถูกดำเนินการก็ต่อเมื่อตรงตามเงื่อนไขเท่านั้น คำสั่ง "B" จะถูกดำเนินการเมื่อไม่ตรงตามเงื่อนไข ไม่สามารถดำเนินการคำสั่ง "A" และ "B" พร้อมกันได้ ตัวอย่างต่อไปนี้แสดงวิธีใช้ไวยากรณ์ if...else:
ถ้า (init()) ( Serial.print("ok"); ) อื่น ( Serial.print("error"); )
ด้วยวิธีนี้ คุณสามารถตรวจสอบการทำงานที่ถูกต้องของฟังก์ชันและแจ้งให้ผู้ใช้ทราบ
การปฏิบัติตามปกติคือการปฏิเสธเงื่อนไข นี่เป็นเพราะฟังก์ชันที่ดำเนินการอย่างถูกต้องคืนค่า 0 ในขณะที่ฟังก์ชันที่ล้มเหลวด้วยเหตุผลบางอย่างส่งคืนค่าที่ไม่ใช่ศูนย์
คำอธิบายสำหรับ "ความซับซ้อนของชีวิต" นี้เป็นเรื่องง่าย หากดำเนินการฟังก์ชันอย่างถูกต้อง นี่เป็นข้อมูลเดียวที่เราต้องการ ในกรณีที่เกิดข้อผิดพลาด บางครั้งก็คุ้มค่าที่จะเข้าใจว่าเกิดข้อผิดพลาดขึ้น เหตุใดจึงดำเนินการฟังก์ชันไม่ถูกต้อง และนี่คือตัวเลขที่แตกต่างจากศูนย์มาช่วยนั่นคือด้วยความช่วยเหลือของรหัสดิจิทัลเราสามารถระบุประเภทของข้อผิดพลาดได้ ตัวอย่างเช่น 1 - ปัญหาในการอ่านค่าบางอย่าง 2 - ไม่มีที่ว่างในหน่วยความจำหรือบนดิสก์ เป็นต้น
ตัวอย่างที่แก้ไขล่าสุดแสดงวิธีการเรียกใช้ฟังก์ชันที่คืนค่าศูนย์เมื่อดำเนินการอย่างถูกต้อง:
ถ้า (!init()) ( Serial.print("ok"); ) อื่น ( Serial.print("error"); )
เปลี่ยนคำสั่งกรณี
คำสั่ง if ให้คุณตรวจสอบเงื่อนไขเดียวเท่านั้น บางครั้งจำเป็นต้องดำเนินการอย่างใดอย่างหนึ่งขึ้นอยู่กับค่าที่ส่งคืนหรือค่าที่อ่าน คำสั่งตัวเลือกแบบสลับเหมาะสำหรับสิ่งนี้ ไวยากรณ์ของคำสั่ง switch แสดงอยู่ด้านล่าง:
สวิตช์ (var) ( กรณีที่ 1: // คำแนะนำสำหรับ var=1 break; กรณีที่ 2: // คำแนะนำสำหรับ var=2 break; default: // คำสั่งโดยค่าเริ่มต้น (หาก var แตกต่างจาก 1 และ 2) )
ขึ้นอยู่กับค่าของตัวแปร var คำสั่งจะดำเนินการในบางบล็อก ป้ายกำกับกรณีหมายถึงจุดเริ่มต้นของบล็อกสำหรับค่าที่ระบุ ตัวอย่างเช่น กรณีที่ 1: หมายความว่าบล็อกที่กำหนดจะถูกดำเนินการสำหรับค่าของตัวแปร var เท่ากับหนึ่ง
แต่ละบล็อกต้องยุติด้วยคำสั่ง break มันขัดจังหวะการดำเนินการต่อไปของคำสั่ง switch หากละเว้นคำสั่ง break คำสั่งจะถูกดำเนินการในบล็อกถัดไปจนถึงคำสั่ง break ป้ายกำกับดีฟอลต์เป็นตัวเลือก เช่นเดียวกับอีกอันในคำสั่ง if คำสั่งในบล็อกดีฟอลต์จะทำงานก็ต่อเมื่อค่าของตัวแปร var ไม่ตรงกับรูปแบบใดๆ
บ่อยครั้งที่ต้องดำเนินการคำสั่งเดียวกันสำหรับค่าใดค่าหนึ่งจากหลายค่า สามารถทำได้ดังนี้:
สวิตช์ (x) ( กรณีที่ 1: // คำสั่งสำหรับ x=1 ตัวแบ่ง กรณีที่ 2: กรณีที่ 3: กรณีที่ 5: // คำสั่งสำหรับ x=2 หรือ 3 หรือ 4 ตัวแบ่ง กรณีที่ 4: // คำสั่งสำหรับ x=4 ตัวแบ่ง ; กรณีที่ 6: // คำแนะนำสำหรับ x=6 break; default: // คำสั่งเริ่มต้น (ถ้า x แตกต่างจาก 1,2,3,4,5,6) )
ขึ้นอยู่กับค่าของตัวแปร x บล็อกคำสั่งที่เกี่ยวข้องจะถูกดำเนินการ การทำซ้ำของ case 2: case 3: case 5: แจ้งให้คอมไพเลอร์ทราบว่าหากตัวแปร x มีค่าเป็น 2 หรือ 3 หรือ 5 โค้ดชิ้นเดียวกันจะถูกดำเนินการ
สำหรับคำสั่ง
คำสั่ง for ใช้เพื่อรันโค้ดเดิมซ้ำๆ บ่อยครั้งที่จำเป็นต้องดำเนินการตามคำสั่งเดียวกัน โดยเปลี่ยนเฉพาะค่าของตัวแปรบางตัวเท่านั้น for loop เหมาะสำหรับสิ่งนี้ ไวยากรณ์คำสั่งมีดังนี้:
int ฉัน; สำหรับ (i=0;i<10;i++) { // инструкции для выполнения в цикле }
พารามิเตอร์แรกที่กำหนดในคำสั่งคือ ค่าเริ่มต้นตัวแปร. องค์ประกอบอื่นกำลังตรวจสอบเงื่อนไขเพื่อดำเนินการวนซ้ำต่อไป ลูปจะถูกดำเนินการตราบเท่าที่ตรงตามเงื่อนไข องค์ประกอบสุดท้ายคือการเปลี่ยนแปลงค่าของตัวแปร บ่อยครั้งที่เราเพิ่มหรือลดมูลค่าของมัน (ตามความจำเป็น) ในตัวอย่างนี้ คำสั่งที่อยู่ในลูปจะถูกดำเนินการที่ i=0…9
บ่อยครั้งที่ตัวแปรที่ใช้ในลูปถูกประกาศในที่เดียวกัน:
สำหรับ (int i=0;i<10;i++) { // инструкции для выполнения в цикле }
ตัวแปรที่ใช้ในการนับขั้นตอนการวนรอบที่ตามมาสามารถใช้ภายในเพื่อเรียกใช้ฟังก์ชันด้วยพารามิเตอร์ที่เหมาะสม
For(int i=10;i>0;i—) ( Serial.print(i); // หมายเลข 10,9,8,7,6,5,4,3,2,1 จะถูกส่งไป)
ในขณะที่คำสั่ง
for loop นั้นสมบูรณ์แบบสำหรับตำแหน่งที่เราต้องการทำการนับ ในสถานการณ์ที่จำเป็นต้องดำเนินการบางอย่างอันเป็นผลมาจากเหตุการณ์บางอย่างที่ไม่สามารถคาดเดาได้ (เช่น เรากำลังรอการกดปุ่ม) เราสามารถใช้คำสั่ง while ซึ่งดำเนินการบล็อกคำสั่ง ตราบใดที่ตรงตามเงื่อนไข ไวยากรณ์ของคำสั่ง while เป็นดังนี้:
ในขณะที่ (เงื่อนไข) ( // บล็อกคำสั่งเพื่อดำเนินการ )
สิ่งสำคัญคือต้องมีการตรวจสอบเงื่อนไขที่จุดเริ่มต้นของลูป อาจเกิดขึ้นได้ว่าคำสั่งภายในลูป while ไม่ถูกดำเนินการ นอกจากนี้ยังเป็นไปได้ที่จะสร้างการวนซ้ำไม่สิ้นสุด ลองดูตัวอย่างสองตัวอย่าง:
intx=2; ในขณะที่(x>5) ( Serial.print(x); ) —————————————- int y=5; ในขณะที่(y>0) ( Serial.print(y); )
บล็อกแรกของคำสั่งภายใน while จะไม่ถูกดำเนินการ ตัวแปร x มีค่าเป็น 2 และจะมีค่าไม่เกิน 5 ในตัวอย่างที่สอง เรากำลังจัดการกับการวนซ้ำไม่สิ้นสุด ตัวแปร "y" มีค่า 5 เช่น มากกว่าศูนย์ ภายในลูปไม่มีการเปลี่ยนแปลงตัวแปร 'y' ดังนั้นการวนซ้ำจะไม่มีวันสิ้นสุด
นี่เป็นข้อผิดพลาดทั่วไปเมื่อเราลืมเปลี่ยนพารามิเตอร์ที่ทำให้การวนซ้ำสิ้นสุดลง ต่อไปนี้เป็นสองตัวอย่างที่ถูกต้องของการใช้ลูป while:
intx=0; ในขณะที่ (x<10) { //блок инструкций x++; } —————————————- while(true) { if(условие) break; // блок инструкций }
ในตัวอย่างแรก เราได้ดูแลการเปลี่ยนแปลงค่าของตัวแปรที่ตรวจสอบในเงื่อนไข เป็นผลให้วงจรจะสิ้นสุดลงในที่สุด ในตัวอย่างที่สอง วงวนไม่สิ้นสุดถูกสร้างขึ้นโดยเจตนา การวนซ้ำนี้เทียบเท่ากับฟังก์ชัน loop() ใน Arduino IDE นอกจากนี้ยังมีการแนะนำการตรวจสอบเงื่อนไขภายในลูป หลังจากนั้นลูปจะจบลงด้วยคำสั่ง break
ทำ...ในขณะที่คำสั่ง
รูปแบบหนึ่งของลูป while คือลูป do... while นอกจากไวยากรณ์แล้ว ยังแตกต่างกันตรงที่ตรวจสอบเงื่อนไขด้วย ในกรณีของ do... while เงื่อนไขจะถูกตรวจสอบหลังจากบล็อกคำสั่งถูกดำเนินการ ซึ่งหมายความว่าบล็อกคำสั่งในเนื้อหาของลูปจะถูกดำเนินการอย่างน้อยหนึ่งครั้ง ต่อไปนี้คือไวยากรณ์สำหรับคำสั่ง do... while:
ทำ ( // บล็อกคำสั่ง ) ในขณะที่ (เงื่อนไข)
ทุกอย่างที่เขียนเกี่ยวกับคำสั่ง while ใช้กับ do... while เช่นกัน ต่อไปนี้เป็นตัวอย่างของการใช้ลูป do... while:
intx=10; ทำ ( // บล็อกคำสั่ง x—; ) while(x>0); —————————————- do ( // บล็อกคำสั่ง if(condition) break; ) while(true);
คำสั่งทำลาย
คำสั่ง break ให้คุณออกจากลูป (do... while, for, while) และออกจากตัวเลือกสวิตช์ ในตัวอย่างต่อไปนี้ ให้พิจารณาการดำเนินการของคำสั่ง break:
สำหรับ (i=0;i<10;i++) { if(i==5) break; Serial.print(i); }
ควรดำเนินการวนรอบสำหรับตัวเลขตั้งแต่ 0 ถึง 9 แต่สำหรับหมายเลข 5 นั้นตรงตามเงื่อนไข ซึ่งทริกเกอร์คำสั่ง break นี่จะเป็นการออกจากลูป เป็นผลให้เฉพาะหมายเลข 0,1,2,3,4 เท่านั้นที่จะถูกส่งไปยังพอร์ตอนุกรม (Serial.print)
ดำเนินการต่อ
ตัวดำเนินการดำเนินการต่อทำให้คำสั่งวนซ้ำ (ทำ...ในขณะที่ สำหรับ ในขณะที่) หยุดการดำเนินการสำหรับค่าปัจจุบัน และไปที่ขั้นตอนถัดไปของการวนซ้ำ ตัวอย่างต่อไปนี้แสดงการทำงานของคำสั่งดำเนินการต่อ:
สำหรับ (i=0;i<10;i++) { if(i==5) continue; Serial.print(i); }
อย่างที่คุณเห็น การวนซ้ำจะถูกดำเนินการสำหรับค่าตั้งแต่ 0 ถึง 9 สำหรับค่า 5 คำสั่งดำเนินการต่อจะถูกดำเนินการ อันเป็นผลให้คำสั่งหลังจากคำสั่งนี้ไม่ถูกดำเนินการ เป็นผลให้หมายเลข 0,1,2,3,4,6,7,8,9 จะถูกส่งไปยังพอร์ตอนุกรม (Serial.print)
ส่งคืนใบแจ้งยอด
คำสั่ง return จะยุติการดำเนินการของฟังก์ชันที่เรียกและส่งคืนค่าของประเภทเฉพาะ ในฐานะพารามิเตอร์คำสั่ง คุณสามารถระบุตัวเลข อักขระ หรือตัวแปรบางประเภทได้ สิ่งสำคัญคือค่าส่งกลับต้องตรงกับประเภทของฟังก์ชันที่ประกาศ ตัวอย่างต่อไปนี้แสดงวิธีใช้คำสั่ง return:
Int checkSensor()( ถ้า (analogRead(0) > 400) ( // อ่านอินพุตแบบอะนาล็อก return 1; // สำหรับค่าที่มากกว่า 400, 1 จะถูกส่งกลับค่าอื่น ( ส่งคืน 0; // สำหรับค่าอื่นๆ , 0 จะถูกส่งกลับ) )
อย่างที่คุณเห็น คุณสามารถใช้คำสั่ง return ได้หลายคำสั่งในฟังก์ชันเดียว แต่จะมีเพียงหนึ่งคำสั่งเท่านั้นที่จะใช้งานได้เสมอ อนุญาตให้ใช้คำสั่ง return โดยไม่มีพารามิเตอร์ การดำเนินการนี้ทำให้คุณสามารถยุติฟังก์ชันที่ไม่ส่งกลับค่าใดๆ ก่อนเวลาอันควร
ถือเป็นโมฆะ function_name() ( statement1; if(x==0) return; statement2; statement3; )
ในตัวอย่างข้างต้น statement1 จะดำเนินการทุกครั้งที่เรียกใช้ฟังก์ชัน การดำเนินการของคำสั่ง 2 และคำสั่ง 3 ขึ้นอยู่กับผลลัพธ์ของคำสั่ง if หากตรงตามเงื่อนไข (จริง) คำสั่ง return จะถูกดำเนินการและฟังก์ชันจะออก
ในกรณีที่ไม่ตรงตามเงื่อนไข คำสั่ง return จะไม่ถูกดำเนินการเช่นกัน แต่คำสั่ง command2 และ instruction3 จะถูกดำเนินการ และหลังจากนั้นฟังก์ชันจะหยุดทำงาน
ไปที่คำสั่ง
ด้วยเหตุผลเชิงอุดมการณ์ ควรข้ามคำอธิบายนี้ไป... คำสั่ง goto เป็นคำสั่งที่ไม่ควรใช้ในการเขียนโปรแกรมปกติ ทำให้เกิดความซับซ้อนของโค้ดและเป็นพฤติกรรมการเขียนโปรแกรมที่ไม่ดี เราขอแนะนำอย่างยิ่งให้คุณอย่าใช้คำสั่งนี้ในโปรแกรมของคุณ เนื่องจาก goto อยู่ในเอกสารอย่างเป็นทางการบนเว็บไซต์ arduino.cc เราจะให้คำอธิบายสั้น ๆ ไวยากรณ์สำหรับคำสั่ง goto คือ:
…. ไปที่ป้ายกำกับ; // ข้ามไปที่บรรทัดที่ระบุว่า 'metka' ….. …. …. metka: // ป้ายกำกับที่โปรแกรมจะทำงานต่อไป ...
คำสั่งอนุญาตให้ข้ามไปยังป้ายกำกับที่กำหนด เช่น ไปยังตำแหน่งในโปรแกรม
บทเรียนนี้ให้ความรู้ขั้นต่ำที่จำเป็นในการเขียนโปรแกรมระบบ Arduino ในภาษาซี คุณสามารถดูและใช้เป็นข้อมูลอ้างอิงในอนาคตเท่านั้น ท่านที่เคยลงโปรแกรมภาษาซีในระบบอื่นข้ามบทความนี้ไปได้เลยครับ
อีกครั้งนี่คือขั้นต่ำเปล่า คำอธิบายของตัวชี้ คลาส ตัวแปรสตริง ฯลฯ จะได้รับในบทเรียนต่อไป หากมีอะไรไม่สมเหตุสมผล ไม่ต้องกังวล จะมีตัวอย่างและคำอธิบายมากมายในบทเรียนต่อๆ ไป
โครงสร้างของโปรแกรม Arduino
โครงสร้างของโปรแกรม Arduino ค่อนข้างเรียบง่ายและในรูปแบบขั้นต่ำประกอบด้วยสองส่วน setup() และ loop()
การตั้งค่าเป็นโมฆะ () (
เป็นโมฆะวน () (
ฟังก์ชัน setup() จะทำงานเพียงครั้งเดียว เมื่อคอนโทรลเลอร์เปิดหรือรีเซ็ต มันมักจะเกิดขึ้น การตั้งค่าเริ่มต้นตัวแปร รีจิสเตอร์ ฟังก์ชันต้องมีอยู่ในโปรแกรมแม้ว่าจะไม่มีสิ่งใดอยู่ในนั้นก็ตาม
หลังจากตั้งค่า () เสร็จสิ้น การควบคุมจะส่งผ่านไปยังฟังก์ชันลูป () มันดำเนินการคำสั่งที่เขียนในเนื้อหาของมัน (ระหว่างวงเล็บปีกกา) ในวงวนไม่สิ้นสุด ที่จริงแล้ว คำสั่งเหล่านี้ดำเนินการตามอัลกอริทึมทั้งหมดของคอนโทรลเลอร์
กฎไวยากรณ์ดั้งเดิมของภาษาซี
; อัฒภาคนิพจน์สามารถมีช่องว่างจำนวนมากโดยพลการ ขึ้นบรรทัดใหม่ สัญลักษณ์ของการสิ้นสุดนิพจน์คือสัญลักษณ์ "เซมิโคลอน"
z = x + y
z=x
+y;
( ) วงเล็บปีกกากำหนดฟังก์ชันหรือนิพจน์บล็อก ตัวอย่างเช่น ในฟังก์ชัน setup() และ loop()
/* … */ บล็อกความคิดเห็นอย่าลืมปิด
/* นี่คือบล็อกความคิดเห็น */
// ความคิดเห็นบรรทัดเดียว, ไม่ต้องปิด , ใช้ได้จนจบบรรทัด.
// นี่คือหนึ่งบรรทัดความคิดเห็น
ตัวแปรและชนิดข้อมูล
ตัวแปรคือตำแหน่งในหน่วยความจำที่เก็บข้อมูล โปรแกรมใช้ตัวแปรเพื่อเก็บข้อมูลการคำนวณระดับกลาง สำหรับการคำนวณสามารถใช้ข้อมูลที่มีรูปแบบต่างกัน บิตลึกต่างกัน ดังนั้นตัวแปรในภาษาซีจึงมีประเภทดังนี้
ประเภทข้อมูล | ความลึกบิตบิต | ช่วงตัวเลข |
บูลีน | 8 | ถูกผิด |
ถ่าน | 8 | -128 … 127 |
ถ่านที่ไม่ได้ลงนาม | 8 | 0 … 255 |
ไบต์ | 8 | 0 … 255 |
นานาชาติ | 16 | -32768 … 32767 |
int ที่ไม่ได้ลงนาม | 16 | 0 … 65535 |
คำ | 16 | 0 … 65535 |
ยาว | 32 | -2147483648 … 2147483647 |
ไม่ได้ลงนามยาว | 32 | 0 … 4294967295 |
สั้น | 16 | -32768 … 32767 |
ลอย | 32 | -3.4028235+38 … 3.4028235+38 |
สองเท่า | 32 | -3.4028235+38 … 3.4028235+38 |
ประเภทข้อมูลจะถูกเลือกตามความแม่นยำในการคำนวณที่ต้องการ รูปแบบข้อมูล และอื่นๆ ตัวอย่างเช่น ไม่จำเป็นสำหรับตัวนับที่นับได้ถึง 100 เพื่อเลือกประเภทยาว มันจะทำงานได้ แต่การดำเนินการจะใช้ข้อมูลและหน่วยความจำโปรแกรมมากขึ้น จะใช้เวลามากขึ้น
การประกาศตัวแปร
มีการระบุชนิดข้อมูลตามด้วยชื่อตัวแปร
intx; // การประกาศตัวแปรชื่อ x ชนิด int
float-widthBox; // ประกาศตัวแปรชื่อ widthBox ชนิด float
ต้องประกาศตัวแปรทั้งหมดก่อนใช้งาน
ตัวแปรสามารถประกาศในส่วนใดก็ได้ของโปรแกรม แต่ขึ้นอยู่กับบล็อกของโปรแกรมที่สามารถใช้ตัวแปรนั้น เหล่านั้น. ตัวแปรมีขอบเขต
- ตัวแปรที่ประกาศในตอนต้นของโปรแกรม ก่อนฟังก์ชัน void setup() จะถือเป็นตัวแปรส่วนกลางและมีอยู่ทุกที่ในโปรแกรม
- ตัวแปรโลคัลถูกประกาศภายในฟังก์ชันหรือบล็อก เช่น for loop และสามารถใช้ได้เฉพาะในบล็อกที่ประกาศเท่านั้น ตัวแปรหลายตัวที่มีชื่อเดียวกันแต่มีขอบเขตต่างกันได้
intmode; // ตัวแปรสามารถใช้ได้กับทุกฟังก์ชั่น
การตั้งค่าเป็นโมฆะ () (
// บล็อกว่าง ไม่ต้องตั้งค่าเริ่มต้น
}
เป็นโมฆะวน () (
นับยาว // ตัวแปรนับมีอยู่ในฟังก์ชัน loop() เท่านั้น
สำหรับ (int i=0; i< 10;) // переменная i доступна только внутри цикла
{
ฉัน ++;
}
}
เมื่อประกาศตัวแปร คุณสามารถตั้งค่าเริ่มต้น (initialize)
int x = 0; // ตัวแปร x ถูกประกาศด้วยค่าเริ่มต้น 0
ถ่าน d = 'a'; // ตัวแปร d ถูกประกาศด้วยค่าเริ่มต้นเท่ากับรหัสอักขระ ”a”
ในระหว่างการดำเนินการทางคณิตศาสตร์กับประเภทข้อมูลที่แตกต่างกัน การแปลงประเภทข้อมูลอัตโนมัติจะเกิดขึ้น แต่จะดีกว่าถ้าใช้การแปลงที่ชัดเจนเสมอ
intx; // ตัวแปร int
ชารี; // ตัวแปรถ่าน
intz; // ตัวแปร int
z = x + (int) y; // ตัวแปร y ถูกแปลงเป็น int อย่างชัดเจน
การดำเนินการทางคณิตศาสตร์
การดำเนินงานสัมพันธ์
การดำเนินการเชิงตรรกะ
การดำเนินการกับพอยน์เตอร์
การทำงานของบิต
& | และ |
| | หรือ |
^ | เอ็กซ์คลูซีฟหรือ |
~ | ผกผัน |
<< | SHIFT ซ้าย |
>> | SHIFT ขวา |
การดำเนินการมอบหมายแบบผสม
ทางเลือกของตัวเลือกการจัดการโปรแกรม
คำสั่ง IFทดสอบเงื่อนไขในวงเล็บปีกกาและดำเนินการนิพจน์หรือบล็อกที่ตามมาในวงเล็บปีกกาหากเงื่อนไขเป็นจริง
ถ้า (x == 5) // ถ้า x=5 ดังนั้น z=0 จะถูกดำเนินการ
z=0;
ถ้า (x > 5) // ถ้า x >
( z=0; y=8; )
ถ้า…อื่น ๆให้คุณเลือกระหว่างสองตัวเลือก
ถ้า (x > 5) // ถ้า x > 5 บล็อก z=0, y=8 จะถูกดำเนินการ;
{
z=0;
ย=8;
}
{
z=0;
y=0;
}
อื่น ๆ ถ้า- ให้คุณเลือกได้หลายแบบ
ถ้า (x > 5) // ถ้า x > 5 บล็อก z=0, y=8 จะถูกดำเนินการ;
{
z=0;
ย=8;
}
อื่นถ้า (x > 20) // ถ้า x > 20 ดำเนินการบล็อกนี้
{
}
อื่น // มิฉะนั้นบล็อกนี้จะถูกดำเนินการ
{
z=0;
y=0;
}
กรณีสวิตช์- ปรนัย. ให้คุณเปรียบเทียบตัวแปร (ในตัวอย่างคือ x) กับค่าคงที่หลายค่า (ในตัวอย่างที่ 5 และ 10) และดำเนินการบล็อกที่ตัวแปรมีค่าเท่ากับค่าคงที่
สวิตช์ (x) (
กรณีที่ 5:
// รหัสถูกดำเนินการถ้า x = 5
หยุดพัก;
กรณีที่ 10:
// รหัสถูกดำเนินการถ้า x = 10
หยุดพัก;
ค่าเริ่มต้น:
// รหัสจะถูกดำเนินการหากไม่มีค่าก่อนหน้าที่ตรงกัน
หยุดพัก;
}
สำหรับลูป. โครงสร้างช่วยให้คุณสามารถจัดระเบียบรอบด้วยจำนวนการวนซ้ำที่กำหนด ไวยากรณ์มีลักษณะดังนี้:
สำหรับ (การกระทำก่อนเริ่มลูป;
เงื่อนไขสำหรับการดำเนินการต่อวงจร
การดำเนินการเมื่อสิ้นสุดการวนซ้ำแต่ละครั้ง) (
// วนรหัสเนื้อหา
ตัวอย่างของการวนซ้ำ 100 ครั้ง
สำหรับ (i=0; i< 100; i++) // начальное значение 0, конечное 99, шаг 1
{
ผลรวม = ผลรวม + ฉัน;
}
ในขณะที่วนซ้ำ. ตัวดำเนินการช่วยให้คุณสามารถจัดระเบียบวงจรด้วยการก่อสร้าง:
ในขณะที่ (นิพจน์)
{
// วนรหัสเนื้อหา
}
การวนซ้ำจะดำเนินการตราบเท่าที่นิพจน์ในวงเล็บเป็นจริง ตัวอย่างการวนซ้ำ 10 รอบ
x = 0;
ในขณะที่ (x< 10)
{
// วนรหัสเนื้อหา
x++;
}
ทำในขณะที่เป็นลูปที่มีเงื่อนไขที่ทางออก
ทำ
{
// วนรหัสเนื้อหา
) ในขณะที่ (นิพจน์);
การวนซ้ำจะดำเนินการในขณะที่นิพจน์เป็นจริง
หยุดพัก- ตัวดำเนินการออกจากวง ใช้เพื่อขัดจังหวะการดำเนินการ สำหรับลูป, ในขณะที่, ทำในขณะที่.
x = 0;
ในขณะที่ (x< 10)
{
ถ้า (z > 20) แตก; // ถ้า z > 20 ให้ออกจากลูป
// วนรหัสเนื้อหา
x++;
}
ไปที่เป็นตัวดำเนินการกระโดดแบบไม่มีเงื่อนไข
ไปที่ป้ายกำกับ 1; // เปลี่ยนเป็น metka1
………………
metka1:
ดำเนินการต่อ- ข้ามคำสั่งไปที่ส่วนท้ายของลูป
x = 0;
ในขณะที่ (x< 10)
{
// วนรหัสเนื้อหา
ถ้า (z > 20) ดำเนินการต่อ; // ถ้า z > 20 ให้กลับไปที่จุดเริ่มต้นของตัวลูป
// วนรหัสเนื้อหา
x++;
}
อาร์เรย์
อาร์เรย์เป็นพื้นที่ของหน่วยความจำที่เก็บตัวแปรหลายตัวตามลำดับ
มีการประกาศอาร์เรย์แบบนี้
อายุ int; // อาร์เรย์ของตัวแปร int 10 ตัว
ลอยน้ำ; // อาร์เรย์ของตัวแปรโฟลต 100 ตัว
เมื่อประกาศ อาร์เรย์สามารถเริ่มต้นได้:
int อายุ = ( 23, 54, 34, 24, 45, 56, 23, 23, 27, 28);
มีการเข้าถึงตัวแปร Array ดังนี้:
x = อายุ; // x เป็นการกำหนดค่าขององค์ประกอบ 5 ของอาร์เรย์
อายุ=32; // องค์ประกอบอาร์เรย์ 9 ถูกกำหนดเป็น 32
องค์ประกอบอาร์เรย์จะมีหมายเลขจากศูนย์เสมอ
ฟังก์ชั่น.
ฟังก์ชันช่วยให้คุณสามารถดำเนินการเดียวกันกับข้อมูลที่แตกต่างกันได้ ฟังก์ชันมี:
- ชื่อที่เธอเรียก;
- อาร์กิวเมนต์ - ข้อมูลที่ฟังก์ชันใช้ในการคำนวณ
- ชนิดข้อมูลที่ส่งคืนโดยฟังก์ชัน
อธิบายฟังก์ชันที่ผู้ใช้กำหนดนอกฟังก์ชัน setup() และ loop()
การตั้งค่าเป็นโมฆะ () (
// รหัสถูกเรียกใช้ครั้งเดียวเมื่อโปรแกรมเริ่มทำงาน
}
เป็นโมฆะวน () (
// รหัสหลักทำงานในลูป
}
// การประกาศของฟังก์ชั่นที่กำหนดเองชื่อ functionName
พิมพ์ functionName(พิมพ์อาร์กิวเมนต์ 1, พิมพ์อาร์กิวเมนต์ 1, … , พิมพ์อาร์กิวเมนต์)
{
// ร่างกายของฟังก์ชั่น
กลับ();
}
ตัวอย่างของฟังก์ชันที่คำนวณผลรวมของกำลังสองของอาร์กิวเมนต์สองตัว
int sumQwadr (int x, int y)
{
กลับ (x* x + y*y);
}
การเรียกใช้ฟังก์ชันจะเป็นดังนี้:
ง=2; ข=3;
z= ผลรวม Qwadr(d, b); // z จะเป็นผลรวมของกำลังสองของตัวแปร d และ b
ฟังก์ชั่นสามารถสร้างขึ้นเอง, กำหนดเอง, ปลั๊กอิน
สั้นมาก แต่ข้อมูลนี้น่าจะเพียงพอที่จะเริ่มเขียนโปรแกรม C สำหรับระบบ Arduino
สิ่งสุดท้ายที่ฉันอยากจะพูดถึงในบทเรียนนี้คือธรรมเนียมของโปรแกรม C ฉันคิดว่าถ้าคุณอ่านบทเรียนนี้เป็นครั้งแรกคุณควรข้ามส่วนนี้ไป สไตล์.
เป้าหมายหลักของการออกแบบโปรแกรมภายนอกคือการปรับปรุงความสามารถในการอ่านของโปรแกรม เพื่อลดจำนวน ข้อผิดพลาดอย่างเป็นทางการ. ดังนั้นเพื่อให้บรรลุเป้าหมายนี้ คุณสามารถละเมิดคำแนะนำทั้งหมดได้อย่างปลอดภัย
ชื่อในภาษาซี
ชื่อที่แสดงถึงประเภทข้อมูลจะต้องเขียนเป็นตัวพิมพ์ผสมกัน ตัวอักษรตัวแรกของชื่อจะต้องเป็นตัวพิมพ์ใหญ่ (ตัวพิมพ์ใหญ่)
สัญญาณ, TimeCount
ตัวแปรต้องเขียนด้วยชื่อตัวพิมพ์ผสมกัน ตัวอักษรตัวแรกเป็นตัวพิมพ์เล็ก (ตัวพิมพ์เล็ก)
หมวดหมู่: . คุณสามารถคั่นหน้าในอดีต ส่วนซอฟต์แวร์ Arduino ประกอบด้วยส่วนรวม สภาพแวดล้อมซอฟต์แวร์(IDE) ซึ่งอนุญาตให้คุณเขียน คอมไพล์ และอัพโหลดโค้ดที่เขียนไปยังฮาร์ดแวร์ สภาพแวดล้อม ArduinoIDE และภาษา Wiring นั้นขึ้นอยู่กับการประมวลผลเป็นหลักโดยอ้อมบน C / C ++ ในความเป็นจริง Arduino IDE เป็นการผสมผสานขนาดใหญ่ไม่ใช่เพื่อความสนุก แต่เพื่อความสะดวก
แม้ภายนอกและอาดูรโน่ไอดีและการประมวลผลจะคล้ายกัน
โปรแกรม (ร่าง) ประกอบด้วยอะไร?
แต่ละโปรแกรมไม่ว่าจะดูซับซ้อนแค่ไหนก็ประกอบด้วยชุดที่แยกจากกัน บล็อกรหัสซึ่งระบุด้วยเครื่องหมายปีกกา () โปรแกรมขั้นต่ำต้องการเพียง 2 ช่วงตึก: setup และ loop การแสดงตนเป็นสิ่งจำเป็นในโปรแกรม C ++ สำหรับ Arduino มิฉะนั้นคุณอาจได้รับข้อผิดพลาดในขั้นตอนการคอมไพล์
การตั้งค่าเป็นโมฆะ () ( ) เป็นโมฆะลูป () ( )
ในฟังก์ชัน setup() การตั้งค่าเริ่มต้นของตัวแปรและรีจิสเตอร์จะเกิดขึ้น หลังจากตั้งค่า () เสร็จสิ้น การควบคุมจะส่งผ่านไปยังฟังก์ชัน loop() ซึ่งเป็นการวนซ้ำไม่สิ้นสุดที่เขียนอยู่ในเนื้อหา (ระหว่าง ( ) ) เป็นคำสั่งเหล่านี้ที่ดำเนินการอัลกอริทึมทั้งหมดของคอนโทรลเลอร์
ฮาร์ดแวร์ «สวัสดี,
โลก!" - ไฟ LED กะพริบ
สิ่งที่เริ่มต้นความคุ้นเคยครั้งแรกกับ Arduino ที่ทางแยกของซอฟต์แวร์และฮาร์ดแวร์คือการกระพริบของ LED
ก่อนอื่นคุณต้องกรอกโปรแกรมขั้นต่ำให้เสร็จ สำหรับ Arduino (เช่น UNO) เราเชื่อมต่อ LED กับพิน 12 และ GND (สีของ LED นั้นถูกเลือกจากความชอบส่วนบุคคล)
การตั้งค่าเป็นโมฆะ () ( pinMode (12, OUTPUT); ) โมฆะลูป () ( digitalWrite (12, สูง); ล่าช้า (100); digitalWrite (12, ต่ำ); ล่าช้า (900); )
ทำ Ctrl+C -> Ctrl+V, คอมไพล์, โหลด, กฎ เราเห็นการแสดงแสงที่กินเวลาไม่เกินหนึ่งวินาที ลองหาสาเหตุที่สิ่งนี้เกิดขึ้น
ในบล็อกว่างก่อนหน้านี้ เราได้เพิ่มบางส่วน การแสดงออก
. พวกเขาถูกวางไว้ระหว่างวงเล็บปีกกาของฟังก์ชันการตั้งค่าและลูป
แต่ละนิพจน์คือคำสั่งสำหรับโปรเซสเซอร์ นิพจน์ภายในหนึ่งบล็อกจะถูกดำเนินการตามลำดับอย่างเคร่งครัดโดยไม่มีการหยุดชั่วคราวและสลับไปมา นั่นคือหากเรากำลังพูดถึงบล็อกรหัสหนึ่งบล็อก สามารถอ่านจากบนลงล่างเพื่อทำความเข้าใจว่ากำลังทำอะไรอยู่
เกิดอะไรขึ้นระหว่าง{ }
?
อย่างที่คุณทราบ พิน Arduino สามารถทำงานได้ทั้งอินพุตและเอาต์พุต เมื่อเราต้องการควบคุมบางอย่าง เราจำเป็นต้องถ่ายโอนขาควบคุมไปยังสถานะเอาต์พุต สิ่งนี้ทำได้โดยนิพจน์ในฟังก์ชันติดตั้ง :
โหมดพิน (12, เอาต์พุต); ในสถานการณ์นี้การแสดงออก การเรียกใช้ฟังก์ชัน
. ใน pinMode พินที่ระบุด้วยตัวเลขจะถูกตั้งค่าเป็นโหมดที่ระบุ (INPUT หรือ OUTPUT) พินใดและโหมดใดที่เป็นปัญหาจะระบุไว้ในวงเล็บ คั่นด้วยเครื่องหมายจุลภาค ในกรณีของเรา เราต้องการให้พินที่ 12 ทำงานเป็นเอาต์พุต OUTPUT หมายถึง เอาต์พุต INPUT หมายถึง อินพุต ค่าที่กำหนดเช่น 12 และ OUTPUT ถูกเรียก อาร์กิวเมนต์ของฟังก์ชัน
. จำนวนอาร์กิวเมนต์ของฟังก์ชันขึ้นอยู่กับสาระสำคัญของฟังก์ชันและเจตจำนงของผู้สร้าง ฟังก์ชันสามารถไม่มีอาร์กิวเมนต์เลย เช่นเดียวกับการตั้งค่าและการวนซ้ำ
จากนั้นไปที่บล็อกวนตามลำดับ:
- เรียกใช้ฟังก์ชัน digitalWrite ในตัว ได้รับการออกแบบมาเพื่อจ่ายค่าศูนย์แบบลอจิคัล (ต่ำ, 0 โวลต์) หรือค่าแบบลอจิคัล (สูง, 5 โวลต์) ให้กับพินที่กำหนด 2 อาร์กิวเมนต์จะถูกส่งผ่านไปยังฟังก์ชัน digitalWrite: หมายเลขพินและค่าตรรกะ
- เรียกใช้ฟังก์ชันหน่วงเวลา นี่เป็นฟังก์ชันในตัวที่ทำให้โปรเซสเซอร์ "สลีป" อีกครั้ง เวลาที่แน่นอน. ใช้เวลาเพียงหนึ่งอาร์กิวเมนต์: เวลาในหน่วยมิลลิวินาทีเพื่อเข้าสู่โหมดสลีป ในกรณีของเรา นี่คือ 100 มิลลิวินาที ทันทีที่หมดเวลา 100 มิลลิวินาที โปรเซสเซอร์จะตื่นและไปยังนิพจน์ถัดไปทันที
- เรียกใช้ฟังก์ชันในตัว digitalWrite เฉพาะเวลานี้ อาร์กิวเมนต์ที่สองมีค่าต่ำ นั่นคือเราตั้งค่าศูนย์ตรรกะที่พินที่ 12 -> เราใช้ 0 โวลต์ -> ปิด LED
- เรียกใช้ฟังก์ชันหน่วงเวลา คราวนี้เรา "หลับ" นานขึ้นเล็กน้อย - 900 มิลลิวินาที
ทันทีที่เรียกใช้ฟังก์ชันสุดท้าย บล็อกลูปจะสิ้นสุดลงและทุกอย่างจะเกิดขึ้นซ้ำแล้วซ้ำอีก ในความเป็นจริง เงื่อนไขที่แสดงในตัวอย่างค่อนข้างผันแปร และคุณสามารถเล่นกับค่าการหน่วงเวลา เชื่อมต่อ LED หลายดวงและทำให้ดูเหมือนสัญญาณไฟจราจรหรือไฟกะพริบของตำรวจ (ทั้งหมดขึ้นอยู่กับจินตนาการและเจตจำนงของผู้สร้าง ).
แทนที่จะสรุปเรื่องความสะอาดสักหน่อย
ในความเป็นจริงไม่มีช่องว่างทั้งหมด ตัวแบ่งบรรทัด อักขระแท็บ มีความสำคัญอย่างยิ่งสำหรับคอมไพเลอร์ เมื่อมีช่องว่าง อาจมีการแบ่งบรรทัดและในทางกลับกัน ในความเป็นจริง 10 ช่องว่างในแถว 2 บรรทัดและอีก 5 ช่องว่างจะเทียบเท่ากับหนึ่งช่องว่าง
ด้วยความช่วยเหลือของพื้นที่ว่าง คุณสามารถทำให้โปรแกรมเข้าใจและมองเห็นได้ หรือในทางกลับกัน ทำลายมันจนจำไม่ได้ ตัวอย่างโปรแกรมที่ยกตัวอย่างสามารถแก้ไขได้ดังนี้
การตั้งค่าเป็นโมฆะ () ( pinMode (12, OUTPUT); ) โมฆะลูป () ( digitalWrite (12,สูง); ล่าช้า (100) ; digitalWrite (12, ต่ำ); ล่าช้า (900); )
เพื่อป้องกันไม่ให้ผู้อื่นเลือดไหลออกจากตาขณะอ่าน คุณสามารถปฏิบัติตามกฎง่ายๆ สองสามข้อ:
1. เสมอเมื่อเริ่มต้นบล็อกใหม่ระหว่าง( และ ) เพิ่มการเยื้อง โดยปกติจะใช้ 2 หรือ 4 ช่องว่าง เลือกหนึ่งในค่าและยึดติดกับมันตลอด
โมฆะวนรอบ () ( digitalWrite (12, สูง); ล่าช้า (100); digitalWrite (12, ต่ำ); ล่าช้า (900); )
2.
เช่นเดียวกับภาษาปกติ ให้เว้นวรรคหลังเครื่องหมายจุลภาค
digitalWrite (12, สูง);
3.
วางอักขระเริ่มต้นของบล็อก ( บน บรรทัดใหม่ที่ระดับการเยื้องปัจจุบันหรือที่ส่วนท้ายของการเยื้องก่อนหน้า และอักขระท้ายบล็อก ) ในบรรทัดแยกที่ระดับการเยื้องปัจจุบัน:
การตั้งค่าเป็นโมฆะ () ( pinMode (12, OUTPUT); ) การตั้งค่าเป็นโมฆะ () ( pinMode (12, OUTPUT); )
4.
ใช้บรรทัดว่างเพื่อแยกบล็อกความหมาย:
void loop() ( digitalWrite(12, สูง); หน่วงเวลา(100); digitalWrite(12, ต่ำ); หน่วงเวลา(900); digitalWrite(12, สูง); หน่วงเวลา(100); digitalWrite(12, ต่ำ); หน่วงเวลา( 900); )
5.
เพื่อให้ผลิตผลของคุณน่าอ่านมีความคิดเห็นที่เรียกว่า สิ่งเหล่านี้คือโครงสร้างในโค้ดโปรแกรมที่คอมไพเลอร์ละเว้นโดยสิ้นเชิงและมีความสำคัญต่อบุคคลที่อ่านเท่านั้น ความคิดเห็นสามารถเป็นหลายบรรทัดหรือบรรทัดเดียว:
/* นี่คือความคิดเห็นหลายบรรทัด */ // นี่คือบรรทัดเดียว