Capacitive buttons
This commit is contained in:
parent
25a0680a90
commit
c43e7d379f
3 changed files with 286 additions and 566 deletions
|
|
@ -1,53 +1,23 @@
|
|||
#include <IRremote.h>
|
||||
#include <CapacitiveSensor.h>
|
||||
|
||||
#define SERIAL_DEBUG 0
|
||||
|
||||
// Remote controls
|
||||
#define RC6_CHM 0xFFA25D// CHANNEL -
|
||||
#define RC6_CH 0xFF629D// CHANNEL
|
||||
#define RC6_CHP 0xFFE21D// CHANNEL +
|
||||
#define RC6_PREV 0xFF22DD// |<< PREVIOUS
|
||||
#define RC6_NEXT 0xFF02FD// >>| NEXT
|
||||
#define RC6_PLAY 0xFFC23D// PLAY/PAUSE
|
||||
#define RC6_VM 0xFFE01F// VOLUME -
|
||||
#define RC6_VP 0xFFA857// VOLUME +
|
||||
#define RC6_EQ 0xFF906F// EQ
|
||||
#define RC6_0 0xFF6897// 0
|
||||
#define RC6_100 0xFF9867// 100+
|
||||
#define RC6_200 0xFFB04F// 200+
|
||||
#define RC6_1 0xFF30CF// 1
|
||||
#define RC6_2 0xFF18E7// 2
|
||||
#define RC6_3 0xFF7A85// 3
|
||||
#define RC6_4 0xFF10EF// 4
|
||||
#define RC6_5 0xFF38C7// 5
|
||||
#define RC6_6 0xFF5AA5// 6
|
||||
#define RC6_7 0xFF42BD// 7
|
||||
#define RC6_8 0xFF4AB5// 8
|
||||
#define RC6_9 0xFF52AD// 9
|
||||
#define AMP2540_VCDAUX 0x8FDBCE66
|
||||
#define AMP2540_TUNERCD 0xC375A98B
|
||||
#define AMP2540_DVD 0xCC7372A6
|
||||
#define AMP2540_TAPE 0xE917A076
|
||||
#define AMP2540_SEARCH 0xE82D76B6
|
||||
#define AMP2540_RESET 0x04D1A486
|
||||
#define AMP2540_VM 0xAB95D276
|
||||
#define AMP2540_VP 0x0217C346
|
||||
|
||||
#define MODE_NORMAL 0
|
||||
#define MODE_SETTIME 1
|
||||
#define MODE_SETALARM 2
|
||||
|
||||
#define PIN_BUTTON 3
|
||||
#define PIN_BUZZER 8
|
||||
#define PIN_IR 10
|
||||
#define PIN_BUZZER_LOUD 8
|
||||
#define PIN_BUZZER_QUIET 12
|
||||
#define PIN_LED_DUTY A0
|
||||
#define PIN_REG_CLOCK 7
|
||||
#define PIN_REG_DATA 5
|
||||
#define PIN_REG_LATCH 6
|
||||
|
||||
IRrecv irrecv(PIN_IR);
|
||||
decode_results ircode;
|
||||
unsigned long last_ir = 0;
|
||||
CapacitiveSensor touch_0 = CapacitiveSensor(A1, 11);
|
||||
CapacitiveSensor touch_1 = CapacitiveSensor(A1, 10);
|
||||
CapacitiveSensor touch_2 = CapacitiveSensor(A1, 2);
|
||||
CapacitiveSensor touch_3 = CapacitiveSensor(A1, 9);
|
||||
|
||||
// Matrix state
|
||||
unsigned char matrix[8] = {0b10000001, 0, 0, 0, 0, 0, 0, 0b10000001};
|
||||
|
|
@ -68,9 +38,12 @@ unsigned long alarm_time = 0;
|
|||
|
||||
// Is alarm ringing
|
||||
unsigned char alarm_ringing = false;
|
||||
unsigned long alarm_ring_start;
|
||||
|
||||
unsigned int led_duty;
|
||||
unsigned int led_duty_step = 3;
|
||||
unsigned long last_light_measure = 0;
|
||||
|
||||
unsigned long touch_time[4] = {0, 0, 0, 0};
|
||||
unsigned long last_touch_measure = 0;
|
||||
|
||||
// Bytewise reverse
|
||||
unsigned char reverse(unsigned char b) {
|
||||
|
|
@ -85,19 +58,11 @@ unsigned char fix_pixels(unsigned char b) {
|
|||
}
|
||||
|
||||
void shift_matrix() {
|
||||
if(led_duty_step == 0) {
|
||||
digitalWrite(PIN_REG_LATCH, LOW);
|
||||
shiftOut(PIN_REG_DATA, PIN_REG_CLOCK, MSBFIRST, ~(1 << matrix_row_on));
|
||||
shiftOut(PIN_REG_DATA, PIN_REG_CLOCK, MSBFIRST, fix_pixels(matrix[(matrix_row_on+7)%8]));
|
||||
digitalWrite(PIN_REG_LATCH, HIGH);
|
||||
matrix_row_on = (matrix_row_on + 1) % 8;
|
||||
} else if(led_duty_step == 1) {
|
||||
digitalWrite(PIN_REG_LATCH, LOW);
|
||||
shiftOut(PIN_REG_DATA, PIN_REG_CLOCK, MSBFIRST, 255);
|
||||
shiftOut(PIN_REG_DATA, PIN_REG_CLOCK, MSBFIRST, 0);
|
||||
digitalWrite(PIN_REG_LATCH, HIGH);
|
||||
}
|
||||
led_duty_step ++;
|
||||
digitalWrite(PIN_REG_LATCH, LOW);
|
||||
shiftOut(PIN_REG_DATA, PIN_REG_CLOCK, MSBFIRST, ~(1 << matrix_row_on));
|
||||
shiftOut(PIN_REG_DATA, PIN_REG_CLOCK, MSBFIRST, fix_pixels(matrix[(matrix_row_on+7)%8]));
|
||||
digitalWrite(PIN_REG_LATCH, HIGH);
|
||||
matrix_row_on = (matrix_row_on + 1) % 8;
|
||||
}
|
||||
|
||||
void draw_time(unsigned long t) {
|
||||
|
|
@ -146,10 +111,9 @@ void setup() {
|
|||
pinMode(PIN_REG_DATA, OUTPUT);
|
||||
pinMode(PIN_REG_CLOCK, OUTPUT);
|
||||
pinMode(PIN_REG_LATCH, OUTPUT);
|
||||
pinMode(PIN_BUZZER, OUTPUT);
|
||||
pinMode(PIN_BUZZER_QUIET, OUTPUT);
|
||||
pinMode(PIN_BUZZER_LOUD, OUTPUT);
|
||||
pinMode(PIN_BUTTON, INPUT_PULLUP);
|
||||
pinMode(PIN_LED_DUTY, INPUT);
|
||||
irrecv.enableIRIn();
|
||||
|
||||
pinMode(13, OUTPUT);
|
||||
digitalWrite(13, LOW);
|
||||
|
|
@ -160,49 +124,68 @@ void setup() {
|
|||
}
|
||||
|
||||
void loop() {
|
||||
if(led_duty_step > led_duty) {
|
||||
led_duty_step = 0;
|
||||
led_duty = (1023-analogRead(PIN_LED_DUTY)) / 128;
|
||||
}
|
||||
|
||||
if(irrecv.decode(&ircode)) {
|
||||
#if SERIAL_DEBUG
|
||||
send_hex(ircode.value);
|
||||
#endif
|
||||
unsigned long val = ircode.value;
|
||||
if(val == last_ir) {
|
||||
alarm_ringing = false;
|
||||
switch(val) {
|
||||
case AMP2540_VCDAUX: mode = (mode+1) % 3; break;
|
||||
case AMP2540_VP: change_selected_number(1); break;
|
||||
case AMP2540_VM: change_selected_number(-1); break;
|
||||
case AMP2540_SEARCH: number_selection = (number_selection+1) % 4; break;
|
||||
case AMP2540_TUNERCD: alarm = !alarm; break;
|
||||
}
|
||||
last_ir = 0;
|
||||
} else {
|
||||
last_ir = val;
|
||||
#if SERIAL_DEBUG
|
||||
send_hex(touch_0.capacitiveSensor(10));
|
||||
send_hex(touch_1.capacitiveSensor(10));
|
||||
send_hex(touch_2.capacitiveSensor(10));
|
||||
send_hex(touch_3.capacitiveSensor(10));
|
||||
delay(100);
|
||||
#endif
|
||||
|
||||
// Calibrate the thresholds according to your resistors
|
||||
if(millis() > last_touch_measure + 50) {
|
||||
if(touch_0.capacitiveSensor(10) > 127 && millis() > touch_time[0] + 250) {
|
||||
touch_time[0] = millis();
|
||||
mode = (mode+1) % 3;
|
||||
}
|
||||
irrecv.resume();
|
||||
if(touch_1.capacitiveSensor(10) > 127 && millis() > touch_time[1] + 250) {
|
||||
touch_time[1] = millis();
|
||||
number_selection = (number_selection+1) % 4;
|
||||
}
|
||||
if(touch_2.capacitiveSensor(10) > 32 && millis() > touch_time[2] + 200) {
|
||||
touch_time[2] = millis();
|
||||
change_selected_number(1);
|
||||
}
|
||||
if(touch_3.capacitiveSensor(10) > 32 && millis() > touch_time[3] + 200) {
|
||||
touch_time[3] = millis();
|
||||
change_selected_number(-1);
|
||||
}
|
||||
last_touch_measure = millis();
|
||||
}
|
||||
|
||||
if(alarm && !alarm_ringing) {
|
||||
unsigned long t = ((millis() + time_offset) / 1000) % 86400;
|
||||
if(alarm_time / 1000 == t) {
|
||||
alarm_ringing = true;
|
||||
alarm_ring_start = millis();
|
||||
}
|
||||
}
|
||||
|
||||
if(alarm_ringing) {
|
||||
if(millis()%1000 < 100) {
|
||||
matrix[7] = 0b11111111;
|
||||
digitalWrite(PIN_BUZZER, HIGH);
|
||||
if(alarm_ring_start + 30000 > millis()) {
|
||||
if(millis()%1000 < 100) {
|
||||
matrix[7] = 0b11111111;
|
||||
digitalWrite(PIN_BUZZER_LOUD, LOW);
|
||||
digitalWrite(PIN_BUZZER_QUIET, HIGH);
|
||||
} else {
|
||||
matrix[7] = 0b10000001;
|
||||
digitalWrite(PIN_BUZZER_LOUD, LOW);
|
||||
digitalWrite(PIN_BUZZER_QUIET, LOW);
|
||||
}
|
||||
} else {
|
||||
matrix[7] = 0b10000001;
|
||||
digitalWrite(PIN_BUZZER, LOW);
|
||||
if(millis()%1000 < 100) {
|
||||
matrix[7] = 0b11111111;
|
||||
digitalWrite(PIN_BUZZER_LOUD, HIGH);
|
||||
digitalWrite(PIN_BUZZER_QUIET, LOW);
|
||||
} else {
|
||||
matrix[7] = 0b10000001;
|
||||
digitalWrite(PIN_BUZZER_LOUD, LOW);
|
||||
digitalWrite(PIN_BUZZER_QUIET, LOW);
|
||||
}
|
||||
}
|
||||
if(digitalRead(PIN_BUTTON) == LOW) {
|
||||
digitalWrite(PIN_BUZZER, LOW);
|
||||
digitalWrite(PIN_BUZZER_LOUD, LOW);
|
||||
digitalWrite(PIN_BUZZER_QUIET, LOW);
|
||||
alarm_ringing = false;
|
||||
}
|
||||
}
|
||||
|
|
@ -218,6 +201,9 @@ void loop() {
|
|||
|
||||
void change_selected_number(signed int nb) {
|
||||
switch(mode) {
|
||||
case MODE_NORMAL:
|
||||
if(nb > 0) alarm = true;
|
||||
else if(nb < 0) alarm = false;
|
||||
case MODE_SETTIME: change_time(&time_offset, nb); break;
|
||||
case MODE_SETALARM: change_time(&alarm_time, nb); break;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue