Ребята в чем может быть подвох

Тема в разделе "Arduino & Shields", создана пользователем Proger_xxx, 1 ноя 2016.

  1. Proger_xxx

    Proger_xxx Нуб

    Итак следующий кодинг:

    Код (C++):

    int switchPin = 2;
    int ledPin = 9;
    boolean lastButton = LOW;
    int SWITCH_TIME = 0;
    boolean currentButton = LOW;

    void setup()
    {
    pinMode(switchPin, INPUT);
    pinMode(ledPin, OUTPUT);
    }

    boolean debounce(boolean last)
    {
    boolean current = digitalRead(switchPin);
    if (last != current)
    {
    delay(5);
    current = digitalRead(switchPin);
    }
    return current;
    }

    void loop()
    {
    currentButton = debounce(lastButton);
    if (lastButton == LOW && currentButton == HIGH)
    {
    SWITCH_TIME = SWITCH_TIME + 3000;
    }
    lastButton = currentButton;

    if (SWITCH_TIME > 9000) SWITCH_TIME = 0;
    delay(SWITCH_TIME);
    digitalWrite(ledPin, HIGH);
    delay(1000);
    }
    Где-то имеется ошибка не нашел. Прощу помощи!!! (А сама затея по нажатию кнопки должно время прибавляться. Для эксперимента 3 сек. А патом загорается светодиод) больше 9 сек обнуляется
     
  2. alxndrlsn

    alxndrlsn Нерд

    ради повышения собственной грамотности хочу поинтересоваться: что такое last и что такое current? и почему boolean переменные принимают значения не true/false, а low/high?
     
  3. Proger_xxx

    Proger_xxx Нуб

    Это потому что копипаст) Поэтому я здесь. Хотябы примерную логику познать
     
  4. rkit

    rkit Гуру

    Потому что и то, и то — читаемые названия для "0" и "не 0".
     
  5. alp69

    alp69 Форумчанин

    last - предыдущее
    current - текущее
    Просто понятное имя переменной.

    ...а еще next бывает ;)
     
  6. alxndrlsn

    alxndrlsn Нерд

    понятно. тогда по коду:
    Код (C++):
    void setup()
    {
    pinMode(switchPin, INPUT);
    pinMode(ledPin, OUTPUT);
    }

    boolean debounce(boolean last)
    {
    boolean current = digitalRead(switchPin);
    if (last != current)
    {
    delay(5);
    current = digitalRead(switchPin);
    }
    return current;
    }
    что собственно считывается в current? там разве что-то есть на switchPin?
     
    Последнее редактирование: 2 ноя 2016
  7. alp69

    alp69 Форумчанин

    Потому, что это кнопка. Ардуина должна принимать изменения уровня на switchPin при нажатии кнопки (input). Отслеживается наличие соответствующего уровня (read).
     
  8. alxndrlsn

    alxndrlsn Нерд

    это понятно, но вот МК выполняет программу: кнопка не нажата значит там что , LOW? void loop вызывает функцию debounce(LOW), поскольку так задано в начальных условиях, видит что объявлена логическая current, но значение ее распознать не может (инициализации конкретным значением не было, а обращение к переменной идет после условия, которое никогда не выполнится, потому что current = something) или тупо считает current = false, то есть LOW и возвращает LOW, то есть currentButton = LOW, дальше if тоже false и SWITCH_TIME остается в 0, lastButton получает LOW и все по кругу.... ЕСЛИ не прав , то поправьте.
     
    Последнее редактирование: 7 ноя 2016
  9. alp69

    alp69 Форумчанин

    Это уже к автору кода.
     
  10. alxndrlsn

    alxndrlsn Нерд

    нашел. http://forum.amperka.ru/threads/Помощь-новичкам.8745/ там функция debounce() из примера взята и отличие существенное: return внутри if {..}
    Код (C++):

    /*
    * Функция сглаживания дребезга
    * принимает в качестве аргумента предыдущее состояние кнопки
    * и выдает фактическое.
    */

    boolean debounce(boolean last)
    {
        boolean current = digitalRead(BUTTON); // Считать состояние кнопки
        if (last != current) // Если изменилось...
        {
            delay(5); // Ждем 5 мс
            current = digitalRead(BUTTON); // Считываем состояние кнопки
            return current; // Возвращаем состояние кнопки
        }
    }
     
  11. Delit

    Delit Нерд