помогите написать скейч

Тема в разделе "Arduino & Shields", создана пользователем сергей з, 22 мар 2016.

  1. Помогите пожалуйста. Суть такая, нужен скейч,чтобы при двойном нажатии (порядка 300-600мс) загорался светодиод на 5 секунд,а потом гас. и этот цикл постояный. Спасибо
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    Помочь - значит написать программу вместо вас?
     
  3. пожалуйста, пытаюсь очень долго не чего не выходит.
     
  4. пожалуйста
     
  5. Megakoteyka

    Megakoteyka Оракул Модератор

    Покажите свою версию кода.
     
  6. свою
    свою версию с психа удалил.
     
  7. нашел готовый который идеально подходит, но не могу вырезать одно короткое нажатие на включение.
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    Вот сейчас совсем непонятно было.
     
  9. Код (C++):
    #define BUTTON_PIN 7
    #define LED_PIN 13

    int bounceTime = 10;          // задержка для подавления дребезга
    int holdTime = 300;          // время, в течение которого нажатие можно считать удержанием кнопки
    int doubleTime = 500;        // время, в течение которого нажатия можно считать двойным

    boolean lastReading = false;  // флаг предыдущего состояния кнопки
    boolean buttonSingle = false; // флаг состояния "краткое нажатие"
    boolean buttonDouble = false; // флаг состояния "двойное нажатие"
    boolean buttonHold = false;  // флаг состояния "долгое нажатие"
    boolean ledState = false;    // флаг состояния LED

    long onTime = 0;              // переменная обработки временного интервала
    long lastSwitchTime = 0;      // переменная времени предыдущего переключения состояния
    long ledStartTime = 0;        // переменная-флаг времени начала включения LED
    unsigned long ledTimeout = 300000;      // переменная времени отключения LED, 5 минут = 300 000 мс

    void setup()
    {
      Serial.begin(9600);
      pinMode(9, HIGH);          //! подаем +5В на кнопку - эта строка только для моей схемы, вам не нужно!
      pinMode(BUTTON_PIN, INPUT_PULLUP); // подключаем кнопку через внутренний резистор
      pinMode(LED_PIN, OUTPUT);
      digitalWrite(LED_PIN, ledState);  // принудительно гасим LED
      Serial.println("\nReady...");
    }


    void loop()
    {


      // ================ обработчик состояния кнопки ====================
      boolean reading = !digitalRead(BUTTON_PIN);  // читаем состояние пина кнопки (инвертированное, т.к. подключено через внутренний резистор)
      // проверка первичного нажатия
      if (reading && !lastReading)
      {
        onTime = millis();
      }
      // проверка удержания
      if (reading && lastReading)
      {
        if ((millis() - onTime) > holdTime)
        {
          buttonHold = true;
        }
      }
      // проверка отпускания кнопки
      if (!reading && lastReading)
      {
        if (((millis() - onTime) > bounceTime) && !buttonHold)
        {
          if ((millis() - lastSwitchTime) >= doubleTime)
          {
            lastSwitchTime = millis();
            buttonSingle = true;
          }
          else
          {
            lastSwitchTime = millis();
            buttonDouble = true;
            buttonSingle = false;
            Serial.println("Button: double press");
            isButtonDouble();
            buttonDouble = false;  // сброс состояния после выполнения команды
          }
        }
        if (buttonHold)
        {
          buttonDouble = false;
          Serial.println("Button: hold");
          isButtonHold();
          buttonHold = false;  // сброс состояния после выполнения команды
        }
      }
      lastReading = reading;
      if (buttonSingle && (millis() - lastSwitchTime) > doubleTime)
      {
        buttonDouble = false;
        Serial.println("Button: single press");
        isButtonSingle();
        buttonSingle = false;  // сброс состояния после выполнения команды
      }
      // ================ конец обработчика состояния кнопки ==================

      // ================ обработчик отключения LED по таймауту ===============
      if ((ledStartTime !=0) && (millis() - ledStartTime > ledTimeout))  // если LED включен по даблклику и прошло больше 5 сек
      {
        Serial.println("Timeout");
        ledToggle();        // то гасим LED
        ledStartTime = 0;    // и обнуляем переменную-флаг
      }
      // ================ конец обработчика отключения LED ====================


    } // конец loop


    void isButtonSingle() // действия после одиночного нажатия кнопки
    {
      //При однократном нажатии диод загорается , если еще раз нажать то тухнет.
      //Если однократно нажать на кнопку то он погаснет, вне зависимости как его включили.
      ledToggle();
    }


    void isButtonDouble() // действия после двойного нажатия кнопки
    {
      //При двойном нажатии диод загорается и тухнет через 5 минут
      ledState = true;                    // однозначно включаем LED
      digitalWrite(LED_PIN, ledState);
      ledStartTime = millis();            // начинаем отсчет времени
      Serial.println("LED on. Will turn off after 5 min");
    }


    void isButtonHold() // действия после удержания кнопки
    {
      // здесь код для этого действия
      Serial.println("nothing to do...");
    }


    void ledToggle()    // функция переключения (инвертирования) LED
    {
      ledState = !ledState;
      digitalWrite(LED_PIN, ledState);
      ledState ? Serial.println("LED on"): Serial.println("LED off");
    }
     
  10. есть такой код но при одном нажатии, включается светодиод от этого нужно избавитьс
     
  11. Megakoteyka

    Megakoteyka Оракул Модератор

    Код (C++):
    void isButtonSingle() // действия после одиночного нажатия кнопки
    {
      //При однократном нажатии диод загорается , если еще раз нажать то тухнет.
      //Если однократно нажать на кнопку то он погаснет, вне зависимости как его включили.
      ledToggle();
    }
    Вот на этот кусок посмотрите внимательно.
     
  12. я нуб. мне решить надо решить эту проблему. и с arduino покончено. Помоги пожалуйста
     
  13. Megakoteyka

    Megakoteyka Оракул Модератор

    Там же все написано, причем по-русски! Закомментируйте строку ledToggle();
     
  14. включение светодиода
     
  15. как его изменить???
     
  16. помоги пожалуйста
     
  17. Megakoteyka

    Megakoteyka Оракул Модератор

    Закомментируйте строку ledToggle(); Что тут непонятного?
     
  18. не могли бы вы мне написать как правильно?
     
  19. Megakoteyka

    Megakoteyka Оракул Модератор

    Правильно - перед строкой ledToggle(); поставить две косые черточки, вот такие - /
     
    ostrov нравится это.
  20. огромное спасибо