//***********************************************************
// illumination controller for ATtiny202
// XRQtechLab
// 2024.12
//:***********************************************************

#define CDS_PIN 0
#define RLon_PIN 3
#define RLoff_PIN 4
#define TIMER_PIN1 1
#define TIMER_PIN2 2

int threshold = 30; // コンパレータの閾値(電源電圧の30%)
int hysteresis = 5; // ヒステリシスの値
int timerDuration = 2; // タイマーの初期値(2分)
bool relayOn = false;
bool flag = false;
unsigned long timerStart = 0;
const int sampleInterval = 5000; // サンプリング間隔(ミリ秒)
const int sampleCount = 5; // サンプル数
int sampleIndex = 0;
int samples[sampleCount];

void setup() {
pinMode(CDS_PIN, INPUT);
pinMode(RLon_PIN, OUTPUT);
pinMode(RLoff_PIN, OUTPUT);
pinMode(TIMER_PIN1, INPUT_PULLUP);
pinMode(TIMER_PIN2, INPUT_PULLUP);
digitalWrite(RLon_PIN, LOW);
digitalWrite(RLoff_PIN, LOW);

// リレーを常にOFFにする
digitalWrite(RLoff_PIN, HIGH);
delay(100); // リレーを確実にOFFにするための遅延
digitalWrite(RLoff_PIN, LOW);

setTimerDuration();

for (int i = 0; i < sampleCount; i++) {
samples[i] = 0;
}
}

void loop() {
static unsigned long lastSampleTime = 0;
if (millis() - lastSampleTime >= sampleInterval) {
lastSampleTime = millis();
samples[sampleIndex] = analogRead(CDS_PIN);
sampleIndex = (sampleIndex + 1) % sampleCount;

int sum = 0;
for (int i = 0; i < sampleCount; i++) {
sum += samples[i];
}
int average = sum / sampleCount;
int thresholdValue = (threshold * 1023) / 100; // 電源電圧の30%に相当する値

if (average < thresholdValue + hysteresis) {
flag = false;
}

if (average > thresholdValue && !flag) {
relayOn = true;
flag = true;
timerStart = millis();
digitalWrite(RLon_PIN, HIGH);
delay(100); // リレーを確実にONにするための遅延
digitalWrite(RLon_PIN, LOW);
}
}


for (int i = 0; i < 60; i++) {
for (int j = 0; j < timerDuration ; j++) {
delay(1000); }
}

relayOn = false;
digitalWrite(RLoff_PIN, HIGH);
delay(100); // リレーを確実にOFFにするための遅延
digitalWrite(RLoff_PIN, LOW);
}

setTimerDuration();
}

void setTimerDuration() {
bool pin1State = digitalRead(TIMER_PIN1);
bool pin2State = digitalRead(TIMER_PIN2);

if (!pin1State && !pin2State) {
timerDuration = 2; // 2分
} else if (!pin1State && pin2State) {
timerDuration = 60; // 60分
} else if (pin1State && !pin2State) {
timerDuration = 120; // 120分
} else if (pin1State && pin2State) {
timerDuration = 180; // 180分
}
}