このような単純なプログラムの場合、実行したようなビジーなループを使用すると問題ありません。しかし、私はおもちゃのプロジェクト以上のものでは受け入れられないことが多いので、習慣から脱却することを提案します。
ボタンをデバウンスするには、コードを書く人がいるのと同じくらい多くの方法があります。ハードウェアで行うことは、場合によっては行こうとするかもしれませんが、欠点がないわけではありません。いずれにしても、これはプログラミングサイトなので、ハードウェアを変更できない(またはしたくない)と仮定しましょう。
メインループ内のボタンを定期的にチェックし、変更された場合にのみ行動します。Cや組み込みプログラミングに慣れていないので、私はタイマーや割り込みを避けますが、コードを理解すればコードを理解しやすく保守しやすくすることができます。
#include <bcm2835.h>
#include <stdio.h>
#define PIN RPI_GPIO_P1_11
// A decent value for the number of checks varies with how "clean" your button is, how
// responsive you need the system to be, and how often you call the helper function. That
// last one depends on how fast your CPU is and how much other stuff is going on in your
// loop. Don't pick a value above UINT_MAX (in limits.h)
#define BUTTON_DEBOUNCE_CHECKS 100
int ButtonPress()
{
static unsigned int buttonState = 0;
static char buttonPressEnabled = 1;
if(bcm2835_gpio_lev(PIN))
{
if(buttonState < BUTTON_DEBOUNCE_CHECKS)
{
buttonState++;
}
else if(buttonPressEnabled)
{
buttonPressEnabled = 0;
return 1;
}
}
else if(buttonState > 0)
{
buttonState--;
// alternatively you can set buttonState to 0 here, but I prefer this way
}
else
{
buttonPressEnabled = 1;
}
return 0;
}
int main()
{
if(!bcm2835_init())
return 1;
bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_INPT);
while(1)
{
if(ButtonPress())
{
printf("The button has been pressed\n");
}
// the rest of your main loop code
}
bcm2835_close();
return 0;
}
「ボタンデバウンシング」のGoogle検索が役立つかもしれません。 –
その技術用語を知ることで、私はそれを調べることができます。ありがとうございました – Marmstrong
幸いです - 私はそれが答えを保証するとは思わなかったが、検索するために適切な用語を持っていることは時々本当に助けになる! –