Ну после каждого она не равна millis, проблема то в другом, а именно используется одна и та же переменная previousMillis для разных интервалов и они мешают друг другу, и sw тоже общая, а надо свою.
В общем надо или динамической массив переменных, или заранее создавать переменные, и в обоих случаях передавать ключ в функцию, например, smartdelay(0, 1000); smartdelay(1, 2000); а в функции уже использовать ключ, sw[key] = ... и т.п.
Ну после каждого она не равна millis, проблема то в другом, а именно используется одна и та же переменная previousMillis для разных интервалов и они мешают друг другу, и sw тоже общая, а надо свою. В общем надо или динамической массив переменных, или заранее создавать переменные, и в обоих случаях передавать ключ в функцию, например, smartdelay(0, 1000); smartdelay(1, 2000); а в функции уже использовать ключ, sw[key] = ... и т.п.
Ну после каждого она не равна millis, проблема то в другом, а именно используется одна и та же переменная previousMillis для разных интервалов и они мешают друг другу, и sw тоже общая, а надо свою. В общем надо или динамической массив переменных, или заранее создавать переменные, и в обоих случаях передавать ключ в функцию, например, smartdelay(0, 1000); smartdelay(1, 2000); а в функции уже использовать ключ, sw[key] = ... и т.п.
Да, не заметил, но там чуть поправить надо, иначе sw 1, только один цикл будет, почти всегда будет 0. Ну и оптимизировать, чтобы if, if не делать, просто sw[i] = и x, y, также на i заменить, а сверху объявить previous и sw[] = {0, 0}; и добавлять по мере надобности.
Да, не заметил, но там чуть поправить надо, иначе sw 1, только один цикл будет, почти всегда будет 0. Ну и оптимизировать, чтобы if, if не делать, просто sw[i] = и x, y, также на i заменить, а сверху объявить previous и sw[] = {0, 0}; и добавлять по мере надобности.
Все нормально там работает. х = 1 с частотой 1Гц. у = 1 с частотой 0,5Гц. то что можно написать подругому или оптимизировать, спорить не буду, написал как могу, програмирую только вторую неделю, с массивами еще не разобрался.
ЗЫ. точнее наверное сказать х = 1 раз в секунду, у = 1 раз в две секунды
Частота то такая, но светодиод будет светить всего 100мс, как указано в delay. А когда используют millis, то значит для того чтобы не использовать delay, и вот если убрать delay, то можно даже не заметить вспышки. Так что там, что-то типа такого можно написать: sw[i] = !sw[i]; правда тогда будет, 1 сек. горит, 1 не горит, и с 2мя также, тоже не очень, значит надо разные интервалы свечения и не свечения делать.
сначала (тихонько в углу, чтобы никто не видел) рисуешь её для себя, потом пишешь код, и когда тебя спрашивают про алгоритм, постишь фото с этими кубиками и описанием к каждому подробно.
а если ты и сам не знаешь чего хочешь, то как же тебе помочь?
сначала (тихонько в углу, чтобы никто не видел) рисуешь её для себя, потом пишешь код, и когда тебя спрашивают про алгоритм, постишь фото с этими кубиками и описанием к каждому подробно.
а если ты и сам не знаешь чего хочешь, то как же тебе помочь?
prevMillis после каждого прохода равна millis() и никогда не достигнет разницы в две секунды.(((((
Вам уже ответили, почему не работает.
Вам уже ответили, почему не работает.
просто просили расписать как не работает
Ну после каждого она не равна millis, проблема то в другом, а именно используется одна и та же переменная previousMillis для разных интервалов и они мешают друг другу, и sw тоже общая, а надо свою.
В общем надо или динамической массив переменных, или заранее создавать переменные, и в обоих случаях передавать ключ в функцию, например, smartdelay(0, 1000); smartdelay(1, 2000); а в функции уже использовать ключ, sw[key] = ... и т.п.
В 37 посту это тоже уже было http://arduino.ru/forum/programmirovanie/podskazhite-po-funktsii#comment-165330
Спасибо, я тоже склоняюсь в эту сторону
Да, не заметил, но там чуть поправить надо, иначе sw 1, только один цикл будет, почти всегда будет 0. Ну и оптимизировать, чтобы if, if не делать, просто sw[i] = и x, y, также на i заменить, а сверху объявить previous и sw[] = {0, 0}; и добавлять по мере надобности.
Все нормально там работает. х = 1 с частотой 1Гц. у = 1 с частотой 0,5Гц. то что можно написать подругому или оптимизировать, спорить не буду, написал как могу, програмирую только вторую неделю, с массивами еще не разобрался.
ЗЫ. точнее наверное сказать х = 1 раз в секунду, у = 1 раз в две секунды
Частота то такая, но светодиод будет светить всего 100мс, как указано в delay. А когда используют millis, то значит для того чтобы не использовать delay, и вот если убрать delay, то можно даже не заметить вспышки. Так что там, что-то типа такого можно написать: sw[i] = !sw[i]; правда тогда будет, 1 сек. горит, 1 не горит, и с 2мя также, тоже не очень, значит надо разные интервалы свечения и не свечения делать.
сделал вот так, все работает
boolean x = 0; boolean y = 0; boolean sw[2]; uint32_t previousMillis[2]; void setup() { Serial.begin(9600); } void loop() { x = smartdelay(1000, 0); y = smartdelay(2000, 1); Serial.print("Timer1 "); Serial.print(x); Serial.print(" Timer2 "); Serial.println(y); } boolean smartdelay (uint32_t interval, uint8_t i){ switch (sw[i]) { case 0: if (millis() - previousMillis[i] >= interval) { previousMillis[i] = millis(); sw[i] = 1; } break; case 1: if (millis() - previousMillis[i] >= interval) { previousMillis[i] = millis(); sw[i] = 0; } break; } return sw[i]; }Функцию можно сократить до:
boolean smartdelay (uint32_t interval, uint8_t i){ if (millis() - previousMillis[i] >= interval) { previousMillis[i] = millis(); sw[i] = !sw[i]; } return sw[i]; }да можно, но у меня она будет работать по другому, поэтому мне надо сначала приравнять
чтобы начинало правильно считать
boolean x = 0; boolean y = 0; boolean sw[2]; uint32_t previousMillis[2]; void setup() { Serial.begin(9600); } void loop() { x = smartdelay(1000, 0); y = smartdelay(2000, 1); Serial.print("Timer1 "); Serial.print(x); Serial.print(" Timer2 "); Serial.println(y); } boolean smartdelay (uint32_t interval, uint8_t i){ switch (sw[i]) { case 0: previousMillis[i] = millis(); sw[i] = 1; break; case 1: if (millis() - previousMillis[i] >= interval) { previousMillis[i] = millis(); sw[i] = 0; } break; } return sw[i]; }всем спасибо, все работает как надо
вот на этом месте тебя должны начать бить
Есть такое понятие: блок-схема программы.
сначала (тихонько в углу, чтобы никто не видел) рисуешь её для себя, потом пишешь код, и когда тебя спрашивают про алгоритм, постишь фото с этими кубиками и описанием к каждому подробно.
а если ты и сам не знаешь чего хочешь, то как же тебе помочь?
пы.сы.
блок-схема - это важно
вот на этом месте тебя должны начать бить
Есть такое понятие: блок-схема программы.
сначала (тихонько в углу, чтобы никто не видел) рисуешь её для себя, потом пишешь код, и когда тебя спрашивают про алгоритм, постишь фото с этими кубиками и описанием к каждому подробно.
а если ты и сам не знаешь чего хочешь, то как же тебе помочь?
пы.сы.
блок-схема - это важно
вот и иди туда
http://arduino.ru/forum/programmirovanie/arduino-rasshirennaya-peredacha-dannykhv-tom-chisle-na-processing