-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprojector_control.ino
More file actions
executable file
·450 lines (418 loc) · 11.6 KB
/
projector_control.ino
File metadata and controls
executable file
·450 lines (418 loc) · 11.6 KB
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
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
// include the SoftwareSerial library so you can use its functions:
#include <SoftwareSerial.h>
#include <IRremote.h>
#include <BlindsSwitch.h>
const int Screen_Control_SerialRX = -1;
const int Screen_Control_SerialTX = 7;
const int Blinds_Switch_TX = 4;
const unsigned int Blinds_Switch_RemoteID = 0x92;
const int Pin13LED = 13;
const int TriggerIn = 2;
const int IRRecv_pin = 3;
SoftwareSerial Screen_Control_Serial(Screen_Control_SerialRX, Screen_Control_SerialTX);
BlindsSwitch Blinds_Switch(Blinds_Switch_TX);
IRrecv irrecv(IRRecv_pin);
decode_results IR_results;
#define DUMP_IR
#ifdef DUMP_IR
int dump_ir = 0;
#endif
void setup()
{
int i;
pinMode(Screen_Control_SerialTX, OUTPUT);
Screen_Control_Serial.begin(2400);
pinMode(Pin13LED, OUTPUT);
digitalWrite(Pin13LED, LOW);
pinMode(TriggerIn, INPUT);
Serial.begin(9600);
Blinds_Switch.enableTransmit(Blinds_Switch_TX);
irrecv.enableIRIn(); // Start the receiver
}
#define SCREEN_UP_WAITING 1
#define SCREEN_UP_TRIGGER_SEEN 2
#define SCREEN_DOWN_WAITING 3
#define SCREEN_DOWN_TRIGGER_SEEN 4
int debounce_start_time = 0;
int state = SCREEN_UP_WAITING;
const int DEBOUNCE_TIME = 250;
const byte ScreenDown[] = {
0xff, 0xee, 0xee, 0xee, 0xee};
const byte ScreenUp[] = {
0xff, 0xee, 0xee, 0xee, 0xdd};
const byte ScreenStop[] = {
0xff, 0xee, 0xee, 0xee, 0xcc};
#ifdef DUMP_IR
void dump(decode_results *results) {
int count = results->rawlen;
// Check if the buffer overflowed
if (results->overflow) {
Serial.println("IR code too long. Edit IRremoteInt.h and increase RAWLEN");
return;
}
switch (results->decode_type) {
default:
case UNKNOWN: Serial.print("UNKNOWN"); break ;
case NEC: Serial.print("NEC"); break ;
case SONY: Serial.print("SONY"); break ;
case RC5: Serial.print("RC5"); break ;
case RC6: Serial.print("RC6"); break ;
case DISH: Serial.print("DISH"); break ;
case SHARP: Serial.print("SHARP"); break ;
case JVC: Serial.print("JVC"); break ;
case SANYO: Serial.print("SANYO"); break ;
case MITSUBISHI: Serial.print("MITSUBISHI"); break ;
case SAMSUNG: Serial.print("SAMSUNG"); break ;
case LG: Serial.print("LG"); break ;
case WHYNTER: Serial.print("WHYNTER"); break ;
case AIWA_RC_T501: Serial.print("AIWA_RC_T501"); break ;
case PANASONIC: Serial.print("PANASONIC"); break ;
case DENON: Serial.print("Denon"); break ;
}
// Panasonic has an Address
if (results->decode_type == PANASONIC) {
Serial.print(results->address, HEX);
Serial.print(":");
}
Serial.print(results->value, HEX);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println(" bits)");
return;
Serial.print("Timing[");
Serial.print(results->rawlen-1, DEC);
Serial.println("]: ");
for (int i = 1; i < results->rawlen; i++) {
unsigned long x = results->rawbuf[i] * USECPERTICK;
if (!(i & 1)) { // even
Serial.print("-");
if (x < 1000) Serial.print(" ") ;
if (x < 100) Serial.print(" ") ;
Serial.print(x, DEC);
} else { // odd
Serial.print(" ");
Serial.print("+");
if (x < 1000) Serial.print(" ") ;
if (x < 100) Serial.print(" ") ;
Serial.print(x, DEC);
if (i < results->rawlen-1) Serial.print(", "); //',' not needed for last one
}
if (!(i % 8)) Serial.println("");
}
Serial.println(""); // Newline
}
#endif
void loop()
{
// Level conveter changes polarity of signal, invert it here
int trigger_value = !digitalRead(TriggerIn);
digitalWrite(Pin13LED, trigger_value);
switch (state)
{
case SCREEN_UP_WAITING:
// If trigger is seen, log the start time and transition
// to the debounce state
if (trigger_value)
{
debounce_start_time = millis();
state = SCREEN_UP_TRIGGER_SEEN;
Serial.println("Leaving 1 for 2");
}
break;
case SCREEN_UP_TRIGGER_SEEN:
if (!trigger_value)
{
// just a glitch - not long enough to be a true
// signal. go back to waiting
state = SCREEN_UP_WAITING;
Serial.println("returning to 1");
}
else if ((millis() - debounce_start_time) >= DEBOUNCE_TIME)
{
// steady trigger for enough time - this is a
// real signal. send the screen down command
Screen_Control_Serial.write(ScreenDown, sizeof(ScreenDown));
state = SCREEN_DOWN_WAITING;
Serial.println("Leaving 2 for 3");
}
break;
case SCREEN_DOWN_WAITING:
// If trigger is no longer seen, log the start time
// and transition to the debounce state
if (!trigger_value)
{
debounce_start_time = millis();
state = SCREEN_DOWN_TRIGGER_SEEN;
Serial.println("Leaving 3 for 4");
}
break;
case SCREEN_DOWN_TRIGGER_SEEN:
if (trigger_value)
{
// Trigger not missing for a long enough
// time - go back to waiting
state = SCREEN_DOWN_WAITING;
Serial.println("Returning to 3");
}
else if ((millis() - debounce_start_time) >= DEBOUNCE_TIME)
{
// Trigger cleared lnog enough - send screen back up
Screen_Control_Serial.write(ScreenUp, sizeof(ScreenUp));
state = SCREEN_UP_WAITING;
Serial.println("Leaving 4 for 1");
}
break;
default:
// return to a known good state just in case
state = SCREEN_UP_WAITING;
break;
}
if (irrecv.decode(&IR_results)) {
#ifdef DUMP_IR
if (dump_ir)
dump(&IR_results);
#endif
irrecv.disableIRIn();
switch (IR_results.value)
{
case 0x8C7328D7: // PLAY
#ifdef DUMP_IR
dump_ir = 1 - dump_ir;
Serial.println("PLAY");
#endif
break;
case 0x8C7308F7: // STOP
#ifdef DUMP_IR
Serial.println("STOP");
#endif
break;
case 0x8C738877: // PAUSE/STILL
#ifdef DUMP_IR
Serial.println("PAUSE/STILL");
#endif
break;
case 0x8C73C837: // FF_>>
#ifdef DUMP_IR
Serial.println("FF_>>");
#endif
break;
case 0x8C7348B7: // <<_REW
#ifdef DUMP_IR
Serial.println("<<_REW");
#endif
break;
case 0x8C73A857: // RECORD
#ifdef DUMP_IR
Serial.println("RECORD");
#endif
break;
case 0x8C73DA25: // OPERATE
#ifdef DUMP_IR
Serial.println("POWER");
#endif
break;
case 0x8C7320DF: // 1
#ifdef DUMP_IR
Serial.println("1");
#endif
Screen_Control_Serial.write(ScreenUp, sizeof(ScreenUp));
Serial.println("screen up");
break;
case 0x8C73A05F: // 2
#ifdef DUMP_IR
Serial.println("2");
#endif
break;
case 0x8C73609F: // 3
#ifdef DUMP_IR
Serial.println("3");
#endif
Serial.println("shades up");
Blinds_Switch.AllUp(Blinds_Switch_RemoteID);
break;
case 0x8C73E01F: // 4
#ifdef DUMP_IR
Serial.println("4");
#endif
Screen_Control_Serial.write(ScreenStop, sizeof(ScreenStop));
Serial.println("screen stop");
break;
case 0x8C7330CF: // 5
#ifdef DUMP_IR
Serial.println("5");
#endif
break;
case 0x8C73B04F: // 6
#ifdef DUMP_IR
Serial.println("6");
#endif
Serial.println("shades stop");
Blinds_Switch.AllStop(Blinds_Switch_RemoteID);
break;
case 0x8C73708F: // 7
#ifdef DUMP_IR
Serial.println("7");
#endif
Screen_Control_Serial.write(ScreenDown, sizeof(ScreenDown));
Serial.println("screen down");
break;
case 0x8C73F00F: // 8
#ifdef DUMP_IR
Serial.println("8");
#endif
break;
case 0x8C7338C7: // 9
#ifdef DUMP_IR
Serial.println("9");
#endif
Serial.println("shades down");
Blinds_Switch.AllDown(Blinds_Switch_RemoteID);
break;
case 0x8C73807F: // CHANNEL_UP
#ifdef DUMP_IR
Serial.println("CHANNEL_UP/ARROW_UP");
#endif
break;
case 0x8C7340BF: // CHANNEL_DOWN
#ifdef DUMP_IR
Serial.println("CHANNEL_DOWN/ARROW_DOWN");
#endif
break;
case 0x8C7329D6: // ARROW_RIGHT
#ifdef DUMP_IR
Serial.println("ARROW_RIGHT");
#endif
break;
case 0x8C73A9D6: // ARROW_LEFT
#ifdef DUMP_IR
Serial.println("ARROW_LEFT");
#endif
break;
case 0x8C7310EF: // VTR_V
#ifdef DUMP_IR
Serial.println("VIDEO");
#endif
break;
case 0x8C738A75: // TV_MONITOR
#ifdef DUMP_IR
Serial.println("TV_MONITOR");
#endif
break;
case 0x8C730AF5: // KEY
#ifdef DUMP_IR
Serial.println("KEY");
#endif
break;
case 0x8C739867: // INDEX
#ifdef DUMP_IR
Serial.println("INDEX");
#endif
break;
case 0x8C7322DD: // RESET
#ifdef DUMP_IR
Serial.println("RESET");
#endif
break;
case 0x8C73C23D: // MEMORY
#ifdef DUMP_IR
Serial.println("MEMORY");
#endif
break;
case 0x8C73F807: // ATR
#ifdef DUMP_IR
Serial.println("ATR");
#endif
break;
case 0x8C73629D: // CHECK
#ifdef DUMP_IR
Serial.println("MENU/GUIDE");
#endif
break;
case 0x8C7352AD: // CL
#ifdef DUMP_IR
Serial.println("EXIT");
#endif
break;
case 0x8C73B847: // O/AV
#ifdef DUMP_IR
Serial.println("O/AV");
#endif
break;
case 0x8C73D22D: // OK
#ifdef DUMP_IR
Serial.println("OK/SELECT");
#endif
break;
#if 0
case 0xC2D0: // power
dump_ir = 1 - dump_ir;
break;
case 0xC230: // play
break;
case 0xC260: // forward
break;
case 0xC2E0: // backward
break;
case 0xC2C0: // stop
break;
case 0xC2B0: // pause
break;
case 0xC2EC: // menu
break;
case 0xC23C: // ok
break;
case 0xC26C: // zero4x
break;
case 0xC233: // itr
break;
case 0xC298: // pr_up
break;
case 0xC218: // pr_dn
break;
case 0xC228: // right
break;
case 0xC2A8: // left
break;
case 0xC220: // eject
break;
case 0xC284: // no_1
Screen_Control_Serial.write(ScreenUp, sizeof(ScreenUp));
Serial.println("screen up");
break;
case 0xC244: // no_2
break;
case 0xC2C4: // no_3
Serial.println("shades up");
Blinds_Switch.AllUp(Blinds_Switch_RemoteID);
break;
case 0xC224: // no_4
Screen_Control_Serial.write(ScreenStop, sizeof(ScreenStop));
Serial.println("screen stop");
break;
case 0xC2A4: // no_5
break;
case 0xC264: // no_6
Serial.println("shades stop");
Blinds_Switch.AllStop(Blinds_Switch_RemoteID);
break;
case 0xC2E4: // no_7
Screen_Control_Serial.write(ScreenDown, sizeof(ScreenDown));
Serial.println("screen down");
break;
case 0xC214: // no_8
break;
case 0xC294: // no_9
Serial.println("shades down");
Blinds_Switch.AllDown(Blinds_Switch_RemoteID);
break;
case 0xC2CC: // no_0
break;
case 0xC098: // tvpr_up
break;
case 0xC018: // tvpr_dn
break;
#endif
}
irrecv.enableIRIn(); // Receive the next value
}
}