Мучаюсь с millis()

а тут какая ошибка ? не уж то надо писать “= 6000000” ?

Между тем, достаточно поменять порядок операторов, чтобы значение вычислялось не сложением, а вычитанием - чтобы ошибка исчезла и выражение стало работать правильно и до переполнения, и после, и даже во время. Поэтому ваша запись - это ошибка, так не делают.

А вы попробуйте вывести значение переменной next_millis_10_min в Монитор - обещаю вам, вы удивитесь (уточнение - результат зависит от контроллера. На Уно/Нано/Мега там будет совсем не то, что вы ожидаете)

Serial.println("next_millis_10_min="+ String(next_millis_10_min));
Serial.println(next_millis_10_min);

22:08:38.180 -> next_millis_10_min=600000
22:08:38.180 -> 600000

шесот тыщь

и напрямую и через стринг

не понимаю чему удивляться. Можешь написать почему вы считаете это ошибкой?

а увидел про уню, моя уня улетела в мусор на второй день моего знакомства с ардуиной, 8266 через месяц, щас только esp32

спасибо за советы

какой контроллер?

esp32

повезло))

вот что было бы на уно/нано и т.д.

потому что выражение

будет вычисляться в типе int, а далеко не в каждом контроллере “шессот тыщ” помещается в этот тип

Чтобы выражение вычислялось правильно всегда, надо писать так:

uint32_t next_millis_10_min = 60*10*1000ul;

и это стоит делать, даже если вы работаете на ЕСП32.

1 лайк

Влад, твои ставки? Как отреагирует? Спасибо скажет или спорить начнет? Я за второе

Если вы про меня. то спасибо уже было в 65 сообщении :grinning_face:

и ещё разок, спасибо

2 лайка

В чем проблема?
Массив адресов функций, индексирующийся по [Print-1].

Ну да, как-то так(просто для разминки))

Спойлер
void timer_1(void);
void timer_2(void);
void timer_3(void);

uint8_t Print = 0;
void (* func[])(void) = { timer_1, timer_2, timer_3};

void timer_1(void)
{
  //что-то делаем
  Serial.println("Print_1");
}

void timer_2(void)
{
  //что-то делаем
  Serial.println( "Print_2");
}

void timer_3(void)
{
  //что-то делаем
  Serial.println( "Print_3");
}


void setup() {
  Serial.begin(9600);
}

void loop() {
  static uint32_t last_millis = 0;
  if (millis() - last_millis >= 5000 )
  {
    last_millis = millis();
    func[Print++]();
    if (Print > 2)
      Print = 0;
  }

}
1 лайк

В неуниверсальности. Представь, что функции будут иметь разный набор аргументов, а некоторые что-то должны возвращать :wink:

Да, сценарный или потоковый счётчик полезен при переходе с delay на millis. Ещё удобен (при увеличении с одного) при объединении разных скетчей на делеях.

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

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

Но это абсурд.
Приведи пример где бы в конструкции case требовалось вызывать функции с различным количеством аргументов, да при этом чтобы еще часть из них возвращала значение.

А чё так можно было? А в ардуино это тоже сработает? А можно вас иногда спрашивать как написать код, когда я в захожу в тупик?

ну там же полный код выложен, скопируйте да попробуйте

Ссылки на функции тоже можно организовать в массив, как обычные переменные…

//массив функций
typedef void (* TFunction)(void);
TFunction massiv_fun[]={zadanie_1,zadanie_2,zadanie_3};
//

Во!, нашёл, ЕвгенийП подсказал, тока название поправил как помнится, а то или fac или kaka в именах :slight_smile:

Выше уже ответили.

Спросить то можете, но я тут, наверно, самый слабый по уровню знаний (из постоянных участников), т.к. просто любитель. Спрашивайте - если не я , то кто-нибудь ответит. Но лучше книжки(можно сайты) читайте ИМХО.
А в личке общаться нет времени, извините.

bool bCliped = false;
switch (iPrimitiveType)
{
   case ptPoint:  DrawPoint(x, y); break;
   case ptCircle: bClipped = DrawCircle(x, y, r); break;
   case ptRect:   bClipped = DrawRect(x, y, w, h); break;
   case ptText:   bClipped = DrawText(x, y, sText, iTextHeight); break;
   default:       bClipped = false;
}
return bClipped;