~rabbits/arduino-cookbook

arduino-cookbook/adafruit-playground/teatime.ino -rw-r--r-- 1.5 KiB
90bb615bDevine Lu Linvega Added teatime 5 months ago
                                                                                
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
#include <Adafruit_CircuitPlayground.h>

unsigned char bl, br, sel;
unsigned short csec, sec;

const unsigned short tune[] = { // Aphex Twin - Avril 14th
  415, 0, 698, 0, 831, 0, 1047, 0,
  523, 0, 784, 0, 1047, 0, 1245, 0,
  1047, 0, 0, 0, 698, 0, 0, 0,
  831, 0, 1109, 0, 1047, 0, 831, 0, 698
};

void setup() {
  pinMode(13, OUTPUT); // red LED
  CircuitPlayground.begin();
  sel = 1;
}

void redraw(void) {
  unsigned char active = sec / 60;
  for (unsigned char i = 0; i < 10; i++) {
    if (i == active)
      CircuitPlayground.setPixelColor(i, 0x72ffc2 * (sec & 0x1));
    else
      CircuitPlayground.setPixelColor(i, (sel ? 0xffffff : 0xff0000) * (sec / 60 > i) * !!sec);
  }
  digitalWrite(13, sec & 0x1 ? HIGH : LOW);
}

void set_sec(unsigned short s) {
  sec = s;
  csec = 0;
  sel = 1;
  redraw();
}

void handle_buttons(void) {
  if (CircuitPlayground.leftButton()) {
    if (!bl) {
      set_sec(sec < 60 ? 0 : (sec / 60) * 60 - 1);
    }
    bl = 1;
  }
  else
    bl = 0;
  if (CircuitPlayground.rightButton()) {
    if (!br) {
      set_sec(sec >= 600 ? 600 : (sec / 60) * 60 + 60);
    }
    br = 1;
  }
  else
    br = 0;
}

void on_sec(void) {
  if (!sec)
    return;
  if (sel)
    sel = 0;
  sec--;
  csec = 0;
  redraw();
}

void play_end(void) {
  for (unsigned char i = 0; i < 33; i++)
    CircuitPlayground.playTone(tune[i], 50);
  sec = 0;
  redraw();
}

void loop() {
  if (sec == 1)
    play_end();
  handle_buttons();
  if (csec++ > 100)
    on_sec();
  delay(10);
}