🧩 1. ความหมายของ Constants
Constant (ค่าคงที่) คือ “ค่าที่ไม่เปลี่ยนแปลงตลอดการทำงานของโปรแกรม” ต่างจากตัวแปร (Variable) ที่ค่าเปลี่ยนได้
ใช้เมื่อคุณต้องการ “กำหนดชื่อแทนค่าตายตัว” เพื่อให้โค้ดอ่านง่าย และลดความผิดพลาดเวลาต้องเปลี่ยนค่าในหลายจุด
⚙️ 2. ประเภทของ Constants ใน Arduino / ESP32
| ประเภท | ลักษณะ | ตัวอย่าง | หมายเหตุ |
|---|---|---|---|
| Literal Constant | ค่าที่ระบุโดยตรง | 10, 'A', 3.14, "Hello" | ตัวเลข, ตัวอักษร, ข้อความ ฯลฯ |
Symbolic Constant (#define) | ค่าคงที่แบบแมโคร (Preprocessor) | #define LED 2 | ถูกแทนค่าก่อนคอมไพล์ |
Constant Variable (const) | ตัวแปรที่ไม่สามารถเปลี่ยนค่าได้ | const int LED = 2; | ปลอดภัยกว่า #define, มีชนิดข้อมูล |
Enumeration (enum) | กำหนดกลุ่มค่าคงที่เป็นชุด | enum State {ON, OFF}; | ใช้จัดกลุ่มสถานะหรือโหมด |
| Built-in Constants | ค่ามาตรฐานใน Arduino Core | HIGH, LOW, INPUT, OUTPUT, true, false | ใช้บ่อยใน I/O |
🔹 3. Literal Constants (ค่าที่เขียนตรง ๆ)
| ตัวอย่าง | ชนิด | ความหมาย |
|---|---|---|
100 | int | ตัวเลขจำนวนเต็ม |
3.1416 | float | ทศนิยม |
'A' | char | ตัวอักษร 1 ตัว |
"ESP32" | String | ข้อความ |
0xFF | hex | เลขฐาน 16 (255) |
0b1010 | binary | เลขฐาน 2 (10) |
📘 ตัวอย่าง:
C++
int ledPin = 2; // ค่าตรง
float pi = 3.1416; // ค่าทศนิยม
char letter = 'A'; // ตัวอักษร
🔹 4. Symbolic Constants – #define
เป็นคำสั่งของ Preprocessor (ประมวลผลก่อนคอมไพล์) ไม่ใช่ตัวแปรในหน่วยความจำ แต่เป็น “การแทนข้อความ” ก่อนคอมไพล์
C++
#define LED 2
#define DELAY 500
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
digitalWrite(LED, HIGH);
delay(DELAY);
digitalWrite(LED, LOW);
delay(DELAY);
}
ข้อดี:
- สั้น, ใช้งานง่าย
- ถูกแทนค่าก่อนคอมไพล์ → ทำงานเร็ว
ข้อเสีย:
- ไม่มีชนิดข้อมูล → Debug ยาก
- ถ้าใช้เยอะ อ่านยากในโปรเจกต์ใหญ่
🔹 5. Constant Variables – const
เป็นการประกาศ “ตัวแปรที่เปลี่ยนค่าไม่ได้” ปลอดภัยกว่า #define เพราะระบบรู้ชนิดข้อมูล
C++
const int LED = 2;
const unsigned long TIME_DELAY = 500;
void setup() {
pinMode(LED, OUTPUT);
}
void loop() {
digitalWrite(LED, HIGH);
delay(TIME_DELAY);
digitalWrite(LED, LOW);
delay(TIME_DELAY);
}
✅ ข้อดีของ const
- มีชนิดข้อมูลแน่นอน → ป้องกันบั๊กจากชนิดผิด
- เก็บในหน่วยความจำจริง → ใช้ร่วมกับ pointer, function ได้
- อ่านง่าย เหมาะกับโปรแกรมใหญ่ / ESP32
Arduino/ESP32 Core ใช้
constสำหรับค่าพิน เช่นconst int SDA = 21;
🔹 6. Enumeration Constants – enum
ใช้สร้าง “กลุ่มค่าคงที่” ที่มีความสัมพันธ์กัน เช่น สถานะเครื่อง
C++
enum State { OFF, ON };
State ledState = OFF;
void setup() {
Serial.begin(115200);
}
void loop() {
if (ledState == OFF) {
Serial.println("LED OFF");
ledState = ON;
} else {
Serial.println("LED ON");
ledState = OFF;
}
delay(1000);
}
ผลลัพธ์:
Zsh
LED OFF
LED ON
LED OFF
...
💡 enum จะกำหนดค่าเป็นตัวเลขอัตโนมัติ เช่นOFF = 0, ON = 1 (สามารถระบุเองได้เช่น enum Mode {SLOW=100, FAST=200};)
🔹 7. Built-in Constants (ค่าคงที่ใน Arduino Core)
| ค่าคงที่ | ความหมาย | ใช้กับ |
|---|---|---|
HIGH | ค่า 1 หรือ 3.3V/5V | digitalWrite, digitalRead |
LOW | ค่า 0V | digitalWrite, digitalRead |
INPUT | ตั้งขาเป็นอินพุต | pinMode |
OUTPUT | ตั้งขาเป็นเอาต์พุต | pinMode |
INPUT_PULLUP | อินพุต + ตัวต้านทานดึงขึ้นภายใน | pinMode |
true / false | ค่าเชิงตรรกะ (boolean) | if, while |
PI | ค่าพาย (3.14159) | คณิตศาสตร์ |
LED_BUILTIN | ขา LED บนบอร์ด | digitalWrite |
📘 ตัวอย่าง:
C++
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // เปิดไฟ
delay(500);
digitalWrite(LED_BUILTIN, LOW); // ปิดไฟ
delay(500);
}
🔹 8. ค่าคงที่เชิงตัวเลข (Numerical Constants)
| รูปแบบ | ตัวอย่าง | หมายเหตุ |
|---|---|---|
| เลขฐาน 10 | 255 | ค่าปกติ |
| เลขฐาน 16 | 0xFF | ใช้กับสี RGB, บิตมาสก์ |
| เลขฐาน 2 | 0b10101010 | ใช้ในการควบคุมบิต |
| เลขฐาน 8 | 0377 | ฐานแปด (น้อยใช้) |
| ตัวเลขทศนิยม | 3.14, -0.75 | ค่าทศนิยม |
| ค่าลอยตัวแบบ long | 1000L | บังคับชนิด long |
| ค่าทศนิยมแบบ float | 2.5f | ใช้กับ float |
🔹 9. การใช้งานร่วมกับ Arrays และ Functions
C++
const int ledPins[] = {2, 4, 5, 18};
const int numLeds = 4;
void setup() {
for (int i = 0; i < numLeds; i++)
pinMode(ledPins[i], OUTPUT);
}
void loop() {
for (int i = 0; i < numLeds; i++) {
digitalWrite(ledPins[i], HIGH);
delay(200);
digitalWrite(ledPins[i], LOW);
}
}
🔹 10. ข้อดีของการใช้ Constants
| ข้อดี | รายละเอียด |
|---|---|
| ✅ อ่านง่าย | ใช้ชื่อสื่อความหมาย แทนตัวเลข |
| ✅ ปรับแก้ง่าย | เปลี่ยนค่าที่เดียว โปรแกรมทั้งระบบปรับตาม |
| ✅ ป้องกันบั๊ก | ลดความเสี่ยงพิมพ์ค่าผิด หรือชนิดข้อมูลไม่ตรง |
| ✅ ประสิทธิภาพ | Compiler จัดการได้ดีขึ้น |
| ✅ ใช้ซ้ำได้ | นำไปใช้ในหลายฟังก์ชัน/โมดูล |
📚 สรุป “Constants”
| ประเภท | คำสั่ง/รูปแบบ | ตัวอย่าง | ใช้เมื่อ |
|---|---|---|---|
| Literal | เขียนค่าโดยตรง | digitalWrite(2, HIGH); | ทดลองสั้น ๆ |
| #define | #define LED 2 | digitalWrite(LED, HIGH); | โปรแกรมเล็ก, ค่าตายตัว |
| const | const int LED=2; | ปลอดภัย, มีชนิดข้อมูล | |
| enum | enum {ON,OFF}; | กลุ่มค่าคงที่ เช่น โหมด | |
| Built-in | HIGH, LOW, INPUT | ค่ามาตรฐานของ Arduino |
🔧 สรุปแนวปฏิบัติที่ดี (Best Practice)
- ใช้
constแทน#defineเมื่อทำงานกับตัวแปรใน C/C++ (เพราะมี type checking) - ใช้ชื่อคงที่เป็น ตัวพิมพ์ใหญ่ทั้งหมด เช่น
LED_PIN,SENSOR_THRESHOLD - ใช้
enumเมื่อค่าคงที่มีหลายสถานะที่สัมพันธ์กัน - อย่าใช้ค่าตัวเลขดิบ (magic numbers) ในโค้ด
- ใช้
constexpr(ESP32 รองรับ) สำหรับค่าคงที่ที่ compiler คำนวณล่วงหน้าได้
