Last active
December 3, 2018 11:54
-
-
Save anekos/5f4d7c0d39f4e1b93335227489bf6c48 to your computer and use it in GitHub Desktop.
arduino nano のスリープ機能でキッチンタイマー
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// tone.h Final Countdown melody https://forum.arduino.cc/index.php?topic=202387.0 | |
#include "TM1637.h" | |
#include <avr/sleep.h> | |
#define BUZZER_PIN 12 | |
#define WAKEUP_PIN 2 | |
#define SUB_WAKEUP_PIN 3 | |
#define NANA_SEG_CLK 10 | |
#define NANA_SEG_DIO 9 | |
#define TIME_0 10 | |
#define TIME_1 60 | |
TM1637 tm1637(NANA_SEG_CLK, NANA_SEG_DIO); | |
volatile int count = 0; | |
volatile int reset = false; | |
const int e = 329; | |
const int f = 349; | |
const int fS = 369; | |
const int g = 392; | |
const int a = 440; | |
const int b = 494; | |
const int c = 523; | |
const int ts[8] = {262, 294, 330, 349, 392, 440, 494, 523}; | |
const int tslen = sizeof ts / sizeof ts[0]; | |
void wakeup(); | |
void setup() { | |
pinMode(BUZZER_PIN, OUTPUT); | |
pinMode(WAKEUP_PIN, INPUT_PULLUP); | |
pinMode(SUB_WAKEUP_PIN, OUTPUT); | |
tm1637.init(); | |
tm1637.set(BRIGHTEST); | |
attachInterrupt(digitalPinToInterrupt(WAKEUP_PIN), wakeup, RISING); | |
set_sleep_mode(SLEEP_MODE_PWR_DOWN); | |
sleep_mode(); | |
} | |
void show_time(int time, boolean dots) { | |
int8_t digits[4] = { | |
time / 60 / 10, | |
time / 60 % 10, | |
time % 60 / 10, | |
time % 60 % 10, | |
}; | |
tm1637.point(dots); | |
tm1637.display(digits); | |
} | |
void loop() { | |
int count = 1; | |
show_time(count * 60, true); | |
while (digitalRead(WAKEUP_PIN)) { | |
delay(1); | |
} | |
while (true) { | |
beep(c, 16); | |
int limit = 1000; | |
while (!digitalRead(WAKEUP_PIN)) { | |
delay(1); | |
limit--; | |
if (limit <= 0) | |
goto COUNTED; | |
} | |
if (0 < limit) | |
count++; | |
show_time(count * 60, true); | |
while (digitalRead(WAKEUP_PIN)) { | |
delay(1); | |
} | |
} | |
COUNTED: | |
reset = false; | |
beep(fS, 4); | |
int remain = count * 60; | |
boolean pointed = true; | |
boolean first = true; | |
for (; 0 <= remain && !reset; remain--) { | |
show_time(remain, pointed ^= 1); | |
delay(500); | |
show_time(remain, pointed ^= 1); | |
int before = millis(); | |
int minutes = remain / 60; | |
if (!first) { | |
if ((remain % 60) == 0) { | |
if (minutes <= tslen) { | |
for (; 0 < minutes; minutes--) { | |
beep(ts[min(minutes, tslen) - 1], 32); | |
delay(50); | |
} | |
} | |
} | |
} | |
int beep_time = millis() - before; | |
if (beep_time < 500) | |
delay(500 - beep_time); | |
first = false; | |
} | |
if (!reset) { | |
final_coundown(); | |
} else { | |
beep(e, 1); | |
} | |
tm1637.point(false); | |
tm1637.clearDisplay(); | |
sleep_mode(); | |
} | |
void wakeup() { | |
reset = true; | |
} | |
const int Tempo = (60000 / 128) * 4; | |
void final_coundown() { | |
first_line(); | |
second_line(); | |
third_line() ; | |
forth_line(); | |
fifth_line(); | |
} | |
void beep(int note, int duration) | |
{ | |
tone(BUZZER_PIN, note,Tempo / duration); | |
delay(Tempo / duration); | |
noTone(BUZZER_PIN); | |
delay(50); | |
} | |
void first_line() | |
{ | |
beep(g, 4); | |
beep(b, 16); | |
beep(a, 16); | |
beep(b, 4); | |
beep(e, 4); | |
//----------------- | |
delay(Tempo / 4); | |
delay(Tempo / 8); | |
beep(c, 16); | |
beep(b, 16); | |
beep(c, 8); | |
beep(b, 8); | |
beep(a, 4); | |
//----------------- | |
delay(Tempo / 4); | |
delay(Tempo / 8); | |
beep(c, 16); | |
beep(b, 16); | |
beep(c, 4); | |
beep(e, 4); | |
//----------------- | |
beep(fS, 4); | |
delay(Tempo / 4); | |
beep(a, 16); | |
beep(g, 16); | |
beep(a, 8); | |
beep(g, 8); | |
beep(fS, 8); //sharp | |
beep(a, 8); | |
//----------------- | |
} | |
void second_line() { | |
beep(g, 4); | |
delay(Tempo / 4); | |
beep(b, 16); | |
beep(a, 16); | |
beep(b, 4); | |
beep(e, 4); | |
//----------------- | |
delay(Tempo / 8); | |
delay(Tempo / 4); | |
beep(c, 16); | |
beep(b, 16); | |
beep(c, 8); | |
beep(b, 8); | |
beep(a, 4); | |
//----------------- | |
delay(Tempo / 8); | |
delay(Tempo / 4); | |
beep(b, 16); | |
beep(a, 16); | |
beep(b, 4); | |
beep(e, 4); | |
//----------------- | |
beep(fS, 4); //sharp | |
delay(Tempo / 4); | |
beep(a, 16); | |
beep(g, 16); | |
beep(a, 8); | |
beep(g, 8); | |
beep(fS, 8); //sharp | |
beep(a, 8); | |
} | |
void third_line() { | |
beep(g, 3); | |
beep(fS, 16); //sharp | |
beep(g, 16); | |
beep(a, 3); | |
beep(g, 16); | |
beep(a, 16); | |
//----------------- | |
beep(b, 8); | |
beep(a, 8); | |
beep(g, 8); | |
beep(fS, 8); //sharp | |
beep(e, 4); | |
beep(b, 4); | |
//----------------- | |
beep(c, 1); | |
//----------------- | |
//beep(c, 1); | |
//----------------- | |
beep(g, 4); | |
delay(Tempo / 4); | |
beep(b, 16); | |
beep(a, 16); | |
beep(b, 4); | |
beep(e, 4); | |
//----------------- | |
delay(Tempo / 8); | |
delay(Tempo / 4); | |
beep(c, 16); | |
beep(b, 16); | |
beep(c, 8); | |
beep(b, 8); | |
beep(a, 8); | |
//----------------- | |
} | |
void forth_line() { | |
delay(Tempo / 8); | |
delay(Tempo / 4); | |
beep(c, 16); | |
beep(b, 16); | |
beep(c, 4); | |
beep(e, 4); | |
//----------------- | |
beep(fS, 4); | |
delay(Tempo / 4); | |
beep(a, 16); | |
beep(g, 16); | |
beep(a, 8); | |
beep(g, 8); | |
beep(fS, 8); //sharp | |
beep(a, 8); | |
//----------------- | |
beep(g, 4); | |
delay(Tempo / 4); | |
beep(b, 16); | |
beep(a, 16); | |
beep(b, 4); | |
beep(e, 4); | |
//----------------- | |
delay(Tempo / 8); | |
delay(Tempo / 4); | |
beep(c, 16); | |
beep(b, 16); | |
beep(c, 8); | |
beep(b, 8); | |
beep(a, 4); | |
//----------------- | |
delay(Tempo / 8); | |
delay(Tempo / 4); | |
beep(c, 16); | |
beep(b, 16); | |
beep(c, 4); | |
beep(e, 4); | |
} | |
void fifth_line() { | |
beep(fS, 4); | |
delay(Tempo / 4); | |
beep(a, 16); | |
beep(g, 16); | |
beep(a, 8); | |
beep(g, 8); | |
beep(fS, 8); //sharp | |
beep(a, 8); | |
//----------------- | |
beep(g, 3); | |
beep(fS, 16); //sharp | |
beep(g, 16); | |
beep(a, 3); | |
beep(g, 16); | |
beep(a, 16); | |
//----------------- | |
beep(b, 8); | |
beep(a, 8); | |
beep(g, 8); | |
beep(fS, 8); //sharp | |
beep(e, 4); | |
beep(b, 4); | |
//----------------- | |
beep(c, 1); | |
//----------------- | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment