ชนิดข้อมูล (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() { }ใช้เมื่อฟังก์ชันไม่คืนค่า
bool1 bytetrue / falsebool ledState = true;ใช้กับเงื่อนไข/สถานะ
char1 byte-128 ถึง 127char c = 'A';ใช้เก็บตัวอักษร 1 ตัว
unsigned char1 byte0 ถึง 255unsigned char b = 255;เก็บตัวเลขบวกขนาดเล็ก
byte1 byte0 ถึง 255byte val = 100;เหมือน unsigned char
int4 byte (บน ESP32)-2,147,483,648 ถึง 2,147,483,647int x = -100;ตัวเลขจำนวนเต็ม
unsigned int4 byte0 ถึง 4,294,967,295unsigned int t = 50000;ตัวเลขบวก
short2 byte-32,768 ถึง 32,767short s = 200;ตัวเลขขนาดเล็ก
unsigned short2 byte0 ถึง 65,535unsigned short us = 60000;
long4 byte-2,147,483,648 ถึง 2,147,483,647long l = 123456L;ใช้กับ millis()
unsigned long4 byte0 ถึง 4,294,967,295unsigned long t = millis();ใช้นับเวลา
long long8 byteค่ามากๆlong long big = 12345678900LL;จำนวนเต็มขนาดใหญ่
float4 byte~6-7 หลักทศนิยมfloat f = 3.1416;ใช้กับค่าทศนิยม
double8 byte (ESP32)~15 หลักทศนิยมdouble d = 3.1415926535;บน ESP32 = 64 บิตจริง
Stringขึ้นอยู่กับความยาวข้อความString msg = "Hello";ใช้งานง่ายกว่ char[]
char[]ตามจำนวนตัวอักษรข้อความแบบ Cchar 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, สถานะ Sensorbool
นับจำนวนรอบ, ค่าเล็กๆ (<255)byte
ค่าจาก Analog, Timer, Loop Counterint หรือ 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)

บอร์ดfloatdoubleหมายเหตุ
Arduino UNO4 ไบต์4 ไบต์float = double (เท่ากัน)
ESP324 ไบต์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, สื่อสารข้อมูล