The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.

เทคโนโลยีเซนเซอร์เพื่อการเกษตร

Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by thongchai.mfu, 2022-07-29 11:01:09

เทคโนโลยีเซนเซอร์เพื่อการเกษตร

เทคโนโลยีเซนเซอร์เพื่อการเกษตร

145

เนอ่ื งจากการดีบัคโคด้ จะใช้ระบุบรรทัดท่ผี ิดพลาดเป็นสว่ นใหญ่ แต่เจ้าหนา้ ตาโปรแกรมดันไม่บอก
หมายเลขบรรทดั เพราะฉนัน้ เราจงึ ต้องไปต้งั ค่าใหแ้ สดงหมายเลขบรรทดั ข้ึนมาครบั
กดเมนู File > Preferences

หลักสตู รการอบรมพฒั นาเกษตรกรรุ่นใหม่: เทคโนโลยเี ซนเซอร์เพือ่ การเกษตร อ.ดร.สรุ พล วรภทั ราทร

146

จะพบหนา้ ต่างง่ายๆ เมนตู า่ งๆทส่ี ำคัญ มดี ังน้ี
• Sketchbook - ท่อี ยู่คา่ เรมิ่ ต้นของโฟลเดอร์โปรเจค
• Editor font size - กรณที โี่ ค้ดมีตวั หนงั สือทีเ่ ล็กมากๆ เราสามารถปรับให้ค่าเพ่ิมมาขน้ึ ได้ เพ่อื ให้

ตัวอกั ษรตัวใหญ่และอ่านง่ายขึน้
• Show verbose output during - ใชใ้ นกรณที ่จี ะใหโ้ ปรแกรมโชวว์ า่ มันทำอะไรอย่พู น้ื หลัง เชน่ ไป

เรียกไฟล์โปรแกรมคอมไพลท์ ่ีไฟล์ไหน พาทไหน
• Display line number - แสดงหมายเลขบรรทดั

หลกั สูตรการอบรมพฒั นาเกษตรกรรนุ่ ใหม่: เทคโนโลยีเซนเซอรเ์ พอ่ื การเกษตร อ.ดร.สรุ พล วรภัทราทร

147

• Check for updates on startup - ตรวจเช็ควา่ มอี ัพเดทใหม่หรอื ไม่ เม่ือเปดิ โปรแกรม
• Save when verifying or uploading - บันทึกโปรเจคทันทีท่ี verifying หรอื uploading

ตัวอย่าง ผมเลอื กดังนี้ และกด OK

หลกั สูตรการอบรมพัฒนาเกษตรกรรุ่นใหม่: เทคโนโลยีเซนเซอรเ์ พอ่ื การเกษตร อ.ดร.สรุ พล วรภทั ราทร

148

จะเห็นวา่ หมายเลขบรรทดั มแี สดงขึ้นมาแล้ว เพราะไดเ้ ลอื ก Display line number ไว้

หลกั สูตรการอบรมพฒั นาเกษตรกรรนุ่ ใหม่: เทคโนโลยีเซนเซอร์เพ่ือการเกษตร อ.ดร.สุรพล วรภทั ราทร

149

หลกั สูตรการอบรมพัฒนาเกษตรกรรุ่นใหม่: เทคโนโลยีเซนเซอรเ์ พื่อการเกษตร อ.ดร.สุรพล วรภทั ราทร

150

ภาคผนวก ข.
การเขียนโปรแกรมบนแพลตฟอร์ม Arduino สำหรับใช้งานกบั บอร์ด Arduino UNO

หลกั สูตรการอบรมพัฒนาเกษตรกรร่นุ ใหม่: เทคโนโลยีเซนเซอรเ์ พ่อื การเกษตร อ.ดร.สุรพล วรภัทราทร

151

โครงสรา้ งโปรแกรมภาษา C บน Arduino จะมลี ักษณะแบบเดยี วกับ C ทวั่ ๆไป แตส่ ำหรับทา่ นที่ยงั
ไมเ่ คยเรยี นรู้การเขยี นโปรแกรมภาษาใดๆมาก่อน ท่านต้องทำความเข้าใจในเร่ืองตา่ งๆดงั น้ี

1. ปรโี ปรเซสเซอร์ไดเรก็ ทีฟ (Preprocessor directives)
2. ส่วนของการกำหนดค่า (Global declarations)
3. ฟังก์ชั่น setup() และ ฟงั ก์ช่ัน loop()
4. การสรา้ งฟังกช์ นั่ และการใชง้ านฟังกช์ นั่ (Users-defined function)
5. สว่ นอธบิ ายโปรแกรม (Progarm comments)
1. ปรีโปรเซสเซอรไ์ ดเร็กทีฟ (Preprocessor directives)

โดยปกตแิ ลว้ เกอื บทกุ โปรแกรมต้องมี โดยสว่ นนจ้ี ะเปน็ สว่ นท่ีคอมไพลเลอรจ์ ะมกี ารประมวลผลและ
ทำตามคำสงั่ ก่อนท่ีจะมกี ารคอมไพล์โปรแกรม ซง่ึ จะเริ่มต้นดว้ ยเครอื่ งหมายไดเร็กทีฟ (directive) หรอื
เคร่ืองหมายสเ่ี หลย่ี ม # แล้วจงึ ตามด้วยช่ือคำสง่ั ท่ีต้องการเรยี กใช้ หรือกำหนด โดยปกติแลว้ ส่วนน้จี ะอยู่
ในส่วนบนสุด หรอื ส่วนหัวของโปรแกรม และต้องอยู่นอกฟังก์ชั่นหลกั ใดๆกต็ าม
#include เปน็ คำสั่งทใี่ ชอ้ า้ งอิงไฟล์ภายนอก เพื่อเรยี กใช้ฟังกช์ ั่น หรอื ตวั แปรทมี่ ีการสรา้ งหรอื กำหนดไว้
ในไฟล์น้นั รูปแบบการใช้งานคอื
#include <ชอื่ ไฟล.์ h>
ตัวอยา่ งเช่น
#include <Wire.h>
#include <Time.h>
จากตวั อยา่ ง จะเหน็ ว่าไดม้ ีการอ้างอิงไฟล์ Wire.h และไฟล์ Time.h ซงึ่ เปน็ ไลบาร่พี ืน้ ฐานทีม่ อี ยู่ใน
Arduino ทำให้เราสามารถใช้ฟงั กช์ น่ั เก่ียวกับเวลาท่ไี ลบารี่ Time มีการสร้างไวใ้ หใ้ ช้งานได้
การอา้ งองิ ไฟลจ์ ากภายใน หรือการอา้ งองิ ไฟลไ์ ลบาร่ีทม่ี ีอยู่แลว้ ใน Arduino หรอื เปน็ ไลบารีท่ เี่ ราเพ่ิมเข้า
ไปเอง จะใช้เครื่องหมาย <> ในการคร่อมชื่อไฟลไ์ ว้ เพ่ือให้โปรแกรมคอมไพลเลอร์เขา้ ใจวา่ ควรไปหาไฟล์
เหล่านีจ้ ากในโฟลเดอรไ์ ลบาร่ี แตห่ ากต้องการอา้ งอิงไฟลท์ ่ีอยู่ในโฟลเดอร์โปรเจค จะต้องใช้เครอ่ื หมาย ""
ครอ่ มแทน ซง่ึ คอมไพล์เลอรจ์ ะวิ้งไปหาไฟล์น้โี ดยอ้างอิงจากไฟลโ์ ปรแกรมทคี่ อมไพล์เลอร์อยู่
เชน่
#include "myFunction.h"
จากตวั อยา่ งด้านบน คอมไพล์เลอรจ์ ะว้งิ ไปหาไฟล์ myFunction.h ภายในโฟลเดอร์โปรเจคทนั ที หากไม่
พบก็จะแจง้ เปน็ ขอ้ ผิดพลาดออกมา
#define เปน็ คำสงั่ ท่ีใช้ในการแทนข้อความที่กำหนดไว้ ด้วยข้อความท่ีกำหนดไว้ ซง่ึ การใชค้ ำส่งั นี้ ขอ้ ดี
คอื จไมม่ ีการอ้างอิงกับตัวโปรแกรมเลย
รปู แบบ
#define NAME VALUE
ตัวอยา่ งเชน่

หลักสูตรการอบรมพัฒนาเกษตรกรรนุ่ ใหม่: เทคโนโลยเี ซนเซอร์เพ่อื การเกษตร อ.ดร.สุรพล วรภัทราทร

152

#define LEDPIN 13
จากตัวอยา่ ง ไม่วา่ คำว่า LEDPIN จะอยู่ส่วนใดของโค้ดโปรแกรมก็ตาม คอมไพลเ์ ลอร์จะแทนคำวา่
LEDPIN ดว้ ยเลข 13 แทน ซ่ึงขอ้ ดีคือเราไม่ต้องสร้างเป็นตวั แปรขึ้นมาเพอ่ื เปลอื งพน้ื ท่แี รม และยงั ช่วยให้
โปรแกรมทำงานเรว็ ขนึ้ อีกด้วยเพราะซีพยี ูไม่ต้องไปขอข้อมูลมาจากแรมหลายๆทอด
2. ส่วนของการกำหนดคา่ (Global declarations)
สว่ นนีจ้ ะเป็นสว่ นทใ่ี ช้ในการกำหนดชนดิ ตวั แปรแบบนอกฟังก์ช่นั หรือประกาศฟงั กช์ ่ัน เพื่อให้ฟงั กช์ ่ันที่
ประกาศสามารถกำหนด หรือเรียกใชไ้ ดจ้ ากทุกสว่ นของโปรแกรม
เชน่
int pin = 13;
void blink(void) ;
3. ฟังกช์ ่นั setup() และฟังก์ช่นั loop()
ฟงั กช์ นั่ setup() และฟังก์ช่นั loop() เป็นคำส่งั ที่ถูกบังคับให้ตอ้ งมใี นทุกโปรแกรม โดยฟังก์ช่ัน setup()
จะเป็นฟังกช์ ั่นแรกท่ีถูกเรียกใช้ นยิ มใช้กำหนดคา่ หรือเริ่มตน้ ใชง้ านไลบารีต่ า่ งๆ เช่น ในฟงั ก์ชั่น setup()
จะมีคำส่งั pinMode() เพื่อกำหนดใหข้ าใดๆกต็ ามเปน็ ดจิ ิตอลอินพุต หรอื เอาต์พุต ส่วนฟังก์ชน่ั loop()
จะเป็นฟงั ก์ชั่นทท่ี ำงานหลังจากฟังกช์ ั่น setup() ได้ทำงานเสร็จส้นิ ไปแลว้ และมกี ารวนรอบแบบไม่รู้จบ
เม่ือฟังก์ชน่ั loop() งานครบตามคำสงั่ แลว้ ฟังกช์ ั่น loop() ก็จะถกู เรียกขน้ึ มาใช้อกี
ตัวอย่าง
int pin = 13;
void setup() {
pinMode(pin, OUTPUT);
}
void loop() {
digitalWrite(pin, HIGH);
delay(1000);
digitalWrite(pin, LOW);
delay(1000);
}
จากตัวอย่าง จะเหน็ วา่ มกี ารประกาศตัวแปรแบบนอกฟงั ก์ช่ัน ทำใหส้ ามารถกำหนด หรือเรยี กใช้จากใน
ฟังกช์ นั่ ใดๆก็ตามได้ ในฟงั ก์ชั่น setup() ไดม้ ีการกำหนดให้ขาที่ 13 เป็นดจิ ติ อลเอาต์พตุ และในฟังก์ชั่น
loop() มีการกำหนดใหพ้ อร์ต 13 มลี อจกิ เป็น 1 และใช้ฟังก์ชน่ั delay() ในการหนว่ งเวลา 1 วนิ าที แลว้
จึงกำหนดให้พอร์ต 13 มสี ถานะลอจกิ เป็น 0 แลว้ จงึ หน่วงเวลา 1 วินาที จบฟงั ก์ชนั่ loop() และจะเร่ิมทำ
ฟงั ก์ช่ัน loop() ใหม่ ผลทีไ่ ด้คือไฟกระพริบบนบอรด์ Arduino Uno ในพอร์ตท่ี 13 ทำงานแบบไม่รจู้ บ

หลักสตู รการอบรมพฒั นาเกษตรกรรนุ่ ใหม่: เทคโนโลยีเซนเซอรเ์ พอื่ การเกษตร อ.ดร.สรุ พล วรภทั ราทร

153

ในทกุ ๆการทำงานของฟังก์ชัน่ จะตอ้ งเร่ิมด้วยการกำหนดค่าทสี่ ง่ กลับ ตามดว้ ยชอ่ื ฟงั กช์ นั่ แลว้ ตามด้วย
เครอ่ื งหมายปกี กาเปิด { และจบดว้ ยเครอื่ งหมายปีกกาปดิ ภายในฟังกช์ ัน่ หากจะเรยี กฟังกช์ นั่ ใชง้ านยอ่ ย
ใดๆ จะต้องมีเครือ่ งหมาเซมโิ คล่อน ; ตอ่ ทา้ ยเสมอ
* การกำหนดชนิดคา่ ทสี่ ง่ กลับเป็น void หมายถงึ ไมม่ ีการสง่ ค่ากลับ แต่สามารถใชค้ ำสัง่ return; ตรงๆได้
เพือ่ ให้จบการทำงานของฟังก์ช่ันก่อนจะไปถงึ บรรทดั สดุ ท้ายของฟังก์ชนั่
4. การสร้างฟังก์ชนั่ และการใช้งานฟังกช์ ่ัน (Users-defined function)
ในการสรา้ งฟังกช์ ่ันข้ึนมา คำสง่ั ต่างๆที่อยู่ภายในฟังก์ชัน่ ต้องอยภู่ ยใต้เครอ่ื งหมายปีกกาเปดิ { และปีกกา
ปิด } เท่านน้ั ภายใต้เคร่ืองหมาย {} เราสามารถนำฟังก์ช่ันหรือคำสง่ั ใดๆก็ได้มาใส่ไว้ แต่จะต้องคัน่ แต่ละ
คำสั่งดว้ ยเคร่ืองหมายเซมโิ คล่อน ; โดยจะนำคำสัง่ ท้งั หมดไว้บรรทัดเดียวกนั เลย หรอื แยกบรรทดั กันก็ได้
เพ่ือความสวยงามของโค้ด (ไม่มีผลกบั ขนาดของโปรแกรมหลงั คอมไพล์)
ตวั อย่าง
void Mode(int pin) {
pinMode(pin, OUTPUT);
}
void setup() {
Mode(13);
}
5. ส่วนอธิบายโปรแกรม (Progarm comments)
ส่วนอธิบายโปรแกรม หรือการคอมเม้นโปรแกรมเป็นส่วนท่ีสำคัญอย่างมากที่จะชว่ ยให้ผู้ทไี่ ม่ไดเ้ ขยี น
โปรแกรม หรือเปน็ ผเู้ ขียนโปรแกรมเข้าใจโปรแกรมไดง้ ่ายข้ึนโดยอา่ นจากคอมเม้น แทนการทำความเข้าใจ
โปรแกรมโดยอา่ นแต่ละฟังก์ชั่น ส่วนอธบิ ายโปรแกรม หรือสว่ นคอมเมน้ น้ี จะไม่มีผลใดๆกบั ขนาดของ
โปรแกรมหลังคอมไพล์ เนื่องจากสว่ นนจี้ ะถูกตัดทง้ิ ทง้ั หมดเนอื่ งจากไม่ได้ถูกนำไปใช้งาน มีผลเพยี งแค่ว่า
ไฟล์โคด้ โปรแกรมจะใหญข่ น้ึ มา หากมีการคอมเมน้ โค้ดเยอะๆ แต่ขนาดก็จะเพ่มิ ข้นึ ตามตัวอกั ษร ดังนั้น
การคอมเมน้ โค้ดจึงไม่คดิ พ้ืนที่มากนัก แต่ผู้เขยี นแนะนำให้คอมเม้นโคด้ ใหส้ ัน้ และกระชับ เพ่ือใหเ้ กิด
ความรวดเรว็ ในการทำความเข้าใจ และไม่ยาวจนต้องเลอื่ นสกอร์บารไ์ ปทางขวาเพื่ออ่านคอมเม้นเพิ่มเตมิ
อกี
การคอมเมน้ โค้ดมีอยู่ 2 รปู แบบ คือเปดิ ด้วย /* และปิดด้วย */ เปน็ การคอมเม้นโคด้ แบบข้ามบรรทัด คอื
ตราบใดท่ยี งั ไม่มี */ตรงสว่ นนน้ั จะเปน็ คอมเม้นทง้ั หมด เช่น
/*
This code by IOXhop.com
17/5/2558
*/
void setup() { .... }

หลักสูตรการอบรมพฒั นาเกษตรกรร่นุ ใหม่: เทคโนโลยีเซนเซอรเ์ พ่อื การเกษตร อ.ดร.สรุ พล วรภทั ราทร

154

และแบบที่ 2 เป็นการคอมเม้นบรรทัดเดยี ว คอื เปดิ ดว้ ยเคร่ืองหมาย // และปดิ ด้วยการขึ้นบรรทดั ใหม่
เชน่
void setup() {
pinMode(13, OUTPUT); // Set pin 13 to output
}
ชนิดของข้อมูล
กอ่ นท่เี ราจะไปทำความเขา้ ใจเรอ่ื งตวั แปร และฟังกช์ น่ั เราตอ้ งทำความเข้าในเรอื่ งชนิดของข้อมูลใน
Arduino กันก่อน โดย Arduino จะมีชนิดของข้อมูลให้เลือกใชด้ งั นี้

ชนดิ ขอ้ มูล การเกบ็ ข้อมูล ขนาด

boolean จรงิ (True) หรือ เท็จ 1 บิต
(False)

char ตัวเลข หรือตวั อกั ษร 1 ไบต์ ใส่คา่ ไดต้ ง้ั แต่ -128 ถึง 127

unsigned char ตวั เลข หรือตัวอกั ษร 1 ไบต์ ใส่คา่ ได้ตัง้ แต่ 0 ถึง 255

byte ไบต์ 1 ไบต์ ใส่ค่าได้ตั้งแต่ 0 ถึง 255

int ตวั เลขจำนวนเต็ม 2 ไบต์ ใสค่ า่ ไดต้ ง้ั แต่ -32,768 ถงึ 32,767

unsigned int ตวั เลขจำนวนเต็ม 2 ไบต์ ใสค่ ่าได้ตง้ั แต่ 0 ถึง 65,535 (2^16) -
1)

long ตัวเลขจำนวนเตม็ ท่มี ี 4 ไบต์ ใสค่ า่ ไดต้ ั้งแต่ -2,147,483,648 ถึง
ความยาว 2,147,483,647

unsigned long ตวั เลขจำนวนเต็มทมี่ ี 4 ไบต์ ใสค่ ่าไดต้ ั้งแต่ 0 ถงึ 4,294,967,295
ความยาว (2^32 - 1)

float ตัวเลขทศนยิ มใช้ในการ 4 ไบต์ ใส่ค่าไดต้ ั้งแต่ 3.4028235E+38 ถึง -
คำนวน 3.4028235E+38 มที ศนิยมได้ 6 ถึง 7
ตำแหน่ง

double (เฉพาะ ตัวเลขทศนยิ มที่มีความ 8 ไบต์ ใช้ในการคำนวนทีต่ ้องการประสิทธิ์
บอร์ด Arduino ยาวและตอ้ งการความ ภาพสงู
Due) แม่นยำ

String ขอ้ ความ ไมร่ ะบุ

* ชนิดขอ้ มลู บางชนดิ ไม่นยิ มใช้ ผเู้ ขยี นจึงไมย่ กมาไว้ในตารางด้วย

หลักสูตรการอบรมพฒั นาเกษตรกรรนุ่ ใหม่: เทคโนโลยเี ซนเซอร์เพื่อการเกษตร อ.ดร.สุรพล วรภัทราทร

155

จากตารางจะเหน็ วา่ มตี วั แปรทีน่ า่ สนใจ และไมม่ ีในภาษา C หรอื C++ ปกติ คอื ตวั แปร String ทีม่ เี ฉพาะ
ใน Arduino ท่ีออกแบบมาเพื่อความสะดวกในการจัดการกับขอ้ ความ
ตัวแปร double จะทำงานบนซีพยี ูแบบ 64 บิตเทา่ นั้น ดังนน้ั บอรด์ ทีใ่ ชต้ วั แปร double ได้ จึงมแี คบ่ อรด์
Arduino Due บอรด์ เดียว
การประกาศตวั แปร เซ็ตค่าตวั แปร
การประกาศตัวแปรจะเหมือนกับภาษา C โดยปกติ คือ
TYPE KEY;
โดย TYPE เป็นชนดิ ของข้อมูล สว่ น KEY เป็นชื่อตวั แปร การประกาศตัวแปรข้างต้นคือการประกาศตวั
แปรแบบไม่กำหนดคา่ ดังนนั้ คา่ ปกติที่อ่านจากตวั แปรจะเปน็ 0
TYPE KEY = VAL;
จากตัวอย่างด้านบน เป็นลกั ษณะของการประกาศตวั แปรแบบกำหนดค่า เม่อื อา่ นคา่ ของตวั แปรออกมา
จะไดเ้ ปน็ ค่าท่ีกำหนดไว้ตอนประกาศ
ตวั อยา่ งการประกาศตัวแปร
int i;
int a = 10, b = 20;
จากตวั อย่าง จะเหน็ ว่าเราสามารถกำหนดชนิดของข้อมลู ใหท้ ีเดยี วหลายๆตัวแปรกไ็ ด้ โดยใชเ้ ครื่องหมาย ,
คนั่ ไว้
int i;
int a = 10, b = 20;
i = a + b;
จากตัวอย่างด้านบน เราสามารถกำหนดค่าใหก้ บั ตวั แปรเมือ่ ไรก็ได้ โดยใช้เครื่องหมายเทา่ กับ = เปน็
ตวั เชื่อม ชือ่ ตัวแปรจะอยูท่ างซ้าย และจะกำหนดค่าเป็นอะไร ใหอ้ ย่ทู างขวา ค่าทีอ่ ยู่ทางขวาจะถูกนำมาใส่
ในค่าท่ีอยทู่ างซา้ ยเสมอ
int i = 10, a;
a = i;
จากตัวอยา่ งด้านบน จะเห็นว่า a ไม่ได้กำหนดค่าไวต้ อนประกาศ ทำให้ค่าที่อ่านได้จาก a คือ 0 แต่
บรรทดั ถดั มา มกี ารกำหนดค่าให้ a เท่ากับ i ซง่ึ ตอนประกาศ i ไดป้ ระกาศไว้วา่ ค่าเทา่ กับ 10 เมือ่ นำมาใส่
a ค่าที่อ่านไดจ้ าก a จึงเปน็ 10 ดว้ ยเชน่ กัน
boolean is = false;
is = !is;
จากตวั อยา่ งด้านบน มกี ารประกาศตวั แปร boolean ซ่ึงเป็นตวั แปรทางลอจิก มีคา่ เป็น True (1) หรอื
False (0) ไดเ้ ทา่ น้ัน ในบรรทัดแรกได้ประกาศวา่ ตัวแปร is เปน็ ตวั แปรชนิด boolean และมคี ่าเปน็
false หรอื ลอจิก 0 บรรทดั ต่อมา ไดม้ กี ารกำหนดให้ is เท่ากับ !is การทเ่ี ครื่องหมายนิเสธไปอยหู่ นา้ ตวั

หลกั สตู รการอบรมพัฒนาเกษตรกรรุ่นใหม่: เทคโนโลยเี ซนเซอร์เพ่อื การเกษตร อ.ดร.สรุ พล วรภทั ราทร

156

แปร หมายถงึ การกลับเป็นค่าตรงขา้ ม จากบรรทดั แรก ตัวแปร is มีคา่ เปน็ false เมื่อเจอ !is คา่ จงึ ถกู
กลับเปน็ true และถกู นำไปเซ็ตในตวั แปร is ทำใหส้ ดุ ท้ายแลว้ ตัวแปร is มีค่าเปน็ true
String text = "IOXhop.com";
จากตัวอย่างด้านบน ได้มีการประกาศตัวแปรช่อื text เป็นชนดิ String เมอ่ื อา่ นค่าที่ไดจ้ าก text จงึ ไดค้ ่า
ออกมาเปน็ "IOXhop.com" เลย
* การกำหนดค่าแบบข้อความให้กบั ตวั แปร จะต้องอย่ภู ายใตเ้ ครือ่ งหมาย "" เทา่ นนั้ มฉิ น้ันโปรแกรมจะ
แสดงข้อความผดิ พลาดออกมา
ตวั แปรอาเรย์
อาเรย์เปรียบเหมือนกบั เรามีตารางขึน้ มา 1 ตาราง ซง่ึ ช่ือของตารางนนั้ เปรยี บได้กับชือ่ ของตัวแปร การ
เพิม่ ข้อมลู ของตารางลงไป เปรียบเหมอื นกบั การเพิ่มข้อมลู ลงในอาเรย์ และการจะดงึ ข้อมูลตารางออกมา
ได้ เราก็จำเปน็ ต้องรวู้ า่ ข้อมูลทเี่ ราต้องการนั้นอยลู่ ำดับทเ่ี ท่าไหร่ ก็เปรียบไดก้ ับเราต้องรู้ว่าเราเพิ่มข้อมูล
อาเรย์ไปในลำดับทีเ่ ท่าไหร่
ผู้เขียนจะยกตัวอย่างตารางขึ้นมาง่ายๆ เป็นราคาเปรียบเทียบของบอร์ด Arduino Uno R3 ในแตล่ ะรา้ น
วา่ แตล่ ะรา้ นมรี าคาเท่าไหร่ แลว้ นำข้อมลู เหลา่ น้ันมาลงในตาราง หลังจากท่ผี ้เู ขียนได้สำรวจและสรปุ
ขอ้ มลู แลว้ ออกมาเปน็ ตารางดังน้ี

ลำดบั ราคาสนิ ค้า Arduino
รา้ น Uno R3

1 280

2 320

3 320

4 380

จากข้อมูลดังกล่าว สรปุ ว่ารา้ น IOXhop.com ขายราคาถูกท่ีสดุ ครบั และเปรียบตารางข้อมลู น้เี ป็นอาเรย์
จะไดว้ ่า
int price[4] = {280, 320, 320, 380};
จากตวั อย่างการสร้างตวั แปรอาเรยด์ ้านบน จะพบวา่ ยังใช้การประกาศชนิดของข้อมูลอยู่เช่นเดิม เพยี งแต่
ว่าแทนที่เราจะใชเ้ คร่อื หมายเทา่ กบั = แลว้ ตามดว้ ยคา่ เปน็ ตัวเลขจำนวนเต็ม กก็ ลบั กลายเป็นว่ามปี ีกกา
เปดิ ข้ึนมา มตี วั เลขมาวางๆ แล้วค้ันดว้ ยเครื่องหมาย , แลว้ จึงปิดดว้ ยเครื่องหมายปกี กาปิด แลว้ ใส่เซมโิ ค
ลอ่ น ; เปน็ อันจบการประกาศตัวแปร int แบบอาเรย์
แตว่ า่ อาเรยจ์ ะแตกตา่ งการกาเรียงลำดบั ของตารางด้านบน ตรงท่ีอาเรย์จะเริม่ จาก 0 ดังนั้นเม่อื เราดึงค่า
ในแถวที่ 0 จงึ ได้ค่าเป็น 280 ออกมา และดึงมาในแถวที่ 1 จะได้ค่า 320 ซ่ึงตารางจะออกมาแบบน้ีครบั

หลักสตู รการอบรมพฒั นาเกษตรกรรนุ่ ใหม่: เทคโนโลยีเซนเซอรเ์ พอื่ การเกษตร อ.ดร.สุรพล วรภทั ราทร

157

ลำดบั ราคาสินค้า Arduino
อาเรย์ Uno R3

0 280

1 320

2 320

3 380
แลว้ อาจจะสงสยั ต่อมาวา่ [4] คืออะไร คำตอบคือ [4] เปน็ การกำหนดว่าเราจะมีข้อมูลทงั้ หมด 4 ตวั อดั ลง
ไปในอาเรย์ ซง่ึ สามารถใสน่ ้อยกวา่ ที่กำหนดไว้ คือสมมุตวิ ่าประกาศไว้วา่ จะมีข้อมูล 10 ตัว แต่เราใส่ไปแค่
1 ตัว กไ็ ด้ (แต่ใสเ่ กนิ ไมไ่ ด้นะครับ) ตวั อยา่ งเช่น
ร้านท่ีไปสำรวจมาท้ังหมด 4 ร้าน แตค่ รง้ั แรกเลยกำหนดไว้ว่าจะสำรวจซัก 10 รา้ น ดังนัน้ ตารางอาเรย์ที่
เหลอื เลยวา่ เปลา่ และมีค่าเป็น 0

ลำดบั ราคาสนิ คา้ Arduino
อาเรย์ Uno R3

0 280

1 320

2 320

3 380

40

50

60

70

80

90
แตห่ ากเราไมท่ ราบว่าจะกำหนดขนาดใหม้ ันเทา่ ไหรด่ ี เราก็ไมร่ ะบุขนาดไปเลยก็ได้ เชน่
int price[] = {280, 320, 320, 380};
มนั ก็จะรบั รู้ไดเ้ องว่ามขี ้อมลู ท้ังหมด 4 ตวั ในอาเรย์ โดยที่ไม่ตอ้ งกำหนดขนาดของข้อมลู เปน็ [6] หรอื [8]
แต่ใส่เปน็ [] ลงไปไดเ้ ลย
ตอ่ มาคอื การกำหนดว่าจะใหล้ ำดับทีเ่ ทา่ ไหร่ของอาเรย์มีคา่ เป็นอะไร กส็ ามารถกำหนดได้แบบเดียวกบั ตวั
แปรปกติ เพียงแตต่ ้องระบดุ ว้ ยว่าจะกำหนดให้ลำดบั ท่ีเท่าไหร่ ตัวอยา่ งเช่น

หลักสูตรการอบรมพัฒนาเกษตรกรรุ่นใหม่: เทคโนโลยีเซนเซอร์เพ่อื การเกษตร อ.ดร.สรุ พล วรภทั ราทร

158

int price[4];
void setup() {
price[0] = 280;
price[2] = 320;
}
void loop() { ... }
การประกาศตวั แปรอาเรยถ์ ึงเราจะไม่กำหนดขนาด และใสค่ ่าลงไปเลยก็ได้อยู่ แต่หากว่าไม่ไดก้ ำหนด
ขนาด และไม่กำหนดค่าลงในอาเรยด์ ้วย มนั จะไม่ยอมใหผ้ ่าน และจะบังคับให้เรากำหนดขนาด หรอื
กำหนดค่าก่อน เพอื่ ใชอ้ า้ งอิงว่าตกลงแลว้ อาเรยน์ ี้มีขนาดเทา่ ไหร่ เพ่ือจะได้เอาไปจองในพ้ืนทีแ่ รมได้ และ
จากโคด้ ด้านบน มนั จะไมย่ อมให้เราออกมากำหนดคา่ แบบทันทีดว้ ย การกำหนดค่าจึงต้องเข้ามาทำใน
ฟังก์ช่นั setup() แทน โดยเราจะกำหนดคา่ ให้กับลำดบั ท่เี ท่าไหร่ของอาเรยก์ ็ได้ แต่ต้องไมเ่ กินขนาดท่ี
กำหนดไว้ (หา้ มลืมเด็ดขาด อาเรยเ์ รม่ิ จาก 0 หากกำหนดขนาดเปน็ 5 แตจ่ ะใส่ขอ้ มูลลงลำดบั ที่ 5 ซง่ึ
เปน็ ไปไมไ่ ด้ เพราะหากใส่ข้อมูลลงลำดับที่ 5 ได้ ขนาดของอาเรย์จะกลายเป็น 6 ทนั ที)
* การเรยี กตัวแปรอาเรยท์ ี่ไม่มอี ยู่จรงิ สามารถทำได้ แตว่ า่ ค่าทีไ่ ด้ออกมาจะเปน็ ข้อมลู ที่ถูกสุม่ มาจากแรม
แต่หากอา่ นแลว้ ไม่เขา้ ใจ ไมร่ ู้หมายถงึ อะไร ลองดูอกี หลายๆตัวอยา่ งเพม่ิ ดูครับ
String name[] = {"Max", "Mut", "Tum", "Nut"};
char Love[6] = {"I", "L", "o", "v", "e", "U"};
การใช้ตัวแปร char เก็บข้อความ
ตามปกติแลว้ ตวั แปร char จะเก็บค่าเป็นไบต์ คือจะเกบ็ ได้ทลี ะตัวอักษรเทา่ นั้น แตเ่ ราสามารถนำเทคนคิ
อาเรย์มาใส่ข้อความลงในตัวแปร char ได้ เช่น
char text[] = "IOXhop.com";
คา่ ทีไ่ ดค้ ือ text ได้ "IOXhop.com" แต่หากนำอาเรยม์ าแยก จะได้ text[0] ได้ "I" และ text[1] ได้ "O"
และไล่ไปเร่ือยๆ จนถงึ ตวั สดุ ท้าย text[9] ได้ "m" ค่าท่ีใช้สำหรับปิด เพ่อื ให่ในการบอกว่าจบข้อความแลว้
คอื text[10] ได้ 0 ดังนั้นหากใช้ char อาเรยใ์ นการเก็บข้อความ ความ ขนาดของอาเรย์จะเปน็ จำนวน
ตวั อกั ษร + 1 เพราะมีตัวสุดท้ายใชบ้ อกว่าจบข้อความแล้ว
อาเรย์ทใ่ี ช้โดยปกติแล้วจะเป็นแบบมิตเิ ดียว คือตารางจะเปน็ แบบแนวยาวออกมา และเพิ่มได้เฉพาะแถว
แตห่ ากเปน็ อาเรยท์ ี่มหี ลายมติ ิ จะเพ่ิมขอ้ มูลที่นำมาลงตารางไดท้ งั้ แถว และคอลมั่
อาเรย์ 2 มิติ
อาเรย์ 2 มิติ เป็นอาเรยท์ จ่ี ะใชล้ ำดบั ในการอ้างอิง 2 ตัว โดยท่ีตวั หน่งึ เปน็ ตวั หลัก เปรียบได้กบั เป็นแถวใน
ตาราง และอีกตวั เปน็ คอล่ัม ดงั นั้นหากเราต้องการทีจ่ ะดึงข้อมูลออกมาจากอาเรย์ เราจะต้องร้วู ่าข้อมลู
นั้นๆอยแู่ ถวที่เทา่ ไหร่ และอยู่คอลมั่ ที่เทา่ ไหร่
ตวั อยา่ งเชน่ การเปรียบเทียบราคาของซีพยี อู ินเทลรุ่นหน่งึ ในแตล่ ะร้าน และแต่ละปี จะนำขอ้ มูลมาเขียน
เปน็ ตารางงา่ ยๆดังน้ี

หลักสตู รการอบรมพัฒนาเกษตรกรรนุ่ ใหม่: เทคโนโลยีเซนเซอรเ์ พ่ือการเกษตร อ.ดร.สุรพล วรภัทราทร

159

ปี / รา้ น ร้าน รา้ น ร้าน
ชอื่ นาย นาย นาย นาย
รา้ น ก. ข. ค. ง.

2012 3,100 2,990 3,120 3,000

2013 3,000 2,900 3,000 3,100

2014 2,900 2,910 3,000 3,000

2015 2,000 2,000 2,000 2,000

จากตาราง จะเหน็ วา่ อาเรย์มิตเิ ดยี วไม่สามารถเกบ็ ข้อมลู ท่ีมีจำนวนมากได้ จงึ จำเป็นต้องใช้อาเรยแ์ บบ 2
มติ ิ ในเก็บข้อมูล ซ่ึงข้อมูลจะถูกนำไปเก็บในอาเรย์ได้ จะป็นดังนี้
int price[4][5] = {
{2012, 3100, 2990, 3120, 3000},
{2013, 3000, 2900, 3000, 3100},
{2014, 2900, 2910, 3000, 3000},
{2015, 2000, 2000, 2000, 2000}
};
จะเหน็ ว่าการประกาศตัวแปรเรมิ่ ต้น ยงั เป็นรูปแบบ TYPE NAME[SIZE] อยู่ แตม่ ีการเพ่ิมมิตเิ พ่ิมขน้ึ มา
ทำให้ได้ออกมาเป็น TYPE NAME[SIZE1][SIZE2] แล้วจึงกำหนดคา่
จากโค้ดจะเห็นว่าผมไดก้ ำหนขนาดของมติ ิแรกเป็น 4 เพราะในตารางมขี ้อมูลทัง้ หมด 4 ปดี ้วยกนั คอื ปี
2012 2013 2014 และ 2015 ในมิติท่ี 2 ไดก้ ำหนดไวว้ ่าจะมีข้อมลู ย่อยอีก 5 ตัว ในรปู แบบของ ปี, ราคา
ร้านนาย ก., ราคารา้ นนาย ข., ราคารา้ นนาย ค., ราคาร้านนาย ง. เมอ่ื นำโค้ดด้านบนมาใสล่ งในตาราง จะ
ไดเ้ ปน็

price price[x][0] price[x][1] price[x][2] price[x][3] price[x][4]

price[0][y] 2012 3,100 2,990 3,120 3,000

price[1][y] 2013 3,000 2,900 3,000 3,100

price[2][y] 2014 2,900 2,910 3,000 3,000

price[3][y] 2015 2,000 2,000 2,000 2,000

จะเห็นว่าตารางแรกจะแตกต่างจากตารางน้ี เพราะว่าเราไมส่ ามารถนำปี มาใช้เป็น Key ทใี่ ช้กำหนดลำดับ
ของอาเรย์ได้ จงึ ต้องนำปีไปรวมกบั ข้อมูลของร้านนัน้ ๆ
การอ่านขอ้ มูลอาเรย์ 2 มิติ

หลกั สตู รการอบรมพฒั นาเกษตรกรรุน่ ใหม่: เทคโนโลยเี ซนเซอร์เพื่อการเกษตร อ.ดร.สรุ พล วรภัทราทร

160

จากทไี่ ดก้ ลา่ วไปขา้ งตน้ นน้ั เราจำเป็นท่จี ะต้องร้ลู ำดบั หรือ Key ของอาเรย์เสียกอ่ น จึงจะสามารถนำค่า
ออกมาได้ ตวั อยา่ งหากผมต้องการดึงวา่ ตอนปี 2014 ของร้านนาย ค. ได้ขายซีพียใู นราคาเท่าไหร่ ซง่ึ หาก
เราพจิ ารณาจากตาราง จะพบว่าเราจะตอ้ งดงึ ออกมาจากลำดบั ท่ี 2,3 เพราะในปี 2014 มีขอ้ มูลอย่ลู ำดับ
หรือ Key ที่ 2 แลว้ ร้านนาย ค. อยลู่ ำดับ หรือ Key ท่ี 3 ดังนัน้ หากจะดึงข้อมูลออกมา ก็สามารถทำได้
ง่ายๆ ดังน้ี
int val = price[2][3];
จากโคด้ จะเหน็ ว่าไดม้ ีการดงึ ข้อมลู จากอาเรย์ในมิตแิ รกลำดับที่ 2 และในมิติท่ีสอง ลำดับท่ี 3 แล้วจึงนำ
คา่ ที่ได้มาเก็บไว้ในตวั แปรชนิด int ชื่อตวั แปร val
การเซต็ ตวั แปรอาเรย์ 2 มิติ
การเซต็ ตวั แปรอาเรย์ 2 มติ ิ จะคล้ายๆกบั การเซ็ตคา่ ของตวั แปรปกติ เพียงแต่จะตอ้ งระบุลำดบั ของข้อมลู
ทตี่ อ้ งการแก้ไขในแตล่ ะมติ ิดว้ ย
price[2][3] = 2900;
อาเรยห์ ลายมติ ิ
อาเรย์แบบหลายมิติจะใช้เมื่อมีกลุ่มข้อมูลชนดิ เดยี วกนั จำนวนมาก และใชแ้ ค่ 2 มติ ิยังไม่พอ หากยงั นึก
ภาพไม่ออกวา่ อาเรย์หลายมติ ิมรี ูปแบบอย่างไร ก็ให้นกึ ถงึ กระดาษที่มขี ้อมลู คลา้ ยๆกับอยู่วางซอ้ นทับกัน
อยู่ ท่ีการจะนำข้อมูลจำนวนมากไปวางลงในกระดาษแผน่ เดยี วนั้นไมพ่ อ จงึ ต้องมีการใช้กระดาษหลาย
แผน่ เม่ือนำมาวางซอ้ นกนั จะทำให้เหน็ ภาพวา่ มติ ทิ ี่ 3 คืออะไร
* วทิ ยาศาสตรอ์ ธิบายไวง้ ่ายๆว่า หากเราระบขุ ้อมลู ของอะไรกต็ ามได้ 1 ตวั นน่ั หมายถึงส่ิงนั้นมี 1 มิติ
หากระบุไดด้ ้วย 2 ตัวเลข เช่นรูปส่เี หลี่ยม จะเปน็ 2 มติ ิ แต่หากเป็นรปู ทรงลูกบาศก์ ซ่ึงจะเป็น 3 มติ ิ
เนอ่ื งจากระบรุ ายละเอยี ดได้ด้วย 3 ตัวเลข
การประกาศเป็นตัวแปรอาเรยห์ ลายมิติ จะเหมือนกับรูป 2 มติ ิ คอื ใชเ้ คร่ืองหมาย [] ในการระบุขนาดของ
มิติท่ี 3 เพิ่มขนึ้ มา เช่น
int price[10][2][2];
สว่ นการเรียกใชก้ เ็ ช่นเดยี วกนั คอื
int val = price[0][0][0];
ตัวดำเนนิ การ คือ สญั ลักษณ์ทใี่ ชก้ ารการกระทำกับข้อมลู นัน้ ๆ เชน่ การบวกขอ้ มูล การเปรียบเทียบ และ
การเปล่ียนแปลงข้อมูล โดยเร่ืองการดำเนินการน้จี ะเป็นสว่ นต่อของเร่ืองตวั แปรนนั้ เอง
ตัวดำเนินการดา้ นการคำนวน
ตัวดำเนนิ การดา้ นการคำนวน คือการใช้สัญลักษณ์ต่างๆ มาใชใ้ นการคำนวนทางคณิตศาสตร์พนื้ ฐาน
ไดแ้ ก่ การบวก ลบ คูณ หาร ตวั ดำเนนิ การด้านการคำนวนใน Arduino มีดงั น้ี

หลกั สูตรการอบรมพฒั นาเกษตรกรรุ่นใหม่: เทคโนโลยีเซนเซอร์เพ่อื การเกษตร อ.ดร.สรุ พล วรภทั ราทร

161

สัญลกั ษณ์ การ
ดำเนินการ

+ บวกเลข

- ลบเลข

* คูณเลข

/ หารเลข

% หารเอา
เศษ

++ เพมิ่ ค่าขึน้
หนง่ึ

-- ลดค่าลง
หนึ่ง

ตัวอยา่ ง 1
int number;
number = 10 + 20;
จากโคด้ ในตวั อย่างท่ี 1 ได้มกี ารสร้างตัวแปร number ชนิด int แบบไม่กำหนดคา่ ในบรรทัดตอ่ มาได้มี
การใชต้ ัวดำเนนิ การบวกเลข 10 กบั 20 แล้วจงึ นำไปเก็บในตวั แปร number ดังนั้นสุดท้ายแลว้ number
จงึ มคี ่าเปน็ 30
ตัวอยา่ ง 2
int number = 10;
boolean is_even;
is_even = number%2;
ตัวอย่างท่ี 2 นีเ้ ป็นโปรแกรมตรวจเชค็ วา่ เปน็ เลขค่หู รอื เลขค่ี ในบรรทดั แรก ไดป้ ระกาศตวั แปรชนิด int
ช่ือ number เพื่อเกบ็ ตวั เลขทีใ่ ชเ้ ช็ค ในบรรทัดท่ี 2 ประกาศตวั แปรชนดิ boolean ช่อื ตวั แปร is_even
ใช้เกบ็ คา่ วา่ เป็นเลขคู่ หรือเลขคี่ โดยจะสามารถใส่ค่าเป็น 0 (False : เท็จ) หรือ 1 (True : จรงิ ) ใน
บรรทดั ท่ี 3 ใชส้ ัญลกั ษณ์ % กบั 2 หมายถงึ การนำคา่ ในตัวแปร number มาหารด้วย 2 เอาเฉพาะเศษ
ในตวั อยา่ งตัวแปร number มคี า่ เป็น 10 เม่อื นำมาหารดว้ ย 2 แลว้ เอาเฉพาะเศษ ซง่ึ 10 หารดว้ ย 2 ไมม่ ี
เศษ จึงได้คา่ เป็น 0 ไปเกบ็ ในตัวแปร is_even
ตัวดำเนินการเปรยี บเทียบ
ตัวดำเนินการเปรยี บเทยี บ คือการนำตวั เลข 2 จำนวนมาเปรียบเทยี บกนั

หลักสตู รการอบรมพัฒนาเกษตรกรรุ่นใหม่: เทคโนโลยเี ซนเซอร์เพอื่ การเกษตร อ.ดร.สุรพล วรภัทราทร

162

สญั ลักษณ์ การ
ดำเนินการ

== เทา่ กับ

!= ไม่เทา่ กบั

> มากกวา่

< น้อยกว่า

>= มากกวา่
หรอื เทา่ กับ

<= นอ้ ยกว่า
หรอื เท่ากับ

ตวั อย่าง
10 == 50 ผลลัพธ์ เท็จ
10 < 50 ผลลัพธ์ จรงิ
10 <= 10 ผลลพั ธ์ จริง
10 < 10 ผลลัพธ์ เท็จ
80 != 10 ผลลพั ธ์ จริง
'A' == 'a' ผลลัพธ์ เทจ็
'C' == 'C' ผลลัพธ์ จรงิ
* สาเหตทุ ีส่ ามารถเปรยี บเทียบตัวอักษรได้ เนื่องจากคอมไพเลอรจ์ ะแปลงตวั อักษรเปน็ รหสั แอสกี (ASCII)
ตวั ดำเนนิ การทางตรรก (Logical Operator)
ตวั ดำเนนิ การดา้ นตรรกใช้ในการดำเนินการเปรยี บเทียบซ้อน

สญั ลกั ษณ์ การดำเนนิ การ

|| หรือ (มีการเปรียบเทยี บใดเป็นจรงิ หรือเป็นจริงทงั้ หมด ผลที่ได้
คือจริง)

&& และ (เป็นจรงิ ท้ังหมด ผลท่ไี ด้จึงจะเป็นจรงิ )

! กลับค่า

ตวั อย่าง
10 == 50 || 20 == 20 ผลลพั ธ์ จริง
10 == 50 && 20 == 20 ผลลพั ธ์ เท็จ
'A' != 'A' && 'A' == 'A' ผลลพั ธ์ เทจ็

หลกั สูตรการอบรมพฒั นาเกษตรกรร่นุ ใหม่: เทคโนโลยเี ซนเซอร์เพ่ือการเกษตร อ.ดร.สรุ พล วรภัทราทร

163

100 < 200 && 300 < 400 && 500 <= 500 ผลลพั ธ์ จริง
ตัวดำเนนิ การระดับบติ (Bitwise Operators)

เปน็ การดำเนนิ การกับบติ ในเลขฐาน 2 เชน่ การเล่อื นบิต การเซต็ บติ โดยตวั ดำเนนิ การการนจ้ี ะใช้ได้กบั
ข้อมูลชนดิ char int และ byte เท่านน้ั

สัญลกั ษณ์ การดำเนินการ

& And

| OR

^ Exclusive OR (XOR)

~ กลบั ค่าบติ (1's
complement)

>> เลอื่ นบิตไปทางขวา

<< เลือ่ นบิตไปทางซ้าย

* โดยปกติแลว้ Arduino จะไมต่ ้องใช้การดำเนินการระดบั บติ เพราะการดำเนนิ การระดับบติ จะใชก้ บั การ
เซ็ตรีจิสเตอร์เปน็ ส่วนใหญ่ ซึง่ Arduino ใช้ไลบารีใ่ นการเซ็ตรจี ิสเตอร์ ทำให้ไม่จำเป็นต้องเซต็ รจี สิ เตอรเ์ อง
ตัวอยา่ ง
byte a = 0x0000001;
a = a|0x00000010; // ผลคือ a ได้ 00000011 เพราะ 0000001 OR 00000010 ได้ 00000011
a = a&0x00000000; // ผลคอื a ได้ 00000000 เนื่องจาก 00000011 AND 00000000 ได้ 00000000
a = 0x00110000; // เซ็ตตวั แปร a เป็น 00110000
a = ~a; // ผลคอื a ได้ 11001111 เพราะนำคา่ 00110000 มา 1' complement
a = a<<2; ผลคือ a ได้ 00111100 เพราะเล่อื นไปทางซ้าย 2 ตัว ทำให้บติ ทเ่ี กนิ ถูกตัดออก และเพิม่ 0
มาทางซ้าย 2 ตวั
a = a>>2; ผลคอื a ได้ 00001111 เพราะเล่อื นไปทางขวา 2 ตัว ทำใหม้ ี 0 เพิ่มขนึ้ มาทางขวา 2 ตัว ส่วน
คา่ ท่ีเกนิ อยู่ด้านซ้ายก็ถกู ตัดออก
การเซต็ บิต
a |= (1<<2); // เซ็ตบิตที่ 2 ให้เป็น 1 ด้วยการสร้าง 00000001 ข้นึ มา แลว้ เลอ่ื นบิตไปทางซา้ ย 2 ตัว ทำ
ใหม้ ี 0 เพิมข้ึนมา เป็น 00000100 แล้วนำไป OR กบั a ดงั น้ันไมว่ ่า a บิตท่ี 2 จะเปน็ อะไร เม่ือนำมา OR
ผลท่ีได้คือบติ ท่ี 2 จะเป็น 1

หลักสตู รการอบรมพฒั นาเกษตรกรรุน่ ใหม่: เทคโนโลยีเซนเซอรเ์ พอ่ื การเกษตร อ.ดร.สุรพล วรภทั ราทร

164

การเคลียรบ์ ติ
a &= ~(1<<2); // เซ็ตบิตที่ 2 ใหเ้ ปน็ 1 ด้วยการสรา้ ง 00000001 ขึน้ มา แล้วเลื่อนบิตไปทางซ้าย 2 ตวั
ทำให้มี 0 เพิมขึ้นมา เป็น 00000100 แล้วกลบั ค่า จงึ ได้เป็น 0x11111011 แล้วนำไป AND กับ a ดงั น้นั
ไม่ว่า a บติ ที่ 2 จะเปน็ อะไร เมอื่ นำมา AND ผลที่ได้คือบิตที่ 2 จะเป็น 0

ตัวดำเนนิ การแบบสัน้ (Compound Assignment)
จากในตารางตัวดำเนินการด้านการคำนวน จะเหน็ ว่ามีตัวดำเนินการ ++ ในการเพ่ิมคา่ และตัวดำเนินการ
-- ในการลบคา่ เราสามารถนำมาใชไ้ ด้ดังน้ี
int loop_num = 0;
void setup() { }
void loop() {
delay(1000);
loop_num++;
}
จากโค้ด จะเห็นว่ามีการประกาศตัวแปร loop_num ไว้ด้านบนสดุ เพ่อื นับจำนวนรอบในการวนลปู ใน
ฟังกช์ นั่ หลัก loop() ได้ใช้ฟงั กช์ ่นั delay() เพ่ือหนว่ งเวลาหลงั จากหมดเวลาหน่วงเวลา ไดใ้ ชต้ ัวดำเนินการ
++ ในการเพิ่มคา่ ให้กับตัวแปร loop_num ข้ึนหน่งึ ลำดับ และวนรอบเพิม่ ค่าไปเรื่อยๆไมส่ น้ิ สดุ
int loop_num = 0;
void setup() { }
void loop() {
delay(1000);
loop_num += 10;
}
จากโค้ดด้านบน บรรทัดท่ี 5 ไดเ้ ปล่ยี นตวั ดำเนนิ การจาก ++ เปน็ += เพ่อื ใช้เพ่ิมคา่ หลายจำนวน ซง่ึ จะมี
คา่ เทา่ กบั loop_num + 10 แตว่ ิธนี ส้ี ้นั กว่า จงึ นิยมใชม้ ากกวา่ ในการทำงานแคเ่ พ่ิมค่าหมายจำนวน ซง่ึ
จะใชก้ ับลบ คูณ หาร กไ็ ดเ้ ชน่ กัน โดยเปลย่ี นจาก += เป็น -= *= /=
นอกจากการใช้ ++ วนการบวกคา่ แล้ว ยังสามารถทจ่ี ะดึงคา่ ก่อนบวก หรือหลังบวก พร้อมกับการบวก
จำนวนเพมิ่ ขึน้ ไปได้อีกดว้ ย โดยการนำ ++ ไปวางไว้หนา้ ตัวแปร เพ่อื ให้ส่งคา่ กลับกอ่ นบวก หรือนำ ++
ไปไว้หลังตวั แปร เพ่ือใหบ้ วกก่อนส่งค่ากลบั เชน่
int loop_num = 0, last;
void setup() { }
void loop() {
delay(1000);
last = ++loop_num;

หลกั สูตรการอบรมพัฒนาเกษตรกรรุ่นใหม่: เทคโนโลยีเซนเซอร์เพอ่ื การเกษตร อ.ดร.สุรพล วรภัทราทร

165

}
การจดั การกับข้อมลู ระดบั บติ กส็ ามารถจะยบุ รปู แบบไดเ้ ชน่ กัน

ตวั ตัวอย่าง มีคา่
ดำเนนิ การ เทา่ กับ

<<= a<<=b; a=
a<<b;

&= a &= a =
b; a&b;

|= a |= b; a=
a|b;

^= a ^= a = a
b; ^ b;

การแปลงชนดิ ข้อมูลนั้นสำคัญมาก โดยเฉพาะหากเราทำงานท่ีตอ้ งรับข้อมูลมาจากภายนอก หรือรับข้อมูล
มาจากไลบารีอน่ื ๆ ซึ่งในแตล่ ะไลบารีกจ็ ะมีการสง่ ชนิดค่ากลับจากฟงั กช์ น่ั แตกต่างกัน ตามแต่ผูจ้ ัดทำไลบา
รถี นัด
การแปลง String เป็น Int
โดยปกตแิ ล้วหากมีการสง่ คา่ เป็นขอ้ ความยาวๆมา แตว่ า่ ต้องการตวั เลขท่ีอยูใ่ นบางสว่ นของข้อความ
เทา่ นนั้ ซึง่ หลังจากที่ตดั สว่ นของตวั เลขแลว้ ชนิดของขอ้ มูลก็ยงั เปน็ String อยู่ดี หากตอ้ งการแปลงเป็น
Int เพ่ือใช้ในการคำนวน หรอื งา่ ยต่อการจัดเก็บ ต้องใชค้ ำส่งั string.toInt();
ตัวอย่าง
String num10 = "10";
int n10 = num10.toInt();
จากตัวอยา่ ง บรรทัดแรกได้มีการประกาศตัวแปร num10 ชนิด String ใสค่ า่ เป็น "10" ต่อมาในบรรทัดท่ี
2 ได้แปลงจากข้อมลู ชนดิ String เป็น Int ดว้ ยคำสงั่ string.toInt(); แลว้ นำค่าไปเก็บในตัวแปร n10 ซง่ึ
เปน็ ตัวแปรชนดิ Int ทำใหส้ ามารถนำตวั แปรนี้ไปใช้งานได้แลว้
การแปลง Int เป็น String
การแปลง Int เปน็ String จะใชใ้ นกรณีท่ีต้องการนำตวั เลขไปเช่อื มกับข้อความ ซ่ึงโดยปกตแิ ล้วการนำ
ขอ้ มูล 2 ตัวมาเชื่อมกนั ต้องทำใหข้ ้อมูลน้นั เป็นชนดิ เดียวกนั เสยี ก่อน โดยใช้คำส่งั String(val);
ตัวอย่าง
int num = 10;
String text = "This number is " + String(num);

หลักสตู รการอบรมพัฒนาเกษตรกรรุน่ ใหม่: เทคโนโลยเี ซนเซอร์เพื่อการเกษตร อ.ดร.สรุ พล วรภัทราทร

166

จากตวั อย่าง ได้มีการประกาศตวั แปร num เป็นชนิด int ใสค่ า่ เปน็ 10 ในบรรทดั ที่ 2 ไดม้ กี ารประกาศตวั
แปร text ใหม้ ขี อ้ ความ "This number is " แลว้ ใชค้ ำสงั่ String(val); เพื่อแปลงตวั แปร int ให้เป็น
String แลว้ จงึ เช่อื มข้อความด้วยเครือ่ งหมาย + ดงั น้ันตวั แปร text จึงได้คา่ เป็น "This number is 10"
การแปลง String เปน็ char array
ใช้ในกรณที ่ีไลบารรี ับตัวแปรเฉพาะตัวแปร char array เขา้ ไปในฟังก์ชน่ั ซึ่งสว่ นใหญจ่ ะใชง้ านในระบบ
IoT เพือ่ ใชร้ บั ส่งขอ้ มูลเพ่ือสือ่ สารและประมวลผลกัน ซ่ึงคำสัง่ ทจี่ ะใชใ้ นการแปลงคือ
คำสง่ั string.toCharArray(buf, len);
ตัวอยา่ ง
String text = "IOXhop";
char tChar[50];
text.toCharArray(tChar, 50);
ในบรรทัดท่ี 1 ไดม้ กี ารประกาศตัวแปร text ชนิด String เพื่อเก็บข้อความ "IOXhop" ในบรรทัดตอ่ มา ได้
ประกาศตวั แปร tChar เปน็ ชนิด char แบบอาเรย์ แลว้ ใช้คำส่งั string.toCharArray(buf, len); ซง่ึ buf
คือช่อื ตวั แปร char array ทก่ี ำหนดขนาดไว้แล้ว สว่ น len คอื ขนาดของตวั อักษรท่ีต้องการนำมาใส่
ท้งั หมด ซ่งึ len จะสัมพันธก์ ับการต้งั ขนาดอาเรย์ตรงท่ี หากต้งั ใหข้ นาดอาเรยน์ ้อยกวา่ len อาจจะทำให้
โปรแกรมทำงานผิดพลาด โดยกินพ้ืนท่ีแรมสว่ นท่ีไม่ไดจ้ องไว้ อาจทำให้พ้ืนท่ีแรมนนั้ ทบั ซ้อนกนั กบั พน้ื ที่
ถกู ใช้งานอยู่ ซึ่งเปน็ จุดที่ตอ้ งระวงั เมือ่ แปลง String เป็น char array
การแปลง char array เปน็ String
เน่ืองจากตวั แปร char เก็บคา่ เป็นตวั อักษร แต่ String เก็บเปน็ ขอ้ ความ การนำ char มาแปลงเป็น
String จึงต้องใช้วธิ กี ารวนลูปเอาออกมาทลี ะตวั อักษรในตัวแปร char แล้วนำไปเก็บทีละตวั อักษรไป
เรือ่ ยๆในตวั แปร String
ตวั อย่าง
char text[] = "IOXhop";
String sText;
for (int i=0;i<sizeof(text);i++)
sText += text[i];
ในบรรทดั ที่ 1 ประกาศตัวแปร char array ไว้ เกบ็ คา่ "IOXhop" ตอ่ มาในบรรทดั ที่ 2 ไดส้ รา้ งตวั แปร
ชนดิ String ชือ่ sText ไว้ เพ่อื ใชเ้ กบ็ ข้อความท่ีถูกแปลงแลว้ ในบรรทดั ท่ี 3 ไดม้ ีการใช้ for loop ในการ
วนรอบทำงาน บรรทดั ที่ 4 เพ่ิมตัวอักษรไปเร่ือยๆ เมื่อจบการทำงานแลว้ ตวั แปร sText จะมีค่าเปน็
"IOXhop"

หลักสตู รการอบรมพฒั นาเกษตรกรร่นุ ใหม่: เทคโนโลยีเซนเซอร์เพื่อการเกษตร อ.ดร.สรุ พล วรภัทราทร

167

การแปลง float เป็น Int
การแปลง float เป็น Int ทำเพอื่ ตัดเศษทงิ้ ทำใหจ้ ำนวนที่ได้เป็นจำนวนเตม็ เท่านั้น ดงั น้ันการแปลงเปน็
Int จึงมีประโยชนใ์ นแง่การตัดเศษตวั เลข การแปลงจะใชว้ ธิ ีการบงั คับแปลงข้อมูลโดยตรง โดยมีรปู แบบ
เปน็ (TYPE)(VAL)
ตวั อย่าง
(int)(100.23); // ผลลพั ธ์คอื 100
(int)(45); // ผลลัพธ์คอื 45
(int)(3.142); // ผลลัพธ์คือ 3
(int)(a); // ผลลพั ธค์ ือ a ตัดเศษ

การแปลง String เป็น float
จุดประสงค์เดียวกับหัวขอ้ การแปลง String เปน็ Int เพยี งแต่กรณี String เปน็ ตัวเลขทศนิยม ซ่งึ จะต้อง
ใช้ตัวแปร flost เก็บเท่าน้นั ใชค้ ำสงั่ string.toFloat() ในการแปลง
ตัวอย่าง
String num10_32 = "10.32";
float n10_32 = num10_32.toFloat();

การแปลง float เป็น String
ใชค้ ำส่ัง String(val); เช่นเดยี วกบั หัวขอ้ การแปลง Int เปน็ String

หลักสูตรการอบรมพฒั นาเกษตรกรรุน่ ใหม่: เทคโนโลยเี ซนเซอร์เพอ่ื การเกษตร อ.ดร.สุรพล วรภทั ราทร


Click to View FlipBook Version