#define ต่างกับ const ใน Arduino IDE
ในการเขียนโค้ดบน Arduino IDE ไม่ว่าจะเป็นบอร์ด Arduino หรือ ESP32 เรามักต้องประกาศค่าคงที่ (constant) และมีอยู่ 2 วิธีที่ใช้บ่อย คือ
- #define (Preprocessor Directive)
- const (ตัวแปรค่าคงที่)
แม้ผลลัพธ์ดูคล้ายกัน แต่มีความแตกต่างสำคัญที่มือใหม่ควรรู้
#define คืออะไร
- เป็นคำสั่ง Preprocessor ทำงานก่อนคอมไพล์
- ไม่มีชนิดข้อมูล (type)
- ไม่กิน RAM เพราะไม่ใช่ตัวแปร
- เหมาะกับค่าที่ต้องแทนที่ตรง ๆ เช่นหมายเลขพิน หรือค่าคงที่ที่ใช้ในเงื่อนไขการคอมไพล์
#define LED_PIN 2
void setup() {
pinMode(LED_PIN, OUTPUT);
}
void loop() {
digitalWrite(LED_PIN, HIGH);
}
const คืออะไร
- เป็นตัวแปรที่ประกาศให้แก้ค่าไม่ได้
- มี type ชัดเจน เช่น int, float, char
- Compiler ตรวจสอบชนิดข้อมูล ลดความผิดพลาดได้
- อาจใช้ RAM แต่ถ้าเป็นค่าคงที่จะถูกเก็บใน Flash
const int ledPin = 2;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
digitalWrite(ledPin, HIGH);
}
ตารางเปรียบเทียบ #define vs const
| คุณสมบัติ | #define | const |
|---|---|---|
| ขั้นตอนทำงาน | ก่อนคอมไพล์ (Preprocessor) | ตอนคอมไพล์ (Compile time) |
| มีชนิดข้อมูลไหม | ❌ ไม่มี type | ✅ มี type |
| ตรวจสอบ type | ❌ ไม่ตรวจ | ✅ ตรวจสอบได้ |
| ใช้ RAM ไหม | ❌ ไม่ใช้ | ⚠ อาจใช้เล็กน้อย |
| เหมาะกับอะไร | ค่าที่แทนที่ตรง ๆ | ค่าที่ต้องการ type ชัด |
ควรใช้แบบไหนดี
- ใช้ const เป็นหลัก เพราะปลอดภัยกว่า และ compiler ช่วยตรวจ type
- ใช้ #define ในกรณีเปิด/ปิดฟีเจอร์ด้วย #ifdef หรือประกาศค่าที่ต้องใช้ในขั้นตอน preprocessor
ตัวอย่างการใช้ผสมกัน
#define DEBUG_MODE
const int ledPin = 2;
void setup() {
pinMode(ledPin, OUTPUT);
#ifdef DEBUG_MODE
Serial.begin(115200);
Serial.println(“Debug mode ON”);
#endif
}
void loop() {
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
}
📌 อ่านต่อที่เกี่ยวข้อง
♦ รายละเอียดพื้นฐานของ — ESP32 คืออะไร พร้อมจุดเด่นและวิธีเริ่มต้นใช้งาน
♠ ถ้ายังไม่เคยใช้ Arduino IDE มาก่อน ลองคลิกอ่าน — Arduino IDE Guide สำหรับผู้เริ่มต้น เพื่อรู้วิธีติดตั้งและเตรียมเขียนโค้ดง่าย ๆ ได้ทันที
#define ทำงานตอนไหน?
→ ทำงานตอน Preprocessor แทนที่ข้อความก่อน compile
const ต่างจากตัวแปรทั่วไปอย่างไร?
→ ไม่สามารถเปลี่ยนค่าได้หลังประกาศ
ใช้ #define แล้ว compiler ตรวจ type ไหม?
→ ไม่ตรวจ type อาจเกิดบั๊กได้ถ้าใช้ผิดชนิดข้อมูล
ใช้ const จะช้ากว่า #define ไหม?
→ ไม่ต่างกันในงานทั่วไป เพราะ compiler optimize ให้
ใช้ #define เก็บค่าข้อความได้ไหม?
→ ได้ เช่น #define MSG “Hello”
ถ้าต้องการปิดโค้ดบางส่วนควรใช้แบบไหน?
→ ใช้ #define ร่วมกับ #ifdef
const ต้องใส่ type เสมอไหม?
→ ใช่ เช่น const float pi = 3.14;
ใช้ #define กับพินดิจิทัล ESP32 ได้ไหม?
→ ได้ แต่ const ปลอดภัยกว่าเพราะตรวจ type
ถ้าใช้ค่าที่คำนวณจากค่าคงที่อื่นควรใช้แบบไหน?
→ ใช้ const เพื่อให้ compiler คำนวณครั้งเดียวและตรวจ type
การใช้ #define เยอะ ๆ ทำให้โค้ดอ่านยากไหม?
→ อาจจะ ควรใช้ชื่อสื่อความหมายและเก็บเป็น const เมื่อเป็นไปได้




