Таймер без Delay. Запустить, подождать, на время включить, выключить

Тема в разделе "Arduino & Shields", создана пользователем АлексейЭтоЯ, 30 окт 2017.

  1. Да Я на 100% уверен, что дам денег вам за это на принцип, и ничего толкового не получу, по разговорам догадался, примерно так
     
  2. b707

    b707 Гуру

    Алексей. я вообще-то полезный совет вам дал - освоить миллис. И ваш ответ меня совершенно не удивил и даже не обидел - заранее было видно, что вы за птица. По всем вашим постам очевидно, что вы ждете готового решения, хотя вслух говорите обратное.
    А много от меня конструктива или мало - пусть судят другие.
     
  3. b707

    b707 Гуру

    да так это и есть. расслабтесь. Мне не нужны ваши деньги. Я хорошо зарабатываю - и совсем не программированием :)
     
  4. Вот и пусть судят. Вы кажется говорили про тыщи примеров в сети, где эти ссылки, хотя бы с пяток. Какие там готовые скетчи, да не смешите народ. Просто так ляпнули про пример, а их то и нема, да??? :) а И ДА ПРО МИГАЮЩИЙ СВЕТОДИОД, МЫ УЖЕ ПРОХОДИЛИ, ЭТИ НЕ НАДО
     
  5. То что не программированием, это Я уже понял. Ибо примеров было бы с десяток наизусть и без заездов, просто так.
     
  6. b707

    b707 Гуру

    Наизусть? Я наизусть код редко пишу. В гугле все готовое есть на любой вкус.

    В вашем коде из сообщения №12 что вас не устраивает? Или это не ваш код и вы его не понимаете?
     
    Последнее редактирование: 31 окт 2017
  7. Он не правильно работает. Первый таймер по кнопке все ОК, а второй должен отработать только один раз до следующего нажатия кнопки. а он сразу циклически мигает и по 1му таймеру прекращает на 2 сек по отработке 1го, после опять мигает лэд8
     
  8. akl

    akl Гуру

    немного непонятно что значит "разовый вызов"
    при нажатии на кнопку запускаем писк, ставим например флажок что писк запущен и засекаем время
    если (кнопка && !пискзапущен) {
    пискзапущен = true;
    время = millis();
    писк(пин);}
    проверяем запущен ли писк и прошло ли нужное время, если все совпало - выключаем писк
    если(пискзапущен && millis() - время > скольконадопищать) {
    выклписк(пин);
    пискзапущен = false;}

    можно еще упростить все, купив пищалку со встроенным генератором, тогда можно не пользоваться функцией тон, а просто подавать единицу на пищалку, тогда и определять запущен ли писк можно не по флажку, а тупо опрашивая диджиталридом соответствующий пин.
     
    arkadyf нравится это.
  9. b707

    b707 Гуру

    Все правильно, вы же запускаете второй таймер. если outtimerPin == LOW. а он у вас и так ЛОУ с самого начала. Вместо этого заведите еще один флаг
    Код (C++):
     // если кнопка нажата впервые
    static int flag3 =0;  
    if((digitalRead(key5Pin) == HIGH) && !flag) {
      flag = 1; // устанавливаем флаг при первом нажатии
      moment = millis(); // запоминаем момент времени
      digitalWrite(outtimerPin, HIGH); // включаем светодиод
      }
       // если прошло время
      if ((millis() - moment >= 10000) && flag) {
      flag = 0; // сбрасываем флаг
      flag3 = 1; // устанавливаем флаг3
      //moment = 2^32 - 1; // устанавливаем максимальное значение - это лишнее
      digitalWrite(outtimerPin, LOW); // выключаем светодиод      
    }
    if( flag3 && (!flag2)) {
      flag2 = 1; //
      flag3 = 0;
      moment2 = millis(); // запоминаем момент времени
      digitalWrite(LED8, HIGH); // включаем светодиод
      }
       // если прошло время
      if ((millis() - moment2 >= 2000) && flag2) {
      flag2 = 0; // сбрасываем флаг
      //moment2 = 2^32 - 1; // устанавливаем максимальное значение - это лишнее
      digitalWrite(LED8, LOW); // выключаем светодиод      
    }
    }
     
    АлексейЭтоЯ и akl нравится это.
  10. akl

    akl Гуру

    просто надо запускать вот это
    if((digitalRead(outtimerPin) == LOW) && !flag2) {
    flag2 = 1; // устанавливаем флаг при первом нажатии
    moment2 = millis(); // запоминаем момент времени
    digitalWrite(LED8, HIGH); // включаем светодиод
    }
    не по digitalRead(outtimerPin), а по чему-нибудь другому (еще какой-нибудь флажок добавить например), потому что сейчас это условие выполняется каждые 2 секунды все время пока этот пин выключен

    опередили:mad:
     
    b707 нравится это.
  11. А Вы тех задание читали?, зачем мне тон сразу включать?
     
  12. akl

    akl Гуру

    подставляем вместо "кнопка" любой флажок, поднимающийся в любом месте алгоритма, и запускаем писк хоть сразу хоть не сразу.
    это уже на троллинг смахивает

    возможно так и есть - а вдруг чувак в перерывах между взламыванием пентагона постит такие вот "техзадания" и угарает как те, кто сами только что блинк на миллис() освоили пытаются что-то объяснить.
     
    Последнее редактирование: 31 окт 2017
  13. писк хоть сразу хоть не сразу....... Мне он по срабатыванию таймера был нужен ака будильник, что значит не сразу
     
  14. Вот таймер с сиреной, кому надо, по запуску кнопки, включается индикация на outtimerPin, проходит время Х, и после outtimerPin2 на коммутацию, сирена 5сек ( можно изменить ), цикл не останавливает. outtimerPin и outtimerPin2 можно совместить с двух цветным светодиодом, для наглядности. Отдельное спасибо, людям которые помогли.
    Код (C++):
     // Поток 3
    void timer_() {
    if((digitalRead(key4Pin) == HIGH) && !flag) {
      flag = 1; // устанавливаем флаг при первом нажатии
      moment = millis(); // запоминаем момент времени
      digitalWrite(outtimerPin, HIGH); // включаем светодиод
      }
       // если прошло время
      if ((millis() - moment >= 20000) && flag) { //  20000 Это 2 минуты
      flag = 0; // сбрасываем флаг
      flag3 = 1; // устанавливаем флаг 3
      //moment = 2^32 - 1; // устанавливаем максимальное значение - это лишнее
      digitalWrite(outtimerPin, LOW);
    }
    if( flag3 && (!flag2)) {
      flag2 = 1;
      flag3 = 0;
      moment2 = millis();
      digitalWrite(outtimerPin2, HIGH);
      }
       // если прошло время
      if ((millis() - moment2 >= 10000) && flag2) {
      flag2 = 0;
      digitalWrite(outtimerPin2, LOW);
    }
      else if(digitalRead(outtimerPin2)== HIGH)
       {
       tone(buzzPin, ton);  // включаем сирену на "ton" Гц
        if (ton <= 1200) {  // до частоты 1200 Гц
        ton += 30;  // увеличиваем тональность сирены
       }
        else
        {  // по достижении 400 Гц
            ton = 400;  // сбрасываем тональность до 400 Гц
          }
        }
        else if(digitalRead(outtimerPin2)== LOW)
       {
       noTone(buzzPin);
      }
    }