Пример с кнопкой

Тема в разделе "Arduino & Shields", создана пользователем JEKONYA, 8 ноя 2015.

  1. JEKONYA

    JEKONYA Нерд

    Доброго времени суток. Помогите поправить код. Суть в том, что мне нужно кнопку считывать в обратном состоянии, т.е не количество нажатий, а количество отпускания кнопки. Иначе говоря пока кнопка нажата светодиод не горит , отпущена зажегся светодиод. Вот собственно код:
    Код (C++):
    #define button 3
    #define led 13
    boolean bIsUp = true; // была ли кнопка нажата? // да
    void setup ()
    {
      pinMode (led, OUTPUT);
      pinMode (button, INPUT_PULLUP);
    }
    void loop ()
    {
      boolean bWsUp = digitalRead(button); // нажата ли кнопка сейчас?
      if (bIsUp  && !bWsUp) {
        Serial.println ("OK");
        delay(10);
        bWsUp = digitalRead(button);
        if (!bIsUp) {
          Serial.println ("Ne OK");
        }}
        bIsUp=bWsUp;
    }
       
     
  2. Vetrinus

    Vetrinus Гик

    Сломал мозг.

    Код (C++):
    if (digitalRead(button) == LOW) {
    digitalWrite(led, HIGH)
    }
    Не?
    Или я чего-то не понимаю?
    И еще.. Как вот это понять? Что это вообще?
    Код (C++):
    if (bIsUp  && !bWsUp)
     
  3. Tomasina

    Tomasina Сушитель лампочек Модератор

    Код (C++):
    #define BUTTON_PIN 3
    #define LED_PIN 13
    boolean prevButtonScan = false;
    enum States {
      UNPRESSED, PRESSED, RELEASE, HOLD};
    // возможные состояния кнопки: не нажата / только что нажата / только что отпущена / долго нажата

    void setup ()
    {
      pinMode (LED_PIN, OUTPUT);
      pinMode (BUTTON_PIN, INPUT_PULLUP);
    }

    void loop ()
    {
      switch (buttonState(BUTTON_PIN)) // смотрим состояние кнопки
      {
      case UNPRESSED:
        Serial.println("Button unpressed"); // кнопка не нажата
        digitalWrite(LED_PIN, HIGH);
        break;
      case PRESSED:
        Serial.println("Button just pressed"); // кнопка только что была нажата
        digitalWrite(LED_PIN, LOW);
        break;
      case RELEASE:
        Serial.println("Button just release");  // кнопка только что была отпущена
        digitalWrite(LED_PIN, HIGH);
        break;
      case HOLD:
        Serial.println("Button is hold");  // кнопка нажата и удерживается
        digitalWrite(LED_PIN, LOW);
        break;
      }
    }

    byte buttonState(byte pin) // обработчик кнопок
    {
      byte result; // конечный результат выполнения функции
      boolean buttonScan = !digitalRead(BUTTON_PIN); // читаем состояние пина
      if(buttonScan == true)          // если кнопка нажата...
      {
        if(prevButtonScan == false) // ...и до этого была не нажата
          result = PRESSED;
        else                        // ...и до этого тоже была нажата
        result = HOLD;
      }
      else                            // если кнопка не нажата...
      {
        if(prevButtonScan == false) // ...и до этого была не нажата
          result = UNPRESSED;
        else                        // ...и до этого тоже была нажата
        result = RELEASE;
      }
      delay(20);
      prevButtonScan = buttonScan;
      return result;
    }
     
    Последнее редактирование: 9 ноя 2015
  4. Vetrinus

    Vetrinus Гик

    Ощутил себя идиотом ))
    Код (C++):
    byte buttonState(byte pin)
    почему именно byte? Почему не void? Вот эту строку я вообще очень слабо понимаю, как это все работает
     
  5. Tomasina

    Tomasina Сушитель лампочек Модератор

    это функция, т.к. дальше идут скобки.
    Если функция что-то делает "молча", т.е не выдавая результат в виде какого-то числа, то пишем void, например: void setup ()
    Если функция что-то должна "ответить", то надо явно указать тип ответа. В данном случае byte, т.к. это минимально возможная размерность числа: от 0 до 255.
    Если в функцию надо что-то передать для расчетов, то это число и его тип указываем в скобках после функции. В данном случае мы передаем ей номер пина BUTTON_PIN и его размерность byte.

    Про emun и switch написано в wiki.
     
  6. Vetrinus

    Vetrinus Гик

    Про enum уже прочел, со switch case был знаком и до этого. Спасибо большое за ответ)
     
  7. JEKONYA

    JEKONYA Нерд

    Ребят забыл отписаться у меня получилось и работает без сбоев, мб что то не дописано, но работает, вся ошибка крылась в подключении самой кнопки в книжке от амперки есть 2 хороших схемы включения кнопки.
    вот код, работает:
    Код (C++):
    #define button 3
    #define led 13
    boolean bIsUp = true; // была ли кнопка нажата? // да
    void setup ()
    {
      Serial.begin(9600);
      pinMode (led, OUTPUT);
      pinMode (button, INPUT_PULLUP);
    }
    void loop ()
    {
      boolean bWsUp = digitalRead(button); // нажата ли кнопка сейчас?
      if (bIsUp  && !bWsUp) {
        Serial.println ("DIM");
        delay(10);
        bWsUp = digitalRead(button);
        }
        bIsUp=bWsUp;
     
  8. JEKONYA

    JEKONYA Нерд

    я имел ввиду, что бы сработка была не в момент замыкания, а в момент размыкания кнопки, вот)