Счетчик нажатий кнопки
- Войдите на сайт для отправки комментариев
Пока жду из Поднебесной реальное железо, решил опробовать в эмуляции. Использую Proteus.
Программа должна считать нажатия кнопки и выводить результат на LCD. На дисплее 3 числа: счетчик, состояние кнопки, переменная prevValue
Собрал вот такую схему
и написал вот такой код
// include the library code: #include <LiquidCrystal.h> // initialize the library with the numbers of the interface pins LiquidCrystal lcd(12, 11, 5, 4, 3, 2); int buttonPin = 13; int counter=0; int prevValue=0; void setup() { pinMode(buttonPin, INPUT); lcd.begin(16, 2); } void loop() { lcd.setCursor(0, 0); boolean bs = digitalRead (buttonPin); if(bs == HIGH && prevValue==0) { prevValue=1; counter++; } if(bs == LOW) { prevValue=0; } lcd.print(counter); lcd.setCursor(5, 0); lcd.print(bs); lcd.setCursor(10, 0); lcd.print(prevValue); }
Все работает, но не совсем так, как задумывалось. А именно: счетчик прибавляется только после нажатия кнопки. И, соотвественно когда кнопка нажата, то ее состояние 0 (LOW), хотя должно быть 1 (High)
т.е. по сути значения нажатой и отпущенной перепутаны
Вопрос: почему это? глюк эмулятора? неправильно собранная схема (знаю, что в живой системе нужны резисторы, но вроде они не нужны на эмуляциии)? а может я программу написал неправильно? (хотя уж что там неправильного то?)
Был бы очень благодарен, если бы кто-нибудь на живом девайсе попробовал.
Допустил опечатку: правильно читать только после ОТЖАТИЯ кнопки
т.е. счетчик прибавляется, если нажать, а потом отжать
все остальное верно, т.к. при нажатой кнопке выдается LOW а при отпущенной HIGH
Когда кнопка не нажата, вход болтается в воздухе, нужна подтяжка к питанию.
При нажатии кнопки что будет на входе?
Кто сказал, что в эмуляторе резисторы не нужны?
При старте программы сразу отображается 1 1 0? Странно?
В данной задаче не важно, 0 при нажатии или 1.
pinMode(buttonPin, INPUT_PULLUP);
kisoft: а в эмуляторе нет выхода с питанием +5В
как тогда поступить?
и кстати при старте с отпщенной кнопкой отображается 1 1 1, а с зажатой 0 0 0
и в принципе именно для данной задачи разницы нет, но все равно же причину хочется понять
mutis: не помогло:(
kisoft: а в эмуляторе нет выхода с питанием +5В
как тогда поступить?
и кстати при старте с отпщенной кнопкой отображается 1 1 1,
Добавить питание +5В.
Я писал про старт программы без нажатия кнопок. По логике 1 1 0 должно быть.
Для INPUT_PULLUP схема правильная. Если надо поменять местами читаемое значение, поставьте перед digitalRead() восклицательный знак.
kisoft: добавление питания не изменило ничего, схема ниже
при старте с отпущенной кнопкой 1 1 1 вместо 1 1 0 отображается потому, что выводится уже измененное prevValue
т.е. у нас начальное значение 0, потом проверка условия и т.к. bs == HIGH то prevValue становится равным единице
std: так это понятно, что если поменять местами HIGH и LOW то все работает
вопросто именно в том почему так происходит
чето и я ступил и никто не заметил
кнопку то надо было подключать к 5 вольтам, а не к земле
вот правильная схема, все работает:)
Да уж #здравствуйжопановыйгод, мы тут все про это говорим, предлагаем варианты (инверсия данных с пина), но оказывается, ТС единственный, кто этого не понимает. Эхх
ну новичок я, да:)