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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
|
#define SERIAL_BAUD 115200
#define MAX_CODE_LEN 1024
#define BUZZ_HAPPY 1000
#define BUZZ_SAD 700
#define PINOUT_KBM7 4
#define PINOUT_KBM6 5
#define PINOUT_KBM5 6
#define PINOUT_KBM4 7
#define PINOUT_KBM3 12
#define PINOUT_KBM2 8
#define PINOUT_KBM1 9
#define PINOUT_LED_Y A5
#define PINOUT_LED_R A4
#define PINOUT_LED_G A3
#define PINOUT_BUZZ A2
#define PINOUT_SET A1
#define PINOUT_RELAIS A0
#define KB_ROW_1 PINOUT_KBM2
#define KB_ROW_2 PINOUT_KBM3
#define KB_ROW_3 PINOUT_KBM5
#define KB_ROW_4 PINOUT_KBM7
#define KB_COL_1 PINOUT_KBM1
#define KB_COL_2 PINOUT_KBM4
#define KB_COL_3 PINOUT_KBM6
#define KB_KEY_1 0
#define KB_KEY_2 1
#define KB_KEY_3 2
#define KB_KEY_4 3
#define KB_KEY_5 4
#define KB_KEY_6 5
#define KB_KEY_7 6
#define KB_KEY_8 7
#define KB_KEY_9 8
#define KB_KEY_C 9
#define KB_KEY_0 10
#define KB_KEY_E 11
int kb_rows[] = { KB_ROW_1, KB_ROW_2, KB_ROW_3, KB_ROW_4 };
int kb_cols[] = { KB_COL_1, KB_COL_2, KB_COL_3 };
unsigned char kb[12], kb_old[12];
unsigned char correct_code[] = { 0, 0, 0, 0 };
unsigned char code[MAX_CODE_LEN];
unsigned int codei = 0;
typedef struct {
unsigned char key;
bool down;
unsigned long timestamp;
} kb_event;
void setup() {
// Start serial (vooral voor debugging)
Serial.begin(SERIAL_BAUD);
// keyboard kolommen als input
pinMode(KB_COL_1, INPUT_PULLUP);
pinMode(KB_COL_2, INPUT_PULLUP);
pinMode(KB_COL_3, INPUT_PULLUP);
// keyboard rijen als output
pinMode(KB_ROW_1, OUTPUT);
pinMode(KB_ROW_2, OUTPUT);
pinMode(KB_ROW_3, OUTPUT);
pinMode(KB_ROW_4, OUTPUT);
// Overige outputs
pinMode(PINOUT_LED_G, OUTPUT);
pinMode(PINOUT_LED_R, OUTPUT);
pinMode(PINOUT_LED_Y, OUTPUT);
pinMode(PINOUT_RELAIS, OUTPUT);
pinMode(PINOUT_BUZZ, OUTPUT);
}
void kb_scan() {
// kopieer kb naar kb_old
memcpy(&kb_old, kb, sizeof(kb_old));
// stel alle indices van kb_old in op 0
memset(&kb, 0, sizeof(kb));
for (int row = 0; row < 4; row++) {
Serial.print("Pin ");
Serial.print(kb_rows[row], DEC);
Serial.print(" is now high\n");
digitalWrite(kb_rows[row], HIGH);
for (int col = 0; col < 3; col++) {
// Serial.print("checking pin ");
// Serial.print(kb_cols[col], DEC);
// Serial.print(" -> ");
// Serial.print(kb_rows[row], DEC);
// Serial.print(" ...\n");
// Serial.print("kb[");
// Serial.print(3 * row + col, DEC);
// Serial.print("] (c");
// Serial.print(kb_cols[col], DEC);
// Serial.print(", r");
// Serial.print(kb_rows[row], DEC);
// Serial.print(")\n");
kb[3 * row + col] = !digitalRead(kb_cols[col]);
Serial.print("Pin ");
Serial.print(kb_cols[col], DEC);
Serial.print(" is now ");
Serial.print(digitalRead(kb_cols[col]), DEC);
Serial.print("\n");
}
digitalWrite(kb_rows[row], LOW);
Serial.print("Pin ");
Serial.print(kb_rows[row], DEC);
Serial.print(" is now low\n");
delay(10);
}
}
void debug_print_arr(unsigned char x[12]) {
Serial.print("[");
for(int i = 0; i < 12; i++) {
Serial.print(x[i], DEC);
if (i != 11) Serial.print(", ");
}
Serial.print("]\n");
}
void wrong_code_routine() {
tone(PINOUT_BUZZ, BUZZ_SAD);
digitalWrite(PINOUT_LED_R, HIGH);
delay(1e3); // shorthand voor 1000
digitalWrite(PINOUT_LED_R, LOW);
noTone(PINOUT_BUZZ);
}
void unlock_routine() {
tone(PINOUT_BUZZ, BUZZ_HAPPY);
digitalWrite(PINOUT_RELAIS, HIGH);
digitalWrite(PINOUT_LED_G, HIGH);
delay(2e3);
digitalWrite(PINOUT_LED_G, LOW);
digitalWrite(PINOUT_RELAIS, LOW);
noTone(PINOUT_BUZZ);
}
void kb_onevent(kb_event ev) {
if (!ev.down) return;
if (ev.key != KB_KEY_E) tone(PINOUT_BUZZ, BUZZ_HAPPY, 200);
Serial.println(ev.key, DEC);
switch (ev.key) {
case KB_KEY_C: {
// TODO: kijk of sizeof() werkt voor arrays
memset(&code, 0, sizeof(code));
codei = 0;
break;
}
case KB_KEY_E: {
//TODO: array length
int correct_code_len = 3;
bool correct = true;
if (codei != correct_code_len) break;
for (int i = 0; i < correct_code_len; i++) {
if (correct_code[i] == code[i]) continue;
// dit voert alleen uit als een van
// de getallen in code[] niet gelijk is aan correct_code[]
correct = false;
break;
}
// debug
Serial.print(correct, DEC);
// kijk mama geen haakjes
if (correct)
unlock_routine();
else
wrong_code_routine();
break;
}
// Overige toetsen (nummers)
default: {
//TODO: NON BLOCKING LED VOOR ALLE LEDS
// bereken getal op toets
// (key + 1 voor alle toetsen behalve 0)
int num = ev.key == 10 ? 0 : ev.key + 1;
// voeg getal toe aan het einde van de code
code[codei] = num;
codei++;
}
}
}
void kb_event_gen() {
for(int i = 0; i < 12; i++) {
// ga door naar de volgende iteratie
// als de toetsen niet veranderd zijn
if (kb[i] == kb_old[i]) continue;
kb_event event = {
.key = (unsigned char) i,
.down = kb[i],
.timestamp = millis()
};
kb_onevent(event);
}
}
void loop() {
// unlock_routine();
// delay(3e3);
// wrong_code_routine();
// delay(10e3);
kb_scan();
kb_event_gen();
// debug_print_arr(kb);
// Serial.print("time ");
// Serial.print(millis(), DEC);
// Serial.print("\n");
// delay(1e3);
}
|