Вроде с таймерами разобрался, но никак не могу реализовать задуманное. Плиз, хелп!!!

Тема в разделе "Arduino & Shields", создана пользователем ForestCrow, 11 окт 2017.

  1. ForestCrow

    ForestCrow Нуб

    Затея какая: от нажатия кнопки должен загореться один светодиод. По истечении 10 секунд первый светодиод должен погаснуть, а второй зажечься тоже на 10 секунд. При этом всем, нужно при нажатии второй кнопки весь этот процес прервать и вернуться в основную программу. Вот взял чужой скетч и на его основе пытаюсь реализовать. Второй LED либо совсем не зажигается, либо зажигается автоматически. С переменными bool led1On; тоже игрался, но ничего не вышло. Может другой подход к реализации должен быть, не через milles() ?

    const int button1Pin = 5;
    const int button2Pin = 3;
    const int led1Pin = 13;
    const int led2Pin =4 ;
    unsigned long led1OnTime;
    unsigned long led2OnTime;
    //bool led1On; //Изначально было влючены везде эти переменные, но я их отключил и разницы в работе не увидел.
    //bool led2On;

    void setup() { /////////SETUP/////////
    pinMode(led1Pin, OUTPUT);
    pinMode(led2Pin, OUTPUT);
    pinMode(button1Pin, INPUT);
    pinMode(button2Pin, INPUT);
    //led1On = false;
    //led2On = false;
    }

    void loop(){ /////////LOOP/////////

    if (digitalRead(button1Pin) == HIGH) { //Кнопка1 нажата, лед включен, статус вкл,
    digitalWrite(led1Pin, HIGH);
    //led1On = true;
    led1OnTime = millis();
    }

    if (digitalRead(button2Pin) == HIGH) { //Кнопка2 нажата, лед включен, статус вкл,
    digitalWrite(led2Pin, HIGH);
    //led2On = true;
    led2OnTime = millis();
    }

    //if(led1On)
    if(millis() - led1OnTime > 10000) {
    digitalWrite(led1Pin, LOW);
    //led1On = false;

    }

    //if(led2On)
    if(millis() - led2OnTime > 10000) {
    digitalWrite(led2Pin, LOW);
    //led2On = false;
    }
    }
     
    Последнее редактирование: 11 окт 2017
  2. b707

    b707 Гуру

    Ну. то что вы описали словами, к коду отношения не имеет. Тот код, что выше - должен работать так: при нажатии на первую кнопку зажигается первый диод, через 10 сек гаснет. Ровно точно так же для второй кнопки и второго диода.
     
  3. ForestCrow

    ForestCrow Нуб

    Я пробовал. Пробовал с булин переменными, но вторая лампа либо вообще не зажигается, либо зажигается сама в цикле, либо постоянно горит. Топо не хватает либо знаний, либо клепки, либо вообще подход ложный, либо все вместе. Сюда обращаюсь только в крайних случаях, после нескольких дней самостоятельных поисков решений когда уже опускаются руки, не люблю напрягать других людей и вообще кайфую когда получается у самого, но тут уже резерв терпения закончился. Сам терпеть не могу когда люди не включают мозг и хотят, что бы все за них сделали. По этому прошу более конкретной помощи со скетчем, либо действительно дельного совета куда копать. То за что этот скетч отвечает я прекрасно знаю, но не знаю как из него сделать то что нужно.

    P.S.

    Я не программер, я самоучка, что в компьютерной тематике, что в программировании ардуины. С компьютерами я больше 15 лет работаю и было у кого спросить, то в программировании даже посоветоваться, кроме форума не с кем. Хотя есть мысли пойти на курсы программирования и этим зарабатывать на жизнь, но это пока мысли, сейчас я битву с ардуиной проигрываю(.
     
  4. b707

    b707 Гуру

    ForestCrow - повторяю, Ваш код правильный для следующей логики - каждый диод зажигается своей кнопкой и гаснет сам через 10 сек. У вас как сейчас работает этот код - не так?

    ЗЫ Как можно 15 лет "работать с компами" и не уметь программировать? Вы их тряпкой от пыли протираете, что ли? :)
     
  5. ORLENOK

    ORLENOK Гик

    Судя по первому посту - нет.
    Есть различные инженеры, которые занимаются компьютерным железом или настройкой какого-либо софта, но никак не связаны с программированием.
    По порядку.
    1) при нажатии узнаем время нажатия, записываем время в переменную, для этого используем millis(); Ещё булевой переменной (флагу) даём знать, что мы нажали кнопку запуска. Ну и зажигаем светодиод.
    2) если нажали кнопку 2, то переменной флагу присваиваем значение, показывающее, что запуск остановлен. И тушим оба светодиода (можно вычислить, какой сейчас горит и погасить его, но зачем?)
    3) Если (запуск)
    {
    если(прошло с момента запуска прошло 10 секунд), то первый светодиод гасим, а второй зажигаем;
    если(прошло с момента запуска 20 секунд), то переменной флагу присваиваем значение, показывающее, что запуск остановлен и тушим второй светодиод
    }
     
  6. ForestCrow

    ForestCrow Нуб

    Я на другом скече так и делал, но где то допускал ошибки, что флаги не отрабатывали. Мне хороший человек прислал рабочий код, сейчас буду сравнивать и искать где я налажал. Просто я плохо освоил работу с millis.
     
  7. ForestCrow

    ForestCrow Нуб

    Вопрос решен. Спасибо тем, кто отнесся с пониманием.
     
  8. ostrov

    ostrov Гуру

    При чем тут таймеры вообще?

    И на будущее, вставляйте код в соответствующий тег.
     
  9. Если это было бесплатно, т е - даром, вынесите в народ, у меня похожая проблема, только надо в идеале вторым включить не надолго тон, и без Delay вдобавок ещё, проблема в этом.