フライドポテトが食べたくなるタイマーとは
百聞は一見にしかず。
ご覧下さい。
フライドポテト、食べたくなりませんか?
作り方
材料
- マイコン(Arduino互換機)×1
- 4桁7セグメントLED×1
- 圧電スピーカー×1
- 抵抗×8
- ジャンパワイヤ(オス-オス)×14
パーツはすべてこのキットに入っているものを使います。
4桁7セグメントLEDとは↓こういうやつです。
タイマーとして使うなら、本当は中央にコロン「:」があるものを使うのが良いでしょうが、手元にこれしかありませんでした。
細かいことは気にせず作ります。
配線
残り時間の表示として、4桁7セグメントLEDを使います。
これの配線がものすごく面倒です。
むしろここさえ乗り切れば、後はそこまで大変ではありません。
スピーカーは、ジャンパワイヤ2本だけなので、すぐに配線が終わります。
プログラム
時間計測のためにライブラリとしてMsTimerを使用します。
コンパイル前にArduino IDEに取り込んでおきます。
コードをマイコンボードに書き込んで完成です。
//7セグメントで任意の秒数のタイマーを表示
#include <MsTimer2.h>
#define SEC 180 //測定する秒数
///////////////////////////////////////////////
//残り時間
int sec = SEC;
//各セグメントのピン(a~h)
int seg_pin[8] = {2, 3, 4, 5, 6, 7, 8, 9};
//桁のピン(d1~d4)
int dig_pin[4] = {10, 11, 12, 13} ;
//スピーカーのピン
int spk_pin = A5;
//数値表示の配列を定義
//使用する4桁7セグメントは、LOWのピンが光る
boolean numArray[10][8]={
{0,0,0,0,0,0,1,1}, //0
{1,0,0,1,1,1,1,1}, //1
{0,0,1,0,0,1,0,1}, //2
{0,0,0,0,1,1,0,1}, //3
{1,0,0,1,1,0,0,1}, //4
{0,1,0,0,1,0,0,1}, //5
{0,1,0,0,0,0,0,1}, //6
{0,0,0,1,1,0,1,1}, //7
{0,0,0,0,0,0,0,1}, //8
{0,0,0,0,1,0,0,1} //9
};
///////////////////////////////////////////////
//分秒表示関数
void minSec(int sec);
//数値表示関数(各桁ごと)
//(引数)digit:桁(右から数えてdigit番目) num:表示したい数字
void numPrint(int digit, int num);
//全てのセグメントを消す
void Clear();
///////////////////////////////////////////////
void setup() {
// put your setup code here, to run once:
int i;
for(i = 0; i < 8; i++){
pinMode(seg_pin[i], OUTPUT);
}
for(i = 0; i < 4; i++){
pinMode(dig_pin[i], OUTPUT);
}
pinMode(spk_pin, OUTPUT);
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
// 分秒の区切りとしてドットを表示
digitalWrite(dig_pin[2], HIGH);
digitalWrite(dig_pin[0], LOW);
digitalWrite(dig_pin[1], LOW);
digitalWrite(dig_pin[3], LOW);
digitalWrite(seg_pin[7], LOW);
Clear();
//millis()で経過時間(ミリ秒)を取得
if(sec > 0){
sec = SEC - millis() / 1000;
}else{
sec = 0;
}
Serial.println(sec);
minSec(sec);
while(sec <= 0){
//メロディーを流す
tone(spk_pin, 784, 250);
delay(250);
tone(spk_pin, 698, 250);
delay(250);
tone(spk_pin, 784, 250);
delay(500);
}
}
///////////////////////////////////////////////77
//分秒表示関数
void minSec(int sec){
int i;
//分の表示
int dsp_min = sec / 60;
for(i = 3; i <= 4; i++){
int dsp_num = dsp_min % 10;
numPrint(i, dsp_num);
dsp_min = dsp_min / 10;
}
//秒の表示
int dsp_sec = sec % 60;
for(i = 1; i <= 2; i++){
int dsp_num = dsp_sec % 10;
numPrint(i, dsp_num);
dsp_sec = dsp_sec / 10;
}
}
//数値表示関数(各桁ごと)
//(引数)digit:桁(右から数えてdigit番目) num:表示したい数字
void numPrint(int digit, int num){
int i;
for(i = 1; i <= 4; i++){
if(i == digit){
digitalWrite(dig_pin[i - 1], HIGH);
}else{
digitalWrite(dig_pin[i - 1], LOW);
}
}
for(i = 0; i < 8; i++){
digitalWrite(seg_pin[i], numArray[num][i]);
}
Clear();
}
//全てのセグメントを消す
void Clear(){
for(int i = 0; i < 8; i++){
digitalWrite(seg_pin[i], HIGH);
}
}
感想
やっぱりポテトが食べたくなります。
ちなみにこれ、1~2年前の作品です。
現在制作中の作品でタイマーを使いたくなったので、タイマーの回路を作るついでに当時のものを復元しました。
コードは当時のものを再利用ですが、見返してみると可読性が低いコードがいくつかあったので修正しました。
ちょっとは成長しているってことですかね。
コメント