переключение светодиодов кнопкой
- Войдите на сайт для отправки комментариев
Чт, 17/01/2019 - 11:15
Подскажите, есть код переключения мерцающих светодиодов кнопкой, но переключить не получается пока цикл не будет выполнен хотя бы один раз.
#define G_LedPin 11 // Подключаем зеленый светодиод к порту 12
#define B_LedPin 10 // Подключаем синий светодиод к порту 11
#define ButPin 7 // Подключаем кнопку к выходу 10
int flag = 0; // флаг состояния
int regim = 1; // Переключалка
void setup()
{
pinMode(G_LedPin, OUTPUT);
pinMode(B_LedPin, OUTPUT);
}
void loop()
{
if (digitalRead(ButPin) == HIGH && flag == 0)
{
regim ++;
flag = 1;
if (regim > 2) // Если номер режима превышает требуемого
{ // то отсчет начинается с нуля
regim = 1;
}
}
if (digitalRead(ButPin) == LOW && flag == 1)
{
flag = 0;
}
for (int i = 0; i <= 255; i++) {
// ======= Вполняем задачу при выборе режима =======
// РЕЖИМ 1: G
if (regim == 1)
{
analogWrite(G_LedPin, i);
analogWrite(B_LedPin, LOW);
if (digitalRead(ButPin) == HIGH){
break;}
delay(5);
}
// РЕЖИМ 2: B
if (regim == 2)
{
analogWrite(G_LedPin, LOW);
analogWrite(B_LedPin, i);
if (digitalRead(ButPin) == HIGH){
break;}
delay(5);
}
}
}
Тема "ПЕСОЧНИЦА. ДЛЯ ВСЕХ НОВИЧКОВ" обязательна к прочтению (хотябы первые два поста) ДО того, как что-либо, постить.
Потрудитесь, пожалуйста, а потом перепостите Ваш вопрос (можно новым постом в этом же топике).
предлагаю админам после регистрации новобранца, делать ему на 1-7 дней доступ только ReadOnly. И чтобы когда новобранец нажал первый раз "Создать тему" переадресовывать в первый пост песочницы отоматически
предлагаю админам после регистрации новобранца, делать ему на 1-7 дней доступ только ReadOnly.
Между прочим, это очень здравая идея.
предлагаю админам после регистрации новобранца, делать ему на 1-7 дней доступ только ReadOnly.
Между прочим, это очень здравая идея.
нудак плюсуем
предлагаю админам после регистрации новобранца, делать ему на 1-7 дней доступ только ReadOnly. И чтобы когда новобранец нажал первый раз "Создать тему" переадресовывать в первый пост песочницы отоматически
думаешь они неделю будут правила читать?
будут постить те же унылые вопросы через неделю после регистрации. только и всего :)
нинаю, за неделю мошт первый зуд в ладошках пройдёт.
будут постить те же унылые вопросы через неделю после регистрации. только и всего :)
Да, не, типажи вроде "срочно, курсовик, завтра сдавать" уйдут на другие форумы мозг выносить. И то легче :)
Музчины, вы очень нервно себя ведете, правил форума я не нарушал. Суть такая, это чисто мой личный интерес, есть устройство (ардуино уно, кнопка, 2 светодиода) которое долно работать так: при нажатии на кнопку происходит переключение светодиодов (при этом они мерцают), так вот - командой break прервать цикл не получается, он выполняется минимум один раз, после этого как по маслу. Если же нажать кнопку то цикл начинается снова и так до бесконечности.
Спасибо!!!
Прошу прощения, дополню - если нажать на кнопку до конча первого выполнения цикла...
Ничего нервного нет. Если бы вы изволили перечитать ссылку из первого поста, то узнали бы, как вставлять код, какая нужна дополнительная информация для создания темы и т.п., а также про "дедовщину".
правил форума я не нарушал.
Нарушали. Просто Вы их так и не удосужились прочитать, хотя я явно написал Вам об этом в первом ответе. Хотите пример нарушения? Вы неправильно вставили код. В нём нет номеров строк. И как его обсуждать? "У Вас ошибка в строке №ХЗ и с строках №№ ХЗ-ХЗ". Так?
Пока не вставите код как положено, никто его читать не будет.
И пожалуйста, не учите старожилов как им себя вести, нервно или не очень - сами ведите себя нормально (в т.ч. соблюдайте правила) и проблемы исчезнут.
правил форума я не нарушал.
Интересно, как Вы можете это утверждать, если Вы этих самых правил даже не читали?
Понятно! Еще раз дико извиняюсь
Вообще-то, не нужно организовывать цикл в строке №31 - сама по себе функция loop вызывается в бесконечном цикле и этим нужно пользоваться.
Но, если Вам так уж захотелось, то тогда Вам необходимо следить за своей флаговой переменной и всегда устанавливать её в ноль перед break. break-то срабатывает в этом нет сомнения (поставьте печать в сериал и убедитесь), а вот логика сломана из-за некорректного значения флага - оно у Вас всегда 1 при выходе по break в первом проходе.
Хотя, повторяю, лучше Вам придерживаться естествнной логики, а не пложить дополнительные циклы. С таким подходом у Вас ещё не одно грабли вылезут.
Я немного пока понимаю, новичек еще, без цикла в 31 строке и команды break все работает идеально, но хотелось чтоб светодиод загорался постепенно, так и происходит но переключается на другой только если цикл будет выполнен один раз. Если не дождаться полного загорания светодиода и последующего затухания и нажать на кнопку цикл начинается сначала.
Ну, тогдаВам надо свосем по-другому делать. Я-то думал, что сначала Вас устраивает. А Вам надо, чтобы новый эффект начинался с того же состояния светодиода в котором он был при нажатии кнопки? Так? Т.е. ещё раз. В одном режиме первый светодиод меняет свою яркость, а второй - нет. При перекючении, первый остётся как есть, а второй начинает менять. При новом переключении, первый начинает менять с того места где остановился, а второя останавливается. Так?
Нет, не совсем, код взял из интернета, мне нужно чтоб по нажатию кнопки переключались светодиоды (или режимы - не важно) и если убрать из кода цикл for и команду break все работает как надо (по нажатию все замечательно переключается) мне же надо чтоб они мерцали. Т.е. мерцает один светодиод а по нажатию он гаснет и начинает мерцать второй и т.д. Как только добавил цикл кнопка работает но перключает только псле того как яркость светодиода достигнет максимума и цикл пойдет по второму кругу (кароче на первом кругу не переключает)
Так я же Вам написал в посте #14, при первом проходе у Вас переменная flag всегда 1. Делайте её 0 перед break и всего делов. Вы не читали?
Спасибо большое!!
но возможно вы меня не поняли, у меня вопрос только в том почему при вызове break до конца первого выполнения цикла не пеереключает светодиод, а заставляет цикл начинаться снова.
Я завтра скину ссылку на видео
Ну, потому что flag равен 1 а переключение происходит только, когда он равен 0 - см. строку 15
мерцает один светодиод а по нажатию он гаснет и начинает мерцать второй и т.д.
Так?
Загрузил... то же самое
https://radikal.ru/video/IjyXyLqjQJw
вот тут в 1 части видео показано как программа выполняется с циклом, во второй естественно его нет и работает четко.
Блин, ну Вы можете в своём коде, просто рядом с break поставить ещё и flag = 0; ????
Загрузил... то же самое
ну незнаю, в железе не смотрел, а в Протеусе нормально переключается
или моя твоя не понимать
upd
https://radikal.ru/video/KoF6UZqqaXe