#include <MsTimer2.h>
#include <avr/wdt.h>
const int sensorPin = A0;
const int ledPin = 13;
int lightValue = 0;
bool ledState = false;
unsigned long startTime = 0; // タイマー開始時刻
bool isTimerRunning = false; // タイマーが実行中かどうか
// LED制御のタイマーのためのフラグ
bool waitForOff = false;
bool waitForOn = false;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(sensorPin, INPUT);
Serial.begin(115200);
Serial.println("system starts");
if (bitRead(MCUSR, WDRF))
Serial.println("system reset");
Serial.println("Watch Dog starts running...");
wdt_enable(WDTO_2S); //Watchdog Timerを2秒で設定
// 100msごとに光センサをチェック
MsTimer2::set(100, checkSensor);
MsTimer2::start();
}
void loop() {
//シリアル入力でeが入力されると、疑似的にloop処理を止める(疑似障害)
errorOccurs(); //この関数は修正・変更してはいけない
if(isTimerRunning){
unsigned long elapsedTime = millis() - startTime; //経過時間
if(elapsedTime >= 3000){
if (waitForOn) {
digitalWrite(ledPin, HIGH);
ledState = true;
waitForOn = false;
}
if (waitForOff) {
digitalWrite(ledPin, LOW);
ledState = false;
waitForOff = false;
}
isTimerRunning = false; // タイマーを停止
}
}
wdt_reset(); // Watchdog Timerをリセット
delay(100);
}
//障害を模擬的に再現する
void errorOccurs(){
if (Serial.available()) {
char input = Serial.read();
if (input == '\n' || input == '\r') //制御文字をカット
return;
if(input == 'e'){
//障害発生が発生したとしてシステムを10秒止める
Serial.println("An error occuers! System stopped!");
delay(10000);
Serial.println("System resumed!");
}else{
return;
}
}
}
// 光センサの値を定期的に取得
void checkSensor() {
lightValue = analogRead(sensorPin);
// 光センサの値が400未満、LEDが消灯状態、3秒間のタイマーをスタート
if (lightValue < 400 && ledState == false && isTimerRunning == false) {
Serial.print(lightValue);
Serial.println(" → ON timer start running!");
//プログラムが開始されてからの経過時間をミリ秒単位で返す関数
//delay() 関数のようにプログラム全体を一時停止することなく、並行処理を実現できる
startTime = millis();
isTimerRunning = true;
waitForOn = true; // LED点灯の準備
}
// 光センサの値が400以上、LEDが点灯状態、5秒間のタイマーをスタート
if (lightValue >= 400 && ledState == true && isTimerRunning == false) {
Serial.print(lightValue);
Serial.println(" → OFF timer start running!");
startTime = millis();
isTimerRunning = true;
waitForOff = true; // LED消灯の準備
}
}