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

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

вот целиком

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

 

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

itar пишет:

вот целиком

Работает.

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

Вот такой код тоже работает.

1if ( currentMillis - previousMillis >= interval ) { 
2     previousMillis = currentMillis;                   
3     boolState = !boolState;
4     digitalWrite ( sveha, boolState );
5     interval = 11000-interval;
6   }

 

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

itar. вы настолько криворукий. что даже готовый код не в состоянии использовать?

Для наглядности добавил вывод в Сериал:

01const int ledPin = 13;
02int State = LOW;
03unsigned long previousMillis;
04const long interval_1 = 1000;
05const long interval_2 = 2000;
06void setup() {
07  pinMode(ledPin, OUTPUT);
08  Serial.begin(9600);
09}
10void loop() {
11    unsigned long currentMillis = millis ( );
12  if ( State == LOW ) {
13  if ( currentMillis - previousMillis >= interval_1 ) {
14     previousMillis = currentMillis;                  
15     State = HIGH;
16     Serial.print(" Go to High ");
17     Serial.println(currentMillis);
18     digitalWrite (ledPin, State );
19   }}
20  if ( State == HIGH ) {
21  if ( currentMillis - previousMillis >= interval_2 ) {
22     previousMillis = currentMillis;                
23     State = LOW;
24     Serial.print(" Go to Low ");
25     Serial.println(currentMillis);
26     digitalWrite ( ledPin, State );
27    }
28  }
29}

А вот результат работы

1Go to High 1000
2 Go to Low 3000
3 Go to High 4000
4 Go to Low 6000
5 Go to High 7000
6 Go to Low 9000
7 Go to High 10000

 

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

ven-til пишет:

Вот такой код тоже работает.

не забудьте только правильно указать типы данных - а то ТС сам не справится. У него, заметьте - интервал типа long

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

Если наоборот.

вот в таком виде действительно получилось,то что и требовалось.

01const int ledPin = 13;
02int State = LOW;
03unsigned long previousMillis;
04const long interval_1 = 10000;
05const long interval_2 = 1000;
06void setup() {
07  pinMode(ledPin, OUTPUT);
08  Serial.begin(9600);
09}
10void loop() {
11    unsigned long currentMillis = millis ( );
12  if ( State == LOW ) {
13  if ( currentMillis - previousMillis >= interval_1 ) {
14     previousMillis = currentMillis;                 
15     State = HIGH;                           //потушили
16     Serial.print(" Go to High ");
17    Serial.println(currentMillis);
18     digitalWrite (ledPin, State );
19   }}
20  if ( State == HIGH ) {
21  if ( currentMillis - previousMillis >= interval_2 ) {
22     previousMillis = currentMillis;               
23     State = LOW;                                 //включили
24     Serial.print(" Go to Low ");
25     Serial.println(currentMillis);
26     digitalWrite ( ledPin, State );

Спасибо.

 

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

itar пишет:

Если наоборот.

вот в таком виде действительно получилось,то что и требовалось.

Ну слава богу - заказчик принял работу :)

itar, так в чем выражалось "не работает" ? - то что я в примере поставил интервал 2 сек вместо нужных Вашему Сиятельству 10-ти? :)

Офигеть - уже и значения констант в готовом скетче сами поменять не могут.

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

b707 пишет:

Офигеть - уже и значения констант в готовом скетче сами поменять не могут.

Не царское это дело! Взялся, так будь любезен не халтурить, а выставлять все константы как надо! Совсем помогатели распустились, блин!

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

я не  знаю почему вариант ven-tilа  не работал . светодиод просто горел.

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

itar пишет:

я не  знаю почему вариант ven-tilа  не работал

причем тут вариант ven-tilа - я спрашиваю про свой код - который ваш скетч из #51

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

Столько агрессии.я же не утверждал, что я специалист.

приобрел плату месяц назад, это весь мой опыт.

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

ваш код работал .только я местами поменял интервалы и все.

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

itar пишет:

Столько агрессии.я же не утверждал, что я специалист.

приобрел плату месяц назад, это весь мой опыт.

Они тут такие.

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

всего пару дней поплевали. Зато результат.

И на том спасибо.

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

itar пишет:

всего пару дней поплевали. Зато результат.

И на том спасибо.

Просто кто-то наплевательски отнесся к вразумительной подаче ответов.

Pyotr
Offline
Зарегистрирован: 12.03.2014

Часто так строю loop()

 

Bruzzer
Offline
Зарегистрирован: 17.03.2020

Pyotr пишет:

Часто так строю loop()

Спасибо за пример. Маленькое замечание. У вас нумерация действий  идет в обратном порядке. Сначала выполнится 3 потом 2 потом 1.

1if(((countCycle + 13) % 10) == 0){//кажд.100 мс
2 //действие 1
3}
4if(((countCycle + 15) % 10) == 0){//кажд.100 мс     
5  //действие 2
6}
7if(((countCycle + 17) % 10) == 0){//кажд.100 мс
8  //действие 3
9}
rkit
Offline
Зарегистрирован: 23.11.2016

Pyotr пишет:

И получаешь не пропуски так повторы. Кошмар.

Pyotr
Offline
Зарегистрирован: 12.03.2014

rkit пишет:

Pyotr пишет:

И получаешь не пропуски так повторы. Кошмар.

rkit,  почему кошмар? Обычный быдлокод ардуинщика.

Сейчас проверить не могу, покажи, если не трудно, код где видны пропуски и повторы.

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

Вышел я из возраста, на слабО и писькометрии. Любой, желающий поплеваться желчью, может это сделать, если хотя-бы равен оппоненту по уровню. А Архатовщина, еще два года назад достала. В результате оставил код от Петра.
Влад, твой последний пост тоже зачистил, захочет разобраться, сам найдет. ИМХО.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

можно и через миллис, но нужно ли?

{
digitalWrite(LED,HIGH);
delay(1000);
digitalWrite(LED,LOW);
delay(10000);

}

Pyotr
Offline
Зарегистрирован: 12.03.2014

rkit пишет:

Pyotr пишет:

И получаешь не пропуски так повторы. Кошмар.

Написал проверочный код. Самые первые действия идут через 40, 60, 80 мс, а дальше каждое действие строго через 100 мс. 
При переполнении currMillis интервалы сохраняют свое значение в 100 мс.
Где кошмар??

 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Bruzzer пишет:

 Маленькое замечание. У вас нумерация действий  идет в обратном порядке. Сначала выполнится 3 потом 2 потом 1.

1if(((countCycle + 13) % 10) == 0){//кажд.100 мс
2 //действие 1
3}
4if(((countCycle + 15) % 10) == 0){//кажд.100 мс     
5  //действие 2
6}
7if(((countCycle + 17) % 10) == 0){//кажд.100 мс
8  //действие 3
9}

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

JhonKnow
Offline
Зарегистрирован: 23.01.2020

Я бы таким как ты пасть зашивал, чтобы лаял меньше