// คู่มือการใช้งาน:
// ส่วนประกอบที่ใช้:
// TM1637 Display: โมดูลแสดงผลแบบ 4 หลัก 7 segment.
// ปุ่ม 3 ปุ่ม:
// ปุ่มสีเขียว (green_bt): ใช้เพื่อเริ่มต้นหรือดำเนินการจับเวลาต่อ.
// ปุ่มสีแดง (red_bt): ใช้เพื่อหยุดการจับเวลา.
// ปุ่มสีน้ำเงิน (blue_bt): ใช้เพื่อรีเซ็ตเวลา.
// การเชื่อมต่อ:
// เชื่อมต่อพิน clk และ dio ของ TM1637 เข้ากับพินที่กำหนดไว้ในโค้ด (clk ที่พิน 2, dio ที่พิน 3).
// เชื่อมต่อปุ่มต่าง ๆ เข้ากับพินที่กำหนดไว้ (green_bt ที่พิน 9, red_bt ที่พิน 8, blue_bt ที่พิน 10).
// การทำงาน:
// เริ่มต้นจับเวลา: กดปุ่มสีเขียว นาฬิกาจะเริ่มจับเวลา และจะแสดงเวลาที่ผ่านไปบนจอแสดงผล.
// หยุดจับเวลา: กดปุ่มสีแดง นาฬิกาจะหยุดจับเวลา.
// รีเซ็ตเวลา: กดปุ่มสีน้ำเงิน นาฬิกาจะหยุดจับเวลาและรีเซ็ตเวลาที่ผ่านไปเป็น 0.
// หมายเหตุ:
// โค้ดนี้ใช้ฟังก์ชัน delay(200) เพื่อป้องกันการเด้ง (debouncing) ของปุ่ม.
// การอัพเดทเวลาบนจอแสดงผลใช้ฟังก์ชัน updateDisplay() ซึ่งจะแปลงเวลาที่ผ่านไปเป็นนาทีและวินาที และแสดงผลบน TM1637.
// [][][][] [][][][] [] [] [][] [][][][]
// [] [] [] [] [] [] [] [] []
// [] [][] [] [] [] [] [] [] [] []
// [] [] [] [][][][] [][][][] [][][][] []
// [] [][] [] [] [] [] [] [] []
// [] [] [] [] [] [] [] []
// [][][][] [] [] [] [] [] []
#include <TM1637.h>
// กำหนดพินสำหรับปุ่มต่าง ๆ
const int red_bt = 8;
const int green_bt = 9;
const int blue_bt = 10;
int clk = 2;
int dio = 3;
TM1637 tm(clk, dio); // กำหนดพินสำหรับ TM1637
bool running = false; // ตัวแปรสำหรับตรวจสอบว่านาฬิกากำลังทำงานอยู่หรือไม่
unsigned long previousMillis = 0; // ตัวแปรเก็บเวลาที่ผ่านไปก่อนหน้านี้
unsigned long elapsedMillis = 0; // ตัวแปรเก็บเวลาที่ผ่านไปทั้งหมด
void setup() {
pinMode(red_bt, INPUT_PULLUP); // กำหนดพิน red_bt เป็นอินพุตและเปิด Pull-Up
pinMode(green_bt, INPUT_PULLUP); // กำหนดพิน green_bt เป็นอินพุตและเปิด Pull-Up
pinMode(blue_bt, INPUT_PULLUP); // กำหนดพิน blue_bt เป็นอินพุตและเปิด Pull-Up
tm.init(); // เริ่มต้นการทำงานของ TM1637
tm.set(5); // กำหนดความสว่างของ TM1637
updateDisplay(); // อัพเดทหน้าจอแสดงผล
}
void loop() {
if (digitalRead(green_bt) == LOW) { // ถ้ากดปุ่ม green_bt
delay(200); // หน่วงเวลา 200 มิลลิวินาที (สำหรับการ debouncing)
running = true; // เริ่มต้นจับเวลา
previousMillis = millis(); // บันทึกเวลาปัจจุบัน
}
if (digitalRead(red_bt) == LOW) { // ถ้ากดปุ่ม red_bt
delay(200); // หน่วงเวลา 200 มิลลิวินาที (สำหรับการ debouncing)
running = false; // หยุดจับเวลา
}
if (digitalRead(blue_bt) == LOW) { // ถ้ากดปุ่ม blue_bt
delay(200); // หน่วงเวลา 200 มิลลิวินาที (สำหรับการ debouncing)
running = false; // หยุดจับเวลา
elapsedMillis = 0; // รีเซ็ตเวลาที่ผ่านไป
updateDisplay(); // อัพเดทหน้าจอแสดงผล
}
if (running) { // ถ้านาฬิกากำลังทำงาน
unsigned long currentMillis = millis(); // เก็บเวลาปัจจุบัน
elapsedMillis += currentMillis - previousMillis; // เพิ่มเวลาที่ผ่านไป
previousMillis = currentMillis; // อัพเดท previousMillis
updateDisplay(); // อัพเดทหน้าจอแสดงผล
}
}
void updateDisplay() {
int totalSeconds = elapsedMillis / 1000; // แปลงเวลาที่ผ่านไปเป็นวินาที
int minutes = totalSeconds / 60; // แปลงเป็นนาที
int seconds = totalSeconds % 60; // แปลงเป็นวินาทีที่เหลืออยู่
tm.display(0, minutes / 10); // แสดงตัวเลขหลักสิบบนนาที
tm.display(1, minutes % 10); // แสดงตัวเลขหลักหน่วยบนนาที
tm.point(1); // แสดงจุดคั่น
tm.display(2, seconds / 10); // แสดงตัวเลขหลักสิบบนวินาที
tm.display(3, seconds % 10); // แสดงตัวเลขหลักหน่วยบนวินาที
}