два таймера из одного millis

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018

Добрый день. Прошу помощи как новичку.

Можно ли  из стандартного таймера  на millis  получить два, на один и тот же выход, но на разное время например 1000 и 60000 мсек. 

Заранее благодарен за любую помощь.

01const int sveha = 11;
02int State = LOW;
03int State1 = HIGH;
04unsigned long previousMillis = 0;
05const long interval = 1000;
06const long interval_2 = 60000;
07void setup() {
08  Serial.begin(9600);
09  pinMode(sveha, OUTPUT);
10}
11void loop() {
12 
13  unsigned long currentMillis = millis ( );
14  if ( currentMillis - previousMillis >= interval ) {
15    previousMillis = currentMillis;
16    if ( State == LOW ) {
17      State = HIGH;
18    } else {
19      State = LOW;
20      digitalWrite ( sveha, State );
21    }
22  }
23}

 

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

Не знаю, что Вы подразумеваете под "стандартным таймером", но, вероятно, Вам нужно ввести несколько разных previousMillis.

А лучше, конечно, сделать это с применением классов (ООП).

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018

 Классы (ООП) это?

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

Это - что?

Или Вы рисунок забыли вставить?

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018

стандартным я называю "примеры" на сайте адуино - https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

ЧТо такое классы (ООП) ?

 

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

Срочно читайте лекции по ООП, да как можно понятнее!!!!  Иначе зачем этот ваш форум нужен!!!  Бездельники!

ven-til
Offline
Зарегистрирован: 13.02.2018

itar пишет:

ЧТо такое классы (ООП) ?

ООП - это аббревиатура.

 

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

itar пишет:
два таймера из одного millis

Как-то не спортивно. Честнее использовать два millis'а.

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018

  unsigned long currentMillis = millis( ); перввый будет блокировать второй.

  

ven-til
Offline
Зарегистрирован: 13.02.2018

itar пишет:

  unsigned long currentMillis = millis( ); перввый будет блокировать второй.

Где тут первый, а где второй?

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018
unsigned long currentMillis = millis ( );
  if ( currentMillis - previousMillis >= interval_1 ) {
    previousMillis = currentMillis;
    if ( State == LOW ) {
      State = HIGH;
      digitalWrite ( sveha, State );
    }
unsigned long currentMillis = millis ( );                    //второй
  if ( currentMillis - previousMillis >= interval_2 ) {
    previousMillis = currentMillis;
    if ( State == LOW ) {
      State = LOW;
      digitalWrite ( sveha, State );
    }
 
ven-til
Offline
Зарегистрирован: 13.02.2018

Я вижу, что код ещё не тестировали в ардуино.

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018

тестировал "пример " работает, моя химия естественно нет

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018

один интервал работает, два разных интервала не работают.

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

Если хотите, чтобы кто-то читал Ваш код - Вставка программного кода в тему/комментарий

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018
01Сорри!
02unsigned long currentMillis = millis ( );
03  if ( currentMillis - previousMillis >= interval_1 ) {
04    previousMillis = currentMillis;
05    if ( State == LOW ) {
06      State = HIGH;
07      digitalWrite ( sveha, State );
08    }
09unsigned long currentMillis = millis ( );  //второй
10  if ( currentMillis - previousMillis >= interval_2 ) {
11    previousMillis = currentMillis;
12    if ( State == LOW ) {
13      State = LOW;
14      digitalWrite ( sveha, State );
15    }
16  }
17}

 

ven-til
Offline
Зарегистрирован: 13.02.2018

Как именно не работают?

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

itar пишет:

один интервал работает, два разных интервала не работают.

В строках 12 и 13 действительно должны былть LOW в обеих? Меня терзают смытные сомнения, что нет.

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018

что бы я там (строки 12-13)не ставил все равно не работает.

Поэтому и прошу помощи.

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

Так помощи не просят. Вы опубликовали ХЗ что вместо кода (это даже компилироваться не будет) что утверждаете что вставляли туда "что бы".

Давайте конкретный код в котором есть проблема.

fogary
Offline
Зарегистрирован: 05.03.2016

itar пишет:

что бы я там (строки 12-13)не ставил все равно не работает.

Поэтому и прошу помощи.

Вам andriano еще в первом ответе написал, что нужно две переменные previousMillis.

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018
Хорошо попробую  поиграться с 
unsigned long previousMillis_1 = 0;
unsigned long previousMillis_2 = 0;
itar
itar аватар
Offline
Зарегистрирован: 20.03.2018

Вот попробовал, не работает.

01const int ledPin = 13;
02int State = LOW;
03unsigned long previousMillis = 0;
04unsigned long previousMillis_2 = 0;
05const long interval_1 = 1000;
06const long interval_2 = 60000;
07void setup() {
08  pinMode(ledPin, OUTPUT);
09}
10void loop() {
11  unsigned long currentMillis = millis ( );
12  if ( currentMillis - previousMillis >= interval_1 ) {
13    previousMillis = currentMillis;
14    if ( State == LOW ) {
15      State = HIGH;
16      digitalWrite (ledPin, State );
17    }
18  }
19   //unsigned long currentMillis = millis ( );                 
20  if ( currentMillis - previousMillis_2 >= interval_2 ) {
21    previousMillis_2 = currentMillis;
22    if ( State == LOW ) {
23      State = LOW;
24      digitalWrite ( ledPin, State );
25    }
26  }
27}

 

ven-til
Offline
Зарегистрирован: 13.02.2018

В 22 строке всё хорошо?

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018

Да, можно поставить "HIGH" ничего не изменится.

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

ven-til пишет:
В 22 строке всё хорошо?

Я него про это ещё вчера спрашивал (#17), тут ещё к тому же и одна переменная состояния на два светодиода.

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

itar пишет:

Да, можно поставить "HIGH" ничего не изменится.

Вы что, методом тыка что-то ставите или не ставите? Правильно-то как. Вот так и поставьте, а если не меняется, ищите следующую ошибку.

ven-til
Offline
Зарегистрирован: 13.02.2018

А не работает, что именно?

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018

Светодиод горит постоянно!

ven-til
Offline
Зарегистрирован: 13.02.2018

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

Я него про это ещё вчера спрашивал (#17), тут ещё к тому же и одна переменная состояния на два светодиода.


Зато человек чётко описал, что и как должно работать и после каждой попытки очень подробно расписывает, что же не так сработало. А то некоторые просто пишут: 1. хочу два таймера; 2-N не работает, не работает, не работает.

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

itar пишет:

Светодиод горит постоянно!

Вам же уже два дня объясняют. И я и коллега вот присоединился. Вы вообще читаете, что Вам пишут?

Ну, давайте смотреть:

Вот истёк первый интервал времени и сработало условие в строке 12. Что при это происходит? State становится HIGH и зажигается светодиод.

Что дальше? А ничего, все Ваши проверки идут на state == LOW (строки 14 и 22). А поскольку state  уже стала HIGH - ни одна из этих проверо никогда не сработает и state навсегда останется HIGH.

Понимаете? Или не так объяснил?

 

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

ven-til пишет:
Зато человек чётко описал, что и как должно работать

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

ven-til пишет:
после каждой попытки очень подробно расписывает

А вот тут нет. И Вы и я говорим про одно и тоже и получаем ответы -"да, ставил я по-разному". Это не то, чтобы "подробно" :)

 

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

itar, в общем случае, Ваша задача безусловно имеет право на жизнь. Но вот Ваш конкретный пример выглядит несколько странно. Вы понимаете, что если Вам по двум таймерам нужно делать одно и то же, и один интервал кратен другому, то один таймер можно просто выкинуть? Конечно если у Вас будут произвольные, не кратные интервалы, то всё нормально.

fogary
Offline
Зарегистрирован: 05.03.2016

Автор, раскройте тайну, что должна делать ваша программа?

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

itar пишет:

Светодиод горит постоянно!

Повезло!

 

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

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

Вы что, методом тыка что-то ставите или не ставите? 

Цитата:

... работая в Силиконовой Долине, Резник занимался так называемым RCP – «random code programming» ...

RCP – это близкое по идеологии, но совершенно иное по целям и результатам направление в программировании. Здесь мы генерируем не случайные комбинации входных данных, а случайные последовательности самого программного кода. А потом прикладываем к этому коду принципы «exhaustive testing».

Это как с обезьяной, способной за миллион лет настучать на машинке «Войну и мир» – только в случае с RCP мы отводим миллиард лет, делаем обезьяне серьезный оверклок воткнутым в задницу высоковольтным проводом – и ожидаем, что она напишет нам не «Войну и мир», а программу, способную написать «Войну и мир».

Качество задачи меняется – поэтому нужна очень высокая производительность и большие объемы памяти. Сегодня с этим проблем нет: мощности избыточны. Достаточно задать требования к выходным секвенциям, и мы рано или поздно получим программу, которая будет делать то, что нам угодно.

© Виктор Пелевин "iPhuck 10"

:-D

 

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018

светодиод должен гореть 1 сек, 10 сек молчать

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018
01const int ledPin = 13;
02int State = LOW;
03unsigned long previousMillis_1 = 0;
04unsigned long previousMillis_2 = 0;
05const long interval_1 = 1000;
06const long interval_2 = 10000;
07void setup() {
08  pinMode(ledPin, OUTPUT);
09}
10void loop() {
11  unsigned long currentMillis = millis ( );
12  if ( currentMillis - previousMillis_1 >= interval_1 ) {
13    previousMillis_1 = currentMillis;
14    if ( State == LOW ) {
15      State = HIGH;
16      digitalWrite ( ledPin, State );
17    } else {
18      if ( currentMillis - previousMillis_2 >= interval_2 ) {
19        previousMillis_2 = currentMillis;
20        if ( State == HIGH ) {
21          State = LOW;
22          digitalWrite ( ledPin, State );
23                }
24      }
25    }
26  }
27}
28Вот в таком виде горит 10сек 1 сек молчит.
29А мне нужно наоборот!

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Ну так поменяйте местами значения интервалов или LOW/HIGH.

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018

не поможет

Olej
Olej аватар
Offline
Зарегистрирован: 05.03.2018

itar пишет:

Вот в таком виде горит 10сек 1 сек молчит.

1А мне нужно наоборот!

Кайф!

RCP говорит: сменить LOW на HiGH, и наоборот ("часы на трусы").

 

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

itar пишет:

не поможет

Беда :(

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

itar пишет:

Вот в таком виде горит 10сек 1 сек молчит.
А мне нужно наоборот!

Афтар, нафига ты второй интервал упрятал в else от первого?

Нет больше сил смотреть на твою тупость. На, держи:

01unsigned long previousMillis_1;
02unsigned long previousMillis_2;
03unsigned long currentMillis = millis ( );
04 
05 if ( currentMillis - previousMillis_1 >= interval_1 ) {  // интервал_1 сверяем с временем_1
06   previousMillis_2 = currentMillis;                    // <=== тут запускаем время_2 !!!
07   if ( State == LOW ) {
08     State = HIGH;
09     digitalWrite ( sveha, State );
10   }
11 
12 if ( currentMillis - previousMillis_2 >= interval_2 ) {  // интервал_2 сверяем с временем_2
13   previousMillis_1 = currentMillis;                   // <=== тут запускаем время_1 !!!
14   if ( State == HIGH ) {
15     State = LOW;
16     digitalWrite ( sveha, State );
17   }

 

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

b707 пишет:

Нет больше сил смотреть на твою тупость. На, держи:

Сломался? :))))

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

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

Сломался? :))))

Ага :)

Я б у таких ардуино отбирал с поражением в правах на 10 лет. Тут либо просто выгнать его с форума, либо дать ему код и он сам уйдет. Пытаться наставить его на путь бесполезно,  мой пылесос и то больше в программировании смыслит...

ven-til
Offline
Зарегистрирован: 13.02.2018

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

Сломался? :))))

И в этом +, ТС так и будет жить с убеждением, что для решения этой задачи нужно два интервала.

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

Так, упс, извиняйте парни, ошибка вышла. Вот так будет лучше:

01unsigned long previousMillis;
02unsigned long currentMillis = millis ( );
03 
04if ( State == LOW ) {
05  if ( currentMillis - previousMillis >= interval_1 ) { 
06     previousMillis = currentMillis;                   
07     State = HIGH;
08     digitalWrite ( sveha, State );
09   }}
10 
11  if ( State == HIGH ) {
12  if ( currentMillis - previousMillis >= interval_2 ) { 
13     previousMillis = currentMillis;                 
14     State = LOW;
15     digitalWrite ( sveha, State );
16   }}

 

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

ven-til пишет:

И в этом +, ТС так и будет жить с убеждением, что для решения этой задачи нужно два интервала.

В общем случае, кмк,  тут нужно два интервала.  А вот Превиус_миллис зватит и одного.

itar
itar аватар
Offline
Зарегистрирован: 20.03.2018

спасибо конечно!но только  ни в первом, ни во втором случае, все равно "не работает!"

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

itar пишет:

спасибо конечно!но только  ни в первом, ни во втором случае, все равно "не работает!"

выложите скетч целиком

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

b707 пишет:

itar пишет:

спасибо конечно!но только  ни в первом, ни во втором случае, все равно "не работает!"

выложите скетч целиком

Дык, это, вы его еще не написали.