Выполнение условия в покое
- Войдите на сайт для отправки комментариев
Доброго времени суток всем форумчанам! Прошу тапками не закидывать и не пинать, но уже голову сломал как написать правильно код. Прошу помощи с кодом или в каком направлении мне копать?
Смысл таков. Имеем Arduino Micro Pro, к ней подключен 7-ми сегментный дисплей (на 2, 3, 4, 5, 6, 7 и 8-й пины соответственно) на выход, а так же 6 герконов на вход (10, 16, 14, 15, 18 и 19-й соответственно). Необходимо что бы в состоянии покоя (на герконах нет сигнала) крайние сегменты поочередно зажигались, но если на одном из герконов есть сигнал, то зажигать толшько определенные сегменты.
У меня получилось включать определенные сегменты при поступлении сигналов на определенные герконы, при этом если сигналов нет, то и дисплей пустой. Так же получилось прописать задачу, что бы крайние сегменты включались поочередно, но если эту задачу вставить вместо задачи выключенного дисплея, то при активации герконов не выполняется их код.
Объяснил сумбурно, добавлю два варианта кода (я знаю что оба страшные, но я только учусь).
По коду ниже: в покое дисплей пустой, при появлении сигнала на герконе включаются определенные элементы
int b = 2; int a = 3; int f = 4; int g = 5; int e = 6; int d = 7; int c = 8; int first = 10; int two = 16; int three = 14; int four = 15; int five = 18; int rewind = 19; void setup() { pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode(first, INPUT); pinMode(two, INPUT); pinMode(three, INPUT); pinMode(four, INPUT); pinMode(five, INPUT); pinMode(rewind, INPUT); } void loop(){ if (digitalRead(first) == HIGH) { digitalWrite(a, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); } else { if (digitalRead(two) == HIGH) { digitalWrite(a, HIGH); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, HIGH); digitalWrite(b, HIGH); digitalWrite(c, LOW); } else { if (digitalRead(three) == HIGH) { digitalWrite(a, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); } else { if (digitalRead(four) == HIGH) { digitalWrite(a, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(b, HIGH); digitalWrite(c, HIGH); } else { if (digitalRead(five) == HIGH) { digitalWrite(a, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); } else { if (digitalRead(rewind) == HIGH) { digitalWrite(a, HIGH); digitalWrite(d, LOW); digitalWrite(e, HIGH); digitalWrite(f, HIGH); digitalWrite(g, LOW); digitalWrite(b, HIGH); digitalWrite(c, LOW); } else { digitalWrite(a, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); } } } } } } }
По коду ниже: в покое на дисплее включаются крайние сегменты поочередно, но при подаче сигнала на герконы ничего не происходит
// до 86-й строки то же самое, что и в первом коде, с 86-й код ниже digitalWrite(g, LOW); digitalWrite(a, HIGH); delay (100); digitalWrite(a, LOW); digitalWrite(f, HIGH); delay (100); digitalWrite(f, LOW); digitalWrite(e, HIGH); delay (100); digitalWrite(e, LOW); digitalWrite(d, HIGH); delay (100); digitalWrite(d, LOW); digitalWrite(c, HIGH); delay (100); digitalWrite(c, LOW); digitalWrite(b, HIGH); delay (100); digitalWrite(b, LOW); } } } } } } }
И второй вариант: так же как и в первом случае
int b = 2; int a = 3; int f = 4; int g = 5; int e = 6; int d = 7; int c = 8; int first = 10; int two = 16; int three = 14; int four = 15; int five = 18; int rewind = 19; int peredacha = 0; void setup() { Serial.begin(9600); pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); pinMode(first, INPUT); pinMode(two, INPUT); pinMode(three, INPUT); pinMode(four, INPUT); pinMode(five, INPUT); pinMode(rewind, INPUT); digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); } void loop(){ peredacha = 0; if (digitalRead(first) == HIGH){ peredacha = first;} if (digitalRead(two) == HIGH){ peredacha = two;} switch (peredacha) { case 10: digitalWrite(a, LOW); digitalWrite(b, HIGH); digitalWrite(c, HIGH); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); break; case 16: digitalWrite(a, HIGH); digitalWrite(b, HIGH); digitalWrite(c, LOW); digitalWrite(d, HIGH); digitalWrite(e, HIGH); digitalWrite(f, LOW); digitalWrite(g, HIGH); break; default: digitalWrite(a, LOW); digitalWrite(b, LOW); digitalWrite(c, LOW); digitalWrite(d, LOW); digitalWrite(e, LOW); digitalWrite(f, LOW); digitalWrite(g, LOW); } }
второй вариант кода: так же как и во втором случае
// до 49-й строки то же самое, что и в первом коде, с 49-й код ниже digitalWrite(g, LOW); digitalWrite(a, HIGH); delay (100); digitalWrite(a, LOW); digitalWrite(f, HIGH); delay (100); digitalWrite(f, LOW); digitalWrite(e, HIGH); delay (100); digitalWrite(e, LOW); digitalWrite(d, HIGH); delay (100); digitalWrite(d, LOW); digitalWrite(c, HIGH); delay (100); digitalWrite(c, LOW); digitalWrite(b, HIGH); delay (100); digitalWrite(b, LOW); } }
Как код спрятать под спойлер не нашел что-то
Я смотрю, у Вас код почти такой же, исправления коснулись if и else, но к сожалению работает так же как и мои два варианта. Крайние сегменты бегают по кругу, но когда подношу магнит к геркону, слышу щелчок срабатывания, но индикации не происходит, или же произойдет, но кратковременно и продолжают дальше бегать, даже если магнит у геркона.
Для начала - откатайте скетч на обычной тактовой кнопке, а не на герконе. Далее почитайте про "blink без delay". Ну и не забывайте, что вам нужна подтяжка кнопки/геркона (см. "подключение кнопки к Arduino"), иначе на индикаторе будете видеть дискотеку под радио "Маяк".
Про Blink без delay сейчас почитаю. Герконы подтянуты через резисторы в 10 кОм, а сегменты подтянуты через 220 Ом. Кнопка и геркон по сути это соеденение двух концов провода. Так вот если я даже на прямую замыкаю, то ничего не происходит, как бегали сегменты по кругу, так и бегают (либо же моргнет нужная индикация на долю секунды и дальше бегают сегменты)
100 ом - Вы не ошибаетесь? Не знаю, по какой схеме у вас там все соединено, но на мой дилетантский взгляд 100 ом - это маловато, я даже не представляю, что с ардуиной творится при замыкании кнопки через 100 ом. В классическом примере кнопка подтягивается через 10kOm.
Кнопка == геркону, это так. Но случаи с трясущимся в руках магнитом бывали. Поэтому для начала - кнопка.
Я бы написал так:
Ошибки возможны, ибо код не компилировал.
Вы правы 10 кОм, чушь написал, исправил. По идее при замыкании на прямую двух проводов, должен же скетч отрабатывать?
Вы правы 10 кОм, чушь написал, исправил. По идее при замыкании на прямую двух проводов, должен же скетч отрабатывать?
По идее он и отрабатывает. Вопрос только - так, как вы ожидаете или нет. Я не особо хочу сейчас разбираться в том, по какому кругу там мотает у вас там что, но могу дать еще один совет: на индикаторе пока не зацикливайтесь, повтыкайте в условиях Serial.println-ы с диагностическими сообщениями и смотрите в Serial Monitor-е - эти сообщения выводятся в соотвествии с вашими ожиданиями или нет. Т.е. составьте максимально короткий скетч, который будет работать, как требуется. Потому уже обвешивайте индикаторами.
Понял спасибо. Уже делал вывод в SerialMonitor, не отрабатывает. Как только я в своем скетче (точнее в скетче vosara) ставлю кусок кода, который включает и выключает сегменты последовательно, то Arduino перестает реагировать на входы, но если же заменить кусок кода с последовательным включением и выключением сегментов на код где все сегменты выключены, то Arduino реагирует на сигналы и показывает то что надо
Не совсем понял этот код. Я правильно понимаю, что там прописан перебор на сравнение через счетчик в +1 шаг?
Если вывод в Serial не отрабатывает, то или условие не выполняется или Serial.begin(..) забыли.
строка 29 - опрашиваются все герконы, и единицы(или нули) складываются в переменную sample. Если sample равна нулю - на всех входах нули - переходим к веселому помигиванию сегментами. Если хоть один вход выдал 1 - то соответсвующий сегмент загорается.
Это понятно, что что-то не так ))) про Serial.begin(9600) не забыл. Про условие:
Посмотрите код из второго поста в этой теме. Если убрать кусок с 87-й по 105-ю строку и вставить туда код все выходы LOW, то все условия идеально отрабатываются.
Я так думаю причина все же в этих delay, про которые Вы и vosara сказали. Пошел курить тему про Blink без delay.
Я так думаю причина все же в этих delay, про которые Вы и vosara сказали. Пошел курить тему про Blink без delay.
Смотрю Вы и код подправили ))) проверил, работает, теперь дополню его. Курить темы все равно буду ))) Спасибо
там некорректность есть: два раза пины опрашиваются.
Лучше так (со строчки 32) :
Спасибо большое! Сейчас попробую
Проверил на симуляторе, все четко работает
Проверил на симуляторе, все четко работает
http://easyelectronics.ru/sistema-modelirovaniya-isis-proteus-bystryj-st...
vosara, к каждому светодиоду нужен токоограничительный резистор.
vosara, к каждому светодиоду нужен токоограничительный резистор.
Да спасибо за подсказку, в натуральной схеме я так и делаю а в симуляторе - диоды сжечь нельзя, а загружать дополнительными параметрами процесор считаю не нужным.
К сожалению, по факту, скетч мой тормозил, и когда выполнялся код бегущих сегментов, то контроллер не реагировал больше ни на что. Помог только скетч 5N62V