フライドポテトが食べたくなるタイマーの作り方【Arduino】

フライドポテトタイマー 電子工作
フライドポテトタイマー
この記事は約6分で読めます。

フライドポテトが食べたくなるタイマーとは

百聞は一見にしかず。
ご覧下さい。

フライドポテト、食べたくなりませんか?

作り方

材料

  • マイコン(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年前の作品です。
現在制作中の作品でタイマーを使いたくなったので、タイマーの回路を作るついでに当時のものを復元しました。
コードは当時のものを再利用ですが、見返してみると可読性が低いコードがいくつかあったので修正しました。
ちょっとは成長しているってことですかね。

コメント

タイトルとURLをコピーしました