ชนิดข้อมูล (Data Type) หมายถึง “ประเภทของค่าที่ตัวแปรสามารถเก็บได้”
ซึ่งจะกำหนด ขนาดหน่วยความจำ (byte) ที่ใช้เก็บ และ ช่วงค่าที่เก็บได้ ของตัวแปรนั้น ๆ
บน ESP32 (32-bit processor) ขนาดของข้อมูลบางประเภทจะใหญ่กว่า Arduino UNO (8-bit) ครับ
1. void
- ใช้ในฟังก์ชันที่ ไม่คืนค่าใด ๆ
- เหมือนคำว่า “ไม่มีข้อมูล”
- ตัวอย่างเช่น
setup()และloop()ที่ไม่ส่งค่ากลับ
C++
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.println("Running...");
delay(1000);
}
voidหมายความว่า ฟังก์ชันนี้ไม่มีค่า return กลับมาให้ใคร
2. bool (บูลีน)
- ใช้เก็บค่า “จริง/เท็จ”
- มีเพียงสองค่าเท่านั้น คือ
true(1) และfalse(0) - ขนาด 1 byte
- นิยมใช้ในการตัดสินใจ เช่น if, while, loop
C++
bool ledState = true;
void loop() {
if (ledState) {
digitalWrite(2, HIGH);
} else {
digitalWrite(2, LOW);
}
}
3. char (ตัวอักษร)
- เก็บตัวอักษร 1 ตัว เช่น
'A','b','9' - จริง ๆ แล้วเก็บเป็น รหัส ASCII (ตัวเลข)
- ขนาด 1 byte → เก็บได้ตั้งแต่ -128 ถึง 127
- สามารถใช้เป็นตัวเลขได้ด้วย (เช่น
'A'= 65)
C++
char letter = 'A';
Serial.println(letter); // แสดง A
Serial.println((int)letter); // แสดง 65
ถ้าต้องการเก็บ “ข้อความหลายตัว” ต้องใช้
char arrayหรือString
4. byte และ unsigned char
- ขนาด 1 byte เหมือนกัน
- เก็บตัวเลขบวก 0–255
- เหมาะกับการเก็บค่าดิจิทัล, สี RGB, ข้อมูลบิต
- นิยมใช้ในวงจรสื่อสาร (I2C, SPI) หรือ buffer
C++
byte val = 255;
Serial.println(val); // 255
5. int (จำนวนเต็ม)
- เก็บค่าจำนวนเต็มบวกและลบ
- ขนาด 4 byte บน ESP32 (32-bit)
(บน Arduino UNO จะมีขนาด 2 byte เท่านั้น) - ช่วงค่าที่เก็บได้: -2,147,483,648 ถึง 2,147,483,647
C++
int count = -123;
int total = 45 + 55;
Serial.println(count + total);
ใช้ทั่วไปมาก เช่น ตัวนับ, ค่าจาก digitalRead, loop index
6. unsigned int
- คล้าย
intแต่ไม่มีค่าลบ - ขนาด 4 byte
- เก็บได้: 0 ถึง 4,294,967,295
- ใช้เมื่อมั่นใจว่าข้อมูลจะเป็น “จำนวนบวกเท่านั้น” เช่น เวลา (millis)
C++
unsigned int timer = millis();
Serial.println(timer);
7. long และ unsigned long
- ใช้เก็บจำนวนเต็มขนาดใหญ่
- ขนาด 4 byte (เหมือน
intบน ESP32 แต่เน้นการใช้งานระยะยาว) - เหมาะสำหรับตัวนับเวลา เช่น
millis(),micros()
C++
unsigned long t1 = millis();
delay(1000);
unsigned long t2 = millis();
Serial.println(t2 - t1); // ประมาณ 1000
millis()คืนค่าแบบunsigned longเสมอ เพราะมันจะเพิ่มขึ้นตลอดโดยไม่ลบ
8. float
- ใช้เก็บค่าทศนิยม (เลขที่มีจุด) เช่น 3.14, -0.75
- ขนาด 4 byte (32-bit floating point)
- ความละเอียดประมาณ 6–7 หลักทศนิยม
C++
float temp = 36.7521;
float voltage = 3.3;
Serial.println(temp);
Serial.println(voltage * 2);
ใช้บ่อยกับค่าจาก sensor analog เช่น อุณหภูมิ, ความชื้น
9. double
- เหมือน
floatแต่ละเอียดกว่า (บน ESP32 คือ 8 byte, 64-bit) - เหมาะสำหรับคำนวณทางคณิตศาสตร์หรือกรณีต้องการความแม่นยำสูง
C++
double pi = 3.141592653589793;
Serial.println(pi, 15); // แสดงทศนิยม 15 ตำแหน่ง
10. String
- ใช้เก็บ “ข้อความ” เช่น
"Hello" - เป็นคลาสที่ใช้งานง่ายใน Arduino (เหมือนในภาษา Python/Java)
- มีเมธอดช่วย เช่น
.length(),.toInt(),.substring()
C++
String name = "ESP32";
Serial.println("Hello " + name);
Serial.println(name.length()); // 5
ใช้ง่ายแต่กิน RAM มากกว่าการใช้
char[]
ถ้าต้องการประสิทธิภาพสูง ควรใช้char[]แทน
11. char[] (C-String)
- เก็บข้อความแบบ array ของตัวอักษร (ลงท้ายด้วย
\0) - ใช้หน่วยความจำน้อยกว่า
String - เหมาะกับงานสื่อสาร UART, Wi-Fi, หรือการประมวลผลข้อความ
C++
char msg[] = "Hello";
Serial.println(msg);| ชนิดข้อมูล | ขนาด (โดยทั่วไป) | ช่วงค่าที่เก็บได้ | ตัวอย่างการประกาศ | หมายเหตุ |
|---|---|---|---|---|
void | – | ไม่มีค่า | void setup() { } | ใช้เมื่อฟังก์ชันไม่คืนค่า |
bool | 1 byte | true / false | bool ledState = true; | ใช้กับเงื่อนไข/สถานะ |
char | 1 byte | -128 ถึง 127 | char c = 'A'; | ใช้เก็บตัวอักษร 1 ตัว |
unsigned char | 1 byte | 0 ถึง 255 | unsigned char b = 255; | เก็บตัวเลขบวกขนาดเล็ก |
byte | 1 byte | 0 ถึง 255 | byte val = 100; | เหมือน unsigned char |
int | 4 byte (บน ESP32) | -2,147,483,648 ถึง 2,147,483,647 | int x = -100; | ตัวเลขจำนวนเต็ม |
unsigned int | 4 byte | 0 ถึง 4,294,967,295 | unsigned int t = 50000; | ตัวเลขบวก |
short | 2 byte | -32,768 ถึง 32,767 | short s = 200; | ตัวเลขขนาดเล็ก |
unsigned short | 2 byte | 0 ถึง 65,535 | unsigned short us = 60000; | – |
long | 4 byte | -2,147,483,648 ถึง 2,147,483,647 | long l = 123456L; | ใช้กับ millis() |
unsigned long | 4 byte | 0 ถึง 4,294,967,295 | unsigned long t = millis(); | ใช้นับเวลา |
long long | 8 byte | ค่ามากๆ | long long big = 12345678900LL; | จำนวนเต็มขนาดใหญ่ |
float | 4 byte | ~6-7 หลักทศนิยม | float f = 3.1416; | ใช้กับค่าทศนิยม |
double | 8 byte (ESP32) | ~15 หลักทศนิยม | double d = 3.1415926535; | บน ESP32 = 64 บิตจริง |
String | ขึ้นอยู่กับความยาว | ข้อความ | String msg = "Hello"; | ใช้งานง่ายกว่ char[] |
char[] | ตามจำนวนตัวอักษร | ข้อความแบบ C | char name[] = "LIC"; | ใช้ได้เร็วกว่าในบางกรณี |
💡 ตัวอย่างการใช้งานในโค้ด
🔸 ตัวอย่าง 1: การประกาศตัวแปรแต่ละชนิด
C++
void setup() {
Serial.begin(115200);
bool state = true;
char letter = 'A';
int count = 123;
float temp = 36.75;
double precise = 3.1415926535;
String name = "Nathee";
Serial.println(state); // แสดงค่า true = 1
Serial.println(letter); // แสดง A
Serial.println(count); // แสดง 123
Serial.println(temp); // แสดง 36.75
Serial.println(precise, 10);// แสดงทศนิยม 10 ตำแหน่ง
Serial.println(name); // แสดง Nathee
}
void loop() {}
🔸 ตัวอย่าง 2: การแปลงชนิดข้อมูล (Type Casting)
C++
int a = 10;
float b = 3;
float result = (float)a / b; // แปลง a เป็น float ก่อนหาร
Serial.println(result); // 3.333333
🔸 ตัวอย่าง 3: ตัวเลขใหญ่และเวลา
C++
unsigned long startTime = millis(); // เวลาเริ่มต้น (ms)
delay(1000);
unsigned long duration = millis() - startTime;
Serial.println(duration); // ประมาณ 1000
🔸 ตัวอย่าง 4: ตัวแปรข้อความ (String)
C++
String name = "ESP32";
String msg = "Hello " + name;
Serial.println(msg); // Hello ESP32
Serial.println(msg.length()); // แสดงความยาว 9
🧠 ทำไม “ชนิดข้อมูล” ถึงสำคัญ?
เพราะ ESP32 มีหน่วยความจำจำกัด (RAM ~520 KB)
ถ้าใช้ชนิดข้อมูลใหญ่โดยไม่จำเป็น จะ เปลืองหน่วยความจำ และ ทำงานช้าลง
ตัวอย่างเช่น 👇
| งานที่ต้องการ | ชนิดข้อมูลที่แนะนำ |
|---|---|
| เปิด-ปิดไฟ LED, สถานะ Sensor | bool |
| นับจำนวนรอบ, ค่าเล็กๆ (<255) | byte |
| ค่าจาก Analog, Timer, Loop Counter | int หรือ unsigned long |
| อุณหภูมิ, แรงดันไฟ | float |
| ข้อความ/ชื่อ/คำ | String หรือ char[] |
⚠️ ข้อควรระวังและเคล็ดลับ
| ปัญหา | คำอธิบาย |
|---|---|
| Overflow | ถ้าค่าเกินช่วงที่เก็บได้ → จะ “วนกลับ” (เช่น 255+1 = 0 ใน byte) |
| หน่วยความจำจำกัด | ใช้ชนิดข้อมูลใหญ่โดยไม่จำเป็น → เปลือง RAM |
| String กินหน่วยความจำมาก | ถ้าใช้ต่อเนื่อง ควรใช้ char[] แทนในงานจริง |
| เปรียบเทียบค่า float/double | ห้ามใช้ == ควรใช้การเปรียบเทียบช่วง เช่น abs(a-b) < 0.001 |
| unsigned | เก็บค่าเป็นบวกเท่านั้น → เหมาะกับเวลา, counter, byte data |
🔍 เปรียบเทียบ float vs double (บน ESP32)
| บอร์ด | float | double | หมายเหตุ |
|---|---|---|---|
| Arduino UNO | 4 ไบต์ | 4 ไบต์ | float = double (เท่ากัน) |
| ESP32 | 4 ไบต์ | 8 ไบต์ | double มีความละเอียดสูงกว่า |
📘 ตัวอย่างเพิ่มเติม — การเลือกใช้ที่เหมาะสม
C++
bool buttonPressed = false; // แค่สถานะจริง/เท็จ
byte brightness = 128; // ความสว่าง LED (0–255)
unsigned long startTime = millis(); // ตัวนับเวลา (ไม่มีค่าลบ)
float sensorValue = 23.56; // ค่าจากเซนเซอร์
char name[] = "LIC COLLEGE"; // ข้อความแบบ C
String message = "Hello ESP32!"; // ข้อความแบบง่าย
🎯 สรุปง่าย ๆ
| ประเภทข้อมูล | หน้าที่หลัก | ตัวอย่างการใช้งาน |
|---|---|---|
| bool | สถานะ (เปิด/ปิด) | สั่งเปิด LED, เช็ค sensor |
| int / long | จำนวนเต็ม | นับรอบ, ระยะเวลา |
| float / double | ค่าทศนิยม | ค่าสัญญาณ analog |
| char / String | ข้อความ | พิมพ์ชื่อ, แสดงบนจอ |
| unsigned | ค่าบวกเท่านั้น | ตัวนับเวลา, counter |
| byte | ค่าต่ำสุดใน 1 ไบต์ | สี, PWM, สื่อสารข้อมูล |
