Работа с функцией

Такой вопрос. Могу ли функцию, в которой используется millis() вызывать каждое n-ное количество времени?

int imp_c = 50;
int delta = 30;
unsigned long t0 = 0;
unsigned long t = 0;
unsigned long t1 = 0;
bool state = 0;

void setup() {
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}
void impuls()
{ t=0;
  t = millis() - t0;
  if (t >= (imp_l + delta))
  {
    if (t <= imp_l + delta + imp_c)
    {
      state = HIGH;
      digitalWrite(7, state);
    }
    else
    {
      state = LOW;
      digitalWrite(7, state);
    }
  }
}
void loop()
{
  if (millis() - t1 > 5000)
  {
    t1 = millis();
    impuls();
  }
}


Есть необходимость подавать импульс каждые 5 секунд, если прописываю следующее, то это не работает

{
  if (millis() - t1 > 5000)
  {
    t1 = millis();
    impuls();
  }
}

Обратите внимание

а где задается… если их не будет гореть не будет
и зачем 2 раза проверять millis снаружи и внутри функции /?

В данном случае неважно даже, где задается, - это все равно работать не будет.
Дим-мычъ правильно обращает внимание на неподходящие типы данных для хранения времени.

Вот целиком

int imp_c = 50;
int delta = 30;
unsigned long t0 = 0;
unsigned long t = 0;
unsigned long t1 = 0;
bool state = 0;

void setup() {
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}
void impuls()
{ t=0;
  t = millis() - t0;
  if (t >= (imp_l + delta))
  {
    if (t <= imp_l + delta + imp_c)
    {
      state = HIGH;
      digitalWrite(7, state);
    }
    else
    {
      state = LOW;
      digitalWrite(7, state);
    }
  }
}
void loop()
{
  if (millis() - t1 > 5000)
  {
    t1 = millis();
    impuls();
  }
}

спасибо, но пока не помогло)

исправил, вопрос открыт. Могу я вызвать функцию в которой уже есть millis() во времени?

я тоже новичек , но мне казалось если промежуток измеряемого времени до нескольких минут то int тоже подойдет…хотя я так и не понял логику. и что у него t0

Вопрос не совсем понятен.

Если Вы спрашиваете существует ли техническая возможность, то да, вызывайте когда хотите, хоть по времени, хоть на нажатию кнопки, хоть по фазе Луны.

Если же Вы спрашиваете, можете ли именно Вы, то точно не знаю, но, скорее всего, пока нет (иначе бы не спрашивали), но Вы можете научиться это делать.

1 лайк

Хах, тогда такой вопрос, почему скетч не работает? Если честно, я в тупике

А что значит “не работает” ? Ардуина зависает, взрывается…?
Или дело в том, что работает, но не так как надо?
а что он делать-то должен?

Ардуина подключена к осциллографу, на нем нет череды импульсов, которая должна быть

Начать с того, что код просто не компилируется

error: 'imp_l' was not declared in this scope

стер строчку когда заливал на сайт, прошу прощения. Отредачил

а нормально можно обьяснить?
Как нибудь так -

при каждом запуске процедуры ИМПУЛЬС я ожидаю 3 импульса ширины 30мс с интервалами… и два 46мс, потом пауза 123мс и еще три 30мс, после чего программа должна выйти из функции ИМПУЛЬС и ждать следующего срабатывания 5секундного таймера?

при каждом запуске процедуры ИМПУЛЬС я ожидаю импульс шириной 50 мс, новы такой же должен появляться каждые 5 с.

void impuls()
{     
      state = HIGH;
      digitalWrite(7, state);
      delay(50);
      state = LOW;
      digitalWrite(7, state);

}

так?

Может бы Вы, прежде чем писать на форум, самостоятельно загрузите себе то, что “отредачили”, и проверите, как оно работает, а не будете испытывать терпение форумчан?

тем более что изменений в коде я не вижу - imp_l все также не задекларирован

А Вы проверили, Ваш ИМПУЛЬС работает именно так, как Вы ожидаете?