unabkraft777/unabkraft.ino

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;
}