// กำหนดพินสำหรับ LED, Switch และ 7-Segment
const int ledPin = 5; // LED1 ต่อที่ GPIO 5
const int sw1Pin = 7; // SW1 ต่อที่ GPIO 7
const int segmentA = 8; // 7-Segment pin A
const int segmentB = 9; // 7-Segment pin B
const int segmentC = 10; // 7-Segment pin C
const int segmentD = 11; // 7-Segment pin D
const int segmentE = 12; // 7-Segment pin E
const int segmentF = 13; // 7-Segment pin F
const int segmentG = 14; // 7-Segment pin G
volatile bool interruptTriggered = false; // ใช้เก็บสถานะของ Interrupt
int counter = 0; // ตัวนับสำหรับ 7-Segment
bool counting = false; // ใช้เช็คสถานะการนับ
unsigned long lastUpdateTime = 0; // ตัวแปรสำหรับเวลา
int ledState = LOW; // สถานะของ LED1
void setup() {
// ตั้งค่าพินสำหรับ LED เป็น OUTPUT
pinMode(ledPin, OUTPUT);
// ตั้งค่าพินสำหรับ 7-Segment เป็น OUTPUT
pinMode(segmentA, OUTPUT);
pinMode(segmentB, OUTPUT);
pinMode(segmentC, OUTPUT);
pinMode(segmentD, OUTPUT);
pinMode(segmentE, OUTPUT);
pinMode(segmentF, OUTPUT);
pinMode(segmentG, OUTPUT);
// *** ปิดทุกส่วนของ 7-Segment ตั้งแต่เริ่มต้น ***
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentE, HIGH);
digitalWrite(segmentF, HIGH);
digitalWrite(segmentG, HIGH);
// ตั้งค่าพินสำหรับ SW1 เป็น INPUT_PULLUP
pinMode(sw1Pin, INPUT_PULLUP);
// เปิดการ Interrupt เมื่อกดสวิตช์
attachInterrupt(digitalPinToInterrupt(sw1Pin), handleSW1Press, FALLING);
}
void loop() {
// ทำให้ LED1 กระพริบทุกๆ 1 วินาที
unsigned long currentTime = millis();
if (currentTime - lastUpdateTime >= 500) { // เช็คเวลาทุก 500ms
ledState = !ledState; // สลับสถานะ LED
digitalWrite(ledPin, ledState); // ตั้งค่าตามสถานะ
lastUpdateTime = currentTime; // อัปเดตเวลา
}
// ถ้ามีการกด SW1 จะไปที่การแสดงผล 7-Segment
if (interruptTriggered) {
counting = true; // เริ่มนับ
counter = 0; // เริ่มนับจาก 0
interruptTriggered = false; // รีเซ็ตสถานะของ Interrupt
}
// หากกำลังนับ
if (counting) {
showNumber(counter); // แสดงหมายเลขที่เก็บใน counter
delay(1000); // รอ 1 วินาทีก่อนนับต่อ
counter++; // เพิ่มค่าของ counter
// เมื่อถึง 3 ให้หยุดนับ
if (counter > 4) {
counting = false; // หยุดนับ
showNumber(-1); // แสดงตัวเลขลบเพื่อปิดจอ
}
}
}
// ฟังก์ชันจัดการการกด SW1
void handleSW1Press() {
if (!counting) { // ถ้ายังไม่กำลังนับ
interruptTriggered = true; // ตั้งค่าให้ Interrupt ถูกกระตุ้น
}
}
// ฟังก์ชันแสดงหมายเลขบน 7-Segment
void showNumber(int num) {
// ปิดทุกส่วนก่อน
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentE, HIGH);
digitalWrite(segmentF, HIGH);
digitalWrite(segmentG, HIGH);
// แสดงหมายเลขตามที่กำหนด
switch (num) {
case 0:
digitalWrite(segmentA, LOW);
digitalWrite(segmentB, LOW);
digitalWrite(segmentC, LOW);
digitalWrite(segmentD, LOW);
digitalWrite(segmentE, LOW);
digitalWrite(segmentF, LOW);
break;
case 1:
digitalWrite(segmentB, LOW);
digitalWrite(segmentC, LOW);
break;
case 2:
digitalWrite(segmentA, LOW);
digitalWrite(segmentB, LOW);
digitalWrite(segmentD, LOW);
digitalWrite(segmentE, LOW);
digitalWrite(segmentG, LOW);
break;
case 3:
digitalWrite(segmentA, LOW);
digitalWrite(segmentB, LOW);
digitalWrite(segmentC, LOW);
digitalWrite(segmentD, LOW);
digitalWrite(segmentG, LOW);
break;
case 4:
digitalWrite(segmentB, LOW);
digitalWrite(segmentC, LOW);
digitalWrite(segmentF, LOW);
digitalWrite(segmentG, LOW);
break;
case -1: // แสดงเลข -1 เพื่อปิดจอ
// ปิดทุกส่วน
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentE, HIGH);
digitalWrite(segmentF, HIGH);
digitalWrite(segmentG, HIGH);
break;
}
}