Skip to content

Instantly share code, notes, and snippets.

@anekos
Last active December 3, 2018 11:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anekos/5f4d7c0d39f4e1b93335227489bf6c48 to your computer and use it in GitHub Desktop.
Save anekos/5f4d7c0d39f4e1b93335227489bf6c48 to your computer and use it in GitHub Desktop.
arduino nano のスリープ機能でキッチンタイマー
// 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