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

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

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

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

Arduino

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

Q&A

2回答

5791閲覧

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 11:09

前提・実現したいこと

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

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

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

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

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

###ソースコード

lang

1const int pinSwCnt = A1; //入力スイッチ 2 3//7セグピン 4const int pin7segA = 6; 5const int pin7segB = 7; 6const int pin7segC = 8; 7const int pin7segD = 9; 8const int pin7segE = 10; 9const int pin7segF = 12; 10const int pin7segG = 13; 11 12//7セグ桁制御 13const int pin7segDig1 = A3; 14const int pin7segDig2 = 2; 15const int pin7segDig3 = 3; 16const int pin7segDig4 = 4; 17 18//時間操作スイッチエッジ検出 19int swCntPrevState = 0; //1つ前のスイッチ状態 20int swCntCurrState = 0; //現在のスイッチ状態 21int swCntUpEdge = 0; //立ち上がりエッジ検出 22int pushSingle = 0; //1回押された判定 23int pushDouble = 0; //2回押された判定 24 25//時間 26long timeNow; //現在時刻 27long timeStart; //タイマー開始時刻 28long timeUpEdge; //立ち上がりエッジを検出した時間 29int numUpEdge = 0;//立ち上がりエッジを検出した回数 30int timeDisp; //表示時刻 31int setTime = 60; //設定時刻(秒単位) 32int numDisp[4]; //LEDに表示する数字 33int i; 34 35int timeState=0; //タイマー状態 0:初期 1:動作 2:完了 36 37void setup() 38{ 39 //入出力の初期化 40 pinMode( pinSwCnt, INPUT ); 41 42 pinMode( pin7segA, OUTPUT ); 43 pinMode( pin7segB, OUTPUT ); 44 pinMode( pin7segC, OUTPUT ); 45 pinMode( pin7segD, OUTPUT ); 46 pinMode( pin7segE, OUTPUT ); 47 pinMode( pin7segF, OUTPUT ); 48 pinMode( pin7segG, OUTPUT ); 49 50 pinMode( pin7segDig1, OUTPUT ); 51 pinMode( pin7segDig2, OUTPUT ); 52 pinMode( pin7segDig3, OUTPUT ); 53 pinMode( pin7segDig4, OUTPUT ); 54 55} 56 57void loop() 58{ 59 timeNow = millis(); //現在時刻の取得 60 61 62 //時間操作スイッチ立ち上がりエッジ検出 63 64 swCntCurrState = digitalRead(pinSwCnt); //現在のスイッチ状態 65 if( swCntCurrState==HIGH && swCntCurrState!=swCntPrevState ){ //現在のスイッチ状態と一つ前のスイッチ状態を比較 66 swCntUpEdge = 1; 67 if( numUpEdge == 0 ) 68 timeUpEdge = timeNow; 69 numUpEdge++; 70 } 71 else 72 swCntUpEdge = 0; 73 swCntPrevState = swCntCurrState; //一つ前のスイッチ状態 74 75 //状態の判定 76 switch(timeState){ 77 case 1: //動作 78 if( swCntUpEdge == 1){ 79 timeState = 0; 80 } 81 else if( (timeNow-timeStart)/1000>=(setTime) ){ 82 timeState = 1; 83 } 84 break; 85 86 case 2: //完了 87 if( swCntUpEdge == 1 ){ 88 timeState = 0; 89 } 90 break; 91 92 default : //初期 93 if( swCntUpEdge == 1 ){ 94 timeState = 1; 95 timeStart = timeNow; 96 } 97 break; 98 } 99 100 switch(timeState){ 101 case 1: //動作 102 timeDisp = setTime -( (timeNow-timeStart)/1000 ); //設定値から現在時刻と開始時刻の差を引いた値が表示時刻 103 break; 104 105 case 2: //完了 106 timeDisp = 0; 107 break; 108 109 default : //初期 110 timeDisp = setTime; 111 break; 112 } 113 114 //表示時刻をLEDの数字へ変更 115 numDisp[0] = timeDisp % 10; 116 numDisp[1] = ( timeDisp % 60 )/10; 117 numDisp[2] = (timeDisp/60) % 10; 118 numDisp[3] = (timeDisp/600) % 10; 119 120 pushSingle = 0; 121 pushDouble = 0; 122 123 124 //7セグLEDの制御 125 for( i=0; i<4; i++ ){ 126 switch(i){ 127 case 1: 128 digitalWrite(pin7segDig4 , HIGH ); 129 digitalWrite(pin7segDig3 , LOW ); 130 digitalWrite(pin7segDig2 , HIGH ); 131 digitalWrite(pin7segDig1 , HIGH ); 132 break; 133 134 case 2: 135 digitalWrite(pin7segDig4 , HIGH ); 136 digitalWrite(pin7segDig3 , HIGH ); 137 digitalWrite(pin7segDig2 , LOW ); 138 digitalWrite(pin7segDig1 , HIGH ); 139 break; 140 141 case 3: 142 digitalWrite(pin7segDig4 , HIGH ); 143 digitalWrite(pin7segDig3 , HIGH ); 144 digitalWrite(pin7segDig2 , HIGH ); 145 digitalWrite(pin7segDig1 , LOW ); 146 break; 147 148 default : 149 digitalWrite(pin7segDig4 , LOW ); 150 digitalWrite(pin7segDig3 , HIGH ); 151 digitalWrite(pin7segDig2 , HIGH ); 152 digitalWrite(pin7segDig1 , HIGH ); 153 break; 154 } 155 156 switch(numDisp[i]){ 157 case 1: 158 digitalWrite(pin7segA , LOW ); 159 digitalWrite(pin7segB , HIGH ); 160 digitalWrite(pin7segC , HIGH ); 161 digitalWrite(pin7segD , LOW ); 162 digitalWrite(pin7segE , LOW ); 163 digitalWrite(pin7segF , LOW ); 164 digitalWrite(pin7segG , LOW ); 165 break; 166 167 case 2: 168 digitalWrite(pin7segA , HIGH ); 169 digitalWrite(pin7segB , HIGH ); 170 digitalWrite(pin7segC , LOW ); 171 digitalWrite(pin7segD , HIGH ); 172 digitalWrite(pin7segE , HIGH ); 173 digitalWrite(pin7segF , LOW ); 174 digitalWrite(pin7segG , HIGH ); 175 break; 176 177 case 3: 178 digitalWrite(pin7segA , HIGH ); 179 digitalWrite(pin7segB , HIGH ); 180 digitalWrite(pin7segC , HIGH ); 181 digitalWrite(pin7segD , HIGH ); 182 digitalWrite(pin7segE , LOW ); 183 digitalWrite(pin7segF , LOW ); 184 digitalWrite(pin7segG , HIGH ); 185 break; 186 187 case 4: 188 digitalWrite(pin7segA , LOW ); 189 digitalWrite(pin7segB , HIGH ); 190 digitalWrite(pin7segC , HIGH ); 191 digitalWrite(pin7segD , LOW ); 192 digitalWrite(pin7segE , LOW ); 193 digitalWrite(pin7segF , HIGH ); 194 digitalWrite(pin7segG , HIGH ); 195 break; 196 197 case 5: 198 digitalWrite(pin7segA , HIGH ); 199 digitalWrite(pin7segB , LOW ); 200 digitalWrite(pin7segC , HIGH ); 201 digitalWrite(pin7segD , HIGH ); 202 digitalWrite(pin7segE , LOW ); 203 digitalWrite(pin7segF , HIGH ); 204 digitalWrite(pin7segG , HIGH ); 205 break; 206 207 case 6: 208 digitalWrite(pin7segA , HIGH ); 209 digitalWrite(pin7segB , LOW ); 210 digitalWrite(pin7segC , HIGH ); 211 digitalWrite(pin7segD , HIGH ); 212 digitalWrite(pin7segE , HIGH ); 213 digitalWrite(pin7segF , HIGH ); 214 digitalWrite(pin7segG , HIGH ); 215 break; 216 217 case 7: 218 digitalWrite(pin7segA , HIGH ); 219 digitalWrite(pin7segB , HIGH ); 220 digitalWrite(pin7segC , HIGH ); 221 digitalWrite(pin7segD , LOW ); 222 digitalWrite(pin7segE , LOW ); 223 digitalWrite(pin7segF , HIGH ); 224 digitalWrite(pin7segG , LOW ); 225 break; 226 227 case 8: 228 digitalWrite(pin7segA , HIGH ); 229 digitalWrite(pin7segB , HIGH ); 230 digitalWrite(pin7segC , HIGH ); 231 digitalWrite(pin7segD , HIGH ); 232 digitalWrite(pin7segE , HIGH ); 233 digitalWrite(pin7segF , HIGH ); 234 digitalWrite(pin7segG , HIGH ); 235 break; 236 237 case 9: 238 digitalWrite(pin7segA , HIGH ); 239 digitalWrite(pin7segB , HIGH ); 240 digitalWrite(pin7segC , HIGH ); 241 digitalWrite(pin7segD , HIGH ); 242 digitalWrite(pin7segE , LOW ); 243 digitalWrite(pin7segF , HIGH ); 244 digitalWrite(pin7segG , HIGH ); 245 break; 246 247 default : //0 248 digitalWrite(pin7segA , HIGH ); 249 digitalWrite(pin7segB , HIGH ); 250 digitalWrite(pin7segC , HIGH ); 251 digitalWrite(pin7segD , HIGH ); 252 digitalWrite(pin7segE , HIGH ); 253 digitalWrite(pin7segF , HIGH ); 254 digitalWrite(pin7segG , LOW ); 255 break; 256 } 257 258 delay(5); 259 } 260}

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

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

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

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

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

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

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

guest

回答2

0

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

投稿2018/09/11 11:39

hillacken

総合スコア359

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

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

0

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

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

投稿2018/09/11 04:11

編集2018/09/11 04:21
WoodenHamlet

総合スコア306

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問