Поочередное включение портов с кнопки

ikenny
Offline
Зарегистрирован: 15.08.2020

Здравствуйте.

Учу массивы. Для практики поставил себе задачку: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;}//если вывод не дает питания-включаем его и останавливаемся до следующего нажатия кнопки
  }  
    }
    
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ты кнопку с 10 ноги замыкай на землю, нахрена тебе 11-й пин?  Где он в коде используется? 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Строка 19 вообще зачем ?

Да и кнопка как то криво описана.

Если нужно, одно нажатие=одно действие, то обычно фланг вводят.:

boolean flag=0;

if(digitalRead(x)==0&&flag==0){
flag=1;
//Что то делаем 1 раз
}
if(digitalRead(x)==1){flag=0;}
//Ну можно ещё добавить делеев, чтоб дребезг убрать, раз миллисы пока не по зубам
delay(20);

 

ikenny
Offline
Зарегистрирован: 15.08.2020

Так если пин уже выдает питание, значит его пропускаем, разве нет?

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ikenny пишет:

Так если пин уже выдает питание, значит его пропускаем, разве нет?

А если без строки 19, то все тоже самое.
Потому что он по второму условию будет тупо не соответствовать.

nik182
Offline
Зарегистрирован: 04.05.2015

Пин выдаёт питание 20 мА если на него подать 1. По умолчанию 0, т.е. земля. Т.е при замыкании кнопки будет 0 или low. Соответственно в 16 строке программа или будет ждать отпускания или пролетит при дребезге. Смысла в ней нет в таком виде.

ikenny
Offline
Зарегистрирован: 15.08.2020

Сам спросил, сам отвечаю)))

Включил монитор порта(Serial.print) и выяснил, что все леды в состоянии HIGH, выставил на LOW и теперь все работает.

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);
  }  
  Serial.begin(9600);  
  for(int i = 0;i < countLeds;i++)
  {
    digitalWrite(leds[i], LOW);
  }  
  
}
// the loop function runs over and over again forever
void loop() {
  if(digitalRead(10)==LOW)
  {
    while(digitalRead(10)==LOW){delay(10);}//Для того, чтобы кнопка работала стабильнее и чтобы срабатывала только при 1 нажатии долгом или коротком
    Serial.print((String)"\nButton Pressed\n");
    for(int i = 0;i < countLeds;i++)
  {
    Serial.print((String)"Led "+leds[i]+" State "+digitalRead(leds[i])+"\n");
    if(digitalRead(leds[i])==0){Serial.print((String)"Led "+leds[i]+" is off, Swith to on\n");digitalWrite(leds[i], HIGH);break;}
  }  
    }
    
}

 

ikenny
Offline
Зарегистрирован: 15.08.2020

DetSimen пишет:

ты кнопку с 10 ноги замыкай на землю, нахрена тебе 11-й пин?  Где он в коде используется? 

Я 11 на 10 замыкаю

ikenny
Offline
Зарегистрирован: 15.08.2020

Всем спасибо, тема закрыта.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

ТС по массивам, раз уж ты их изучаешь, на будущее, есть такая функция foreach.
В твоём случае самое оно:
for(int i:countLeds){pinMode(i,OUTPUT)};

b707
Offline
Зарегистрирован: 26.05.2017

ikenny пишет:

Я 11 на 10 замыкаю


вот тебя и спрашивают - нафига ты так делаешь?

ikenny
Offline
Зарегистрирован: 15.08.2020

Это называется не спашивать, а быковать.

Если есть что обьяснить-обьясни, нет-проходи мимо. Я понимаю, что тут много "спецов" которые выучили языки за 5 минут утром за чайком и что вообще все очень просто и понятно, но это не так.

Обратился сюда-никто по существу ничего не ответил. Написал на буржуйском форуме-ясно, вежливо и доходчиво обьяснили.

За сим разрешите откланяться. Терпеть не могу таких людей, которые забывают, что тоже когда-то ничего не понимали.

Буду благодарен за инфу как тут аккаунт закрыть...

Green
Offline
Зарегистрирован: 01.10.2015

С кнопками/светодиодами сам так делаю. Только чего психовать? Спецы сходу не догоняют.)

b707
Offline
Зарегистрирован: 26.05.2017

Green пишет:

С кнопками/светодиодами сам так делаю.

как "так"? - тоже занимаешь под одну кнопку два пина?

b707
Offline
Зарегистрирован: 26.05.2017

ikenny пишет:

Если есть что обьяснить-обьясни, нет-проходи мимо. Я понимаю, что тут много "спецов" которые выучили языки за 5 минут утром за чайком и что вообще все очень просто и понятно, но это не так.

Дорогой, ты явно многого не понимаешь, причем я не имею в виду программирования. Вот смотри - ты пришел сюда с вопросом, почему твой код не работает, я прошу тебя обьяснить смысл некоторых строк в твоем коде, которые мне кажутся ошибочными - спрашиваю исключительно с целью поиочь - а ты обижаешься и начинаешь качать права. Если ты считаешь, что такое поведение подходит для новичка - тебе в самом деле нечего делать на этом форуме.

nik182
Offline
Зарегистрирован: 04.05.2015

b707 пишет:

Green пишет:

С кнопками/светодиодами сам так делаю.

как "так"? - тоже занимаешь под одну кнопку два пина?


Да. У меня куча кнопок и диодов от компов с шлейфом и двухпиновыми фишками. Если есть лишние ноги, то просто втыкаю в нану на две ноги, одну ногу на выход, вторую на вход. Я даже для датчиков массу и питание так подаю. Sht22 три провода а +5 у наны только одна нога. Второй датчик без борды не запитать. А так, три разных датчика висят прямо на ногах наны и никакой борды не надо.

b707
Offline
Зарегистрирован: 26.05.2017

А я не делаю :) Для тестов спаял пару "размножителей" на питание, а в готовых самоделках и понятно

Ну и пара причин, почему новичкам не стоит к такому привыкать: Во-первых, лишних пинов не бывает :), во-вторых стоит помнить, что нагрузочная способность GPIO 20 мА, а пинов "+5v" и GND - в 10 раз больше, как минимум

nik182
Offline
Зарегистрирован: 04.05.2015

В готовых оно понятно. А датчик быстренько проверить? +5 lcd кушает, его с подсветкой на ногу не повесишь. Остаётся только так. Паять это время. Вобщем рекомендую.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Для наны есть, например, такой шилд - https://aliexpress.ru/item/32346681480.html - к каждому порту выведены VCC и  GND, как раз для проверить по-быстрому. Стоит копейки. В общем, рекомендую ))

Green
Offline
Зарегистрирован: 01.10.2015

nik182 пишет:
Паять это время.

Солидарен.) Во всём приходится находить компромисс.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:
b707 пишет:

как "так"? - тоже занимаешь под одну кнопку два пина?

Да. У меня куча кнопок и диодов от компов с шлейфом и двухпиновыми фишками. Если есть лишние ноги, то просто втыкаю в нану на две ноги, одну ногу на выход, вторую на вход. Я даже для датчиков массу и питание так подаю. Sht22 три провода а +5 у наны только одна нога. Второй датчик без борды не запитать. А так, три разных датчика висят прямо на ногах наны и никакой борды не надо.

На этот случай существуют такие платы: https://aliexpress.ru/item/32779423321.html