Включение таймера без delay

Тема в разделе "Arduino & Shields", создана пользователем REm, 21 июл 2024.

Метки:
  1. REm

    REm Гик

    Товарищи, подскажите, где проблема?
    Делал задержку по кнопке:

    Код (C++):
    ....
    if (flagPed == true & odnoFun1 == false) {    // срабатывание по кнопке и условию в программе
        flagPedcount = 1;              //  флаг для работы цикла без удержания кнопки (вкл)
      }

      if (flagPedcount == 1) {       //проверка условия
        digitalWrite(v13, HIGH);       //включение реле
        if (millis() - myTimerMotor >= 60000) { //таймер 1 минута
        myTimerMotor = millis();        // сброс таймера
       
        CountMotorON++;       //счётчик срабатывания
        if (CountMotorON >=1) {   // при достижении таймера 1й минуты
          digitalWrite(v13, LOW);   // отключение реле
          flagPedcount = 0;   //  флаг для работы цикла без удержания кнопки (откл)
      ......
    но контрольные измерения дают погрешность до 15 секунд, в среднем 7-10 секунд.
    Это как-то поправить можно? в цикле с delay работает верно.
     
    Последнее редактирование: 21 июл 2024
  2. Igor68

    Igor68 Гуру

    Тут люди говорили про шары... вроде как стеклянняе. Но я думаю в этом случае как про яйца, которые надо отбить.
    Вы прикажете по шарам определять, что за флаг и зачем нужен?!
    Будьте любезны пояснить код (ну если он не секретный - потму как до секретного/коммерческрго Вам оооооочень далЁЁЁЁко)
    Вы уж простите за грубость. А накой Вам такой подход? Не моё дело конечно, но все решается подругому
     
  3. b707

    b707 Гуру

    Вашу проблему - пока непонятно.
    А вот неправильно заданный вопрос вполне можно поправить, добавив полный код.
     
  4. REm

    REm Гик

    подправил.
     
  5. REm

    REm Гик

    Делаю простую программу, пытаясь избежать delay.
    При нажатии кнопки и совпадении условия в программе, реле должно включиться на определённое время. Аналогичный код с delay работает точно, а с функцией millis выдержка реле на 10-15 секунд раньше заканчивается.
     
  6. parovoZZ

    parovoZZ Гуру

    очевидно, что где-то ещё стоит delay или цикл с ним, или опрос внешнего устройства, или... ещё много или, о которых мы знать не знаем.
     
  7. REm

    REm Гик

    нет, проверил через поиск, задержек нет. Опросов тоже нет.
    Такая конструкция работает верно:

    Код (C++):
      /*if (flagPed == true & odnoFun1 == false) { //
         digitalWrite(v13, HIGH);
         flagPedcount++;
         delay (60000);
         digitalWrite(v13, LOW);
         odnoFun1 = true;
         delayMicroseconds(50);
         odnoFun1 = false;
        }*/
     
  8. b707

    b707 Гуру

    И что вы "поправили"?
    Вы понимаете что значит "полный код"? - это значит код полностью, с сетап и луп, который можно вставить в Ардуино ИДЕ и он скомпилируется без ошибок.
    А что вы дали? - опять огрызок???

    Как и где описана переменная таймера myTimerMotor ?
     
  9. Asper Daffy

    Asper Daffy Иксперд

    Попробуйте посмотреть в словаре значение слова "полный".
     
  10. parovoZZ

    parovoZZ Гуру

    Тогда самостоятельно дебажить переменные через UART. Более ни чем помочь не сможем.
     
  11. KindMan

    KindMan Гуру

    Контрольный замер сделайте. Например, каждую минуту выводите в порт значение millis и сравнивайте его с часами.
     
  12. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Логический И - двойное &&. В Ардуинном ИДЕ. Или тут чего-то другое !?
     
  13. parovoZZ

    parovoZZ Гуру

    Язык программирования следует сперва изучить. Операторы в первую очередь.
     
  14. REm

    REm Гик

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