гирлянда за 1000р
- Войдите на сайт для отправки комментариев
Втр, 03/04/2012 - 16:29
Уважаемые форумчане
А особенно те, кто готов помочь
железо - freeduino nano v5
задача - написать софт
Четыри светодиода включаются поочереди
скорость регулируется кнопками + и -
значение скорости сохраняется в память микроконтроллера и грузится при включении
Максимальный delay 2000, минимальный 100
шаг наверное 50
ps из личного неудачного опыта)))
Не должно быть задержек с изменением скорости при нажатии на кнопку, вызванных тем что программа ждет пока зажгутся все четыри светодиода и дойдет дело до обработки кнопки
Не должно быть задержек - используй прерывания. http://arduino.ru/Reference/AttachInterrupt
Там в конце есть пример, предполагается, что к входу 2 подключена кнопка.
polk, это да.. Но все равно я load и save делать не умею, проковыряюсь неделю.
Кто-нибуть ?
Работа с памятью
http://robocraft.ru/blog/arduino/82.html
Кнопки подключаются к 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.
Максим, спасибо
Ты лучший;)
Я завтра проверяю и отпишусь тогда
Проверил, по какой-то причине в прерывании не происходит запись в еепром, пришлось вынести запись в еепром в общий цикл и для своевремеенной записи избавиться от задержек, так же если вы используете микрокнопки, чтобы устранить дребезг контактов, нужно паралельно каждой кнопке поставить конденсатор.
#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; } }Теперь, т.к. нет задержек, при желании, можно избавиться и от прервываний и обрабатывать кнопки в общем цикле.
Макс, скопировал скетч, занимаюсь подключением) Подскажи пжл как правильно подключить кнопки. Мне знаком вот такой вариант www.arduino.ru/tutorials/button
А ты предлагаешь - все тоже самое только вместо резистора конденсатор?
Нет, вот так:
Отсутствие конденсаторов будет влиять только на дребезг, но работать будет и без них.
Я так и думал) А какой взять конденцатор?
И как тебе денежку кинуть.. тут даже лички нету
Примерно от 1 до 10 мкф, у меня стоят на 1мкф.
Тестирую, замечание правда есть.. Изменение скорости срабатывает только если нажатие на кнопку совпадает с обработкой этого события.. если не совпадает, то ничего не происходит.. Через прерывание с этой точки зрения было бы правильнее< text>
Нет, как раз сейчас кнопки работают через прерывания, а значит мгновенно, одно нажатие +/- 100 миллисекунд.
Попробуйте или без конденсаторов или уменьшите их емкость.
Не, у меня через раз срабатывает.. на медленной скорости это особенно заметно
(у меня вообще без конденсаторов)
Если убрать конденсаторы вообще, то иногда, из-за дребезга, при однократном нажатии вместо одного срабатывания будет происходить два, три, а то и больше.
А как вы определяете срабатывание? Вы скорее всего на медленной скорости не замечаете изменений.
я заметил, что чтобы произошло повышение скорости надо чтобы нажатие на кнопку было приблизительно во время потухания первого-зажигания второго светодиода!
Вот этот скейтч будет выводить в сириал монитор текущее значение переменной 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. У меня прибавляется и убавляется в любой момент времени.
Или вот:
#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 в одном из крайних значений.
Спасибо, Макс.. Все работает)
Просто визуально изменения скорости не
сильно ощутимы со значения 20 до где то 6, а я на кнопочки грешил). Кстати дребизгов у меня и без конденсаторов нету..
зы: по поводу оплаты, есть какие-нибуть идеи?
могу на телефон кинуть как вариант
Если перепродаешь, то кидай:
а если для себя, то дарю.
Ок. Не продаю, но все равно кину денежку..)
И последнее наверное.. Я хочу изменить интервал, сделать от 0,5 до 10. И хочу изменить шаг с 1 на 0,5. Пробовал через -=0,5 и +=0,5
не прошло.. Неlp
Ты какой код используешь? С мигающим светодиодом, с сериал-монитором или первый(рабочий)?
С с-монитором:
#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 - Максимальная задержка в миллисекундах(целое число)
Не пашет. Светододы не горят. Монитор показывает изм значений от 50 до 2000
Скопируйте еще раз, я просто к другим выводам подключался, а в этом коде забыл исправить. У меня другие выводы подключены - LED1, LED2 и т.д.
исправил, все ок
И вот еще:
#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
А можно вопрос по подключению кнопки. Обычно, насколько я понял изучаю теорию (только начал изучать), кнопка подключается еще подтягивающим резистором, чтобы при разомкнутом состояние было определенное значение. А у вас на схеме нет. Просто хочу понять можно ли так подключать? а не будет ли при разомкнутой кнопке гулять значение на порту и вхолостую посылать прерывания?
maksim, классная идея про две кнопки одновременно. В обратную сторону мне не надо, но есть три режима, которые было бы прикольно воплотить. Если возмешься:
1. Все тоже самое только после четвертого светодиода пауза( которую можно задать вначале)
2. Все тоже самое только последлвательность загарания светодиодов - 1 3 2 4
3. Наиболее сложное. Волна расходящаяся из центра и возвращающаяся обратно. Вначале одновременно загораются 2 и 3, гаснут, загораются 1 и 4, гаснут, загораются нововведение 5 и 6, гаснут, загораются 1 и 4
раъзяснение - я добавил 5 и 6 светодиод, которые везде просто горят, и только в третьем режиме задействованы.
Денюшка пришла? Если с этим поможешь тоже в долгу не останусь)
выбранный режим естественно сохраняется и грузится, ну и можно добавить 4. попеременное включение этих трех.
А можно вопрос по подключению кнопки. Обычно, насколько я понял изучаю теорию (только начал изучать), кнопка подключается еще подтягивающим резистором, чтобы при разомкнутом состояние было определенное значение. А у вас на схеме нет. Просто хочу понять можно ли так подключать? а не будет ли при разомкнутой кнопке гулять значение на порту и вхолостую посылать прерывания?
Для того, что бы была "подтяжка" к +5В без внешнего резистора в функции setup() пишишь:
у меня выше в коде 28 и 29 строки
Для того, что бы была "подтяжка" к +5В без внешнего резистора в функции setup() пишишь:
у меня выше в коде 28 и 29 строки
Спасибо. Точно, встроенные подтягивающие резисторы. А не надо тогда еще добавить
Для того, что бы была "подтяжка" к +5В без внешнего резистора в функции setup() пишишь:
у меня выше в коде 28 и 29 строки
Спасибо. Точно, встроенные подтягивающие резисторы. А не надо тогда еще добавить
Нет, не надо, все порты по-умолчанию и так настроены на вход.
Теперь ясно. Спасибо.
Да дошла. Остальное завтра допишу.
Я правильно понял, что крайние (1 и 6) светодиоды во всех кроме 3 режима (и чстично в 4) горят?
ага, всегда горят.. и только в третьем режиме мигают, когда до них дойдет волна.
На деле они крайние.. хотя номера у них 5,6... можно было бы назвать 5,0
А в первом режиме после четвертого светодиода задержка, велечину которой можно задать там где у нас вначале step, min, max
Итого у нас получилось пять режимов:
-Обычный ( то что уже есть)
- С задержкой после 4
- 1324
- Волна из центра вместе с 5 и 6
- И смена всех режимов по кругу.
А задержку лучше сделать пропорционально изменяющейся в зависимости от скорости перебора или просто статическую?
да лучше сделать зависемой
допустим задержка = наш тот делей * 2
Во втором режиме нужно, что бы 4 светодиод тух и была задержка или чтобы оставалься гореть на время задержки?
нужно чтобы гас
Вот потестите пока без последнего режима, задержка 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; } }По поводу пятого режима - нужно, чтобы все режимы однократно шли по очереди или чтобы можно было задать колличество прохождений режима до перехода к следующему или переход от режима к режиму через заданное время не зависимое от скорости режимов
< text>лучше всего что бы менялись через время t, которое можно задать вначале, только если возможно чтобы "режим "не обрывался, а доходил до конца.
Тестирую- все нормально
Макс, я тебя не сильно замотал ?
Тебя хоть чуть-чуть греют те малюсенькие бонусы которые я тебе выс на телефон?
Я просто созрел для окончательного вида программы. Я бы сделал возможным менять режимы не только двумя кнопками(пусть остаются), но и третьей.
Кроме того, я придумал новый, самый главный для меня режим, который МАКСимально) демонстрирует, то для чего это все и придумано.
Добьем это дело? )
Оказалось что новый режим я и сам смог написать.. Все не так сложно). Значит осталось -третяя кнопка, если это возможно. и попеременная смена режимов