// https://forum.arduino.cc/t/search-and-destroy-bomb-prop-for-paintball/1130728
// https://wokwi.com/projects/365754412965833729
# define disarmButton 2
# define armButton 3
# define disarmedLED 5
# define armedLED 6
# define boomLED 7
void setup() {
Serial.begin(115200);
Serial.println("Hello Search and Destroy World!\n");
pinMode(armButton, INPUT_PULLUP);
pinMode(disarmButton, INPUT_PULLUP);
pinMode(armedLED, OUTPUT);
pinMode(disarmedLED, OUTPUT);
}
enum {DISARMED, ARMED, BOOM};
unsigned char state = DISARMED;
# define RATE 100 // every 100 milliseconds
// life too short timing constants. adjust to taste (and tolerance)
# define TOARM 50 // 50 ticks is 5 seconds
# define TODISARM 50 // 5 seconds
# define TOBOOM 200 // 10 seconds
unsigned char armCount;
unsigned char disarmCount;
unsigned char boomCount;
unsigned long now;
void loop() {
now = millis(); // time for all machines
handleDevice();
report();
}
void handleDevice()
{
// RATE mechanism
static unsigned long lastTime;
if (now - lastTime < RATE) return; // not time yet to do any of the rest of this
lastTime = now;
// INPUT
unsigned char armIt = !digitalRead(armButton);
unsigned char disarmIt = !digitalRead(disarmButton);
// PROCESS
switch (state) {
case DISARMED :
disarmCount = 0; // nephew presses all the button at once - who does that IRL?
if (armIt) armCount++;
else armCount = 0;
if (armCount == TOARM) state = ARMED;
break;
case ARMED :
armCount = 0; // nephews, who needs them?
if (disarmIt) disarmCount++;
else disarmCount = 0;
boomCount++;
if (boomCount == TOBOOM) state = BOOM;
if (disarmCount == TODISARM) {
state = DISARMED;
boomCount = 0;
}
break;
case BOOM :
// boom is end of the world. no further state transitions
break;
}
// OUTPUT
switch (state) {
case DISARMED :
digitalWrite(armedLED, LOW);
digitalWrite(disarmedLED, HIGH);
break;
case ARMED :
digitalWrite(armedLED, HIGH);
digitalWrite(disarmedLED, LOW);
break;
case BOOM :
digitalWrite(armedLED, LOW);
digitalWrite(disarmedLED, LOW);
digitalWrite(boomLED, HIGH);
break;
}
}
void report()
{
static unsigned long lastTime;
unsigned long now = millis();
if (now - lastTime < 777) return; // not time yet to do any of the rest of this
lastTime = now;
Serial.print("arm count "); Serial.println(armCount);
Serial.print("disarm count "); Serial.println(disarmCount);
Serial.print("boom count "); Serial.println(boomCount);
Serial.println();
}