Поочередное включение портов с кнопки
- Войдите на сайт для отправки комментариев
Сб, 15/08/2020 - 12:26
Здравствуйте.
Учу массивы. Для практики поставил себе задачку:4 светодиода, обявить порты на них выходом через перебор массива.
Далее, включать по одному через нажатие кнопки.
Пара портов на кнопку D10,D11.
Порты на светодиоды D2-D5
Собственно в чем проблема. При нажатии кнопки загорается только первый светодиод. При последующих нажатиях ничего не происходит.
Идея в том, чтобы нажав кнопку прошерстился массив из выводных пинов, и первый который не дает питания светодиоду-дал и на этом цикл оборвался. Т.е. 1 нажатие=включить 1 светодиод. Т.е. нажимая на кнопку чтобы включался следующий светодиод
Сам код
int leds[] = {2,3,4,5};//пины на светодиоды int countLeds = sizeof(leds) / sizeof (int *);//подсчитываю элементы массива void setup() { // initialize digital pin LED_BUILTIN as an output. pinMode(11,OUTPUT);//пара на кнопку pinMode(10,INPUT_PULLUP);//пара на кнопку for(int i = 0;i < countLeds;i++) { pinMode(leds[i], OUTPUT); } } // the loop function runs over and over again forever void loop() { if(digitalRead(10)==LOW) { while(digitalRead(10)==LOW){delay(10);}//Для того, чтобы кнопка работала стабильнее и чтобы срабатывала только при 1 нажатии долгом или коротком for(int i = 0;i < countLeds;i++) { if(digitalRead(leds[i]==HIGH)){continue;}//Если вывод уже дает питание-пропускаем его else if(digitalRead(leds[i]==LOW)){digitalWrite(leds[i],HIGH);break;}//если вывод не дает питания-включаем его и останавливаемся до следующего нажатия кнопки } } }
ты кнопку с 10 ноги замыкай на землю, нахрена тебе 11-й пин? Где он в коде используется?
Строка 19 вообще зачем ?
Да и кнопка как то криво описана.
Если нужно, одно нажатие=одно действие, то обычно фланг вводят.:
Так если пин уже выдает питание, значит его пропускаем, разве нет?
Так если пин уже выдает питание, значит его пропускаем, разве нет?
А если без строки 19, то все тоже самое.
Потому что он по второму условию будет тупо не соответствовать.
Пин выдаёт питание 20 мА если на него подать 1. По умолчанию 0, т.е. земля. Т.е при замыкании кнопки будет 0 или low. Соответственно в 16 строке программа или будет ждать отпускания или пролетит при дребезге. Смысла в ней нет в таком виде.
Сам спросил, сам отвечаю)))
Включил монитор порта(Serial.print) и выяснил, что все леды в состоянии HIGH, выставил на LOW и теперь все работает.
ты кнопку с 10 ноги замыкай на землю, нахрена тебе 11-й пин? Где он в коде используется?
Я 11 на 10 замыкаю
Всем спасибо, тема закрыта.
ТС по массивам, раз уж ты их изучаешь, на будущее, есть такая функция foreach.
В твоём случае самое оно:
for(int i:countLeds){pinMode(i,OUTPUT)};
Я 11 на 10 замыкаю
вот тебя и спрашивают - нафига ты так делаешь?
Это называется не спашивать, а быковать.
Если есть что обьяснить-обьясни, нет-проходи мимо. Я понимаю, что тут много "спецов" которые выучили языки за 5 минут утром за чайком и что вообще все очень просто и понятно, но это не так.
Обратился сюда-никто по существу ничего не ответил. Написал на буржуйском форуме-ясно, вежливо и доходчиво обьяснили.
За сим разрешите откланяться. Терпеть не могу таких людей, которые забывают, что тоже когда-то ничего не понимали.
Буду благодарен за инфу как тут аккаунт закрыть...
С кнопками/светодиодами сам так делаю. Только чего психовать? Спецы сходу не догоняют.)
С кнопками/светодиодами сам так делаю.
как "так"? - тоже занимаешь под одну кнопку два пина?
Если есть что обьяснить-обьясни, нет-проходи мимо. Я понимаю, что тут много "спецов" которые выучили языки за 5 минут утром за чайком и что вообще все очень просто и понятно, но это не так.
Дорогой, ты явно многого не понимаешь, причем я не имею в виду программирования. Вот смотри - ты пришел сюда с вопросом, почему твой код не работает, я прошу тебя обьяснить смысл некоторых строк в твоем коде, которые мне кажутся ошибочными - спрашиваю исключительно с целью поиочь - а ты обижаешься и начинаешь качать права. Если ты считаешь, что такое поведение подходит для новичка - тебе в самом деле нечего делать на этом форуме.
С кнопками/светодиодами сам так делаю.
как "так"? - тоже занимаешь под одну кнопку два пина?
Да. У меня куча кнопок и диодов от компов с шлейфом и двухпиновыми фишками. Если есть лишние ноги, то просто втыкаю в нану на две ноги, одну ногу на выход, вторую на вход. Я даже для датчиков массу и питание так подаю. Sht22 три провода а +5 у наны только одна нога. Второй датчик без борды не запитать. А так, три разных датчика висят прямо на ногах наны и никакой борды не надо.
А я не делаю :) Для тестов спаял пару "размножителей" на питание, а в готовых самоделках и понятно
Ну и пара причин, почему новичкам не стоит к такому привыкать: Во-первых, лишних пинов не бывает :), во-вторых стоит помнить, что нагрузочная способность GPIO 20 мА, а пинов "+5v" и GND - в 10 раз больше, как минимум
В готовых оно понятно. А датчик быстренько проверить? +5 lcd кушает, его с подсветкой на ногу не повесишь. Остаётся только так. Паять это время. Вобщем рекомендую.
Для наны есть, например, такой шилд - https://aliexpress.ru/item/32346681480.html - к каждому порту выведены VCC и GND, как раз для проверить по-быстрому. Стоит копейки. В общем, рекомендую ))
Солидарен.) Во всём приходится находить компромисс.
как "так"? - тоже занимаешь под одну кнопку два пина?
На этот случай существуют такие платы: https://aliexpress.ru/item/32779423321.html