โครงการ LED วิ่งด้วย ESP32
โครงการนี้เราจะใช้บอร์ด ESP32 เพื่อควบคุมไฟ LED ที่สามารถวิ่งจากซ้ายไปขวาหรือกระพริบได้ โดยใช้ฟังก์ชันที่สามารถเปลี่ยนโหมดการทำงานของไฟ LED ได้อย่างง่ายดายผ่านการกดปุ่มสัมผัส (Touch Switch) และแสดงผลผ่าน LED 4 ดวงที่เชื่อมต่อกับพอร์ต GPIO ของ ESP32
อุปกรณ์ที่ใช้ในโครงการ
- บอร์ด ESP32 รุ่น DevKit V1
- LED จำนวน 4 ดวง
- ตัวต้านทาน 330 โอห์ม สำหรับแต่ละ LED
- ปุ่มสัมผัส (Touch Switch) ที่ใช้สำหรับเปลี่ยนโหมดการทำงาน
- สายไฟและแหล่งจ่ายไฟ สำหรับการเชื่อมต่อวงจร

การเชื่อมต่อวงจร
ในการทำงานของโครงการนี้ เราจะเชื่อมต่อ LED ทั้ง 4 ดวงเข้ากับพอร์ต GPIO ของ ESP32 โดยการเชื่อมต่อไฟจากพอร์ต GPIO ไปยังขาของ LED แต่ละดวง ผ่านตัวต้านทาน 330 โอห์มเพื่อลดกระแสที่ส่งไปยัง LED และทำให้การทำงานของวงจรเป็นไปอย่างปลอดภัย
การตั้งค่าพอร์ต GPIO ของ ESP32 ให้เป็นโหมด OUTPUT เพื่อใช้ควบคุมการเปิดปิด LED แต่ละดวง ส่วนปุ่มสัมผัสจะเชื่อมต่อกับพอร์ต GPIO 15 ซึ่งจะถูกตั้งค่าให้เป็นโหมด INPUT เพื่อให้สามารถอ่านค่าได้เมื่อกดปุ่ม
การเขียนโปรแกรมสำหรับ ESP32
โปรแกรมใน Arduino IDE จะเริ่มต้นด้วยการกำหนดขาพอร์ตที่ใช้ควบคุม LED และปุ่มสัมผัส จากนั้นทำการตั้งค่าให้พอร์ต GPIO ที่ใช้กับ LED อยู่ในโหมด OUTPUT ส่วนพอร์ตที่ใช้กับปุ่มสัมผัสจะตั้งเป็น INPUT เพื่อให้สามารถรับค่าได้
/*
* Deva DIY LED Running Light
*/
//กำหนดขา Pins ESP32
const int touch_SW = 15;
const int led_pins17 = 17;
const int led_pins18 = 18;
const int led_pins19 = 19;
const int led_pins21 = 21;
//ตัวแปรเก็บค่าสถานะ H||L หลอด LED
bool state_led17 = 0;
bool state_led18 = 0;
bool state_led19 = 0;
bool state_led21 = 0;
//ตัวแปรสำหรับเก็บค่า Touch
int touch_Value;
//ตัวแปรเก็บค่า MODE LED Runging
int Mode_led = 0;
void setup() {
Serial.begin(115200);
pinMode(touch_SW,INPUT);
pinMode(led_pins17,OUTPUT);
pinMode(led_pins18,OUTPUT);
pinMode(led_pins19,OUTPUT);
pinMode(led_pins21,OUTPUT);
digitalWrite(led_pins17,0);
digitalWrite(led_pins18,0);
digitalWrite(led_pins19,0);
digitalWrite(led_pins21,0);
}
void loop() {
// อ่านสถานะของค่า Touch pins:
touch_Value = touchRead(touch_SW);
// ถ้ากดสวิตช์สัมผัสค่า touch_Value < 20 และค้างไว้ 1 วินาที จะเปลี่ยน mode ไฟวิ่ง
static bool touch_change = false;
static bool touch_state = false;
static bool hold_state = false;
const long debounceDelay = 1000;
static unsigned long lastDebounceTime;
if(touch_Value < 20){
if (touch_change == false) {
touch_change = true;
lastDebounceTime = millis();
}
else if ((millis() - lastDebounceTime >= debounceDelay) && (!hold_state)) {
touch_state = true;
hold_state = true;
//Serial.print("touch_state = ");
//Serial.println(touch_state);
}
else {
touch_state = false;
}
}
else if (touch_Value > 20) {
touch_change = false;
hold_state = false;
touch_state = false;
}
if(touch_state){
Mode_led++;
Serial.print(" Mode LED = ");
Serial.println(Mode_led);
}
// Mode ไฟวิ่ง LED
switch (Mode_led)
{
static unsigned long DelayTime2 = 0;
static unsigned long DelayTime3 = 0;
case 1: // LED สว่างทุกหลอด
state_led17 = 1; state_led18 = 1; state_led19 = 1; state_led21 = 1;
break;
case 2: // LED กระพริบทุกๆ 300ms.
if(millis() >= DelayTime2){
state_led17 = !state_led17; state_led18 = !state_led18; state_led19 = !state_led19; state_led21 = !state_led21;
DelayTime2 = millis() + 300L;
}
break;
case 3: // LED ไฟวิ่งซ้ายไปขวาและขวาไปซ้าย ความเร็ว 150ms.
static int i=1;
static bool LtoR = false;
//ไฟวิ่งจากขวาไปซ้าย
if(millis() >= DelayTime3 && (!LtoR)){
if(i == 1){
state_led17 = 0; state_led18 = 0; state_led19 = 0; state_led21 = 1;
i++;
DelayTime3 = millis() + 150L;
}
else if(i == 2){
state_led17 = 0; state_led18 = 0; state_led19 = 1; state_led21 = 0;
i++;
DelayTime3 = millis() + 150L;
}
else if(i == 3){
state_led17 = 0; state_led18 = 1; state_led19 = 0; state_led21 = 0;
i++;
DelayTime3 = millis() + 150L;
}
else if(i == 4){
state_led17 = 1; state_led18 = 0; state_led19 = 0; state_led21 = 0;
LtoR = true;
DelayTime3 = millis() + 150L;
}
}
//ไฟวิ่งจากซ้ายไปขวา
if(millis() >= DelayTime3 && LtoR){
if(i == 1){
state_led17 = 0; state_led18 = 0; state_led19 = 0; state_led21 = 1;
LtoR = false;
DelayTime3 = millis() + 150L;
}
else if(i == 2){
state_led17 = 0; state_led18 = 0; state_led19 = 1; state_led21 = 0;
i--;
DelayTime3 = millis() + 150L;
}
else if(i == 3){
state_led17 = 0; state_led18 = 1; state_led19 = 0; state_led21 = 0;
i--;
DelayTime3 = millis() + 150L;
}
else if(i == 4){
state_led17 = 1; state_led18 = 0; state_led19 = 0; state_led21 = 0;
i--;
DelayTime3 = millis() + 150L;
}
}
break;
default:
Mode_led = 0;
state_led17 = 0;
state_led18 = 0;
state_led19 = 0;
state_led21 = 0;
break;
}
//Output แสดงผล ไฟ LED
digitalWrite(led_pins17,state_led17);
digitalWrite(led_pins18,state_led18);
digitalWrite(led_pins19,state_led19);
digitalWrite(led_pins21,state_led21);
}
ตัวแปรในโค้ด
ในโค้ดนี้เราจะใช้ตัวแปรต่างๆ เพื่อควบคุมสถานะของ LED และปุ่มสัมผัส:
- state_led17, state_led18, state_led19, state_led21: ตัวแปรที่ใช้เก็บสถานะของ LED แต่ละดวง (ON/OFF)
- touch_Value: ตัวแปรที่ใช้เก็บค่าการอ่านจากปุ่มสัมผัส
- Mode_led: ตัวแปรที่ใช้กำหนดโหมดของไฟ LED เช่น สว่าง, กระพริบ หรือวิ่งจากซ้ายไปขวา
การตั้งค่าและการอ่านค่าจาก Touch Switch
ในฟังก์ชัน setup() จะทำการตั้งค่าพอร์ต GPIO ของ ESP32 และเริ่มต้นการใช้งาน Serial Monitor สำหรับตรวจสอบค่าต่างๆ ที่ส่งจาก ESP32 ขึ้นไปยังคอมพิวเตอร์
ในฟังก์ชัน loop() จะทำการอ่านค่าจากปุ่มสัมผัส โดยการใช้คำสั่ง touchRead(touch_SW) ซึ่งจะได้ค่าตัวเลขที่บ่งบอกถึงสถานะของการกดปุ่ม ถ้าค่าที่ได้ต่ำกว่า 20 (แสดงว่ามีการกดปุ่มสัมผัส) ระบบจะทำการเปลี่ยนโหมดของไฟ LED ตามลำดับที่ตั้งไว้
โหมดการทำงานของ LED
โปรแกรมนี้มีการกำหนดโหมดการทำงานของ LED 4 โหมดหลักๆ:
โหมด 1: LED สว่างทุกหลอด
ทุกดวงจะถูกเปิดให้สว่างทั้งหมดโหมด 2: LED กระพริบทุกๆ 300ms
ทุกดวงจะกระพริบสลับกันทุกๆ 300 มิลลิวินาทีโหมด 3: LED วิ่งซ้ายไปขวาและขวาไปซ้าย
ไฟ LED จะวิ่งจากซ้ายไปขวา และขวากลับไปซ้ายโดยมีความเร็ว 150 มิลลิวินาทีโหมด 4: ปิดไฟทั้งหมด
จะทำการปิดไฟทั้งหมดและเริ่มต้นจากโหมด 1 ใหม่
การเปลี่ยนโหมด
การเปลี่ยนโหมดจะเกิดขึ้นเมื่อกดปุ่มสัมผัส โดยจะมีดีเลย์ (Debounce) ประมาณ 1 วินาทีเพื่อป้องกันการกดซ้ำเร็วเกินไป เมื่อกดปุ่มสัมผัสแล้วจะเปลี่ยนโหมดของไฟ LED และแสดงผลบน Serial Monitor เพื่อให้ผู้ใช้เห็นการเปลี่ยนแปลงของโหมด
if(touch_state){
Mode_led++;
Serial.print(" Mode LED = ");
Serial.println(Mode_led);
}
การควบคุมไฟ LED
เมื่อโหมดของไฟ LED ถูกตั้งค่าแล้ว โปรแกรมจะใช้คำสั่ง digitalWrite() เพื่อควบคุมการเปิดปิด LED แต่ละดวง ตามสถานะที่กำหนดไว้ในตัวแปร state_led17, state_led18, state_led19, state_led21
digitalWrite(led_pins17,state_led17); digitalWrite(led_pins18,state_led18); digitalWrite(led_pins19,state_led19); digitalWrite(led_pins21,state_led21);
การทำงานของไฟ LED วิ่ง
ในโหมดไฟวิ่ง (โหมด 3) ไฟ LED จะวิ่งจากซ้ายไปขวาและจากขวาไปซ้าย โดยใช้ตัวแปร DelayTime3 เพื่อควบคุมความเร็วในการสลับสถานะของ LED ทุกๆ 150 มิลลิวินาที
สรุป
โครงการ ESP32 LED นี้เป็นการใช้งานบอร์ด ESP32 สำหรับควบคุมไฟ LED 4 ดวงที่สามารถทำงานในโหมดต่างๆ ได้แก่ การสว่างพร้อมกัน การกระพริบ การวิ่งซ้ายไปขวา และขวาไปซ้าย การใช้งานปุ่มสัมผัสช่วยให้ผู้ใช้สามารถเปลี่ยนโหมดการทำงานได้อย่างสะดวกและรวดเร็ว นอกจากนี้ยังช่วยให้ผู้ที่สนใจเรียนรู้การใช้งาน ESP32 ในการควบคุมอุปกรณ์ต่างๆ ผ่านโปรแกรมที่เขียนใน Arduino IDE ได้เป็นอย่างดี
หากคุณกำลังมองหาการทดลองหรือเรียนรู้การใช้ ESP32 สำหรับการควบคุมอุปกรณ์ไฟฟ้า นี่เป็นโครงการที่ดีที่สามารถทำตามได้อย่างง่ายดาย และสามารถปรับแต่งให้เหมาะสมกับความต้องการของตัวเองได้






