質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.64%

Arudinoを用いて1分タイマーを創りたいです。

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,853

ReiNakagawa

score 7

 前提・実現したいこと

Arudino R3 互換ボードを用いてタイマーを創りたいです。

タイマーの構造としてはボタンが1つ。
ボタンを押すと1分のカウントダウンが液晶画面に表示され始まります。
タイマーが00:00秒になったとき、
再び自動的に1分のカウントダウンが始まるの無限ループのフローです。

発生している問題・エラーメッセージ

まず一分のカウントダウンのタイマーを作成しようと始めました。
以下のソースコードだと、ディスプレイ上には01:00での待機画面で表示されているのですが、
ボタンを押してもカウントダウンしません。
ボタンを押している間のみカウントダウンが始まる結果です。
ボタンを離すと01:00の待機画面に戻ってしまいます。

なんとか完成させたいです。お願いいたします。

ソースコード

const int pinSwCnt   = A1; //入力スイッチ

//7セグピン
const int pin7segA  = 6;
const int pin7segB  = 7;
const int pin7segC  = 8;
const int pin7segD  = 9;
const int pin7segE  = 10;
const int pin7segF  = 12;
const int pin7segG  = 13;

//7セグ桁制御
const int pin7segDig1 = A3;
const int pin7segDig2 = 2;
const int pin7segDig3 = 3;
const int pin7segDig4 = 4;

//時間操作スイッチエッジ検出
int swCntPrevState = 0;  //1つ前のスイッチ状態
int swCntCurrState = 0;  //現在のスイッチ状態
int swCntUpEdge    = 0;  //立ち上がりエッジ検出
int pushSingle = 0; //1回押された判定
int pushDouble = 0; //2回押された判定

//時間
long timeNow;  //現在時刻
long timeStart;  //タイマー開始時刻
long timeUpEdge; //立ち上がりエッジを検出した時間
int  numUpEdge = 0;//立ち上がりエッジを検出した回数
int timeDisp;  //表示時刻
int setTime = 60; //設定時刻(秒単位)
int  numDisp[4];  //LEDに表示する数字
int  i;

int timeState=0; //タイマー状態 0:初期 1:動作 2:完了 

void setup()
{
  //入出力の初期化
  pinMode( pinSwCnt, INPUT );

  pinMode( pin7segA,  OUTPUT );
  pinMode( pin7segB,  OUTPUT );
  pinMode( pin7segC,  OUTPUT );
  pinMode( pin7segD,  OUTPUT );
  pinMode( pin7segE,  OUTPUT );
  pinMode( pin7segF,  OUTPUT );
  pinMode( pin7segG,  OUTPUT );

  pinMode( pin7segDig1,  OUTPUT );
  pinMode( pin7segDig2,  OUTPUT );
  pinMode( pin7segDig3,  OUTPUT );
  pinMode( pin7segDig4,  OUTPUT );

}

void loop()
{
  timeNow = millis();  //現在時刻の取得


  //時間操作スイッチ立ち上がりエッジ検出

  swCntCurrState = digitalRead(pinSwCnt); //現在のスイッチ状態 
  if( swCntCurrState==HIGH && swCntCurrState!=swCntPrevState ){ //現在のスイッチ状態と一つ前のスイッチ状態を比較
    swCntUpEdge = 1;
    if( numUpEdge == 0 )
      timeUpEdge = timeNow;
    numUpEdge++;
  }
  else
    swCntUpEdge = 0;
  swCntPrevState = swCntCurrState; //一つ前のスイッチ状態

  //状態の判定
  switch(timeState){
    case 1: //動作
     if( swCntUpEdge == 1){
       timeState = 0;
     }
     else if( (timeNow-timeStart)/1000>=(setTime) ){
       timeState = 1;
     }
     break;

    case 2: //完了
     if( swCntUpEdge == 1 ){
       timeState = 0;
     }
     break;

   default : //初期
     if( swCntUpEdge == 1 ){
       timeState = 1;
       timeStart = timeNow;
     }
     break;
  }

  switch(timeState){
    case 1: //動作
      timeDisp = setTime -( (timeNow-timeStart)/1000 );  //設定値から現在時刻と開始時刻の差を引いた値が表示時刻
      break;

    case 2: //完了
      timeDisp = 0;
      break;

   default : //初期
     timeDisp = setTime;
     break;
  }

  //表示時刻をLEDの数字へ変更
  numDisp[0] = timeDisp % 10;
  numDisp[1] = ( timeDisp % 60 )/10;
  numDisp[2] = (timeDisp/60) % 10;
  numDisp[3] = (timeDisp/600) % 10;

  pushSingle = 0;
  pushDouble = 0;


  //7セグLEDの制御
  for( i=0; i<4; i++ ){
    switch(i){
      case 1:
        digitalWrite(pin7segDig4  , HIGH  );
        digitalWrite(pin7segDig3  , LOW   );
        digitalWrite(pin7segDig2  , HIGH  );
        digitalWrite(pin7segDig1  , HIGH  );
        break;

      case 2:
        digitalWrite(pin7segDig4  , HIGH  );
        digitalWrite(pin7segDig3  , HIGH  );
        digitalWrite(pin7segDig2  , LOW   );
        digitalWrite(pin7segDig1  , HIGH  );
        break;

      case 3:
        digitalWrite(pin7segDig4  , HIGH  );
        digitalWrite(pin7segDig3  , HIGH  );
        digitalWrite(pin7segDig2  , HIGH  );
        digitalWrite(pin7segDig1  , LOW   );
        break;

     default :
        digitalWrite(pin7segDig4  , LOW   );
        digitalWrite(pin7segDig3  , HIGH  );
        digitalWrite(pin7segDig2  , HIGH  );
        digitalWrite(pin7segDig1  , HIGH  );
        break;
    }

    switch(numDisp[i]){
      case 1:
        digitalWrite(pin7segA  , LOW  );
        digitalWrite(pin7segB  , HIGH );
        digitalWrite(pin7segC  , HIGH );
        digitalWrite(pin7segD  , LOW  );
        digitalWrite(pin7segE  , LOW  );
        digitalWrite(pin7segF  , LOW  );
        digitalWrite(pin7segG  , LOW  );
        break;

      case 2:
        digitalWrite(pin7segA  , HIGH );
        digitalWrite(pin7segB  , HIGH );
        digitalWrite(pin7segC  , LOW  );
        digitalWrite(pin7segD  , HIGH );
        digitalWrite(pin7segE  , HIGH );
        digitalWrite(pin7segF  , LOW  );
        digitalWrite(pin7segG  , HIGH );
        break;

      case 3:
        digitalWrite(pin7segA  , HIGH );
        digitalWrite(pin7segB  , HIGH );
        digitalWrite(pin7segC  , HIGH );
        digitalWrite(pin7segD  , HIGH );
        digitalWrite(pin7segE  , LOW  );
        digitalWrite(pin7segF  , LOW  );
        digitalWrite(pin7segG  , HIGH );
        break;

      case 4:
        digitalWrite(pin7segA  , LOW  );
        digitalWrite(pin7segB  , HIGH );
        digitalWrite(pin7segC  , HIGH );
        digitalWrite(pin7segD  , LOW  );
        digitalWrite(pin7segE  , LOW  );
        digitalWrite(pin7segF  , HIGH );
        digitalWrite(pin7segG  , HIGH );
        break;

      case 5:
        digitalWrite(pin7segA  , HIGH );
        digitalWrite(pin7segB  , LOW  );
        digitalWrite(pin7segC  , HIGH );
        digitalWrite(pin7segD  , HIGH );
        digitalWrite(pin7segE  , LOW  );
        digitalWrite(pin7segF  , HIGH );
        digitalWrite(pin7segG  , HIGH );
        break;

      case 6:
        digitalWrite(pin7segA  , HIGH );
        digitalWrite(pin7segB  , LOW  );
        digitalWrite(pin7segC  , HIGH );
        digitalWrite(pin7segD  , HIGH );
        digitalWrite(pin7segE  , HIGH );
        digitalWrite(pin7segF  , HIGH );
        digitalWrite(pin7segG  , HIGH );
        break;

      case 7:
        digitalWrite(pin7segA  , HIGH );
        digitalWrite(pin7segB  , HIGH );
        digitalWrite(pin7segC  , HIGH );
        digitalWrite(pin7segD  , LOW  );
        digitalWrite(pin7segE  , LOW  );
        digitalWrite(pin7segF  , HIGH );
        digitalWrite(pin7segG  , LOW  );
        break;

      case 8:
        digitalWrite(pin7segA  , HIGH );
        digitalWrite(pin7segB  , HIGH );
        digitalWrite(pin7segC  , HIGH );
        digitalWrite(pin7segD  , HIGH );
        digitalWrite(pin7segE  , HIGH );
        digitalWrite(pin7segF  , HIGH );
        digitalWrite(pin7segG  , HIGH );
        break;

      case 9:
        digitalWrite(pin7segA  , HIGH );
        digitalWrite(pin7segB  , HIGH );
        digitalWrite(pin7segC  , HIGH );
        digitalWrite(pin7segD  , HIGH );
        digitalWrite(pin7segE  , LOW  );
        digitalWrite(pin7segF  , HIGH );
        digitalWrite(pin7segG  , HIGH );
        break;

      default :  //0
        digitalWrite(pin7segA  , HIGH );
        digitalWrite(pin7segB  , HIGH );
        digitalWrite(pin7segC  , HIGH );
        digitalWrite(pin7segD  , HIGH );
        digitalWrite(pin7segE  , HIGH );
        digitalWrite(pin7segF  , HIGH );
        digitalWrite(pin7segG  , LOW  );
        break;
    }

    delay(5);
  }
}

 補足情報(FW/ツールのバージョンなど)

rudino R3 互換ボード
4桁LEDデジタル表示管
タクトスイッチ2つ
抵抗

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

スイッチのチャタリング(スイッチを入れた瞬間の物理的な接触が不安定な瞬間におこる激しいON-OFFの変化)を防止するようなコーディングをしてみてはどうでしょう

swCntPrevStateの初期値が直値 0 ですが、これはHIGH/LOWどちらになりますか?また、それは正しい値ですか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

HIGHからLOWにしたらいかがでしょうか?
if( swCntCurrState==LOW && swCntCurrState!=swCntPrevState )

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる