Счетчик нажатий кнопки

Hamulus
Offline
Зарегистрирован: 24.08.2015

Пока жду из Поднебесной реальное железо, решил опробовать в эмуляции. Использую 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)

т.е. по сути значения нажатой и отпущенной перепутаны

Вопрос: почему это? глюк эмулятора? неправильно собранная схема (знаю, что в живой системе нужны резисторы, но вроде они не нужны на эмуляциии)? а может я программу написал неправильно? (хотя уж что там неправильного то?)

Был бы очень благодарен, если бы кто-нибудь на живом девайсе попробовал.

Hamulus
Offline
Зарегистрирован: 24.08.2015

Допустил опечатку: правильно читать только после ОТЖАТИЯ кнопки

т.е. счетчик прибавляется, если нажать, а потом отжать

все остальное верно, т.к. при нажатой кнопке выдается LOW а при отпущенной HIGH

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Когда кнопка не нажата, вход болтается в воздухе, нужна подтяжка к питанию.
При нажатии кнопки что будет на входе?
Кто сказал, что в эмуляторе резисторы не нужны?
При старте программы сразу отображается 1 1 0? Странно?
В данной задаче не важно, 0 при нажатии или 1.

mutis
Offline
Зарегистрирован: 24.09.2015

pinMode(buttonPin, INPUT_PULLUP);

Hamulus
Offline
Зарегистрирован: 24.08.2015

kisoft: а в эмуляторе нет выхода с питанием +5В
как тогда поступить?

и кстати при старте с отпщенной кнопкой отображается 1 1 1, а с зажатой 0 0 0

и в принципе именно для данной задачи разницы нет, но все равно же причину хочется понять

mutis: не помогло:(

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Hamulus пишет:

kisoft: а в эмуляторе нет выхода с питанием +5В
как тогда поступить?

и кстати при старте с отпщенной кнопкой отображается 1 1 1,


Добавить питание +5В.
Я писал про старт программы без нажатия кнопок. По логике 1 1 0 должно быть.

std
Offline
Зарегистрирован: 05.01.2012

Для INPUT_PULLUP схема правильная. Если надо поменять местами читаемое значение, поставьте перед digitalRead() восклицательный знак.

Hamulus
Offline
Зарегистрирован: 24.08.2015

kisoft: добавление питания не изменило ничего, схема ниже
при старте с отпущенной кнопкой 1 1 1 вместо 1 1 0 отображается потому, что выводится уже измененное prevValue

т.е. у нас начальное значение 0, потом проверка условия и т.к. bs == HIGH то prevValue становится равным единице

std: так это понятно, что если поменять местами HIGH и LOW то все работает
вопросто именно в том почему так происходит
 

 

 

Hamulus
Offline
Зарегистрирован: 24.08.2015

чето и я ступил и никто не заметил

кнопку то надо было подключать к 5 вольтам, а не к земле

вот правильная схема, все работает:)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Да уж #здравствуйжопановыйгод, мы тут все про это говорим, предлагаем варианты (инверсия данных с пина), но оказывается, ТС единственный, кто этого не понимает. Эхх

Hamulus
Offline
Зарегистрирован: 24.08.2015

ну новичок я, да:)