два таймера из одного millis
- Войдите на сайт для отправки комментариев
Втр, 20/03/2018 - 13:54
Добрый день. Прошу помощи как новичку.
Можно ли из стандартного таймера на millis получить два, на один и тот же выход, но на разное время например 1000 и 60000 мсек.
Заранее благодарен за любую помощь.
const int sveha = 11;
int State = LOW;
int State1 = HIGH;
unsigned long previousMillis = 0;
const long interval = 1000;
const long interval_2 = 60000;
void setup() {
Serial.begin(9600);
pinMode(sveha, OUTPUT);
}
void loop() {
unsigned long currentMillis = millis ( );
if ( currentMillis - previousMillis >= interval ) {
previousMillis = currentMillis;
if ( State == LOW ) {
State = HIGH;
} else {
State = LOW;
digitalWrite ( sveha, State );
}
}
}
Не знаю, что Вы подразумеваете под "стандартным таймером", но, вероятно, Вам нужно ввести несколько разных previousMillis.
А лучше, конечно, сделать это с применением классов (ООП).
Классы (ООП) это?
Это - что?
Или Вы рисунок забыли вставить?
стандартным я называю "примеры" на сайте адуино - https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
ЧТо такое классы (ООП) ?
Срочно читайте лекции по ООП, да как можно понятнее!!!! Иначе зачем этот ваш форум нужен!!! Бездельники!
ЧТо такое классы (ООП) ?
ООП - это аббревиатура.
Как-то не спортивно. Честнее использовать два millis'а.
unsignedlongcurrentMillis = millis( ); перввый будет блокировать второй.unsignedlongcurrentMillis = millis( ); перввый будет блокировать второй.Где тут первый, а где второй?
Я вижу, что код ещё не тестировали в ардуино.
тестировал "пример " работает, моя химия естественно нет
один интервал работает, два разных интервала не работают.
Если хотите, чтобы кто-то читал Ваш код - Вставка программного кода в тему/комментарий
Сорри! 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 ); } } }Как именно не работают?
один интервал работает, два разных интервала не работают.
В строках 12 и 13 действительно должны былть LOW в обеих? Меня терзают смытные сомнения, что нет.
что бы я там (строки 12-13)не ставил все равно не работает.
Поэтому и прошу помощи.
Так помощи не просят. Вы опубликовали ХЗ что вместо кода (это даже компилироваться не будет) что утверждаете что вставляли туда "что бы".
Давайте конкретный код в котором есть проблема.
что бы я там (строки 12-13)не ставил все равно не работает.
Поэтому и прошу помощи.
Вот попробовал, не работает.
const int ledPin = 13; int State = LOW; unsigned long previousMillis = 0; unsigned long previousMillis_2 = 0; const long interval_1 = 1000; const long interval_2 = 60000; void setup() { pinMode(ledPin, OUTPUT); } void loop() { unsigned long currentMillis = millis ( ); if ( currentMillis - previousMillis >= interval_1 ) { previousMillis = currentMillis; if ( State == LOW ) { State = HIGH; digitalWrite (ledPin, State ); } } //unsigned long currentMillis = millis ( ); if ( currentMillis - previousMillis_2 >= interval_2 ) { previousMillis_2 = currentMillis; if ( State == LOW ) { State = LOW; digitalWrite ( ledPin, State ); } } }В 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 сек молчать
const int ledPin = 13; int State = LOW; unsigned long previousMillis_1 = 0; unsigned long previousMillis_2 = 0; const long interval_1 = 1000; const long interval_2 = 10000; void setup() { pinMode(ledPin, OUTPUT); } void loop() { unsigned long currentMillis = millis ( ); if ( currentMillis - previousMillis_1 >= interval_1 ) { previousMillis_1 = currentMillis; if ( State == LOW ) { State = HIGH; digitalWrite ( ledPin, State ); } else { if ( currentMillis - previousMillis_2 >= interval_2 ) { previousMillis_2 = currentMillis; if ( State == HIGH ) { State = LOW; digitalWrite ( ledPin, State ); } } } } } Вот в таком виде горит 10сек 1 сек молчит. А мне нужно наоборот!Ну так поменяйте местами значения интервалов или LOW/HIGH.
не поможет
Вот в таком виде горит 10сек 1 сек молчит.
Кайф!
RCP говорит: сменить LOW на HiGH, и наоборот ("часы на трусы").
не поможет
Беда :(
const int ledPin = 13; int State = LOW; unsigned long previousMillis_1 = 0; unsigned long previousMillis_2 = 0; const long interval_1 = 1000; const long interval_2 = 10000; void setup() { pinMode(ledPin, OUTPUT); } void loop() { unsigned long currentMillis = millis ( ); if ( currentMillis - previousMillis_1 >= interval_1 ) { previousMillis_1 = currentMillis; if ( State == LOW ) { State = HIGH; digitalWrite ( ledPin, State ); } else { if ( currentMillis - previousMillis_2 >= interval_2 ) { previousMillis_2 = currentMillis; if ( State == HIGH ) { State = LOW; digitalWrite ( ledPin, State ); } } } } }Вот в таком виде горит 10сек 1 сек молчит.
А мне нужно наоборот!
Афтар, нафига ты второй интервал упрятал в else от первого?
Нет больше сил смотреть на твою тупость. На, держи:
unsigned long previousMillis_1; unsigned long previousMillis_2; unsigned long currentMillis = millis ( ); if ( currentMillis - previousMillis_1 >= interval_1 ) { // интервал_1 сверяем с временем_1 previousMillis_2 = currentMillis; // <=== тут запускаем время_2 !!! if ( State == LOW ) { State = HIGH; digitalWrite ( sveha, State ); } if ( currentMillis - previousMillis_2 >= interval_2 ) { // интервал_2 сверяем с временем_2 previousMillis_1 = currentMillis; // <=== тут запускаем время_1 !!! if ( State == HIGH ) { State = LOW; digitalWrite ( sveha, State ); }Нет больше сил смотреть на твою тупость. На, держи:
Сломался? :))))
Сломался? :))))
Ага :)
Я б у таких ардуино отбирал с поражением в правах на 10 лет. Тут либо просто выгнать его с форума, либо дать ему код и он сам уйдет. Пытаться наставить его на путь бесполезно, мой пылесос и то больше в программировании смыслит...
Сломался? :))))
И в этом +, ТС так и будет жить с убеждением, что для решения этой задачи нужно два интервала.
Так, упс, извиняйте парни, ошибка вышла. Вот так будет лучше:
unsigned long previousMillis; unsigned long currentMillis = millis ( ); if ( State == LOW ) { if ( currentMillis - previousMillis >= interval_1 ) { previousMillis = currentMillis; State = HIGH; digitalWrite ( sveha, State ); }} if ( State == HIGH ) { if ( currentMillis - previousMillis >= interval_2 ) { previousMillis = currentMillis; State = LOW; digitalWrite ( sveha, State ); }}И в этом +, ТС так и будет жить с убеждением, что для решения этой задачи нужно два интервала.
В общем случае, кмк, тут нужно два интервала. А вот Превиус_миллис зватит и одного.
спасибо конечно!но только ни в первом, ни во втором случае, все равно "не работает!"
спасибо конечно!но только ни в первом, ни во втором случае, все равно "не работает!"
выложите скетч целиком
спасибо конечно!но только ни в первом, ни во втором случае, все равно "не работает!"
выложите скетч целиком
Дык, это, вы его еще не написали.