//***********************************************
// ATtiny Project
// ラーメンタイマー 3,4,5分
// programmed with Copilot
// XRQTechLab 2024.08
//***********************************************
#define LED_PIN 2
#define PIEZO_PIN 3
#define BUTTON_PIN 4
unsigned long previousMillis = 0;
unsigned long interval = 2000; // 初期状態のLED点滅間隔
unsigned long timerStart = 0;
unsigned long timerDuration = 0;
bool timerRunning = false;
int buttonState = 0;
int lastButtonState = 0;
unsigned long buttonPressTime = 0;
bool buttonPressed = false;
bool singleClick = false;
bool doubleClick = false;
bool longPress = false;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(PIEZO_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
unsigned long currentMillis = millis();
// LEDの点滅制御
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
digitalWrite(LED_PIN, HIGH);
delay(50);
digitalWrite(LED_PIN, LOW);
}
// ボタンの状態を読み取る
buttonState = digitalRead(BUTTON_PIN);
// ボタンが押されたときの処理
if (buttonState == LOW && lastButtonState == HIGH) {
buttonPressTime = currentMillis;
buttonPressed = true;
}
// ボタンが離されたときの処理
if (buttonState == HIGH && lastButtonState == LOW) {
if (buttonPressed) {
unsigned long pressDuration = currentMillis - buttonPressTime;
if (pressDuration < 500) {
if (singleClick) {
doubleClick = true;
singleClick = false;
} else {
singleClick = true;
}
} else {
longPress = true;
}
buttonPressed = false;
}
}
// シングルクリックの処理
if (singleClick && (currentMillis - buttonPressTime > 500)) {
singleClick = false;
timerDuration = 180000; // 3分
startTimer();
beep(3);
}
// ダブルクリックの処理
if (doubleClick) {
doubleClick = false;
timerDuration = 240000; // 4分
startTimer();
beep(4);
}
// 長押しの処理
if (longPress) {
longPress = false;
timerDuration = 300000; // 5分
startTimer();
beep(5);
}
lastButtonState = buttonState;
// タイマーの動作
if (timerRunning && (currentMillis - timerStart >= timerDuration)) {
timerRunning = false;
interval = 2000; // タイマー終了後のLED点滅間隔
alert();
}
}
void startTimer() {
timerStart = millis();
timerRunning = true;
interval = 1000; // タイマー動作中のLED点滅間隔
}
void beep(int count) {
for (int i = 0; i < count; i++) {
tone(PIEZO_PIN, 1000, 100); // 1000Hzの音を100ms鳴らす
delay(300); // 音の間隔を200ms空ける
}
}
void alert() {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 4; j++) {
tone(PIEZO_PIN, 1000, 100); // 1000Hzの音を100ms鳴らす
delay(300); // 音の間隔を200ms空ける
}
delay(500);
}
}