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

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

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

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

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

#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 > 5){
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 + DELAY;
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;
case 4:
digitalWrite(LED4, LOW);
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;
case 4:
digitalWrite(LED5, HIGH);
digitalWrite(LED6, HIGH);
statemax = 18;
switch(state){
case 0:
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);
digitalWrite(LED1, HIGH);
break;
case 5:
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
break;
case 6:
digitalWrite(LED2, LOW);
digitalWrite(LED3, HIGH);
break;
case 7:
digitalWrite(LED3, LOW);
digitalWrite(LED4, HIGH);
break;
case 8:
digitalWrite(LED4, HIGH);
digitalWrite(LED1, HIGH);
break;
case 9:
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
break;
case 10:
digitalWrite(LED2, LOW);
digitalWrite(LED3, HIGH);
break;
case 11:
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
break;
case 12:
digitalWrite(LED4, HIGH);
digitalWrite(LED1, HIGH);
break;
case 13:
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);
break;
case 14:

break;
case 15:

case 16:
digitalWrite(LED4, HIGH);
digitalWrite(LED1, HIGH);
break;
case 17:
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
break;
case 18:
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
break;
case 19:
digitalWrite(LED3, HIGH);
digitalWrite(LED4, HIGH);
break;

}
break;
}

}

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

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

 

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

Подправить можно вот здесь: 

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

сделать >5

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

 Ну на самом деле не только здесь, так у тебя 6 режим не будет сохраняться при выключении, точнее бедет сохраняться, но при включении mode будет равна 0.

 

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

Кстати, чтобы код всталлять там есть кнопка " {...}code "

Alexander
Offline
Зарегистрирован: 25.04.2010

New User посмотрите пожалуйста про вставку программного кода

Выше я поправлю

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

ok

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

Все понял, что за режим, т.е. теперь будет 6 режимов переключаться они будут еще одной кнопкой и 6 режим переберает остальные пять. Сейчас уже не дома, проверять не на чем, так что завтра добью.

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

ok

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

Макс, когда можно ожидать шестой режим и третью кнопку? Пытаюсь день распланировать

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

 Ближе к вечеру.

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

И так, кнопку "режим" подключил к 4 выводу и поэтому все светодиоды подвинул и немного поменял очередность режимов:

0. Перебор

1. Перебор с задержкой

2. Ваш

3. 1324 с задеркой(ты добавил)

4. волна

5. Перебор режимов

#include <EEPROM.h>

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

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

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

int Delay, delayold, state, mode, statemax = 0;
long millisold, millisold1;
boolean mode5, buttonmodestate = 0;
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);
  digitalWrite(BUTTON_MODE, 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 > 5){
    mode = 0;
  }
  EEPROM.write(0, mode);
  if(mode == 5){
    mode5 = 1;
    mode = 0;
    millisold1 = millis();
  }
  else{
    mode5 = 0;
  }  
  millisold = millis();
}

void loop() {
  if(!digitalRead(BUTTON_MODE) && !buttonmodestate){
    mode = EEPROM.read(1);
    mode++;
    if(mode > 5){
      mode = 0;
    }
    EEPROM.write(1, mode);
    Serial.println(mode, DEC);
    delay(50);
    buttonmodestate = 1;
    if(mode == 5){
      mode5 = 1;
      mode = 0;
      millisold1 = millis();
    }
    else{
      mode5 = 0;
    }    
  }
  if(digitalRead(BUTTON_MODE)){
    delay(50);
    buttonmodestate = 0;
  }
  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();
  }
  if(mode5 && millis()-millisold1 > DELAY5 && state == statemax){
    digitalWrite(LED1, LOW);
    digitalWrite(LED2, LOW);
    digitalWrite(LED3, LOW);
    digitalWrite(LED4, LOW);
    mode++;
    if(mode > 4){
      mode = 0;
    }
    millisold1 = 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 = 18;
    switch(state){
    case 0:
      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;
    case 5:
      digitalWrite(LED1, HIGH);
      break;
    case 6:
      digitalWrite(LED1, LOW);
      digitalWrite(LED2, HIGH);
      break;
    case 7:
      digitalWrite(LED2, LOW);
      digitalWrite(LED3, HIGH);
      break;
    case 8:
      digitalWrite(LED3, LOW);
      digitalWrite(LED4, HIGH);
      break;
    case 9:
      digitalWrite(LED4, HIGH);
      digitalWrite(LED1, HIGH);
      break;
    case 10:
      digitalWrite(LED1, LOW);
      digitalWrite(LED2, HIGH);
      break;
    case 11:
      digitalWrite(LED2, LOW);
      digitalWrite(LED3, HIGH);
      break;
    case 12:
      digitalWrite(LED3, HIGH);
      digitalWrite(LED4, HIGH);
      break;
    case 13:
      digitalWrite(LED4, HIGH);
      digitalWrite(LED1, HIGH);
      break;
    case 14:
      digitalWrite(LED1, LOW);
      digitalWrite(LED2, HIGH);
      break;
    case 15:
      digitalWrite(LED4, HIGH);
      digitalWrite(LED1, HIGH);
      break;
    case 16:
      digitalWrite(LED1, HIGH);
      digitalWrite(LED2, HIGH);
      break;
    case 17:
      digitalWrite(LED2, HIGH);
      digitalWrite(LED3, HIGH);
      break;
    case 18:
      digitalWrite(LED3, HIGH);
      digitalWrite(LED4, HIGH);
      break;
    }
    break;

  case 3:
    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(LED3, HIGH);
      break;
    case 2:
      digitalWrite(LED3, LOW);
      digitalWrite(LED2, HIGH);
      break;
    case 3:
      digitalWrite(LED2, LOW);
      digitalWrite(LED4, HIGH);
      break;
    case 4:
      digitalWrite(LED4, LOW);
      break;
    }
    break;

  case 4:
    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;
  }
}

 

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

< text>Здесь уже и шестой режим? а есть вариант без цифорок слева 1-319?

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

New user пишет:
< text>Здесь уже и шестой режим?
 

да от 0 до 5 всего 6

New user пишет:
а есть вариант без цифорок слева 1-319?

Всмысле?

 

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

Без нумерации строк.. Я их удаляю минут пять)

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

maksim пишет:

 

New user пишет:
а есть вариант без цифорок слева 1-319?

Всмысле?
 

А понял, ты не просто его копируй, а когда развернешь в правом верхнем углу появится панель управления там есть кнопка  "<>" "КОД" , нажми ее и вот потом копируй )

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

Я так понял, ты все это время просто копировал и удалял нумерацию ) Перекопируй по нормальному, что бы ненароком лишнего не удалить

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

)))))) ясно Сейчас буду подключать третию кнопку, потом отпишусь. А последовательность режимов можно любую поставить, ты просто так сделал на свой вкус?

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

В принципе да, просто первые три последовательные с горящими крайними, четвертый вразнобой с горящими крайними и пятый с меняющимися крайними, мне такая последовательность показалась логичной, но если хочешь поменять, меняй, достаточно поменять только номера case-ов в switch(mode){...}, т.е. само тело case-а можно не переставлять. Пример:

switch(mode){
  case 0:
  //Первое действие  
    break;

  case 1:
  // Второе дейтвие
    break;

меняем последовательность:

switch(mode){
  case 1:
  //Первое действие  
    break;

  case 0:
  // Второе дейтвие
    break;

 

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

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

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

Макс, я спаял все.. все аккуратно.
Но у меня терь каждый раз при вкл выкл устройства она начинает с режима на 1 больше.

Если выключил на 2 режиме, то после включения начинает с 3.

Перезалил софт заново отсюда - не помогло
Пробовал даже искуственно писать что то типа mode = mode - 1 тоже не помогло

В чем может быть дело?
А у тебя грузит как надо?

Хелп

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

А если не питание выключать, а резет нажать тоже самое происходит?

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

Я понял в чем дело
Я отпаял конденсатор и этот глюк пропал.
Видимо он разряжался..

Но теперь есть дребезг кнопок(

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

Кондюк припаяй обратно и добавь задержку между 36 и 37 строкой функции setup():

digitalWrite(BUTTON_MODE, HIGH);
delay(100);
attachInterrupt(0, Faster, FALLING);

увеличивай значение delay(100); пока не проподет глюк.
 

 

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

Сегодня ближе к ночи попробую.. сенкс

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

Угу, заработало))