И снова о millis()

Это лучше добавить потенциометр - регулятор const uint16_t period = 500;
к примеру 450-550 и подбирать экспериментально, исходя из экземпляра платы, питания и скетча.

Точность работы millis() меня вполне устраивает.

Какая идея? Синтаксически и семантически неверного кода? Ясна.

До того, что Вы выложили. Выкладывайте другое, будем докапываться до другого.

Это тот мужик, что эрцгерцога Фердинанда замочил?

2 лайка

Гаврилы они такие

“Убил Гаврила Фердинанда,
Гаврила бойню заварил…”
©Ляпис-Трубецкой (но это неточно).

Нет, не всегда.
Светодиод вообще не входит в контроллер. Он может быть на плате. Если Вы используете плату своей разработки, то только от Вас зависит, куда Вы подключили светодиод. Если Вы используете отладочную плату, то на разных отладочных платах он может быть подключен к разным ногам. На платах Arduino Uno, Nano, Mini светодиод подключается к 13-й ноге. Там - да, будет мигать с периодом около секунды, если на него подать подходящее напряжение питания.
Но исправность контроллера это не гарантирует. Например, он может “мигать” 13-й ногой тогда, когда у него, скажем, отгорели ноги 2 и 5.

Конечно.
Подобная организация работы контроллера подразумевает, что один проход цикла занимает намного меньше 500 мс.
Смотрите сами, если, скажем, проход цикла занимает 400 мс:

номер
прохода   время   состояние LED
1                  300        +
2                  600        -
3                  900        -
4                 1200        +
5                 1500        -
6                 1800        -
7                 2100        +
8                 2400        +
9                 2700        -

В принципе, уже видно, что мигание будет неравномерным.
А если проход будет занимать более 500 мс, то и период будет больше секунды.

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

Теоретически этот термин должен быть применим к многозадачным ОС - как время выполнения конкретной задачи. На практике это время вычисляется далеко не всегда, и вместо него берется обычное астрономическое время (естественно, с допустимой точностью).

Почему это?

Там подпрыгивать легче.

Подпрыгивать, скакать…
Давайте не засорять политикой тему.

2 лайка

Я понимаю, что достал здесь всех своим вопросом.
Но сам не могу решить эту пробелму.
Сейчас будете критиковать строку 17, но мне надо чтобы переменная trigger поменяла свое состояние за час, по версии millis(), работы ПРИМЕРНО 3600 раз. Пэтому строка 17 написана именно так.

//для тактового генератора
static uint32_t period13 = 500;
static uint32_t moment13;
static uint32_t getsensor;
bool trigger;

void setup()
{
  pinMode(13, OUTPUT);
  digitalWrite(13, 0);
}

void loop()
{
  if (millis() - moment13 >= period13)
  {
    moment13 = moment13 + period13;
    trigger = !trigger;
    digitalWrite(13, trigger);
  }
  if (millis() - getsensor >= 3000)
  {
    getsensor = millis();
    // здесь опрос датчика, который занимает какое-то время.
  }
}

Тем более, что положение усугубляется тем, что в строке 24 опрашивается датчик BMP180. Опрос занимает какое-то время.
Поэтому, если в строке 17 написать так:

moment13 = millis();

, то trigger за час работы 3600 раз не “щелкнет”.
Как, все-таки, решить проблему?
Если время между походами какой-то точки loop() и корректировать period13, то получится ерунда, так как period13=500, а время опроса датчика занимает около секунды…

С такой постановкой вопроса, как у Вас – никак.

Например, никому кроме Вас неизвестно, что в данном контексте означает слово

которое Вы ещё и капсом забили.

Также никому неизвестно, что Вы понимаете под

По моим сведениям опрос этого датчика занимает 5мс для температуры и от 5мс до 26мс (в зависимости от разрешения) для давления. Как Вы умудряетесь опрашивать его целую секунду, знаете только Вы, кода Вы не привели.

Слово “ПРИМЕРНО” здесь озаначает то, что пренебрегается время работы секции setup().
А если точнее, то 3600±2 “щелчка”.

1 лайк

Ну, это уж что-то, теперь про датчик расскажите, откуда там секунда.

А также про остальное, что там ещё будет.

А главное, скажите, зачем Вам это надо, возможно есть другое, более правильное решение.

  if (millis() - getsensor >= 3000)
  {
    getsensor = millis();

    status = pressure.startTemperature();
    if (status != 0)
    {
      delay(status);
      status = pressure.getTemperature(T);
      if (status != 0)
      {
        //Переменная T скоро испортится.
        //ее надо срочно прочитать
        if (T > 0)
        {
          cur_t = T;
        }
        status = pressure.startPressure(3);
        if (status != 0)
        {
          delay(status);
          status = pressure.getPressure(P, T);
          if (status != 0)
          {
            //получаем текущее давление P и переводим миллибары в мм рт. ст.
            cur_p = P * 0.750063783; //миллибары в мм рт. ст.
            String s_s = String(cur_t, 2);
            s_s += " ";
            s_s += String(cur_p, 2);
            Serial.println(s_s);
          }
        }
      }
    }
  }

Это ни о чём. Откуда я знаю, что такое и как написано startTemperature, getTemperature и т.п.? Если эта байда работает целую секунду, возьмите нормальную библиотеку – уложитесь в 30 миллисекунд.

Мне надо отмерять секундные (в среднем) интервалы.

Там не только эта байда. Там еще и delay(). А это взято из примера Arduino-IDE.

Это похоже на ответ: “трясти надо”. Я ведь спросил зачем.

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

Ну, прекрасно. Возьмите нормальную библиотеку.

Знать бы - где ее взять. Везде ссылки на эту: SFE_BMP180.h

Мне надо к текущему millis() прибавить, например, 20 минут, пусть в переменную sour. Затем раз в секунду находить разницу между sour и текущим millis(), показывать это разницу в минутах и секундах. И когда разница будет равна нулю - выдать какой-либо сигнал. Но можно ли поймать этот ноль?

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

Но, в конце концов, написать свою. Вот скажите, нафига в Вашем примере, в строке №21 используется delay(status); ? Зачем? Если задержка уж так нужна, кто мешает отработать её через тот же миллис? Тогда у Вас не будет никаких проблем с мигание.