Millis не могу осилить.

Moro_500
Offline
Зарегистрирован: 08.03.2021

b707 пишет:
так и пишите delay(2000);

лично я бы так и сделал, поставил бы delay в сетапе, исходя из задачи ТС, но

Moro_500 пишет:
ТС-у нужно принципиально чтоб без delay

v258 пишет:
а ты вообще ардуину на две секунды застопорил

дак

Moro_500 пишет:
она не блокирует МК, это пустой цикл, в который если надо, можно добавить какие-то действия

пердуинка обладает скромными ресурсами, вот и боремся за каждый байт, каждый такт, я и не говорил что мой пример идеален, но он явно эффективнее из предложенных здесь трёх примеров за 50 постов.

b707
Offline
Зарегистрирован: 26.05.2017

Моро500 - хуже нет когда мужик начинает юлить.
Замена delay() на такой, как у тебя, while - типичная ошибка новичка. И смотреть, как ты виляешь, пытаясь представить, что "так и задумано" - просто противно.

Я вижу, что тебя сейчас не переубедить, но это не беда - с твоим самомнением ты непременно скоро сядешь в лужу в чем-нибудь другом

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Moro_500 пишет:

она не блокирует МК, это пустой цикл, в который если надо, можно добавить какие-то действия

Она блокирует МК ибо ничем от простого делея не отличается

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Moro_500 пишет:

b707 пишет:
так и пишите delay(2000);

лично я бы так и сделал, поставил бы delay в сетапе, исходя из задачи ТС, но

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

void loop()
{
  static uint32_t interval = 2000;
  static uint32_t start = 0;
  static bool statusLED = false;
  if (millis() - start >= interval)
  {
    start = millis();
    statusLED = !statusLED;
    digitalWrite(LED, statusLED);
  }
  if (statusLED)
    interval = 100;
  else
    interval = 1000;
}

Первый раз условие в шестой строке сработает не ранее, чем через две секунды. Не нравится statusLED? Да пожалуйста

void loop()
{
  static uint32_t interval = 2000;
  static uint32_t start = 0;
  if (millis() - start >= interval)
  {
    start = millis();
    if (digitalRead(LED))
    {
      digitalWrite(LED, false);
      interval = 1000;
    } else {
      digitalWrite(LED, true);
      interval = 100;
    }
  }
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Moro_500 пишет:

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

Ардуинка раз в 30 по производительности превосходит первое поколение массовых ПК. А задачи у нее, как правило, попроще.

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

А в небольшом числе оставшихся лишь небольшой процент кода (обычно не более 10%) являются критичными к скорости выполнения.

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

Moro_500
Offline
Зарегистрирован: 08.03.2021

b707, да у вас, месье, богатая фантазия, я бы вообще просто delay в сетапе поставил и всё, потому что мне надо, сука, НИЧЕГО не делать первые 2 секунды, но поставил миллис т.к. в условиях задачи ТС не юзать делай, да, фантазии у вас много, жаль только что не для примера кода, но только не такого медленного как у wdrakula

v258 пишет:
Она блокирует МК ибо ничем от простого делея не отличается

нет,

Moro_500 пишет:
она не блокирует МК, это пустой цикл, в который если надо, можно добавить какие-то действия

v258 пишет:
Нигде не было оговорено, что и все остальное должно задержаться на две секунды. Стало быть нужно задерживать именно блинк.

да, но и обратное не было обговорено, если надо задерживать только блинк, тогда это уже совсем другое дело.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Moro_500 пишет:

Моя профессия - ИП, свой автокран, и давай ты бомжара не будешь мне давать советы...
...тут куча бреда...

1. ИП - это не профессия, а организационная форма - Индивидуальный предприниматель.

2. автокран? то есть пролетарий? ну что ты в науку то лезешь?

3. слово "бомжара" в этом случае нужно было выделить запятыми. Так что и с языком проблемы.

Таким образом имеем плохо образованного пролетария с амбициями. Брысь уж, лишенец.

-----------------

Я, кстати, не учу тебя груз закреплять на твоем кране. Ты же, непонятно с какого хера, лезешь в программирование. Андриано уже написал тебе, я только повторю: да, проверка занимает дополнительные такты, но этим я плачу за отсутствие кода в сетапе. В целом - это оправданная плата. Эффективность кода не является главной целью. Ты же не ведешь свой кран по улицам с максимальной разрешенной скоростью? Кроме времени в дороге, у тебя есть более важные критерии, так?

Надоело мне спорить. С твоим подходом забанят тебя скоро, так что нет нужды привыкать.

b707
Offline
Зарегистрирован: 26.05.2017

v258 пишет:

Moro_500 пишет:

она не блокирует МК, это пустой цикл, в который если надо, можно добавить какие-то действия

Она блокирует МК ибо ничем от простого делея не отличается


более того, если заглянуть в исходник delay() - там внутри именно такой цикл и зашит.
Так что код с while аналогичен делею не только по смыслу, но и по оформлению. Единственная причина заменять delay на подобный while - это внешнее условие "не использовать делеи", которое выдает ТС с головой - такие условия могут ставится только преподом в учебных целях.
Так что я сразу сказал, что ТС двоешник, пришел на форум домашку списывать. А ты такой же двоешник - сразу полез ему помогать, даже не спросив, откуда это бредовое условие

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Это сколько же ТС народа обматерил из-за легендарного миллиса !? Фантастика :)

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Moro_500 пишет:

v258 пишет:
Она блокирует МК ибо ничем от простого делея не отличается

нет,

Да. Потому что она именно блокирует. Хоть чем ее наполни - она ВСЕ РАВНО БЛОКИРУЕТ.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

b707][quote=v258 пишет:

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

Я не двоешник, я - пень трухлявый )))

b707
Offline
Зарегистрирован: 26.05.2017

v258 пишет:

Я не двоешник, я - пень трухлявый )))

это не вам, это мороку-500

MaksVV
Offline
Зарегистрирован: 06.08.2015

v258 пишет:
а ты вообще ардуину на две секунды застопорил. Молодец, че )))

смешно? нет, зато без delay. 

Moro_500
Offline
Зарегистрирован: 08.03.2021

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

в программирование лезу потому что ардуинки и взлом ехе-шников игр на ассемблере это моё хобби, глядя на ассемблерный код, видишь как после компиляции всё не эффективно организовано, сколько бесполезных тактов, джампов на соседний адрес, нопов, и тд., а всё ради того чтоб программистам на сях было удобно кодить, для игр не критично, а пердуинки стремлюсь оптимизировать, даже выполнение пустого if без условия и тела это уже операция перехода по адресу

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Moro_500 пишет:

в программирование лезу потому что ардуинки и взлом ехе-шников игр на ассемблере это моё хобби, глядя на ассемблерный код, видишь как после компиляции всё не эффективно организовано, сколько бесполезных тактов, джампов на соседний адрес, нопов, и тд., а всё ради того чтоб программистам на сях было удобно кодить, для игр не критично, а пердуинки стремлюсь оптимизировать, даже выполнение пустого if без условия и тела это уже операция перехода по адресу

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

b707
Offline
Зарегистрирован: 26.05.2017

brokly пишет:

Причем уровень этот начинает вызывать подозрения....

Брокли,  куда спешить-то? Время покажет, что он стоит.

Сколько тут уже было уверенных в себе "знатоков языка с университетским уровнем"? - десять? двадцать? - каждый раз это заканчивается либо "помогите написать цикл For", либо , из последнего - огромным срачем на тему того, что сумма нескольких байт не может поместится в 8 бит :))))

И где они все? :)

 

Moro_500
Offline
Зарегистрирован: 08.03.2021

вот вы говорите что моя конструкция

interval=millis();
while(millis()-interval<2000){}

блокирует МК, это же цикл, в котором можно что то выполнять, например

interval=millis();
while(millis()-interval<2000)
  {
    radio.write(&message,4);
  }

ну и где он работает как делай и блокирует МК?

v258 пишет:
Да. Потому что она именно блокирует. Хоть чем ее наполни - она ВСЕ РАВНО БЛОКИРУЕТ.

а можно в этом цикле сделать if проверку чего-либо и если условие верное то сделать break внутри if, что приведёт к выходу из while до того как пройдут эти 2 секунды, эта конструкция блокирует МК не больше чем любой другой while

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Moro_500 пишет:

вот вы говорите что моя конструкция

interval=millis();
while(millis()-interval<2000){}

блокирует МК, это же цикл, в котором можно что то выполнять, например

interval=millis();
while(millis()-interval<2000)
  {
    radio.write(&message,4);
  }

ну и где он работает как делай и блокирует МК?

v258 пишет:
Да. Потому что она именно блокирует. Хоть чем ее наполни - она ВСЕ РАВНО БЛОКИРУЕТ.

а можно в этом цикле сделать if проверку чего-либо и если условие верное то сделать break внутри if, что приведёт к выходу из while до того как пройдут эти 2 секунды, эта конструкция блокирует МК не больше чем любой другой while

Да сколько ж можно? Какие еще действия может выполнять МК, пока две секунды шлет весточки по радио? А с учетом того, что это запхнуто в setup? А с учетом того, что в конкретном твоем коде НИКАКОГО наполнения действиями не было? А с учетом того, что delay() определяется именно таким образом, т.е. ты просто переписал вместо делея его реализацию? Утомил, короче ))

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Moro_500 пишет:
эта конструкция блокирует МК не больше чем любой другой while

Снова пролетарщина прет. Ты просто не знаешь терминологии. "Блокирующий код" - код который останавливает loop() или иной основной цикл МК. В твоем случае то, что свой говнокод ты разместил в сетапе - ничего не меняет. Начало лупа отложено. "Неблокирующий код" - проходится за микро или милли секунды, и выполнение основного цикла продолжается, вне зависимости от того, разместил ли ты что-то  внутри холостого цикла или нет.

делей - блокирует, как и его суррогаты, типа твоего. Проверка времени - не блокирует.

=======================

Коллеги! Еще раз, мы спорим с крановщиком! Не ай-я-яй? Ну и пусть он останется при своем мнении! Это мнение - крановщика! ;))) О программировании. Не смешно? Давайте с сантехником еще пообщаемся или с  грузчиком. Про  разницу статической и динамической типизации в компилируемых ЯП пятого поколения.

Moro_500
Offline
Зарегистрирован: 08.03.2021

v258 пишет:
Да сколько ж можно? Какие еще действия может выполнять МК, пока две секунды шлет весточки по радио?

Да сколько ж можно? ЛЮБЫЕ!

v258 пишет:
А с учетом того, что в конкретном твоем коде НИКАКОГО наполнения действиями не было?

А с учётом того что конкретной этой задачей было ничего не делать 2 секунды?

v258 пишет:
А с учетом того, что delay() определяется именно таким образом

А с учётом того что во время delay нельзя ничего выполнять, а во время while можно всё что угодно?

Moro_500 пишет:
bwn, уровень подготовки дедов здесь как я посмотрю "доверяй но проверяй". Причина: "правильный говнокод".

ой всё, утомили старпёры шаблонно мыслящие, я вообще тут новичёк и знания языка поверхностные, но мы тут обсуждали простейшие примеры с простейшими циклами

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Moro_500 пишет:

я вообще тут новичёк и знания языка поверхностные

Ну так и не спорь со старшими

Moro_500
Offline
Зарегистрирован: 08.03.2021

хорошо, вот у меня скетч

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(9,10);
unsigned long message = 4000000000;
unsigned long timer;
unsigned long timer2;
byte x;

void setup()
  {
    Serial.begin(500000);
    radio.begin();
    radio.setAutoAck(false);
    radio.setPayloadSize(4);
    radio.setCRCLength(RF24_CRC_DISABLED);
    radio.setAddressWidth(3);
    radio.setChannel(0x60);
    radio.setDataRate (RF24_250KBPS);
    radio.setPALevel (RF24_PA_MAX);
    radio.openWritingPipe(0xAABBCC);
    radio.openReadingPipe(1,0xAABBCC);
    radio.powerUp();
    radio.txDelay = 0;
  }

void loop()
  {
    timer=millis();
    x=0;
    while(1)
      {
        timer2=millis()+10;
        radio.stopListening();
        radio.write(&message,4);
        radio.startListening();
        while(1)
          {
            if(radio.available())
              {
                radio.read(&message,4);
                radio.flush_rx();
                x++;
                  if(x>=100)
                    {
                      Serial.println(millis()-timer);
                      return;
                    }
                break;
              }
            else if(millis()>timer2)
              {
                Serial.println("Error");
                return;
              }
          }
      }
  }

для того чтоб посчитать за какое время две nRF24L01 успеют обменяться 100 пакетами, прошу не ругаться на говнокод/быдлокод, я там ничего не оптимизировал, есть сотня вариантов конструкций для выполнения одной и той же задачи и я не говорю что это одна из лучших

в строке 37 находится бесконечный безусловный цикл while(true), в нём несколько условий, 1 break и 2 return, если пакеты приходят не позже 10 мс, то while продолжается, если пакет не дошёл, то while прерывается и начинается следующий цикл loop, почти всё время программа находится в while(true) и на короткое время выходит из него либо если потерялся пакет, либо если набралось 100 пакетов, короче break и return делают выход из while, являются ли по вашему мнению эти while блокирующими, если да, то я понятия не имею и не могу представить каким может быть неблокирующий while который мы тут обсуждаем

taxiiiii
Offline
Зарегистрирован: 07.03.2021

Ух сколько сообщений сегодня появилось.
Читаю книги, пытаюсь понять, жду посылку с книгой ( на бумаге проще читать).

V258 мыслит правильно. Задержка должна быть только на мигание.
Спасибо всем за примеры.
Пробовать буду наверное только на выходных.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Moro_500 пишет:

я понятия не имею и не могу представить каким может быть неблокирующий while который мы тут обсуждаем

Мы не обсуждаем неблокирующих while. Любой цикл блокирует выполнение программы. И это ни хорошо и не плохо. При грамотном применении все нормально работает. При неграмотном получается хня. Я тебе даже крамольную мысль скажу - delay() сам по себе тоже ничем не плох и в каких-то случаях его применение вполне оправдано. Тут речь идет о том, что ты (лично ты) применил блокировку там, где ее применять не было нужды. Более того, тебе даже два варианта неблокирующей задержки показали. За что ты тут вторую страницу воюешь - не понятно

Kakmyc
Offline
Зарегистрирован: 15.01.2018

А у меня такой вариант:

void setup(){
    pinMode(LED_BUILTIN,OUTPUT);
}
void loop(){
    static uint32_t timer=millis();
    static int16_t interval=2000;
    static boolean isBlink=false;
    if(millis()-timer>=interval){
        timer=millis();
        isBlink=!isBlink;
        interval=100+(900*isBlink);
        digitalWrite(LED_BUILTIN,isBlink);
    }    
}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Kakmyc пишет:

А у меня такой вариант:

void setup(){
    pinMode(LED_BUILTIN,OUTPUT);
}
void loop(){
    static uint32_t timer=millis();
    static int16_t interval=2000;
    static boolean isBlink=false;
    if(millis()-timer>=interval){
        timer=millis();
        isBlink=!isBlink;
        interval=100+(900*isBlink);
        digitalWrite(LED_BUILTIN,isBlink);
    }    
}

 

Между прочим - ну ОЧЕНЬ красиво!!! Просто молодец! Можно умножение заменить на тернарный оператор, или поверить, что оптимизатор сам это сделает.

b707
Offline
Зарегистрирован: 26.05.2017

wdrakula пишет:

Можно умножение заменить на тернарный оператор, или поверить, что оптимизатор сам это сделает.

лучше переменную isBlink заменить на чтение из порта.

Но это код Кактуса и он таков, какой есть.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Кактус - молодец. 

Dumper
Offline
Зарегистрирован: 21.09.2020

Работал с несколькими людьми с форума в тандеме заказчик-исполнитель. Кактус один из немногих, кто решает задачу быстро и правильно!

 

b707
Offline
Зарегистрирован: 26.05.2017

Dumper пишет:

Работал с несколькими людьми с форума в тандеме заказчик-исполнитель. Кактус один из немногих, кто решает задачу быстро и правильно!

А остальные как - "не решают" или "неправильно"? :)

Dumper
Offline
Зарегистрирован: 21.09.2020

b707 пишет:

А остальные как - "не решают" или "неправильно"? :)

Вы мыслите, как истинный программер. Если я одного из вас выделил как true, то это не означает, что все остальные false. Ну как-то так )

Лично Вы мне тоже очень помогли некоторое время назад. Вы тоже true, если я Вас зацепил оценкой в копилку Кактусу )))))

b707
Offline
Зарегистрирован: 26.05.2017

Dumper пишет:

b707 пишет:

А остальные как - "не решают" или "неправильно"? :)

Вы мыслите, как истинный программер. Если я одного из вас выделил как true, то это не означает, что все остальные false.

тем не менее смысл вашего поста получился именно такой :)

Цитата:
Лично Вы мне тоже очень помогли некоторое время назад.

сорри, на похвалу не напрашивался. Если честно, не помню, чтобы у нас с Вами были какие-то проекты - иначе не написал бы.

Dumper
Offline
Зарегистрирован: 21.09.2020

b707 пишет:

сорри, на похвалу не напрашивался. Если честно, не помню, чтобы у нас с Вами были какие-то проекты - иначе не написал бы.

Проектов у нас с Вами пока не было. Был лишь Ваш альтруизм, который помог мне сдвинуться с мёртвой точки.

Moro_500
Offline
Зарегистрирован: 08.03.2021

Kakmyc пишет:

void setup(){
    pinMode(LED_BUILTIN,OUTPUT);
}
void loop(){
    static uint32_t timer=millis();
    static int16_t interval=2000;
    static boolean isBlink=false;
    if(millis()-timer>=interval){
        timer=millis();
        isBlink=!isBlink;
        interval=100+(900*isBlink);
        digitalWrite(LED_BUILTIN,isBlink);
    }    
}

Kakmyc, аплодирую стоя.

wdrakula, видал как это делается? а ты чево нагородил?

wdrakula пишет:

const uint16_t StartDelay = 2000;
const uint16_t OnTime = 100;
const uint16_t OffTime = 1000;


void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  static boolean isBlinking = false;
  static uint32_t oldMillis = millis();
  uint32_t newMillis = millis();
  boolean ledOn = digitalRead(LED_BUILTIN);

  if (not isBlinking and newMillis - oldMillis > StartDelay) {
    isBlinking = true;
    oldMillis = newMillis;
    digitalWrite(LED_BUILTIN, HIGH);
  }
  else if (isBlinking and ledOn and newMillis - oldMillis > OnTime) {
    digitalWrite (LED_BUILTIN, LOW);
    oldMillis = newMillis;

  }
  else if (isBlinking and not ledOn and newMillis - oldMillis > OffTime) {
    digitalWrite (LED_BUILTIN, HIGH);
    oldMillis = newMillis;

  }
}

такое ощущение что ты не лампочкой моргаешь а шаттл запускаешь)

sadman41
Offline
Зарегистрирован: 19.10.2016

Плескану масла в огонь:

digitalWrite(LED_BUILTIN, millis() % allTime < onTime);

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Moro_500 пишет:
тут в основном посылают книшки пачитать
Это сначала.

Если же поциент отказывается это делать, его посылают гораздо дальше.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

 while(millis()-interval<2000){}   //без delay

Да. без делей :) Но что толку? Вы в курсе. что такая конструкция так же блокирует МК, как задержка? - тогда зачем выпендриваться, так и пишите delay(2000)

С delay или без - это вопрос не технический (блокировки там всякие, прости Господи) а чисто религиозный. А Вы таким постами оскорбляете чувства верующих!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

taxiiiii пишет:
буду изучаь else
Успехов!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sadman41 пишет:

Плескану масла в огонь:

digitalWrite(LED_BUILTIN, millis() % allTime < onTime);

Это код совсем не для девочек! А потому - гнусный сексизм!

(но, плюсик - мой :-)

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

sadman41 пишет:

Плескану масла в огонь:

digitalWrite(LED_BUILTIN, millis() % allTime < onTime);

 

2000 мс стартовой задержки нет. ;)))

тогда так:

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
 }

void loop()
{
  digitalWrite(LED_BUILTIN, millis() > 2000 && (millis() - 2000) % 1100 < 100);
} 

Вот это и есть истиный говнокод. Прям хоть поля удобряй ;)))))))))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

digitalWrite(LED_BUILTIN, millis() > 2000 && (millis() - 2000) % 1100 < 100);

Вот это и есть истиный говнокод.

Не, ну а чё миллис два раза вызывается? Он же и поменяться между вызовами может! И ваще - нестрого, перерасход ресурсов!

Тогда уж так:

digitalWrite(LED_BUILTIN, []()->uint8_t{const uint32_t m=millis(); return m>2000 && (m-2000)%1100<100;}());
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

wdrakula пишет:

digitalWrite(LED_BUILTIN, millis() > 2000 && (millis() - 2000) % 1100 < 100);

Вот это и есть истиный говнокод.

Не, ну а чё миллис два раза вызывается? Он же и поменяться между вызовами может! И ваще - нестрого, перерасход ресурсов!

Тогда уж так:

digitalWrite(LED_BUILTIN, []()->uint8_t{const uint32_t m=millis(); return m>2000 && (m-2000)%1100<100;}());

Я так и хотел, не поверишь. Но переменная на стеке! Хотя лябда, бесспорно, повышает уровень говна в говнокоде! ;))))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, переменная на стеке, её ещё объявить надо где-то. Кстати, лямбду можно подсократить "->uint8_t" там явное эстетство. Компилятор и сам не развалится преобразовать :-)

Dumper
Offline
Зарегистрирован: 21.09.2020

А тс кросаучег))) Пока титаны мерились программаторами, автор получил на халяву идеальнейший код. НЛП сплошное.

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Dumper пишет:
А тс кросаучег))) Пока титаны мерились программаторами, автор получил на халяву идеальнейший код. НЛП сплошное.

Не, я думаю, ТС вспыльчивый, но вменяемый. Просто в самом начале изучения ардуино.

Кстати, мне и самому было интересно увидеть варианты "титанов". "Намотал на ус".

в результате у меня получилось так, при условии, что OnTime < OffTime

const uint32_t StartDelay = 2000;
const uint32_t OnTime = 100;
const uint32_t OffTime = 1000;

void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop(){
    static uint32_t oldMillis = millis();
    static uint32_t onOffTime = StartDelay;
    uint32_t newMillis = millis();
    boolean ledOn = digitalRead(LED_BUILTIN);
    
    if(newMillis-oldMillis>=onOffTime){
        oldMillis=millis();
        ledOn=!ledOn;
        onOffTime=OnTime+((OffTime - OnTime)*!ledOn);
        digitalWrite(LED_BUILTIN,ledOn);
    }    
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Мне он напоминает юного студента, который вдруг познал, что он велик и пытается казаться умудренным старцем. Или так и не повзрослевшего инфантила. ИМХО.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

AndreyD пишет:

в результате у меня получилось так, при условии, что OnTime < OffTime

const uint32_t StartDelay = 2000;
const uint32_t OnTime = 100;
const uint32_t OffTime = 1000;

void setup(){
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop(){
    static uint32_t oldMillis = millis();
    static uint32_t onOffTime = StartDelay;
    uint32_t newMillis = millis();
    boolean ledOn = digitalRead(LED_BUILTIN);
    
    if(newMillis-oldMillis>=onOffTime){
        oldMillis=millis();
        ledOn=!ledOn;
        onOffTime=OnTime+((OffTime - OnTime)*!ledOn);
        digitalWrite(LED_BUILTIN,ledOn);
    }    
}

Я не титан, но глянул ))

Скетч использует 1086 байт (3%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 25 байт (1%) динамической памяти, оставляя 2023 байт для локальных переменных. Максимум: 2048 байт.

1) Константы в 1-3 строках не нужны в принципе. Каждая из них занимает два байта. Если заменить их дефайнами, то занимать не будут ничего, а на функционале не скажется

#define StartDelay 2000
#define OnTime 100
#define OffTime 1000

2) 17 строка - преобразование ledOn, 18 строка - обратное преобразование ledOn. Очевидно, 17 строку можно оптимизировать ))

onOffTime = OnTime + ((OffTime - OnTime) * ledOn);
digitalWrite(LED_BUILTIN, !ledOn);

3) Ну и собственно 18 строку можно избавить от вычислений

 ledOn ? (onOffTime = OffTime) : (onOffTime = OnTime);

4) Переменная newMillis имела бы значение, если бы использовалась не только в сравнении, а и в 16 строке. Это имело бы смысл в случае, если накопление погрешности недопустимо для каких-то точных измерений, в обычном блинке это излишне. Значит и ее оптимизируем ))

Итого

#define StartDelay 2000
#define OnTime 100
#define OffTime 1000

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  static uint32_t oldMillis = millis();
  static uint32_t onOffTime = StartDelay;
  boolean ledOn = digitalRead(LED_BUILTIN);

  if (millis() - oldMillis >= onOffTime) {
    oldMillis = millis();
    ledOn ? (onOffTime = OffTime) : (onOffTime = OnTime);
    digitalWrite(LED_BUILTIN, !ledOn);
  }
}
Скетч использует 1062 байт (3%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 25 байт (1%) динамической памяти, оставляя 2023 байт для локальных переменных. Максимум: 2048 байт.

 

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

С дефайнами я читал есть свои "заморочки",  рекомендуют их заменить на const или constexpr (VS вот у меня рекомендует заменить на последнее, хотя не знаю ещё почему)

И тернарный оператор ТС ещё рано показывать.

sadman41
Offline
Зарегистрирован: 19.10.2016

У меня const ничего лишнего не отбирает у Ардуины. Перешёл с define на const, чтобы размерности переменных считались корректно. А то так в запале UL забудешь и мозги кипятишь.

Тернарный оператор с двумя присваиваиваниями волшебен, конечно: ledOn ? (onOffTime = OffTime) : (onOffTime = OnTime);

Сразу вспоминается сцена на заправке из "Бумера".

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

sadman41 пишет:
Тернарный оператор с двумя присваиваиваниями волшебен, конечно: ledOn ? (onOffTime = OffTime) : (onOffTime = OnTime);

Сразу вспоминается сцена на заправке из "Бумера".

Эмм, а в чем проблема? Ну так, для самообразования ))