วันศุกร์ที่ 17 กุมภาพันธ์ พ.ศ. 2560

Arduino ตอนที่ 6 ตัวแปร และอาเรย์

ชนิดของข้อมูล

ก่อนที่เราจะไปทำความเข้าใจเรื่องตัวแปร และฟังก์ชั่น เราต้องทำความเข้าในเรื่องชนิดของข้อมูลใน Arduino กันก่อน โดย Arduino จะมีชนิดของข้อมูลให้เลือกใช้ดังนี้
ชนิดข้อมูลการเก็บข้อมูลขนาด
booleanจริง (True) หรือ เท็จ (False)1 บิต
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 (เฉพาะบอร์ด Arduino Due)ตัวเลขทศนิยมที่มีความยาวและต้องการความแม่นยำ8 ไบต์ ใช้ในการคำนวนที่ต้องการประสิทธิ์ภาพสูง
Stringข้อความไม่ระบุ
* ชนิดข้อมูลบางชนิดไม่นิยมใช้ ผู้เขียนจึงไม่ยกมาไว้ในตารางด้วย
จากตารางจะเห็นว่ามีตัวแปรที่น่าสนใจ และไม่มีในภาษา 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 การที่เครื่องหมายนิเสธไปอยู่หน้าตัวแปร หมายถึงการกลับเป็นค่าตรงข้าม จากบรรทัดแรก ตัวแปร 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
2320
3320
4380
จากข้อมูลดังกล่าว สรุปว่าร้าน IOXhop.com ขายราคาถูกที่สุดครับ และเปรียบตารางข้อมูลนี้เป็นอาเรย์ จะได้ว่า
int price[4] = {280, 320, 320, 380};
จากตัวอย่างการสร้างตัวแปรอาเรย์ด้านบน จะพบว่ายังใช้การประกาศชนิดของข้อมูลอยู่เช่นเดิม เพียงแต่ว่าแทนที่เราจะใช้เครื่อหมายเท่ากับ = แล้วตามด้วยค่าเป็นตัวเลขจำนวนเต็ม ก็กลับกลายเป็นว่ามีปีกกาเปิดขึ้นมา มีตัวเลขมาวางๆ แล้วคั้นด้วยเครื่องหมาย , แล้วจึงปิดด้วยเครื่องหมายปีกกาปิด แล้วใส่เซมิโคล่อน ; เป็นอันจบการประกาศตัวแปร int แบบอาเรย์
แต่ว่า อาเรย์จะแตกต่างการกาเรียงลำดับของตารางด้านบน ตรงที่อาเรย์จะเริ่มจาก 0 ดังนั้นเมื่อเราดึงค่าในแถวที่ 0 จึงได้ค่าเป็น 280 ออกมา และดึงมาในแถวที่ 1 จะได้ค่า 320 ซึ่งตารางจะออกมาแบบนี้ครับ
ลำดับอาเรย์ราคาสินค้า Arduino Uno R3
0
280
1320
2320
3380
แล้วอาจจะสงสัยต่อมาว่า [4] คืออะไร คำตอบคือ [4] เป็นการกำหนดว่าเราจะมีข้อมูลทั้งหมด 4 ตัวอัดลงไปในอาเรย์ ซึ่งสามารถใส่น้อยกว่าที่กำหนดไว้ คือสมมุติว่าประกาศไว้ว่าจะมีข้อมูล 10 ตัว แต่เราใส่ไปแค่ 1 ตัว ก็ได้ (แต่ใส่เกินไม่ได้นะครับ) ตัวอย่างเช่น
ร้านที่ไปสำรวจมาทั้งหมด 4 ร้าน แต่ครั้งแรกเลยกำหนดไว้ว่าจะสำรวจซัก 10 ร้าน ดังนั้นตารางอาเรย์ที่เหลือเลยว่าเปล่า และมีค่าเป็น 0
ลำดับอาเรย์ราคาสินค้า Arduino Uno R3
0
280
1320
2320
3380
40
50
60
70
80
90
แต่หากเราไม่ทราบว่าจะกำหนดขนาดให้มันเท่าไหร่ดี เราก็ไม่ระบุขนาดไปเลยก็ได้ เช่น
int price[] = {280, 320, 320, 380};
มันก็จะรับรู้ได้เองว่ามีข้อมูลทั้งหมด 4 ตัวในอาเรย์ โดยที่ไม่ต้องกำหนดขนาดของข้อมูลเป็น [6] หรือ [8] แต่ใส่เป็น [] ลงไปได้เลย
ต่อมาคือการกำหนดว่าจะให้ลำดับที่เท่าไหร่ของอาเรย์มีค่าเป็นอะไร ก็สามารถกำหนดได้แบบเดียวกับตัวแปรปกติ เพียงแต่ต้องระบุด้วยว่าจะกำหนดให้ลำดับที่เท่าไหร่ ตัวอย่างเช่น
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 เพราะมีตัวสุดท้ายใช้บอกว่าจบข้อความแล้ว

ไม่มีความคิดเห็น:

แสดงความคิดเห็น