300 行
8.1 KiB
C++
300 行
8.1 KiB
C++
/******************************************************************************\
|
|
* author : serguei_chmod77 (Arthur) *
|
|
* codename : unabkraft *
|
|
* testing board : unab77 *
|
|
* processor : at(mel)mega 328p *
|
|
* date : 07.08.2015 *
|
|
* version : 1.5.2 ``Boolzor powered'' *
|
|
* compiler : avrdude, OpenBSD 5.6 *
|
|
\******************************************************************************/
|
|
|
|
|
|
// Id of digital-pins by nicknames :
|
|
const int pushButt = 2;
|
|
const int ledBarA = 3, ledBarB = 4, ledBarC = 5, ledBarD = 6, ledBarE = 7;
|
|
const int ledBarF = 8, ledBarG = 9, ledBarH = 10, ledBarI = 11;
|
|
const int mainLed = 12, bell = 13;
|
|
// Some integer variables for arithmetical counts along loop() :
|
|
int i = 2000, k = 0, pb = 0, lb = 0, s = 0;
|
|
|
|
int lastDebounceTime = 0;
|
|
long ctDownSet = 0, dc = 0, cd = 0;
|
|
bool zor = true, modeState = false;
|
|
|
|
void defusing() {
|
|
zor = false;
|
|
}
|
|
|
|
void setup(void) {
|
|
// Pins input/output mode global setting :
|
|
pinMode(mainLed, OUTPUT);
|
|
pinMode(ledBarA, OUTPUT);
|
|
pinMode(ledBarB, OUTPUT);
|
|
pinMode(ledBarC, OUTPUT);
|
|
pinMode(ledBarD, OUTPUT);
|
|
pinMode(ledBarE, OUTPUT);
|
|
pinMode(ledBarF, OUTPUT);
|
|
pinMode(ledBarG, OUTPUT);
|
|
pinMode(ledBarH, OUTPUT);
|
|
pinMode(ledBarI, OUTPUT);
|
|
pinMode(bell, OUTPUT);
|
|
pinMode(pushButt, INPUT);
|
|
attachInterrupt(0, defusing, CHANGE);
|
|
}
|
|
|
|
void thisIsTheEnd() {
|
|
|
|
i = 2000;
|
|
while (i >= 400) {
|
|
if (zor) {
|
|
k=i/2;
|
|
s = i - 50;
|
|
digitalWrite(mainLed, HIGH);
|
|
digitalWrite(bell, HIGH);
|
|
delay(50);
|
|
digitalWrite(bell, LOW);
|
|
delay(s);
|
|
digitalWrite(mainLed, LOW);
|
|
delay(k);
|
|
i -= k;
|
|
}
|
|
else {
|
|
goto lastStraw;
|
|
}
|
|
}
|
|
while (i >= 20) {
|
|
if (zor) {
|
|
digitalWrite(mainLed, HIGH);
|
|
digitalWrite(bell, HIGH);
|
|
delay(i);
|
|
digitalWrite(mainLed, LOW);
|
|
digitalWrite(bell, LOW);
|
|
delay(i);
|
|
i -= 10;
|
|
}
|
|
else {
|
|
goto lastStraw;
|
|
}
|
|
}
|
|
i = 2000;
|
|
// Chenillard final
|
|
lb = 3;
|
|
while (lb < 12) {
|
|
digitalWrite(lb, HIGH);
|
|
delay(400);
|
|
lb ++;
|
|
}
|
|
delay(500);
|
|
lb = 3;
|
|
while (lb < 12) {
|
|
digitalWrite(lb, LOW);
|
|
lb ++;
|
|
}
|
|
lb = 3;
|
|
digitalWrite(bell, HIGH);
|
|
while (lb < 12) {
|
|
digitalWrite(lb, HIGH);
|
|
delay(100);
|
|
digitalWrite(lb, LOW);
|
|
lb ++;
|
|
}
|
|
lb = 10;
|
|
while (lb > 2) {
|
|
digitalWrite(lb, HIGH);
|
|
delay(100);
|
|
digitalWrite(lb, LOW);
|
|
lb --;
|
|
}
|
|
zor = true;
|
|
|
|
lastStraw:
|
|
digitalWrite(bell, LOW);
|
|
|
|
}
|
|
|
|
void initConditions() {
|
|
delay(300); // interruption debounce, else it'll jump the 'while'
|
|
lb = 3;
|
|
while ( lb < 12 ) {
|
|
digitalWrite(lb, LOW);
|
|
lb ++;
|
|
}
|
|
ctDownSet = 0;
|
|
k = 0;
|
|
dc = 0;
|
|
lastDebounceTime = 0;
|
|
modeState = false;
|
|
}
|
|
|
|
/* ========================================================================== */
|
|
void loop(void) {
|
|
clearSelect:
|
|
initConditions();
|
|
|
|
while ( modeState == false ) {
|
|
if ( ctDownSet < 2700001 ) {
|
|
k=ctDownSet/300000 + 2;
|
|
digitalWrite(k, HIGH);
|
|
|
|
if ( digitalRead(pushButt) == LOW ) {
|
|
lastDebounceTime = millis();
|
|
delay(300); // debounce
|
|
// check if the switch is pressed for a long time
|
|
if( digitalRead(pushButt) == LOW && ( lastDebounceTime - millis() ) > 5000 ) {
|
|
modeState = true;
|
|
i=0;
|
|
while( i<2 ) {
|
|
digitalWrite(bell, HIGH);
|
|
delay(200);
|
|
digitalWrite(bell, LOW);
|
|
delay(200);
|
|
i++;
|
|
}
|
|
delay(700);
|
|
goto sayByBye;
|
|
}
|
|
// otherwise (short pressure), just increment the countdown delay
|
|
else {
|
|
ctDownSet += 300000;
|
|
digitalWrite(mainLed, HIGH);
|
|
delay(300);
|
|
digitalWrite(mainLed, LOW);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
goto clearSelect;
|
|
}
|
|
}
|
|
|
|
sayByBye:
|
|
zor = true;
|
|
if (zor) {
|
|
if ( ctDownSet != 0 ) {
|
|
k=ctDownSet/300000;
|
|
while ( k > 1 ) {
|
|
//delay(300000);
|
|
dc = 0;
|
|
|
|
countDown:
|
|
|
|
while ( dc < 300001 ) {
|
|
if (zor) {
|
|
delay(10);
|
|
dc += 10;
|
|
}
|
|
else {
|
|
i = 0;
|
|
while ( i < 2 ) {
|
|
digitalWrite(mainLed, HIGH);
|
|
delay(300);
|
|
digitalWrite(mainLed, LOW);
|
|
delay(300);
|
|
i ++;
|
|
}
|
|
cd = 0;
|
|
while ( cd < 10001 ) {
|
|
delay(10);
|
|
cd += 10;
|
|
}
|
|
zor = true;
|
|
delay(400);
|
|
if (zor) {
|
|
i = 0;
|
|
while ( i < 2 ) {
|
|
digitalWrite(mainLed, HIGH);
|
|
delay(300);
|
|
digitalWrite(mainLed, LOW);
|
|
delay(300);
|
|
i ++;
|
|
}
|
|
goto countDown;
|
|
}
|
|
else {
|
|
goto jackFlash;
|
|
}
|
|
}
|
|
}
|
|
digitalWrite(k+2, LOW);
|
|
digitalWrite(k+1, HIGH);
|
|
k --;
|
|
}
|
|
|
|
dc = 0;
|
|
|
|
takeFive:
|
|
|
|
while ( dc < 300001 ) {
|
|
if (zor) {
|
|
delay(10);
|
|
dc += 10;
|
|
}
|
|
else {
|
|
i = 0;
|
|
while ( i < 2 ) {
|
|
digitalWrite(mainLed, HIGH);
|
|
delay(300);
|
|
digitalWrite(mainLed, LOW);
|
|
delay(300);
|
|
i ++;
|
|
}
|
|
cd = 0;
|
|
while ( cd < 10001 ) {
|
|
delay(10);
|
|
cd += 10;
|
|
}
|
|
zor = true;
|
|
delay(400);
|
|
if (zor) {
|
|
i = 0;
|
|
while ( i < 2 ) {
|
|
digitalWrite(mainLed, HIGH);
|
|
delay(300);
|
|
digitalWrite(mainLed, LOW);
|
|
delay(300);
|
|
i ++;
|
|
}
|
|
goto takeFive;
|
|
}
|
|
else {
|
|
goto jackFlash;
|
|
}
|
|
}
|
|
}
|
|
digitalWrite(3, LOW);
|
|
}
|
|
}
|
|
|
|
jackFlash:
|
|
|
|
if (zor) {
|
|
thisIsTheEnd();
|
|
if ( zor == false ) {
|
|
k = 11;
|
|
while ( k > 2 ) {
|
|
digitalWrite(k, HIGH);
|
|
k --;
|
|
}
|
|
k = 9;
|
|
goto defuseSign;
|
|
}
|
|
}
|
|
|
|
else {
|
|
|
|
defuseSign:
|
|
lb = k + 2;
|
|
while ( lb > 2 ) {
|
|
digitalWrite(bell, HIGH);
|
|
digitalWrite(lb, LOW);
|
|
delay(500 - lb*25);
|
|
digitalWrite(bell, LOW);
|
|
delay(200 - lb*15);
|
|
lb --;
|
|
}
|
|
|
|
}
|
|
|
|
return;
|
|
}
|