Рандом и лампочки
- Войдите на сайт для отправки комментариев
Втр, 24/05/2016 - 20:58
Добрый день. Возник следующий вопрос.
Есть две лампочки, LedR и LedL. Есть кнопка, при нажатии на которую срабатывает "рандом". В 10 процентах должна включаться LedL на 2 секунды, в остальных LedR так же на 2 секунды. Код ниже:
int ledL = 7; int ledR = 8; int button = 4; long randNumber; void setup() { pinMode(ledL, OUTPUT); pinMode(ledR, OUTPUT); pinMode(button, INPUT); randomSeed(analogRead(0)); } void loop() { if(digitalRead(button) == HIGH) { randNumber = random(100); if( randNumber <=9) { digitalWrite(ledL, HIGH); digitalWrite(ledR, LOW); delay(2000); } else { digitalWrite(ledL, LOW); digitalWrite(ledR, HIGH); delay(2000); } } else { digitalWrite(ledL, LOW); digitalWrite(ledR, LOW); } }
Собственно вопрос. Как сделать то же самое, но на 3 кнопки и 6 лампочек. Кнопки должны работать независимо: пока горит лампочка из первой группы, и нажата кнопка второй группы, лампочка группы 2 должна загореться не потушив при этом лампу группы 1. Одна кнопка - 2 лампы. Надеюсь понятно объяснил))
Натолкните на мысль.
Заранее благодарен.
P.S. Есть возможность контролировать время нажатия кнопок. Может так будет проще и отталкиваться от этого?
Ну, на худой конец также и делай, просто кода будет больше. Хотя, правильнее создать классы для ламп и кнопок, тогда можно хоть на 10 делать без дублирования одного и того же
Так же делать бессмысленно. Ему нужно конечный автомат реализовывать.
На сколько я понимаю, delay() подразумевает остановку всего на заданный интервал, т.е. если нажатие второй кнопки попадет в delay() первой, то ничего не произайдет. Значит от этого нужно уходить. mills()? как вариант, но смущает необходимость переодического перезапуска для сброса счетчика. Может есть еще варианты?
P.S. Напишу опять в конце. Появилась мысли привязаться к времени нажатия кнопки, которое есть вариант контролировать, но! если подключить не 2, а 4 лампочки, две из которых горят, а две - мигать...
смущает необходимость переодического перезапуска для сброса счетчика.
Зачем его сбрасывать? Я что-то не понял, о чём это Вы, можно поподробнее с этого места?
"сбрасывает в ноль". Все. Понял. Небольшой баг раз в 50 дней, не факт которые раметишь. Пошел пробовать.
Ну как сказать баг...баг с постоянной периодичностью есмь фича, так что переполнение переменной millis скорее фича.
Тогда так. На сколько данный код корректен? И будет ли он работать?
"сбрасывает в ноль". Все. Понял. Небольшой баг раз в 50 дней, не факт которые раметишь. Пошел пробовать.
ничего не нужно сбрасывать #14
"сбрасывает в ноль". Все. Понял. Небольшой баг раз в 50 дней, не факт которые раметишь. Пошел пробовать.
Никто ничего не сбрасывает, если правильно писать. Даже не парьтесь. Если правильно напишете работы с millis никаких проблем от переполнения не будет.
А можете прокомментировать код, который выше с millis()? Будет ли он работать? Может быть какие-нибудь недочеты, ошибки?
Согласен. А так?
Работать будет, но не так как ты хочешь. Ошибка в реализации алгоритма. Судя по всему обе лампочки будут сразу включаться по нажатию на кнопку и выключаться по отпусканию.
Попробуем по другому. Что скажите по этому поводу?
Как бы, давай пропустим твои итерации и перейдем сразу к реализации идеи.
Спасибо большое. Можно еще 1 глупый вопрос?
что значит буква p после myStruct, равно как - почему переменная записана как p.st - т.е. с точкой?
Или подскажите о чем почитать, чтобы понять это.
p это ссылка на структуру, которую передаем функции в качестве параметра, можно назвать как угодно, например:
void group(myStruct myFuckingLinkToStructure), тогда и обращаться к полям структуры придется myFuckingLinkToStructure.st
Набери в поисковике "оператор точка".
Вроде все встало на свои места. Еще раз спасибо.
После нажатия на кнопку загораются обе лампочки и не тухнут. Где искать?
Хотя все должно работать...
Судя по всему надо передавать указатель на структуру void group(myStruct *p).
а доступ к полям структуры через указатель p->st, p->tmr, p->ledR и т.д.
Сейчас "поигрался" с платой. Почему срабатывало две лампы - нашел - кинул сопративление от пина кнопки на землю. Решил потестить через "слушанье порта". Вот что там пишет:
antidrebizg
bolee 10
Zapomnil vremya
antidrebizg
menee 10
Zapomnil vremya
соответственно два нажатия. т.е. casse OFF отрабатывает, а вот в case WAIT затем не переходит. Код ниже
Все верно, надо передавать указатель на структуру в качестве параметра функции. Иначе компилятор создает копию структуры в стеке и все изменения происходят в этой копии, а не в самих структурах a,b,c
Действительно, так намного лучше)) все работает идеально)