-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhandleTimer.ino
59 lines (51 loc) · 2.13 KB
/
handleTimer.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
uint32_t timerStarted;
void initTimer() {
pinMode(timerInput, INPUT_PULLUP);
pinMode(timerOutput, OUTPUT);
pinMode(dischargeSignalRelayPin, OUTPUT);
timerStarted = -TIMER_DELAY; // Make sure we don't go on right away.
}
void handleTimer() {
if (millis() - timerStarted < TIMER_DELAY) {
digitalWrite(timerOutput, HIGH);
}
else {
digitalWrite(timerOutput, LOW);
if (digitalRead(timerInput) == HIGH) {
timerStarted = millis();
}
}
static uint32_t isDischargedTime;
switch (dischargeTimerState) {
case DISCHARGED: // Batch completely discharged.
isDischargedTime = millis(); // Record when this happened.
dischargeTimerState = DELAY;
break;
case DELAY: // Wait some time before setting the signal HIGH.
if (millis() - isDischargedTime > DISCHARGE_RELAY_DELAY) { // After some delay time,
digitalWrite(dischargeSignalRelayPin, HIGH); // switch on the relay.
dischargeTimerState = WAIT_ROASTER_START;
}
break;
case WAIT_ROASTER_START: // Wait until INPUT1 goes low - just in case.
if (digitalRead(INPUT1) == LOW) {
dischargeTimerState = WAIT_DEBOUNCE;
isDischargedTime = millis();
}
break;
case WAIT_DEBOUNCE: // Relay contacts may bounce.
if (millis() - isDischargedTime > 100) { // After some delay time,
dischargeTimerState = WAIT_ROASTER_READY; // start waiting for the roaster to finish (and INPUT1 to go high again).
}
break;
case WAIT_ROASTER_READY: // Wait until INPUT1 goes high, set signal LOW.
if (digitalRead(INPUT1) == HIGH) {
digitalWrite(dischargeSignalRelayPin, LOW); // switch off the relay.
dischargeTimerState = DONE;
isDischargedTime = millis();
}
break;
case DONE: // Nothing to do here any more.
break;
}
}