const int ledPins[] = {6, 7, 8, 9, 10, 11, 12, 13}; // ขาที่ต่อ LED
const int numLeds = 8; // จำนวน LED
const int buttonPin = 2; // ขาที่ต่อปุ่ม
const unsigned long patternDelay = 200; // หน่วงเวลา 200 ms สำหรับ pattern
unsigned long lastChangeTime = 0; // เวลาที่ผ่านไปแล้วสำหรับการเปลี่ยนแปลง
unsigned long lastButtonPress = 0; // เวลาที่ผ่านไปแล้วสำหรับการกดปุ่ม
int currentPattern = 0; // ตัวแปรเก็บสถานะของ pattern ปัจจุบัน
bool buttonState = false; // สถานะปุ่มปัจจุบัน
bool lastButtonState = false; // สถานะปุ่มก่อนหน้า
void setup() {
// ตั้งค่าให้ขาที่ต่อกับ LED เป็น OUTPUT
for (int i = 0; i < numLeds; i++) {
pinMode(ledPins[i], OUTPUT);
}
// ตั้งค่าให้ขาที่ต่อกับปุ่มเป็น INPUT
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
unsigned long currentTime = millis(); // เวลาปัจจุบัน
// อ่านสถานะของปุ่ม
buttonState = digitalRead(buttonPin) == LOW; // ปุ่มกดจะอ่านค่า LOW
// ตรวจสอบการเปลี่ยนแปลงสถานะของปุ่ม
if (buttonState && !lastButtonState) {
lastButtonPress = currentTime; // บันทึกเวลาที่กดปุ่ม
}
if (!buttonState && lastButtonState) {
// ตรวจสอบว่ามีการกดปุ่มเกิดขึ้น
if (currentTime - lastButtonPress >= 50) { // หน่วงเวลาเพื่อป้องกันการกดซ้ำ
currentPattern = (currentPattern + 1) % 5; // เปลี่ยน pattern
lastChangeTime = currentTime; // อัปเดตเวลาสำหรับ pattern ใหม่
}
}
lastButtonState = buttonState; // อัปเดตสถานะของปุ่ม
// เรียกใช้ฟังก์ชันตาม pattern ปัจจุบัน
switch (currentPattern) {
case 0:
runLeftToRight(currentTime); // Pattern 1: วิ่งจากซ้ายไปขวา
break;
case 1:
runRightToLeft(currentTime); // Pattern 2: วิ่งจากขวาไปซ้าย
break;
case 2:
runOpposite(currentTime); // Pattern 3: วิ่งสวนกัน
break;
case 3:
allOnAllOff(currentTime); // Pattern 4: ติดและดับทั้งหมดพร้อมกัน
break;
case 4:
runTwoLedsRightToLeft(currentTime); // Pattern 5: ติดทีละ 2 ดวง วิ่งจากขวาไปซ้าย
break;
}
}
// ฟังก์ชันที่ทำให้ LED วิ่งจากซ้ายไปขวา (ขา 6 ถึงขา 13)
void runLeftToRight(unsigned long currentTime) {
static int ledIndex = 0;
if (currentTime - lastChangeTime >= patternDelay) {
digitalWrite(ledPins[ledIndex], LOW); // ปิด LED ตัวเก่า
ledIndex = (ledIndex + 1) % numLeds;
digitalWrite(ledPins[ledIndex], HIGH); // เปิด LED ตัวใหม่
lastChangeTime = currentTime;
}
}
// ฟังก์ชันที่ทำให้ LED วิ่งจากขวาไปซ้าย (ขา 13 ถึงขา 6)
void runRightToLeft(unsigned long currentTime) {
static int ledIndex = numLeds - 1;
if (currentTime - lastChangeTime >= patternDelay) {
digitalWrite(ledPins[ledIndex], LOW); // ปิด LED ตัวเก่า
ledIndex = (ledIndex - 1 + numLeds) % numLeds;
digitalWrite(ledPins[ledIndex], HIGH); // เปิด LED ตัวใหม่
lastChangeTime = currentTime;
}
}
// ฟังก์ชันที่ทำให้ LED วิ่งสวนกันจากซ้ายและขวา
void runOpposite(unsigned long currentTime) {
static int left = 0;
static int right = numLeds - 1;
if (currentTime - lastChangeTime >= patternDelay) {
digitalWrite(ledPins[left], LOW); // ปิด LED ทางซ้าย
digitalWrite(ledPins[right], LOW); // ปิด LED ทางขวา
if (left < right) {
digitalWrite(ledPins[left], HIGH); // เปิด LED ทางซ้าย
digitalWrite(ledPins[right], HIGH); // เปิด LED ทางขวา
left++;
right--;
}
lastChangeTime = currentTime;
}
}
// ฟังก์ชันที่ทำให้ LED ทั้งหมดติดพร้อมกันและดับพร้อมกัน
void allOnAllOff(unsigned long currentTime) {
static bool allOn = false;
if (currentTime - lastChangeTime >= patternDelay) {
if (allOn) {
// ปิด LED ทั้งหมด
for (int i = 0; i < numLeds; i++) {
digitalWrite(ledPins[i], LOW);
}
} else {
// เปิด LED ทั้งหมด
for (int i = 0; i < numLeds; i++) {
digitalWrite(ledPins[i], HIGH);
}
}
allOn = !allOn;
lastChangeTime = currentTime;
}
}
// ฟังก์ชันที่ทำให้ LED ติดทีละ 2 ดวง วิ่งจากขวาไปซ้าย
void runTwoLedsRightToLeft(unsigned long currentTime) {
static int ledIndex = numLeds - 1;
if (currentTime - lastChangeTime >= patternDelay) {
digitalWrite(ledPins[ledIndex], LOW); // ปิด LED ตัวที่ i
if (ledIndex < numLeds - 1) {
digitalWrite(ledPins[ledIndex + 1], LOW); // ปิด LED ตัวที่ i+1
}
ledIndex--;
if (ledIndex > 0) {
digitalWrite(ledPins[ledIndex], HIGH); // เปิด LED ตัวที่ i
digitalWrite(ledPins[ledIndex + 1], HIGH); // เปิด LED ตัวที่ i+1
}
lastChangeTime = currentTime;
}
}