-
Notifications
You must be signed in to change notification settings - Fork 0
/
tarefa3_FlashingLed.ino
167 lines (126 loc) · 3.79 KB
/
tarefa3_FlashingLed.ino
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
#define QTD_PINOS 14
#define QTD_TIMERS 14
// Registros Globais
int btn_state = 0;
int pin_listen_list[QTD_PINOS]; // Pinos registraveis
int btn_lastState[QTD_PINOS]; // Ultimo estado de um botão espefico
long timer_expire[QTD_TIMERS]; // Ultima marcação de um timer
/* Callbacks */
void button_changed (int pin, int state);
void timer_expired (int timer);
/* Registrador de botões */
void button_listen (int pin) {
pin_listen_list[pin] = 1;
}
/* Registrador de timers */
void timer_set (int ms, int timer) {
timer_expire[timer] = millis() + ms;
}
/* Setup Inicial */
void setup() {
Serial.begin(9600);
int i = 0;
// Inicializa Lista de pinos a serem ouvidos
for( i = 0 ; i < QTD_PINOS; i++ ) {
pin_listen_list[i] = 0;
btn_lastState[i] = 0;
}
// Inicializa Lista de TIMERS a serem ouvidos
for( i = 0 ; i < QTD_TIMERS; i++ ) {
timer_expire[i] = -1;
}
// Init do observer
_init();
}
void loop() {
int i = 0;
int dRead = 0;
unsigned long instant = 0;
// Detecta Botões apertados
for( i = 0 ; i < QTD_PINOS ; i++ ) {
if( pin_listen_list[i] == 0 ) continue; // Não tem mais botão a ser testado
// Detecta se o estado do botão mudou, chama a função changed APENAS caso tenha mudado
dRead = digitalRead(i);
if( dRead != btn_lastState[i] ) {
btn_lastState[i] = dRead;
button_changed(i, dRead);
}
}
// Detecta timers expirados
instant = millis();
for( i = 0 ; i < QTD_TIMERS ; i++ ) {
if (timer_expire[i] == -1) continue; //Timer não setado
// Checa se o timer expirou
if ( instant > timer_expire[i] ) {
timer_expire[i] = -1;
timer_expired(i);
}
}
}
/* --------------------------------- EVENT.C END ------------------ */
/* --------------------------------- USER AREA START ------------------ */
#define LED_PIN 10
#define BUT1_PIN 2
#define BUT2_PIN 3
#define BTN_DELAY 200
#define STOP_DELAY 500
int led_locked = 0;
int led_delay = 1000;
int led_state = 0;
int btn1_locked = 0;
int btn2_locked = 0;
int btn1_stop = 0;
int btn2_stop = 0;
void button_changed (int pin, int state) {
if(led_locked==1) return;
// Botão aumentar
if( pin == BUT1_PIN && state && btn1_locked == 0 ) {
btn1_locked = 1; // Trava o accesso ao botao por um curto espaço de tempo
timer_set( BTN_DELAY , 1); // Timer para destravar o botao
btn1_stop = 1; // Timer para encerrar o programa ( botao duplo )
timer_set( STOP_DELAY , 3); // Timeout da janela para encerramento
led_delay = led_delay / 2; // Muda a frenquencia do led
}
// Botão diminuir
if( pin == BUT2_PIN && state && btn2_locked == 0 ) {
btn2_locked = 1; // Trava o accesso ao botao por um curto espaço de tempo
timer_set( BTN_DELAY , 2); // Timer para destravar o botao
btn2_stop = 1; // Timer para encerrar o programa ( botao duplo )
timer_set( STOP_DELAY , 3); // Timeout da janela para encerramento
led_delay = led_delay * 2; // Muda a frenquencia do led
}
// Encerramento ao apertar dois botões
if( btn1_stop && btn2_stop ) {
led_locked = 1;
digitalWrite(LED_PIN, HIGH);
}
}
void timer_expired (int timer) {
if(led_locked==1) return;
switch(timer) {
case 0:
Serial.println("Led Delay...");
led_state = !led_state;
digitalWrite(LED_PIN, led_state);
timer_set( led_delay , 0);
break;
case 1:
btn1_locked = 0;
break;
case 2:
btn2_locked = 0;
break;
case 3:
btn1_stop = 0;
btn2_stop = 0;
break;
}
}
void _init () {
pinMode(LED_PIN, OUTPUT);
pinMode(BUT1_PIN, INPUT);
pinMode(BUT2_PIN, INPUT);
button_listen(BUT1_PIN);
button_listen(BUT2_PIN);
timer_set( led_delay , 0); //Inicia a piscada do led
}