тактовая кнопка

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем __grisha__, 2 фев 2017.

  1. __grisha__

    __grisha__ Нуб

    Нужна помощь! Подключил кнопку через триггер Шмитта-устранил дребезг и ввел этот код:
    int switchPin = 8;
    int ledPin = 13;
    boolean lastButton = LOW;
    boolean ledOn = false;

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

    void loop()
    {
    if (digitalRead(switchPin) == HIGH && lastButton == LOW)
    {
    ledOn = !ledOn;
    lastButton = HIGH;
    }
    else
    {
    //lastButton = LOW;
    lastButton = digitalRead(switchPin);
    }
    digitalWrite(ledPin, ledOn);

    }
    светодиод то включался,то выключался почитал в интернете и сделал так:
    int switchPin = 8
    int ledPin = 13;
    boolean lastButton = LOW;
    boolean ledOn = false;

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

    void loop()
    {
    if (digitalRead(switchPin) == HIGH && lastButton == LOW)
    {
    ledOn = !ledOn;
    lastButton = HIGH;
    }
    else if (digitalRead(switchPin) == LOW&& lastButton == HIGH)
    {
    //lastButton = LOW;
    lastButton = digitalRead(switchPin);
    }
    digitalWrite(ledPin, ledOn);

    }
    1. так заработало,но не пойму в чем разница?
    • подскажите пожалуйста
     
  2. mcureenab

    mcureenab Гуру

    Разница в условиях срабатывания.
    В первом что то происходит только при переходе LOW -> HIGH. Переход HIGH->LOW только запоминает что кнопка отпущена.
    Во втором что то одно происходит при переходе LOW -> HIGH, и что то другое происходит при переходе HIGH -> LOW.

    PS. Пользуйтесь кнопкой для разметки кода, пзл.
     
  3. mcureenab

    mcureenab Гуру

    Код неправильный и первый и второй. После проверки условия digitalRead может вернуть новое состояние.
     
  4. __grisha__

    __grisha__ Нуб

    второй работает
     
  5. __grisha__

    __grisha__ Нуб

    а первый взят из 2 урока Джереми Блюма
     
  6. __grisha__

    __grisha__ Нуб

    но он почему то не работает
     
  7. __grisha__

    __grisha__ Нуб

    а что происходит во втором при переходе из 1 в 0 кроме запоминания состояния кнопки,как и в первом
     
  8. mcureenab

    mcureenab Гуру

    Код (C++):
    // S1
    int switchPin = 8;
    int ledPin = 13;
    boolean lastButton = LOW;
    boolean ledOn = false;

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

    void loop()
    {
      if (digitalRead(switchPin) == HIGH && lastButton == LOW)
      {
        ledOn = !ledOn;
        lastButton = HIGH;
      } else {
    //lastButton = LOW;
        lastButton = digitalRead(switchPin);
      }
      digitalWrite(ledPin, ledOn);
    }
     
    Код (C++):
    // S2
    int switchPin = 8
    int ledPin = 13;
    boolean lastButton = LOW;
    boolean ledOn = false;

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

    void loop()
    {
      if (digitalRead(switchPin) == HIGH && lastButton == LOW)
      {
        ledOn = !ledOn;
        lastButton = HIGH;
      }
      else if (digitalRead(switchPin) == LOW && lastButton == HIGH)
      {
    //lastButton = LOW;
        lastButton = digitalRead(switchPin);
      }
      digitalWrite(ledPin, ledOn);
    }
     
     
  9. mcureenab

    mcureenab Гуру

    И S1 и S2 что то делают с большей или меньшей вероятностью. Я не вполне уверен в том как вы устранили дребезг кнопки. Нарисуйте схему.

    И что вы хотите получить? Переключение светодиода по каждому нажатию?
     
  10. __grisha__

    __grisha__ Нуб

    да переключение светодиода по каждому нажатию
     
  11. __grisha__

    __grisha__ Нуб

    а какая ошибка во втором коде
    ?
     
  12. __grisha__

    __grisha__ Нуб

    а дребезг я устранил подключив параллельно друг друг конденсатор 0,1 мкф и резистор на 10 ком
     
  13. __grisha__

    __grisha__ Нуб

    в интернете написано что так лишний шум устранится
     
  14. __grisha__

    __grisha__ Нуб

    int knopka=7;
    int led=13;
    boolean logi=true; //запоминает предыдущие состояние кнопок //boolean нужны для запоминания
    boolean ledb=false; //состояния системы

    void setup() {
    pinMode(knopka,INPUT);
    pinMode(led,OUTPUT);

    }

    void loop() {
    if(digitalRead(knopka)==HIGH&&logi==false){ //проверяем,что сейчас HIGH,а
    ledb=!ledb; //раньше были в LOW
    logi=true;
    }
    else if(digitalRead(knopka)==LOW&&logi==true){
    logi=digitalRead(knopka);
    }
    digitalWrite(led,ledb);
    }
     
  15. __grisha__

    __grisha__ Нуб

    правильно?
     
  16. mcureenab

    mcureenab Гуру

    После
    digitalWrite(ledPin, ledOn);
    добавьте
    delay(500);

    и пользуйтесь специальной разметкой для кода!
     
  17. __grisha__

    __grisha__ Нуб

  18. __grisha__

    __grisha__ Нуб

    а предыдущие коды были неправильные ?
     
  19. mcureenab

    mcureenab Гуру

    Ну если все правильно и надежно подключено + триггер Шмитта, то кнопка должна работать четко.
    Но сам подход не верный. Случайное двойное срабатывание кнопки вернет систему в исходное состояние.

    Код (C++):
      digitalWrite(ledPin, ledOn);
      delay(500);
     
    Дает вам шанс заметить эффект от срабатывания кнопки и отсекает дребезг.
     
  20. mcureenab

    mcureenab Гуру

    Длительность дребезга.

    [​IMG]

    Похоже, ваш фильтр дребезга где то на грани работает.