// ボタンとリレーピンの設定
const int relayPin = 2;
const int stopButtonPin = 3;
const int centigrade_minus_5_to_10_Pin = 4;
const int centigrade_minus_10_to_15_Pin = 5;
const int centigrade_minus_15_or_less_Pin = 6;
const int LED_Pin = 10;
// ON/OFFの間隔(ミリ秒)
const unsigned long on_minus_5_to_10 = 1000;
const unsigned long off_minus_5_to_10 = 1000;
const unsigned long on_minus_10_to_15 = 2000;
const unsigned long off_minus_10_to_15 = 2000;
const unsigned long on_minus_15_or_less = 12000;
const unsigned long off_minus_15_or_less = 48000;
unsigned long onTime = 0;
unsigned long offTime = 0;
unsigned long onT = 0;
unsigned long offT = 0;
unsigned long previousMillis = 0;
bool flg = false;
bool heatingActive = false;
bool relayState = false;
bool newSettingAvailable = false;
bool stopButtonPressed = false; // 停止ボタンの状態
void setup() {
pinMode(relayPin, OUTPUT);
pinMode(stopButtonPin, INPUT_PULLUP);
pinMode(centigrade_minus_5_to_10_Pin, INPUT_PULLUP);
pinMode(centigrade_minus_10_to_15_Pin, INPUT_PULLUP);
pinMode(centigrade_minus_15_or_less_Pin, INPUT_PULLUP);
pinMode(LED_Pin, OUTPUT);
digitalWrite(centigrade_minus_5_to_10_Pin, LOW);
digitalWrite(centigrade_minus_10_to_15_Pin, LOW);
digitalWrite(centigrade_minus_15_or_less_Pin, LOW);
digitalWrite(relayPin, LOW);
digitalWrite(LED_Pin, LOW);
}
void loop() {
// ボタンの状態を読み取る
bool current_StopButton_State = digitalRead(stopButtonPin);
bool current_minus_5_to_10_ButtonState = digitalRead(centigrade_minus_5_to_10_Pin);
bool current_minus_10_to_15_ButtonState = digitalRead(centigrade_minus_10_to_15_Pin);
bool current_minus_15_or_less_ButtonState = digitalRead(centigrade_minus_15_or_less_Pin);
// ストップボタンが押された場合の処理
if (current_StopButton_State == HIGH && !stopButtonPressed) {
stopButtonPressed = true; // 停止ボタンフラグをtrue
// 加熱を停止し、変数を初期化
heatingActive = false;
relayState = false;
digitalWrite(relayPin, LOW); // リレーOFF
digitalWrite(LED_Pin, LOW); // LEDもOFF
onTime = 0;
offTime = 0;
} else if (current_StopButton_State == LOW) {
stopButtonPressed = false; // 停止ボタンフラグをfalse
}
// 温度設定のチェック
if (newSettingAvailable == false) {
if (current_minus_5_to_10_ButtonState == HIGH) {
onTime = on_minus_5_to_10;
offTime = off_minus_5_to_10;
newSettingAvailable = true;
}
if (current_minus_10_to_15_ButtonState == HIGH) {
onTime = on_minus_10_to_15;
offTime = off_minus_10_to_15;
newSettingAvailable = true;
digitalWrite(LED_Pin, HIGH); // LEDもOFF
}
if (current_minus_15_or_less_ButtonState == HIGH) {
onTime = on_minus_15_or_less;
offTime = off_minus_15_or_less;
newSettingAvailable = true;
}
}
//リレー停止中のみ通過
if (newSettingAvailable && !heatingActive) {
// heatingActiveがfalseのときは、最初に加熱を開始
heatingActive = true; // 加熱を開始
relayState = true; //
previousMillis = millis(); // タイマーリセット
onT = onTime;
offT = offTime;
flg = false;
newSettingAvailable = false;
}
// リレーの制御
if (heatingActive) {
unsigned long currentMillis = millis();
if (relayState) {
// リレーをOFFにする時間が経過したか?
if (flg){
onT = onTime;
offT = offTime;
}
if (currentMillis - previousMillis >= offT) {
// リレーをONにする時間が経過したか?
digitalWrite(relayPin, HIGH); // リレーON
//digitalWrite(LED_Pin, HIGH); // LEDもON
relayState = false;
previousMillis = millis(); // タイマーリセット
flg = false;
}
} else {
if (currentMillis - previousMillis >= onT) {
digitalWrite(relayPin, LOW); // リレーOFF
//digitalWrite(LED_Pin, LOW); // LEDもOFF
relayState = true;
previousMillis = millis(); // タイマーリセット
flg = true;
digitalWrite(LED_Pin, LOW); // LEDもOFF
}
}
}
}