гирлянда за 1000р

New user
Offline
Зарегистрирован: 03.04.2012

Уважаемые форумчане

А особенно те, кто готов помочь

железо - freeduino nano v5

задача - написать софт

Четыри светодиода включаются поочереди

скорость регулируется кнопками + и -

значение скорости сохраняется в память микроконтроллера и грузится при включении

 

Максимальный delay 2000, минимальный 100

шаг наверное 50

 

ps  из личного неудачного опыта)))
Не должно быть задержек с изменением скорости при нажатии на кнопку, вызванных  тем что программа ждет пока зажгутся все четыри светодиода и дойдет дело до обработки кнопки

polk
Offline
Зарегистрирован: 13.03.2011

 Не должно быть задержек - используй прерывания. http://arduino.ru/Reference/AttachInterrupt

Там в конце есть пример, предполагается, что к входу 2 подключена кнопка.

New user
Offline
Зарегистрирован: 03.04.2012

 

polk, это да.. Но все равно я load и save делать не умею, проковыряюсь неделю.

Кто-нибуть ?

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Работа с памятью
http://robocraft.ru/blog/arduino/82.html 

maksim
Offline
Зарегистрирован: 12.02.2012

Кнопки подключаются к 2 и 3 цифровым выводам и при нажатии кнопка должна замыкать вывод на землю (GND). Вот простой код с использованием задержек и внешних прирываний:

#include <EEPROM.h>

#define BUTTON_FAST 2 // прерывание 0 - кнопка "+"
#define BUTTON_SLOW 3 // прерывание 1 - кнопка "-"

#define LED1 4 // светодиод 1
#define LED2 5 // светодиод 2
#define LED3 6 // светодиод 3
#define LED4 7 // светодиод 4

int Delay;

void setup() {                
  pinMode(LED1, OUTPUT); 
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);

  Delay = EEPROM.read(0);
  if(Delay < 2 || Delay > 20){
    Delay = 10;
    EEPROM.write(0, Delay);
  }

  digitalWrite(BUTTON_FAST, HIGH);
  digitalWrite(BUTTON_SLOW, HIGH);
  attachInterrupt(0, Faster, FALLING);
  attachInterrupt(1, Slower, FALLING);
}

void loop() {
  digitalWrite(LED1, HIGH);
  delay(Delay*100);           
  digitalWrite(LED1, LOW); 
  digitalWrite(LED2, HIGH);
  delay(Delay*100);           
  digitalWrite(LED2, LOW); 
  digitalWrite(LED3, HIGH);
  delay(Delay*100);           
  digitalWrite(LED3, LOW); 
  digitalWrite(LED4, HIGH);
  delay(Delay*100);           
  digitalWrite(LED4, LOW);   
}

void Faster() {
  Delay--;
  if(Delay < 2){
    Delay = 2;
  }
  EEPROM.write(0, Delay);
}

void Slower() {
  Delay++;
  if(Delay > 20){
    Delay = 20;
  }
  EEPROM.write(0, Delay);
}

Проверить было не на чем, так что если что-то не правильно будет работать отпишись. И еще шаг 50 мне показался маленьким, так что я сделал 100.

New user
Offline
Зарегистрирован: 03.04.2012

 Максим, спасибо
Ты лучший;)
Я завтра проверяю и отпишусь тогда

maksim
Offline
Зарегистрирован: 12.02.2012

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

#include <EEPROM.h>

#define BUTTON_FAST 2 // прерывание 0 - кнопка "+"
#define BUTTON_SLOW 3 // прерывание 1 - кнопка "-"

#define LED1 4 // светодиод 1
#define LED2 5 // светодиод 2
#define LED3 6 // светодиод 3
#define LED4 7 // светодиод 4

int Delay, state_delay, state = 0;
long millisold;

void setup() {   
  pinMode(LED1, OUTPUT); 
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);

  digitalWrite(BUTTON_FAST, HIGH);
  digitalWrite(BUTTON_SLOW, HIGH);
  attachInterrupt(0, Faster, FALLING);
  attachInterrupt(1, Slower, FALLING);

  Delay = EEPROM.read(0);
  if(Delay < 2 || Delay > 20){
    Delay = 10;
    EEPROM.write(0, Delay);
  }
  millisold = millis();
}

void loop() {
  if(Delay != state_delay){
    EEPROM.write(0, Delay);
    state_delay = Delay;
  }
  if(millis()-millisold > Delay*100){
    state++;
    if(state > 3){
      state = 0;
    }
    millisold = millis();
  }
  switch(state){
  case 0:
    digitalWrite(LED4, LOW); 
    digitalWrite(LED1, HIGH);
    break;
  case 1:
    digitalWrite(LED1, LOW); 
    digitalWrite(LED2, HIGH);
    break;
  case 2:
    digitalWrite(LED2, LOW); 
    digitalWrite(LED3, HIGH);
    break;
  case 3:
    digitalWrite(LED3, LOW); 
    digitalWrite(LED4, HIGH);
    break;
  }         
}

void Faster() {
  Delay--;
  if(Delay < 2){
    Delay = 2;
  }
}

void Slower() {
  Delay++;
  if(Delay > 20){
    Delay = 20;
  }
}


 Теперь, т.к. нет задержек, при желании, можно избавиться и от прервываний и обрабатывать кнопки в общем цикле.

New user
Offline
Зарегистрирован: 03.04.2012

Макс, скопировал скетч, занимаюсь подключением) Подскажи пжл как правильно подключить кнопки. Мне знаком вот такой вариант www.arduino.ru/tutorials/button
А ты предлагаешь - все тоже самое только вместо резистора конденсатор?

maksim
Offline
Зарегистрирован: 12.02.2012

Нет, вот так:

Отсутствие конденсаторов будет влиять только на дребезг, но работать будет и без них. 

New user
Offline
Зарегистрирован: 03.04.2012

Я так и думал) А какой взять конденцатор?
И как тебе денежку кинуть.. тут даже лички нету

maksim
Offline
Зарегистрирован: 12.02.2012

Примерно от 1 до 10 мкф, у меня стоят на 1мкф.

New user
Offline
Зарегистрирован: 03.04.2012

 

 

Тестирую, замечание правда есть.. Изменение скорости срабатывает только если нажатие на кнопку совпадает с обработкой этого события.. если не совпадает, то ничего не происходит.. Через прерывание с этой точки зрения было бы правильнее< text>

maksim
Offline
Зарегистрирован: 12.02.2012

Нет, как раз сейчас кнопки работают через прерывания, а значит мгновенно, одно нажатие +/- 100 миллисекунд.

maksim
Offline
Зарегистрирован: 12.02.2012

Попробуйте или без конденсаторов или уменьшите их емкость.

New user
Offline
Зарегистрирован: 03.04.2012

 Не, у меня через раз срабатывает.. на медленной скорости это особенно заметно
(у меня вообще без конденсаторов)

maksim
Offline
Зарегистрирован: 12.02.2012

Если убрать конденсаторы вообще, то иногда, из-за дребезга, при однократном нажатии вместо одного срабатывания будет происходить два, три, а то и больше.

maksim
Offline
Зарегистрирован: 12.02.2012

А как вы определяете срабатывание? Вы скорее всего на медленной скорости не замечаете изменений.

New user
Offline
Зарегистрирован: 03.04.2012

 я заметил, что чтобы произошло повышение скорости надо чтобы нажатие на кнопку было приблизительно во время потухания первого-зажигания второго светодиода!

maksim
Offline
Зарегистрирован: 12.02.2012

Вот этот скейтч будет выводить в сириал монитор текущее значение переменной Delay :

#include <EEPROM.h>

#define BUTTON_FAST 2 // прерывание 0 - кнопка "+"
#define BUTTON_SLOW 3 // прерывание 1 - кнопка "-"

#define LED1 4 // светодиод 1
#define LED2 5 // светодиод 2
#define LED3 6 // светодиод 3
#define LED4 7 // светодиод 4

int Delay, state_delay, state = 0;
long millisold;

void setup() {   
  
  Serial.begin(9600);
  
  pinMode(LED1, OUTPUT); 
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);

  digitalWrite(BUTTON_FAST, HIGH);
  digitalWrite(BUTTON_SLOW, HIGH);
  attachInterrupt(0, Faster, FALLING);
  attachInterrupt(1, Slower, FALLING);

  Delay = EEPROM.read(0);
  if(Delay < 2 || Delay > 20){
    Delay = 10;
    EEPROM.write(0, Delay);
  }
  millisold = millis();
}

void loop() {
  if(Delay != state_delay){
    EEPROM.write(0, Delay);
    state_delay = Delay;
    Serial.println(Delay, DEC);
  }
  if(millis()-millisold > Delay*100){
    state++;
    if(state > 3){
      state = 0;
    }
    millisold = millis();
  }
  switch(state){
  case 0:
    digitalWrite(LED4, LOW); 
    digitalWrite(LED1, HIGH);
    break;
  case 1:
    digitalWrite(LED1, LOW); 
    digitalWrite(LED2, HIGH);
    break;
  case 2:
    digitalWrite(LED2, LOW); 
    digitalWrite(LED3, HIGH);
    break;
  case 3:
    digitalWrite(LED3, LOW); 
    digitalWrite(LED4, HIGH);
    break;
  }         
}

void Faster() {
  Delay--;
  if(Delay < 2){
    Delay = 2;
  }
}

void Slower() {
  Delay++;
  if(Delay > 20){
    Delay = 20;
  }
}

 Залейте его, запустите Serial Monitor и вы должны будете видеть как меняется Delay. У меня прибавляется и убавляется в любой момент времени.

 

maksim
Offline
Зарегистрирован: 12.02.2012

 Или вот:

#include <EEPROM.h>

#define BUTTON_FAST 2 // прерывание 0 - кнопка "+"
#define BUTTON_SLOW 3 // прерывание 1 - кнопка "-"

#define LED1 4 // светодиод 1
#define LED2 5 // светодиод 2
#define LED3 6 // светодиод 3
#define LED4 7 // светодиод 4

int Delay, state_delay, state = 0;
long millisold;

void setup() {   

  pinMode(LED1, OUTPUT); 
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  
  pinMode(13, OUTPUT);

  digitalWrite(BUTTON_FAST, HIGH);
  digitalWrite(BUTTON_SLOW, HIGH);
  attachInterrupt(0, Faster, FALLING);
  attachInterrupt(1, Slower, FALLING);

  Delay = EEPROM.read(0);
  if(Delay < 2 || Delay > 20){
    Delay = 10;
    EEPROM.write(0, Delay);
  }
  millisold = millis();
}

void loop() {
  if(Delay != state_delay){
    digitalWrite(13, HIGH);
    EEPROM.write(0, Delay);
    state_delay = Delay;
    delay(50);
    digitalWrite(13, LOW);
  }
  if(millis()-millisold > Delay*100){
    state++;
    if(state > 3){
      state = 0;
    }
    millisold = millis();
  }
  switch(state){
  case 0:
    digitalWrite(LED4, LOW); 
    digitalWrite(LED1, HIGH);
    break;
  case 1:
    digitalWrite(LED1, LOW); 
    digitalWrite(LED2, HIGH);
    break;
  case 2:
    digitalWrite(LED2, LOW); 
    digitalWrite(LED3, HIGH);
    break;
  case 3:
    digitalWrite(LED3, LOW); 
    digitalWrite(LED4, HIGH);
    break;
  }         
}

void Faster() {
  Delay--;
  if(Delay < 2){
    Delay = 2;
  }
}

void Slower() {
  Delay++;
  if(Delay > 20){
    Delay = 20;
  }
}


При изменении Delay будет кратковременно мигать светодиод на ардуине, если при нажатии перестал мигать значит Delay в одном из крайних значений.

New user
Offline
Зарегистрирован: 03.04.2012

Спасибо, Макс.. Все работает)
Просто визуально изменения скорости не
сильно ощутимы со значения 20 до где то 6, а я на кнопочки грешил). Кстати дребизгов у меня и без конденсаторов нету..
зы: по поводу оплаты, есть какие-нибуть идеи?
могу на телефон кинуть как вариант

maksim
Offline
Зарегистрирован: 12.02.2012

Если перепродаешь, то кидай:

+79049031399 ННС

 а если для себя, то дарю.

New user
Offline
Зарегистрирован: 03.04.2012

Ок. Не продаю, но все равно кину денежку..)

New user
Offline
Зарегистрирован: 03.04.2012

И последнее наверное.. Я хочу изменить интервал, сделать от 0,5 до 10. И хочу изменить шаг с 1 на 0,5. Пробовал через -=0,5 и +=0,5
не прошло.. Неlp

maksim
Offline
Зарегистрирован: 12.02.2012

Ты какой код используешь? С мигающим светодиодом, с сериал-монитором или первый(рабочий)?

maksim
Offline
Зарегистрирован: 12.02.2012

С с-монитором:

#include <EEPROM.h>

#define STEP 50 // Шаг в миллисекундах(целое число)
#define MIN 50 // Минимальная задержка в миллисекундах(целое число)
#define MAX 1000 // Максимальная задержка в миллисекундах(целое число)

#define BUTTON_FAST 2 // прерывание 0 - кнопка "+"
#define BUTTON_SLOW 3 // прерывание 1 - кнопка "-"

#define LED1 4 // светодиод 1
#define LED2 5 // светодиод 2
#define LED3 6 // светодиод 3
#define LED4 7 // светодиод 4

int Delay, state_delay, state = 0;
long millisold;

void setup() {   

  Serial.begin(9600);

  pinMode(LED1, OUTPUT); 
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);

  digitalWrite(BUTTON_FAST, HIGH);
  digitalWrite(BUTTON_SLOW, HIGH);
  attachInterrupt(0, Faster, FALLING);
  attachInterrupt(1, Slower, FALLING);

  Delay = EEPROM.read(0);
  if(Delay < MIN/STEP || Delay > MAX/STEP){
    Delay = 10;
    EEPROM.write(0, Delay);
  }
  millisold = millis();
}

void loop() {
  if(Delay != state_delay){
    EEPROM.write(0, Delay);
    state_delay = Delay;
    Serial.println(Delay*STEP, DEC);
  }
  if(millis()-millisold > Delay*STEP){
    state++;
    if(state > 3){
      state = 0;
    }
    millisold = millis();
  }
  switch(state){
  case 0:
    digitalWrite(LED4, LOW); 
    digitalWrite(LED1, HIGH);
    break;
  case 1:
    digitalWrite(LED1, LOW); 
    digitalWrite(LED2, HIGH);
    break;
  case 2:
    digitalWrite(LED2, LOW); 
    digitalWrite(LED3, HIGH);
    break;
  case 3:
    digitalWrite(LED3, LOW); 
    digitalWrite(LED4, HIGH);
    break;
  }         
}

void Faster() {
  Delay--;
  if(Delay < MIN/STEP){
    Delay = MIN/STEP;
  }
}

void Slower() {
  Delay++;
  if(Delay > MAX/STEP){
    Delay = MAX/STEP;
  }
}

вот в начале кода можешь менять вот эти 3 параметра:

STEP - Шаг в миллисекундах(целое число)
MIN - Минимальная задержка в миллисекундах(целое число)
MAX - Максимальная задержка в миллисекундах(целое число)

New user
Offline
Зарегистрирован: 03.04.2012

Не пашет. Светододы не горят. Монитор показывает изм значений от 50 до 2000

maksim
Offline
Зарегистрирован: 12.02.2012

 Скопируйте еще раз, я просто к другим выводам подключался, а в этом коде забыл исправить. У меня другие выводы подключены - LED1, LED2 и т.д.

New user
Offline
Зарегистрирован: 03.04.2012

 

New user
Offline
Зарегистрирован: 03.04.2012

исправил, все ок

maksim
Offline
Зарегистрирован: 12.02.2012

И вот еще:

#include <EEPROM.h>

#define STEP 50 // Шаг в миллисекундах(целое число)
#define MIN 50 // Минимальная задержка в миллисекундах(целое число)
#define MAX 1000 // Максимальная задержка в миллисекундах(целое число)

#define BUTTON_FAST 2 // прерывание 0 - кнопка "+"
#define BUTTON_SLOW 3 // прерывание 1 - кнопка "-"

#define LED1 4 // светодиод 1
#define LED2 5 // светодиод 2
#define LED3 6 // светодиод 3
#define LED4 7 // светодиод 4

int Delay, state_delay, state = 0;
long millisold;
boolean Direction = 0;

void setup() {   

  Serial.begin(9600);

  pinMode(LED1, OUTPUT); 
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);

  digitalWrite(BUTTON_FAST, HIGH);
  digitalWrite(BUTTON_SLOW, HIGH);
  attachInterrupt(0, Faster, FALLING);
  attachInterrupt(1, Slower, FALLING);

  Delay = EEPROM.read(0);
  if(Delay < MIN/STEP || Delay > MAX/STEP){
    Delay = 10;
    EEPROM.write(0, Delay);
  }
  Direction = EEPROM.read(1);
  millisold = millis();
}

void loop() {
  if(!digitalRead(BUTTON_FAST) && !digitalRead(BUTTON_SLOW)){
    Direction = !Direction;
    EEPROM.write(1, Direction);
    delay(200);
  }
  if(Delay != state_delay){
    EEPROM.write(0, Delay);
    state_delay = Delay;
    Serial.println(Delay*STEP, DEC);
  }
  if(millis()-millisold > Delay*STEP){
    state++;
    if(state > 3){
      state = 0;
    }
    millisold = millis();
  }
  if(Direction){
    switch(state){
    case 0:
      digitalWrite(LED1, LOW); 
      digitalWrite(LED4, HIGH);
      break;
    case 1:
      digitalWrite(LED4, LOW); 
      digitalWrite(LED3, HIGH);
      break;
    case 2:
      digitalWrite(LED3, LOW); 
      digitalWrite(LED2, HIGH);
      break;
    case 3:
      digitalWrite(LED2, LOW); 
      digitalWrite(LED1, HIGH);
      break;
    }
  }
  else{
    switch(state){
    case 0:
      digitalWrite(LED4, LOW); 
      digitalWrite(LED1, HIGH);
      break;
    case 1:
      digitalWrite(LED1, LOW); 
      digitalWrite(LED2, HIGH);
      break;
    case 2:
      digitalWrite(LED2, LOW); 
      digitalWrite(LED3, HIGH);
      break;
    case 3:
      digitalWrite(LED3, LOW); 
      digitalWrite(LED4, HIGH);
      break;
    }       
  }  
}

void Faster() {
  Delay--;
  if(Delay < MIN/STEP){
    Delay = MIN/STEP;
  }
}

void Slower() {
  Delay++;
  if(Delay > MAX/STEP){
    Delay = MAX/STEP;
  }
}

если нажать обе кнопки одновременно, то мигание поменяет направление и тоже запомнится в eeprom

Tulus
Offline
Зарегистрирован: 04.04.2012

 А можно вопрос по подключению кнопки. Обычно, насколько я понял изучаю теорию (только начал изучать), кнопка подключается еще подтягивающим резистором, чтобы при разомкнутом состояние было определенное значение.  А у вас на схеме нет. Просто хочу понять можно ли так подключать? а не будет ли при разомкнутой кнопке гулять значение на порту и вхолостую посылать прерывания?

New user
Offline
Зарегистрирован: 03.04.2012

maksim, классная идея про две кнопки одновременно. В обратную сторону мне не надо, но есть три режима, которые было бы прикольно воплотить. Если возмешься:
1. Все тоже самое только после четвертого светодиода пауза( которую можно задать вначале)
2. Все тоже самое только последлвательность загарания светодиодов - 1 3 2 4

3. Наиболее сложное. Волна расходящаяся из центра и возвращающаяся обратно. Вначале одновременно загораются 2 и 3, гаснут, загораются 1 и 4, гаснут, загораются нововведение 5 и 6, гаснут, загораются 1 и 4

раъзяснение - я добавил 5 и 6 светодиод, которые везде просто горят, и только в третьем режиме задействованы.

New user
Offline
Зарегистрирован: 03.04.2012

Денюшка пришла? Если с этим поможешь тоже в долгу не останусь)
выбранный режим естественно сохраняется и грузится, ну и можно добавить 4. попеременное включение этих трех.

maksim
Offline
Зарегистрирован: 12.02.2012

Tulus пишет:

А можно вопрос по подключению кнопки. Обычно, насколько я понял изучаю теорию (только начал изучать), кнопка подключается еще подтягивающим резистором, чтобы при разомкнутом состояние было определенное значение. А у вас на схеме нет. Просто хочу понять можно ли так подключать? а не будет ли при разомкнутой кнопке гулять значение на порту и вхолостую посылать прерывания?

Для того, что бы была "подтяжка" к +5В без внешнего резистора в функции setup() пишишь:

  digitalWrite(BUTTON, HIGH);

   у меня выше в коде 28 и 29 строки

Tulus
Offline
Зарегистрирован: 04.04.2012

maksim пишет:

Для того, что бы была "подтяжка" к +5В без внешнего резистора в функции setup() пишишь:

  digitalWrite(BUTTON, HIGH);

   у меня выше в коде 28 и 29 строки

Спасибо. Точно, встроенные подтягивающие резисторы. А не надо тогда еще добавить 

pinMode(BUTTON, INPUT); // надо?
maksim
Offline
Зарегистрирован: 12.02.2012

Tulus пишет:

maksim пишет:

Для того, что бы была "подтяжка" к +5В без внешнего резистора в функции setup() пишишь:

  digitalWrite(BUTTON, HIGH);

   у меня выше в коде 28 и 29 строки

Спасибо. Точно, встроенные подтягивающие резисторы. А не надо тогда еще добавить 

pinMode(BUTTON, INPUT); // надо?

Нет, не надо, все порты по-умолчанию и так настроены на вход.

Tulus
Offline
Зарегистрирован: 04.04.2012

 Теперь ясно. Спасибо.

maksim
Offline
Зарегистрирован: 12.02.2012

New user пишет:
Денюшка пришла? Если с этим поможешь тоже в долгу не останусь) выбранный режим естественно сохраняется и грузится, ну и можно добавить 4. попеременное включение этих трех.

Да дошла. Остальное завтра допишу.

maksim
Offline
Зарегистрирован: 12.02.2012

Я правильно понял, что крайние (1 и 6) светодиоды во всех кроме 3 режима (и чстично в 4) горят?

New user
Offline
Зарегистрирован: 03.04.2012

ага, всегда горят.. и только в третьем режиме мигают, когда до них дойдет волна.
На деле они крайние.. хотя номера у них 5,6... можно было бы назвать 5,0
А в первом режиме после четвертого светодиода задержка, велечину которой можно задать там где у нас вначале step, min, max

New user
Offline
Зарегистрирован: 03.04.2012

Итого у нас получилось пять режимов:
-Обычный ( то что уже есть)
- С задержкой после 4
- 1324
- Волна из центра вместе с 5 и 6
- И смена всех режимов по кругу.

maksim
Offline
Зарегистрирован: 12.02.2012

А задержку лучше сделать пропорционально изменяющейся в зависимости от скорости перебора или просто статическую?

New user
Offline
Зарегистрирован: 03.04.2012

да лучше сделать зависемой
допустим задержка = наш тот делей * 2

maksim
Offline
Зарегистрирован: 12.02.2012

Во втором режиме нужно, что бы 4 светодиод тух и была задержка или чтобы оставалься гореть на время задержки?

New user
Offline
Зарегистрирован: 03.04.2012

нужно чтобы гас

maksim
Offline
Зарегистрирован: 12.02.2012

Вот потестите пока без последнего режима, задержка DELAY для второго режима измеряется в текущих значениях Delay

Т.е.  DELAY 2 означает, что при скрости в 500млс задержка после 4-го светодиода равна 1000млс

#include <EEPROM.h>

#define STEP 50 // Шаг в миллисекундах(целое число)
#define MIN 50 // Минимальная задержка в миллисекундах(целое число)
#define MAX 1000 // Максимальная задержка в миллисекундах(целое число)
#define DELAY 2 // Задержка в значения текущей скорости (целое число)

#define BUTTON_FAST 2 // прерывание 0 - кнопка "+"
#define BUTTON_SLOW 3 // прерывание 1 - кнопка "-"

#define LED1 4 // светодиод 1
#define LED2 5 // светодиод 2
#define LED3 6 // светодиод 3
#define LED4 7 // светодиод 4
#define LED5 8 // светодиод 5 первый
#define LED6 9 // светодиод 6 последний

int Delay, delayold, state, mode, statemax = 0;
long millisold;

void setup() {   

  Serial.begin(9600);

  pinMode(LED1, OUTPUT); 
  pinMode(LED2, OUTPUT);
  pinMode(LED3, OUTPUT);
  pinMode(LED4, OUTPUT);
  pinMode(LED5, OUTPUT);
  pinMode(LED6, OUTPUT);

  digitalWrite(BUTTON_FAST, HIGH);
  digitalWrite(BUTTON_SLOW, HIGH);
  attachInterrupt(0, Faster, FALLING);
  attachInterrupt(1, Slower, FALLING);

  Delay = EEPROM.read(0);
  if(Delay < MIN/STEP || Delay > MAX/STEP){
    Delay = 10;
    EEPROM.write(0, Delay);
  }

  mode = EEPROM.read(1);
  if(mode  > 4){
    mode = 0;
    EEPROM.write(0, mode);
  }

  millisold = millis();
}

void loop() {
  if(!digitalRead(BUTTON_FAST) && !digitalRead(BUTTON_SLOW)){
    mode++;
    if(mode  > 4){
      mode = 0;
    }
    EEPROM.write(1, mode);
    Serial.println(mode+1, DEC);
    delay(200);
  }
  if(Delay != delayold){
    EEPROM.write(0, Delay);
    delayold = Delay;
    Serial.println(Delay*STEP, DEC);
  }
  if(millis()-millisold > Delay*STEP){
    state++;
    if(state > statemax){
      state = 0;
    }
    millisold = millis();
  }

  switch(mode){
  case 0:
    digitalWrite(LED5, HIGH); 
    digitalWrite(LED6, HIGH);
    statemax = 3;
    switch(state){
    case 0:
      digitalWrite(LED4, LOW); 
      digitalWrite(LED1, HIGH);
      break;
    case 1:
      digitalWrite(LED1, LOW); 
      digitalWrite(LED2, HIGH);
      break;
    case 2:
      digitalWrite(LED2, LOW); 
      digitalWrite(LED3, HIGH);
      break;
    case 3:
      digitalWrite(LED3, LOW); 
      digitalWrite(LED4, HIGH);
      break;
    }
    break;

  case 1:
    digitalWrite(LED5, HIGH); 
    digitalWrite(LED6, HIGH);
    statemax = 3 + DELAY;
    switch(state){
    case 0:
      digitalWrite(LED4, LOW); 
      digitalWrite(LED1, HIGH);
      break;
    case 1:
      digitalWrite(LED1, LOW); 
      digitalWrite(LED2, HIGH);
      break;
    case 2:
      digitalWrite(LED2, LOW); 
      digitalWrite(LED3, HIGH);
      break;
    case 3:
      digitalWrite(LED3, LOW); 
      digitalWrite(LED4, HIGH);
      break;
    case 4:
      digitalWrite(LED4, LOW); 
      break;
    }
    break;  

  case 2:
    digitalWrite(LED5, HIGH); 
    digitalWrite(LED6, HIGH);
    statemax = 3;
    switch(state){
    case 0:
      digitalWrite(LED4, LOW); 
      digitalWrite(LED1, HIGH);
      break;
    case 1:
      digitalWrite(LED1, LOW); 
      digitalWrite(LED3, HIGH);
      break;
    case 2:
      digitalWrite(LED3, LOW); 
      digitalWrite(LED2, HIGH);
      break;
    case 3:
      digitalWrite(LED2, LOW); 
      digitalWrite(LED4, HIGH);
      break;
    }
    break;

  case 3:
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, LOW);
    digitalWrite(LED3, LOW);
    digitalWrite(LED4, LOW);
    statemax = 3;
    switch(state){
    case 0:
      digitalWrite(LED5, HIGH); 
      digitalWrite(LED6, HIGH);
      digitalWrite(LED1, LOW); 
      digitalWrite(LED4, LOW);
      break;
    case 1:
      digitalWrite(LED1, HIGH); 
      digitalWrite(LED4, HIGH);
      digitalWrite(LED5, LOW); 
      digitalWrite(LED6, LOW);
      break;
    case 2:
      digitalWrite(LED2, HIGH); 
      digitalWrite(LED3, HIGH);
      digitalWrite(LED1, LOW); 
      digitalWrite(LED4, LOW);
      break;
    case 3:
      digitalWrite(LED1, HIGH); 
      digitalWrite(LED4, HIGH);
      digitalWrite(LED2, LOW); 
      digitalWrite(LED3, LOW);
      break;
    }
    break;
  }

}


void Faster() {
  Delay--;
  if(Delay < MIN/STEP){
    Delay = MIN/STEP;
  }
}

void Slower() {
  Delay++;
  if(Delay > MAX/STEP){
    Delay = MAX/STEP;
  }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

По поводу пятого режима - нужно, чтобы все режимы однократно шли по очереди или чтобы можно было задать колличество прохождений режима до перехода к следующему или переход от режима к режиму через заданное время не зависимое от скорости режимов  

New user
Offline
Зарегистрирован: 03.04.2012

< text>лучше всего что бы менялись через время t, которое можно задать вначале, только если возможно чтобы "режим "не обрывался, а доходил до конца.

Тестирую- все нормально

New user
Offline
Зарегистрирован: 03.04.2012

Макс, я тебя не сильно замотал ?
Тебя хоть чуть-чуть греют те малюсенькие бонусы которые я тебе выс на телефон?

Я просто созрел для окончательного вида программы. Я бы сделал возможным менять режимы не только двумя кнопками(пусть остаются), но и третьей.

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

Добьем это дело? )

New user
Offline
Зарегистрирован: 03.04.2012

Оказалось что новый режим я и сам смог написать.. Все не так сложно). Значит осталось -третяя кнопка, если это возможно. и попеременная смена режимов