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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

2154閲覧

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

ReiNakagawa

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2018/09/08 10:42

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
Arudino R3 互換ボードを用いてタイマーを創りたいです。

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

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

まず一分のカウントダウンのタイマーを作成しようと始めました。 以下のソースコードだと、ディスプレイ上には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/ツールのバージョンなど)

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

スイッチ入力には、チャタリングというのが発生します
このため、スイッチのOFF時にもスイッチ立ち上がりと判定される場合があります
ということで、スイッチ入力は単純なポート読み出しだけではなく、これにチャタリング除去のコードを付加する必要があります

具体的には、スイッチ状態入力が変化した場合、一定時間(10ms程度)待ってから再度読み出し、レベルが同一であれば、これをスイッチのレベルとして処理します
このとき、レベルが違っていれば、これを無視します

投稿2018/09/08 11:47

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ReiNakagawa

2018/09/08 11:49

回答ありがとうございます。 具体的なソースコードってご教示していただけますか?
y_waiwai

2018/09/08 11:52

「チャタリング除去」でぐぐるといろいろ記事が引っかかりますんで、参照してください。 あなた自身でこれだけのコードを書いたのだから、コードを出す必要はないでしょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問