Изучение работы кнопки (не работает как надо)

Smirna
Offline
Зарегистрирован: 06.01.2016

День добрый!

Начал изучать Ардуино (заказан с Алиэкспресса Funduino Uno)/

Дошёл до 2-йго урока, где изучается кнопка. В результате у меня встроенный светодиод (13-й цифровой вывод) постоянно моргает, если на цифровой вход, который установлен как сенсор (через стягивающий резистор).

не знаю на что думать...

программа вроде нормально написана:

boolean currentStatus = LOW;
boolean lastStatus = LOW;
boolean statusLed = LOW;
const int BUTTON = 7;

void setup() {
  pinMode(BUTTON, INPUT);
  pinMode(13, OUTPUT);
  digitalWrite(13, statusLed);
}

void loop() {
  currentStatus = getButtonStatus(lastStatus);
  if (currentStatus == HIGH  &&  lastStatus ==LOW) {
    statusLed = !statusLed;
  }
  digitalWrite(13, statusLed);
}

boolean getButtonStatus(boolean last) {
  boolean current = digitalRead(BUTTON);
  if (last != current) {
    delay(50);
    current = digitalRead(BUTTON);
    return current;
  }
}

Подскажите, что да как мне делать? так как кнопку мне необходимо задействовать в моей задумке "Светофор", как переключение режимов работы светофора (дальше буду уже от фоторезистора делать).

Smirna
Offline
Зарегистрирован: 06.01.2016

Да, забыл сказать, что подключиил на 5В и на GND через сопротивление в 220 Ом светодиод - он горит ровнои не моргает, а вот 13-й светодиод, который получает команду от 7 входа - моргает постоянно (порядка 10 морганий в секунду)

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

lastStatus - нигде не присваивается. Остальное не смотрел.

Smirna
Offline
Зарегистрирован: 06.01.2016

Благодарю, добавил строку в функции loop(). Теперь 13-й светодиод моргает постоянно на 65% яркости.

исключения - когда замыкаю кнопку - то ярко светит, то отключает светодиод.

boolean currentStatus = LOW;
boolean lastStatus = LOW;
boolean statusLed = LOW;
const int BUTTON = 7;

void setup() {
  pinMode(BUTTON, INPUT);
  pinMode(13, OUTPUT);
  digitalWrite(13, statusLed);
}

void loop() {
  currentStatus = getButtonStatus(lastStatus);
  if (currentStatus == HIGH  &&  lastStatus ==LOW) {
    statusLed = !statusLed;
  }
  lastStatus = currentStatus;
  digitalWrite(13, statusLed);
}

boolean getButtonStatus(boolean last) {
  boolean current = digitalRead(BUTTON);
  if (last != current) {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
  }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Smirna пишет:

Теперь 13-й светодиод моргает постоянно на 65% яркости.

Чем измеряли яркость? Там точно не 60? и не 70%?

А если серьёзно, то это разговор "в пользу бедных".

Прочитайте вот эту фразу:

Smirna пишет:

В результате у меня встроенный светодиод (13-й цифровой вывод) постоянно моргает, если на цифровой вход, который установлен как сенсор (через стягивающий резистор).

Вы её поняли? Я - нет. Что там за вход, который установлен как сенсор? Да, "если на цифровой вход", то ЧТО? И, кстати "ЧТО" на цифровой вход? Землю подать? Или питание? Или пописать?

Поэтому, давайте так, если Вам нужна помощь, то:

1. Полный скетч в студию

2. Полную схему в студию

3. Внятно объяснте чего Вы хотите и что в реальности получаете.

А что он у Вас дрыгаться будет, это понятно. Подумайте, что возвращает Ваша функция getButtonStatus в том случае, если last оказался равным current? Посмотрите, подумайте.

Smirna
Offline
Зарегистрирован: 06.01.2016

Извольте:

1) Скетч:

boolean currentStatus = LOW;
boolean lastStatus = LOW;
boolean statusLed = LOW;
const int BUTTON = 7;

void setup() {
  pinMode(BUTTON, INPUT);
  pinMode(13, OUTPUT);
  digitalWrite(13, statusLed);
}

void loop() {
  currentStatus = getButtonStatus(lastStatus);
  if (currentStatus == HIGH  &&  lastStatus ==LOW) {
    statusLed = !statusLed;
  }
  lastStatus = currentStatus;
  digitalWrite(13, statusLed);
}

boolean getButtonStatus(boolean last) {
  boolean current = digitalRead(BUTTON);
  if (last != current) {
    delay(5);
    current = digitalRead(BUTTON);
    return current;
  }
}

2) Схема по ссылке https://yadi.sk/i/damzB1uqmiD33

3) Хочу что бы при нажатии на кнопку изменялось состояние встроенного светодиода (на 13-м пине) при этом никаких морганий.

 

Пример взят из книги Джерими Блюма...

Smirna
Offline
Зарегистрирован: 06.01.2016

Благодарю за подсказку: перенес return из условия и вроде как всё заработало.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, и слава Богу.

Smirna
Offline
Зарегистрирован: 06.01.2016

Вот результат работы кнопки, чего я добивался.

https://yadi.sk/i/Qny1QnYxmiKYu

Показан один из моментов, когда нажатие кнопки среди паузы отрабатывает после выполнения подпрграммы.