Программка со светодиодами и кнопкой, но один светодиод горит нормально, а другой тускло

Первая картинка с тем самым плохо горящим светодиодом. Вторая с нормальным. Программа вроде нормальная, не могу понять в чем причина. Пробовал просто отдельно запитывать второй светодиод, но ситуация такая же. В чем может быть проблема? Сама программа: (не обращайте внимание на Serial. Просто изучал саму программку и как кнопка работает
int led = 4;

boolean ledEnable = LOW;

int button = 2;

boolean buttonWasUp = true;

int secondled = 3;

void setup() {

pinMode(led,OUTPUT);

pinMode(button,INPUT);

Serial.begin(9600);

}

void loop() {

int buttonState = digitalRead(button);

if (buttonWasUp && !buttonState){

delay(10);

ledEnable=!ledEnable;

digitalWrite(led, ledEnable);

digitalWrite(secondled, !ledEnable);

}

Serial.print("buttonWasUp = ");

Serial.println(buttonWasUp);

Serial.print("ledEnable = ");

Serial.println(ledEnable);

buttonWasUp = buttonState;

Serial.print("buttonState = ");

Serial.println(buttonState);

Serial.print("digitalRead(button) = ");

Serial.println(digitalRead(button));

Serial.print("buttonWasUp = ");

Serial.println(buttonWasUp);

delay(50);

}

Начните с этого

int led = 4;
boolean ledEnable = LOW;
int button = 2;
boolean buttonWasUp = true;
int secondled = 3;
void setup() {
pinMode(led,OUTPUT);
pinMode(button,INPUT);
Serial.begin(9600); 
}

void loop() {
  int buttonState = digitalRead(button);
  if (buttonWasUp && !buttonState){
  delay(10);
  ledEnable=!ledEnable;
  digitalWrite(led, ledEnable);
  digitalWrite(secondled, !ledEnable);
  }
  Serial.print("buttonWasUp = ");
  Serial.println(buttonWasUp);
  Serial.print("ledEnable = ");
  Serial.println(ledEnable);
  buttonWasUp = buttonState;

  Serial.print("buttonState = ");
  Serial.println(buttonState);
  Serial.print("digitalRead(button) = ");
  Serial.println(digitalRead(button));
  Serial.print("buttonWasUp = ");
  Serial.println(buttonWasUp);
  delay(50);
}

Либо неконтакт (например, ножки светодиода или резистора окислились), либо резистор слишком большого номинала

Резистор 220. Светодиод пробовал другой поставить, все то же. Резистор тоже менял.

Плюс стоит резистор 10к ОМ (которым посередине), но он только для инпута сигнала кнопки, чтобы не было помех от радиомагнитных волн (как я понял).

Пробовал еще менять места аутпута светодиодов друг с другом, и в таком случае они меняются ролями (теперь тот, что светил нормально начинает светить тускло, а другой нормально).

Сорри, не дочитал. Вы не объявили пин второго светодиода OUTPUT

1 лайк

А где то же самое для secondled?

Всем спасибо. Сильно затупил получается(
А почему в таком случае небольшой ток все равно тёк? Какая то небольшая утечка есть если не объявлять пин?

А где setup? Без этого работать никак не будет. Добейся сначала картинки на форуме. Это всё связано.

Видимо, да

Конечно, аппаратная часть жестко следит за программной.

И не просто следит. Но и жОстко наказывает.

То есть аппаратная часть поняла, что я от неё хочу, но при этом программа этого не позволила, грубо говоря?

Заведите привычку форматировать код. В Arduino IDE это делается комбинацией Ctrl+T. И разделять функции пустыми строками, чтобы они не сливались с окружающим кодом. Согласитесь, так ваш код читается гораздо легче

int led = 4;
boolean ledEnable = LOW;
int button = 2;
boolean buttonWasUp = true;
int secondled = 3;

void setup() {
  pinMode(led, OUTPUT);
  pinMode(button, INPUT);
  Serial.begin(9600);
}

void loop() {
  int buttonState = digitalRead(button);
  if (buttonWasUp && !buttonState) {
    delay(10);
    ledEnable = !ledEnable;
    digitalWrite(led, ledEnable);
    digitalWrite(secondled, !ledEnable);
  }
  Serial.print("buttonWasUp = ");
  Serial.println(buttonWasUp);
  Serial.print("ledEnable = ");
  Serial.println(ledEnable);
  buttonWasUp = buttonState;

  Serial.print("buttonState = ");
  Serial.println(buttonState);
  Serial.print("digitalRead(button) = ");
  Serial.println(digitalRead(button));
  Serial.print("buttonWasUp = ");
  Serial.println(buttonWasUp);
  delay(50);
}

Ничего она не поняла. Вы программно присвоили пину высокий/низкий уровень, но аппаратно он все равно остался в высокоимпендансном состоянии (INPUT)

1 лайк

Так мы и до куклы Вуду дойдём.)

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

Так подумайте о тех, кто будет читать ваш код здесь :wink:

1 лайк

В следующий раз обязательно!)

Программу в таком виде никто читать не будет.
Но это и не важно.
Судя по словесному описанию, один из светодиодов Вы переводите в режим OUTPUT, а другой - забываете.

Потому что в архитектуре AVR для экономии адресного пространства пин переводится в “1” и включается подтяжка одной и той же командой (в режимах OUTPUT и INPUT соответственно).