два таймера из одного millis
- Войдите на сайт для отправки комментариев
Втр, 20/03/2018 - 13:54
Добрый день. Прошу помощи как новичку.
Можно ли из стандартного таймера на millis получить два, на один и тот же выход, но на разное время например 1000 и 60000 мсек.
Заранее благодарен за любую помощь.
01 | const int sveha = 11; |
02 | int State = LOW; |
03 | int State1 = HIGH; |
04 | unsigned long previousMillis = 0; |
05 | const long interval = 1000; |
06 | const long interval_2 = 60000; |
07 | void setup () { |
08 | Serial .begin(9600); |
09 | pinMode(sveha, OUTPUT); |
10 | } |
11 | void 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 | } |
Не знаю, что Вы подразумеваете под "стандартным таймером", но, вероятно, Вам нужно ввести несколько разных previousMillis.
А лучше, конечно, сделать это с применением классов (ООП).
Классы (ООП) это?
Это - что?
Или Вы рисунок забыли вставить?
стандартным я называю "примеры" на сайте адуино - https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
ЧТо такое классы (ООП) ?
Срочно читайте лекции по ООП, да как можно понятнее!!!! Иначе зачем этот ваш форум нужен!!! Бездельники!
ЧТо такое классы (ООП) ?
ООП - это аббревиатура.
Как-то не спортивно. Честнее использовать два millis'а.
unsigned
long
currentMillis = millis( ); перввый будет блокировать второй.
unsigned
long
currentMillis = millis( ); перввый будет блокировать второй.
Где тут первый, а где второй?
Я вижу, что код ещё не тестировали в ардуино.
тестировал "пример " работает, моя химия естественно нет
один интервал работает, два разных интервала не работают.
Если хотите, чтобы кто-то читал Ваш код - Вставка программного кода в тему/комментарий
01
Сорри!
02
unsigned
long
currentMillis = millis ( );
03
if
( currentMillis - previousMillis >= interval_1 ) {
04
previousMillis = currentMillis;
05
if
( State == LOW ) {
06
State = HIGH;
07
digitalWrite ( sveha, State );
08
}
09
unsigned
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
}
Как именно не работают?
один интервал работает, два разных интервала не работают.
В строках 12 и 13 действительно должны былть LOW в обеих? Меня терзают смытные сомнения, что нет.
что бы я там (строки 12-13)не ставил все равно не работает.
Поэтому и прошу помощи.
Так помощи не просят. Вы опубликовали ХЗ что вместо кода (это даже компилироваться не будет) что утверждаете что вставляли туда "что бы".
Давайте конкретный код в котором есть проблема.
что бы я там (строки 12-13)не ставил все равно не работает.
Поэтому и прошу помощи.
Вот попробовал, не работает.
01
const
int
ledPin = 13;
02
int
State = LOW;
03
unsigned
long
previousMillis = 0;
04
unsigned
long
previousMillis_2 = 0;
05
const
long
interval_1 = 1000;
06
const
long
interval_2 = 60000;
07
void
setup
() {
08
pinMode(ledPin, OUTPUT);
09
}
10
void
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
}
В 22 строке всё хорошо?
Да, можно поставить "HIGH" ничего не изменится.
Я него про это ещё вчера спрашивал (#17), тут ещё к тому же и одна переменная состояния на два светодиода.
Да, можно поставить "HIGH" ничего не изменится.
Вы что, методом тыка что-то ставите или не ставите? Правильно-то как. Вот так и поставьте, а если не меняется, ищите следующую ошибку.
А не работает, что именно?
Светодиод горит постоянно!
Я него про это ещё вчера спрашивал (#17), тут ещё к тому же и одна переменная состояния на два светодиода.
Зато человек чётко описал, что и как должно работать и после каждой попытки очень подробно расписывает, что же не так сработало. А то некоторые просто пишут: 1. хочу два таймера; 2-N не работает, не работает, не работает.
Светодиод горит постоянно!
Вам же уже два дня объясняют. И я и коллега вот присоединился. Вы вообще читаете, что Вам пишут?
Ну, давайте смотреть:
Вот истёк первый интервал времени и сработало условие в строке 12. Что при это происходит? State становится HIGH и зажигается светодиод.
Что дальше? А ничего, все Ваши проверки идут на state == LOW (строки 14 и 22). А поскольку state уже стала HIGH - ни одна из этих проверо никогда не сработает и state навсегда останется HIGH.
Понимаете? Или не так объяснил?
Потому я и толкусь здесь. Другого давно послал бы.
А вот тут нет. И Вы и я говорим про одно и тоже и получаем ответы -"да, ставил я по-разному". Это не то, чтобы "подробно" :)
itar, в общем случае, Ваша задача безусловно имеет право на жизнь. Но вот Ваш конкретный пример выглядит несколько странно. Вы понимаете, что если Вам по двум таймерам нужно делать одно и то же, и один интервал кратен другому, то один таймер можно просто выкинуть? Конечно если у Вас будут произвольные, не кратные интервалы, то всё нормально.
Автор, раскройте тайну, что должна делать ваша программа?
Светодиод горит постоянно!
Повезло!
Вы что, методом тыка что-то ставите или не ставите?
... работая в Силиконовой Долине, Резник занимался так называемым RCP – «random code programming» ...
RCP – это близкое по идеологии, но совершенно иное по целям и результатам направление в программировании. Здесь мы генерируем не случайные комбинации входных данных, а случайные последовательности самого программного кода. А потом прикладываем к этому коду принципы «exhaustive testing».
Это как с обезьяной, способной за миллион лет настучать на машинке «Войну и мир» – только в случае с RCP мы отводим миллиард лет, делаем обезьяне серьезный оверклок воткнутым в задницу высоковольтным проводом – и ожидаем, что она напишет нам не «Войну и мир», а программу, способную написать «Войну и мир».
Качество задачи меняется – поэтому нужна очень высокая производительность и большие объемы памяти. Сегодня с этим проблем нет: мощности избыточны. Достаточно задать требования к выходным секвенциям, и мы рано или поздно получим программу, которая будет делать то, что нам угодно.
© Виктор Пелевин "iPhuck 10"
:-D
светодиод должен гореть 1 сек, 10 сек молчать
01
const
int
ledPin = 13;
02
int
State = LOW;
03
unsigned
long
previousMillis_1 = 0;
04
unsigned
long
previousMillis_2 = 0;
05
const
long
interval_1 = 1000;
06
const
long
interval_2 = 10000;
07
void
setup
() {
08
pinMode(ledPin, OUTPUT);
09
}
10
void
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
А мне нужно наоборот!
Ну так поменяйте местами значения интервалов или LOW/HIGH.
не поможет
Вот в таком виде горит 10сек 1 сек молчит.
1
А мне нужно наоборот!
Кайф!
RCP говорит: сменить LOW на HiGH, и наоборот ("часы на трусы").
не поможет
Беда :(
01
const
int
ledPin = 13;
02
int
State = LOW;
03
unsigned
long
previousMillis_1 = 0;
04
unsigned
long
previousMillis_2 = 0;
05
const
long
interval_1 = 1000;
06
const
long
interval_2 = 10000;
07
void
setup
() {
08
pinMode(ledPin, OUTPUT);
09
}
10
void
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
}
Вот в таком виде горит 10сек 1 сек молчит.
А мне нужно наоборот!
Афтар, нафига ты второй интервал упрятал в else от первого?
Нет больше сил смотреть на твою тупость. На, держи:
01
unsigned
long
previousMillis_1;
02
unsigned
long
previousMillis_2;
03
unsigned
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
}
Нет больше сил смотреть на твою тупость. На, держи:
Сломался? :))))
Сломался? :))))
Ага :)
Я б у таких ардуино отбирал с поражением в правах на 10 лет. Тут либо просто выгнать его с форума, либо дать ему код и он сам уйдет. Пытаться наставить его на путь бесполезно, мой пылесос и то больше в программировании смыслит...
Сломался? :))))
И в этом +, ТС так и будет жить с убеждением, что для решения этой задачи нужно два интервала.
Так, упс, извиняйте парни, ошибка вышла. Вот так будет лучше:
01
unsigned
long
previousMillis;
02
unsigned
long
currentMillis = millis ( );
03
04
if
( 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
}}
И в этом +, ТС так и будет жить с убеждением, что для решения этой задачи нужно два интервала.
В общем случае, кмк, тут нужно два интервала. А вот Превиус_миллис зватит и одного.
спасибо конечно!но только ни в первом, ни во втором случае, все равно "не работает!"
спасибо конечно!но только ни в первом, ни во втором случае, все равно "не работает!"
выложите скетч целиком
спасибо конечно!но только ни в первом, ни во втором случае, все равно "не работает!"
выложите скетч целиком
Дык, это, вы его еще не написали.