Время работы шилдов без delay

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

  1. superir

    superir Нуб

    Перерыл весь интернет, решил здесь спросить. С прерыванием с delay все понятно, но как сделать при нажатии кнопки, чтобы шилд работал 5 секунд и отключался даже если кнопка нажата все время и запускался снова при следующем нажатии на кнопку и опять 5 секунд работал?

    (чайник я...не пинайте)
    Пример скетча с прерыванием без delay()


    Код (C++):
    int ledPin = 13; // пин со светодиодом
    long OnTime = 5000; // время свечения светодиода, мс
    int ledState = LOW;
    int pinButton = 8; // пин, к которому подключена кнопка
    int pinButton2 = 7; // пин, к которому подключена кнопка2
    unsigned long previousMillis = 0;
    void setup()
    {
    pinMode(ledPin, OUTPUT);  
    }
    void loop()
    {
      unsigned long currentMillis;
       
     
      if (ledState == HIGH) // если светодиод светится
      {
        currentMillis = millis();
       
       
        if (currentMillis-previousMillis >= OnTime)// проверяем сколько прошло времени,если больше заданного -                                                                      //выключаем
        {
           ledState = LOW;
           previousMillis = 0;
           digitalWrite(ledPin,ledState);
         }
       }
     
     
      if (digitalRead(pinButton) == HIGH)// если кнопка нажата - включаем светодиод
      {
        previousMillis = currentMillis; // запоминаем время
        ledState = HIGH;              
        digitalWrite(ledPin,ledState);
      }
     
     
      if (digitalRead(pinButton2) == HIGH)// если кнопка2 нажата - включаем светодиод
      {
        previousMillis = currentMillis; // запоминаем время
        ledState = HIGH;
        digitalWrite(ledPin,ledState);
      }
    }
     
  2. Sindbad

    Sindbad Гик

    1. В коде запускающем действие зафиксировать (сохранить в переменной) значение счетчика миллисекунд. См. https://www.arduino.cc/en/Reference/Millis
    2. В loop() проверять, разность между текущим значением миллисекунд и сохраненным значением. Если разность не достигла нужного значения, то ничего не делать, если достигла - выполнить код останавливающий действие.
    3. Предусмотреть переменную-флаг, при установке которой контроль времени в п. 2 производить не нужно, не забыть устанавливать этот флаг в п.2 и сбрасывать в п.1.
     
    Tomasina нравится это.
  3. superir

    superir Нуб

    Первые 2 пункта я прописал в скетче выше. А вот как сделать проверку на удержание кнопки и "игнорировать это удержание" не могу понять.
     
  4. Sindbad

    Sindbad Гик

    Код (C++):
    bool BtnUp1 = true;
    /*....*/
    loop() {
      if (!digitalRead(pinButton)) {
        Delay(5);
        if (!digitalRead(pinButton))
         BtnUp1=true;
      };
    /*,,,*/
      if((digitalRead(pinButton) &&  BtnUp1) { // если кнопка нажата - включаем светодиод
        BtnUp1 = false;
        /*,,,,*/
      }
    /*....*/
     
    Например, так. Т.е. если кнопку не отпускать, то светодиод погаснет и загораться не будет.

    Для вдохновения имеет смысл разобраться с базовыми примерами из вики, в частности, работа с кнопками: http://wiki.amperka.ru/конспект-arduino:кнопочный-переключатель
     
  5. superir

    superir Нуб

    Выкладываю код для нубят вроде меня, ищущих решения. Спасибо GhostX с ресурса "аврки". Там помогли...и я здесь помогу.
    Нажали кнопку(кликнули) или нажав удерживаем, светодиод горит заданное время (в нашем случае 1 секунда) и гаснет...независимо удерживаем мы кнопку или нет. Так же жмем(клик) вторую кнопку или нажав удерживаем, тот же светодиод горит заданное время (1 секунда) и гаснет...независимо удерживаем мы кнопку или нет.

    Код (C++):
    int ledPin = 13; // пин со светодиодом
    long OnTime = 1000; // время свечения светодиода, мс
    int ledState = LOW;
    int pinButton = 7; // пин, к которому подключена кнопка
    int pinButton2 = 9; // пин, к которому подключена кнопка2
    unsigned long previousMillis = 0UL;
    bool key = true;
    bool keyLOW = true;

    void setup()
    {
    pinMode(ledPin, OUTPUT);
    pinMode(pinButton, INPUT);
    pinMode(pinButton2, INPUT);
    }
    void loop()
    {
       digitalWrite(ledPin,ledState); // включаем или гасим диод в зависимости от переменной ledState

       if (millis()- previousMillis >= OnTime){ // таймер пяти секунд
          ledState = LOW; //потушить по истечении времени
       }

        if ((digitalRead(pinButton2) == LOW) && (keyLOW == false)) keyLOW = true;// триггер на отжатие кнопки, пока не отожмешь не пустит в если где проверяет нажатие.
       if ((digitalRead(pinButton2) == HIGH) && (keyLOW == true)){ // если нажата кнопка и ключ true то
          previousMillis = millis(); // запоминаем время когда она нажалать
          ledState = HIGH; // взводим ключ на включение.
          keyLOW = false;
        }
       if ((digitalRead(pinButton) == LOW) && (key == false)) key = true;
       if ((digitalRead(pinButton) == HIGH) && (key == true)){ // если нажата кнопка и ключ true то
          previousMillis = millis(); // запоминаем время когда она нажалать
          ledState = HIGH; // взводим ключ на включение.
          key = false;
        }
    }
     
    Последнее редактирование: 30 янв 2016