подскажите по функции

keefa
Offline
Зарегистрирован: 19.06.2015

bwn пишет:

prevMillis после каждого прохода равна millis() и никогда не достигнет  разницы в  две секунды.(((((

Вам уже ответили, почему не работает.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

keefa пишет:

Вам уже ответили, почему не работает.

просто просили расписать как не работает

Jatixo
Offline
Зарегистрирован: 13.01.2016

Ну после каждого она не равна millis, проблема то в другом, а именно используется одна и та же переменная previousMillis для разных интервалов и они мешают друг другу, и sw тоже общая, а надо свою.
В общем надо или динамической массив переменных, или заранее создавать переменные, и в обоих случаях передавать ключ в функцию, например, smartdelay(0, 1000); smartdelay(1, 2000); а в функции уже использовать ключ, sw[key] = ... и т.п.

keefa
Offline
Зарегистрирован: 19.06.2015

Jatixo пишет:
Ну после каждого она не равна millis, проблема то в другом, а именно используется одна и та же переменная previousMillis для разных интервалов и они мешают друг другу, и sw тоже общая, а надо свою. В общем надо или динамической массив переменных, или заранее создавать переменные, и в обоих случаях передавать ключ в функцию, например, smartdelay(0, 1000); smartdelay(1, 2000); а в функции уже использовать ключ, sw[key] = ... и т.п.

В 37 посту это тоже уже было http://arduino.ru/forum/programmirovanie/podskazhite-po-funktsii#comment-165330

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

Jatixo пишет:
Ну после каждого она не равна millis, проблема то в другом, а именно используется одна и та же переменная previousMillis для разных интервалов и они мешают друг другу, и sw тоже общая, а надо свою. В общем надо или динамической массив переменных, или заранее создавать переменные, и в обоих случаях передавать ключ в функцию, например, smartdelay(0, 1000); smartdelay(1, 2000); а в функции уже использовать ключ, sw[key] = ... и т.п.

Спасибо, я тоже склоняюсь в эту сторону

Jatixo
Offline
Зарегистрирован: 13.01.2016

Да, не заметил, но там чуть поправить надо, иначе sw 1, только один цикл будет, почти всегда будет 0. Ну и оптимизировать, чтобы if, if не делать, просто sw[i] = и x, y, также на i заменить, а сверху объявить previous и sw[] = {0, 0}; и добавлять по мере надобности.

keefa
Offline
Зарегистрирован: 19.06.2015

Jatixo пишет:
Да, не заметил, но там чуть поправить надо, иначе sw 1, только один цикл будет, почти всегда будет 0. Ну и оптимизировать, чтобы if, if не делать, просто sw[i] = и x, y, также на i заменить, а сверху объявить previous и sw[] = {0, 0}; и добавлять по мере надобности.

Все нормально там работает. х = 1 с частотой 1Гц. у = 1 с частотой 0,5Гц.  то что можно написать подругому или оптимизировать, спорить не буду, написал как могу, програмирую только вторую неделю, с массивами еще не разобрался.

ЗЫ. точнее наверное сказать х = 1 раз в секунду, у = 1 раз в две секунды

Jatixo
Offline
Зарегистрирован: 13.01.2016

Частота то такая, но светодиод будет светить всего 100мс, как указано в delay. А когда используют millis, то значит для того чтобы не использовать delay, и вот если убрать delay, то можно даже не заметить вспышки. Так что там, что-то типа такого можно написать: sw[i] = !sw[i]; правда тогда будет, 1 сек. горит, 1 не горит, и с 2мя также, тоже не очень, значит надо разные интервалы свечения и не свечения делать.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

сделал вот так, все работает

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];
}

 

Jatixo
Offline
Зарегистрирован: 13.01.2016

Функцию можно сократить до:





boolean smartdelay (uint32_t interval, uint8_t i){ 
  if (millis() - previousMillis[i] >= interval) {
     previousMillis[i] = millis();
     sw[i] = !sw[i];
  }
  return sw[i];
}

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

да можно, но у меня она будет работать по другому, поэтому мне надо сначала приравнять

previousMillis[i] = millis();

чтобы начинало правильно считать

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];
}

всем спасибо, все работает как надо

 

 

allesanbr
Offline
Зарегистрирован: 31.01.2016

вот на этом месте тебя должны начать бить

Есть такое понятие: блок-схема программы.

сначала (тихонько в углу, чтобы никто не видел) рисуешь её для себя, потом пишешь код, и когда тебя спрашивают про алгоритм, постишь фото с этими кубиками и описанием к каждому подробно.

а если ты и сам не знаешь чего хочешь, то как же тебе помочь?

пы.сы.

блок-схема - это важно

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

allesanbr пишет:

вот на этом месте тебя должны начать бить

Есть такое понятие: блок-схема программы.

сначала (тихонько в углу, чтобы никто не видел) рисуешь её для себя, потом пишешь код, и когда тебя спрашивают про алгоритм, постишь фото с этими кубиками и описанием к каждому подробно.

а если ты и сам не знаешь чего хочешь, то как же тебе помочь?

пы.сы.

блок-схема - это важно

вот и иди туда

http://arduino.ru/forum/programmirovanie/arduino-rasshirennaya-peredacha-dannykhv-tom-chisle-na-processing