ここから本文です

一定時間内に押されたボタンの回数をカウントする方法

rin********さん

2012/11/500:38:40

一定時間内に押されたボタンの回数をカウントする方法

c言語初心者です。

whileで任意の回数ループする間に、ボタンを何回押せたかカウントするプログラムを作りたいのですが、上手くいきません。

思いついたプログラムは
while(count < 50){
count++;
if(ボタンをおしたら){
cnt++;
}
}
printf("%d", cnt);

なのですが、これではボタンを一回押しても数回カウントされてしまいます。

一回押したら、一回とカウントするようにするにはどうしたらいいでしょうか?

あと、while文にはこだわりません。
一定時間に押せたボタンの回数を知るためのより良いコードがありましたら、教えていただけたら幸いです。

よろしくお願いいたします。

補足知恵袋の使い方がよくわっていないので、ここで返答さえていただきます。
外部ハードウェアとキーボードでプログラムが変わってくるとは思いませんでした。

ajjfllさん 回答ありがとうございます。
今回は外部ハードウェアの方の話でしたが、サンプルプログラムは初心者の自分にはありがたいです。
勉強になります。

閲覧数:
2,517
回答数:
2
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

qui********さん

2012/11/515:44:39

過去の質問でmbedとか出てますから組み込みマイコンの話として...

if(ボタンをおしたら){
ここはちゃんと考えなきゃいけません。
ボタンを押した時(ボタンが押されていない状態から押されている状態に変化したら)
それとも
ボタンが押されているなら(いま、ボタンが押されているかどうか)
でしょうか。どちらであるのかによって対策は変わります。

・ボタンを押した時、の場合
チャタリング(機械的な接点の切替の際に接点構造が微妙にバウンドしたりして、マイコンから見るとしばらく付いたり離れたりしているようにみえる現象)が考えられます。一度ONを検出してから、人間にとっては充分に短い時間、マイコンにとっては充分長い時間「不感時間」を設けてみましょうか。

/* 値は適宜調整。小さすぎると複数カウントしてしまうし大きすぎると取りこぼす*/
#define TH 3

disable=TH+1;
while(count <50){
count++;
if(disable>TH){
if(ボタンをおしたら){
cnt++;
disable=0;
}}else{
disable++;
}
}
printf("%d",cnt);

・ボタンが押されている時、の場合
一度押されたら、ボタンが離されるまで次のカウントをしないというのが考え方でしょう。
もちろん、こちらもチャタリングの影響を受けます。

#define TH 3

int stable=0;
int ready=1;

while(count < 50){
count++;

if(ボタンをおしたら){
if(++stable>TH && ready){ /* ループでTH回連続ボタンが押されていて、かつその前は押されていなかった状態 */
cnt++;
ready=0; /*ボタンを離すまでreadyは1にならない*/
}
}else{
ready=1;
stable=0;
}
}
printf("%d", cnt);

質問した人からのコメント

2012/11/6 13:07:25

回答ありがとうございます。
教えていただいたプログラムを使ってみましたが、うまくいきませんでした。

count と TH 値をいろいろと変えてみましたが、連打しても、押しっぱなしでもループ中にカウントできる最大値が表示されるだけです。

状況が正確に説明できてないかもしれませんが、わかりましたら教えてください。

ベストアンサー以外の回答

1〜1件/1件中

ajj********さん

2012/11/510:02:16

>rinpo3さん
>一定時間内に押されたボタンの回数をカウントする方法
>c言語初心者です。

外部ハードウェアは実装方法でプログラムが変わります。
キーボードをカウントする場合の例を作りましたので参考にして下さい。

#include <stdio.h>
#include <time.h>
#include <conio.h>

int main(void)
{
time_t st;
int cnt=0;

st=time(NULL);
puts("これから5秒間に何回キーを打てるか判定します。");
puts("適当なキーを乱打して下さい。");
while(1)
{
if(difftime(time(NULL),st) > 5.0) break; // 5秒経過
if(kbhit()) // コンパイラ依存関数
{
cnt++;
getche(); // 入力クリヤ、コンパイラ依存関数
}
}
printf("\nキー回数=%d回です。\n", cnt);
return 0;
}

あわせて知りたい

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる