Я пытаюсь написать код, чтобы светодиод включался, когда он выключен, и выключался, когда он включался с помощью тактильного кнопочного переключателя. Я написал, как мне кажется, правильный код с библиотекой wiringPi, но я могу только включить его, когда он выключен, и не могу его отключить после этого. В очень редких случаях и после многократных нажатий светодиод гаснет, когда он включен, и я нажимаю кнопку, но я уверен, что это не так, как это должно работать.
#include <wiringPi.h>
int main (void)
{
wiringPiSetup ();
pinMode (0, OUTPUT);
pinMode (1, INPUT);
digitalWrite (0, LOW);
for(;;)
{
if(digitalRead (1) == LOW)
{
if(digitalRead (0) == HIGH)
digitalWrite (0, LOW);
else if(digitalRead (0) == LOW)
digitalWrite (0, HIGH);
}
}
return 0;
}
Я приложил изображение, как схема подключена.
Ответы:
Проводка выглядит правильно для кода.
Проблема в том, что код находится в очень узком цикле. Теоретически, когда кнопка нажата, тело цикла многократно включает и выключает светодиод. Теоретически, когда кнопка отпущена, светодиод будет включен (или выключен) с вероятностью 50/50. Вы заметили изменение яркости при нажатии кнопки. Там может быть недостаточно, чтобы быть замеченным.
На практике причина того, что светодиод остается включенным, заключается в том, как вы проверяете, включен ли он. Контактный вывод 0 HIGH подает 3,3 В на выход. Но этот провод подключен к светодиоду, а вывод настроен на выход. Светодиод может сбрасывать напряжение достаточно низко, чтобы не регистрироваться как ВЫСОКОЕ, когда он читается, но иногда это происходит, потому что он близок к отключению.
На практике код для выключения и включения светодиода при каждом нажатии кнопки будет использовать прерывание, вызванное падающим фронтом. Как указано в комментариях, вы бы хотели отменить прерывание в этом случае. Вы также можете сделать то же самое без прерываний, записав предыдущее состояние кнопки и меняя светодиод только тогда, когда состояние кнопки изменилось. Дебейсинг, когда код написан, теперь не имеет смысла.
источник
Вероятно, проще поддерживать «состояние» в нормальных переменных, чем пытаться вывести его из текущего состояния GPIO.
Также «занятый цикл» будет потреблять каждый цикл ЦПУ, который ОС будет разрешать процессу; для такого простого процесса вы увидите, что загрузка вашего процессора возрастет до 100%! Вы должны позволить процессу передавать ЦП другим задачам, например, с помощью
usleep()
вызова. Задержка также будет служить для сброса переключателя.источник