ade6fb87b261d89889632f73cfe43a14c8828b3b
[mirrors/Programs.git] / exit-rum.ino
1 /*
2 * Exit Rum
3 * (c) Tomas 'Harvie' Mudrunka 2016
4 */
5
6 #include <Wire.h>
7 #include <LiquidCrystal_I2C.h>
8 #include <TM1637Display.h>
9
10 #define TIMEOUT 300
11 #define BEEP_FREQ 3000
12 #define BEEP_LEN 50
13
14 #define P_NASLAP 12
15 #define P_PIEZO 35
16 #define P_RELAY_1 9
17 #define P_RELAY_2 8
18 #define P_LEDSEG_CLK 2
19 #define P_LEDSEG_DIO 3
20 #define P_LEDSTRIP 11
21
22 TM1637Display display(P_LEDSEG_CLK, P_LEDSEG_DIO);
23 LiquidCrystal_I2C lcd(0x3F, 16, 2); //i2c addr, chars, lines
24
25 #define JBASE 38
26 #define JCOUNT 16
27
28 #define J_A 0
29 #define J_B 2
30 #define J_C 4
31 #define J_D 6
32 #define J_E 8
33 #define J_F 10
34 #define J_G 12
35 #define J_H 14
36 #define J_1 1
37 #define J_2 3
38 #define J_3 5
39 #define J_4 7
40 #define J_5 9
41 #define J_6 11
42 #define J_7 13
43 #define J_8 15
44
45 boolean jumpers_read[JCOUNT][JCOUNT] = {0}, jumpers_secret[JCOUNT][JCOUNT] = {0};
46
47 void jumper_store(int a, int b, boolean c) {
48 jumpers_secret[min(a,b)][max(a,b)]=c;
49 }
50
51 void sound(char sndpin, float freq, float duration) { //Play bit-bang sound
52 if(duration<=0) return; if(freq<=0) { delay(duration); return; }
53 freq=((1000000/2)/freq); //Convert freq to delay (us)
54 duration*=1000; //Convert duration to us
55 pinMode(sndpin, OUTPUT);
56 for(;duration>0;duration-=2*freq) {
57 digitalWrite(sndpin, HIGH); delayMicroseconds(freq);
58 digitalWrite(sndpin, LOW); delayMicroseconds(freq);
59 }
60 pinMode(sndpin, INPUT); //Close pin to avoid noise (optional)
61 }
62
63 int check_jumpers() {
64 int i, j, check = 0, fail = 0;
65
66 for(i=0;i<JCOUNT;i++) {
67 pinMode(JBASE+i, OUTPUT);
68 digitalWrite(JBASE+i, LOW);
69 for(j=0;j<JCOUNT;j++) if(i<j) {
70 pinMode(JBASE+j, INPUT_PULLUP);
71 jumpers_read[i][j] = !digitalRead(JBASE+j);
72 if(jumpers_read[i][j]) {
73 check++;
74 Serial.print(JBASE+i, DEC);
75 Serial.print("->");
76 Serial.print(JBASE+j, DEC);
77 if(jumpers_secret[i][j]) {
78 Serial.print("!");
79 } else {
80 fail++;
81 }
82 Serial.print(", ");
83 }
84 }
85 pinMode(JBASE+i, INPUT_PULLUP);
86 }
87 Serial.println();
88 check = fail ? -check : check;
89 Serial.println(check, DEC);
90 return check;
91 }
92
93 void setup() {
94 jumper_store(J_A, J_5, true);
95 jumper_store(J_B, J_4, true);
96 jumper_store(J_C, J_7, true);
97 jumper_store(J_D, J_2, true);
98 jumper_store(J_E, J_6, true);
99 jumper_store(J_F, J_8, true);
100 jumper_store(J_G, J_1, true);
101 jumper_store(J_H, J_3, true);
102
103 pinMode(P_NASLAP, INPUT_PULLUP);
104 pinMode(P_RELAY_1, OUTPUT);
105 pinMode(P_RELAY_2, OUTPUT);
106 pinMode(P_LEDSTRIP, OUTPUT);
107
108 Serial.begin(9600);
109 lcd.begin();
110 }
111
112 #define seconds_display(seconds) ((((seconds)/60)*100)+((seconds)%60))
113
114 // the loop function runs over and over again forever
115 void loop() {
116 Serial.println("Inicializace systemu...");
117
118 lcd.backlight();
119 lcd.clear();
120 lcd.print(" (c) SPOJE.NET");
121 lcd.setCursor(0,1);
122 lcd.print("Tomas@MudrunkaCZ");
123
124 display.setBrightness(0x0f);
125 display.setColon(true);
126 display.showNumberDec(2323);
127
128 delay(5000);
129
130 lcd.noDisplay();
131 lcd.noBacklight();
132 display.setBrightness(0x00);
133
134 display.setBrightness(0);
135 display.showNumberDec(0);
136
137 analogWrite(P_LEDSTRIP, 0);
138 digitalWrite(P_RELAY_1, HIGH);
139 digitalWrite(P_RELAY_2, HIGH);
140
141 sound(P_PIEZO, BEEP_FREQ, BEEP_LEN);
142 delay(BEEP_LEN);
143 sound(P_PIEZO, BEEP_FREQ, BEEP_LEN);
144 Serial.println("Cekam na aktivaci...");
145 while(digitalRead(P_NASLAP));
146
147 Serial.println("Sekvence aktivovana!");
148
149 display.setBrightness(0x0f);
150 for(int i=0;i<70;i++) {
151 sound(P_PIEZO, random(500,10000), random(10,100));
152 display.showNumberDec(random(1000,9999));
153 analogWrite(P_LEDSTRIP, random(0,255));
154 }
155 sound(P_PIEZO, BEEP_FREQ, 2000);
156
157 Serial.println("Odpocet aktivovan!");
158 int timer = TIMEOUT;
159 while(check_jumpers() != 8) {
160 Serial.print("Zbyva: ");
161 Serial.print(timer, DEC);
162 Serial.println(" sekund");
163 if(timer <= 0) {
164 digitalWrite(P_RELAY_1, LOW);
165 }
166 display.setColon(timer%2);
167 display.showNumberDec(seconds_display(timer));
168 analogWrite(P_LEDSTRIP, map(timer%5, 0, 4, 255, 10));
169 digitalWrite(P_RELAY_2, timer%2);
170 if(timer>0) {
171 timer--;
172 sound(P_PIEZO, BEEP_FREQ, BEEP_LEN);
173 delay(1000-BEEP_LEN);
174 } else {
175 analogWrite(P_LEDSTRIP, random(0,255));
176 sound(P_PIEZO, random(500,10000), random(100,1000));
177 }
178 }
179
180 Serial.println("Odpocet zastaven.");
181 display.setColon(true);
182 display.showNumberDec(seconds_display(timer));
183 analogWrite(P_LEDSTRIP, 0);
184 digitalWrite(P_RELAY_1, HIGH);
185
186 //Muhammad Ismáil Árifi
187 lcd.clear();
188 lcd.print(" Muhammad");
189 lcd.setCursor(0,1);
190 lcd.print(" Ismail Arifi");
191 lcd.backlight();
192 lcd.display();
193
194 Serial.println("Cekam na reset...");
195 //while(digitalRead(P_NASLAP));
196 while(check_jumpers() != 0) delay(1000);
197 }
This page took 0.908626 seconds and 3 git commands to generate.