Светодиод не включается со следующим кодом

Светодиод не включается со следующим кодом. Перепробовал несколько светодиодов и дважды проверил проводку. В чем дело? Использование uno.

int ldr = A1;
int  ldrVal = ldr;
int led = 6;
int lvalue = 900;





void setup() {
  pinMode(led, OUTPUT);

  Serial.begin(9600);     

delay(1000);                               

}




void loop() {

Serial.println(analogRead(ldrVal));
if (ldrVal > lvalue) {

digitalWrite(led, HIGH);
}
delay (50);

if (ldrVal < lvalue)
{
  digitalWrite(led, LOW);
}
delay (1000);

}

, 👍-1

Обсуждение

Начните с использования хороших имен для переменных. Используйте термин «контакт» в названии переменной, которая является номером контакта. Например,ledPin и ldrPin. Не путайте значение датчика с номером контакта. Уровень, при котором включается светодиод, может называться «triggerLevel» или «switchLevel» или как-то еще. Не используйте два оператора в одной строке (например, Serial.print и AnalogRead). Используйте один и тот же стиль для текста везде. Используйте отступы текста таким же образом., @Jot

Это неверно: int ldrVal = ldr; и это: Serial.println(analogRead(ldrVal)); В состав IDE входит пример эскиза (AnalogInput.ino), который станет отличной отправной точкой., @VE7JRO


2 ответа


1

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

Одна из проблем заключается в том, что переменная lvalue никогда не устанавливается, то есть ее значение остается 900 независимо от того, какое значение вы читаете с помощью analogRead() >.

Вторая ошибка: ваш ldrVal, который должен обозначать границу между горит и выключенным, имеет значение A1, который, в свою очередь, является определением макроса для допустимого целого числа, но очень маленького значения (менее 20).

Другими словами, код, который должен принимать решение о включении/выключении светодиода, постоянно сравнивает 900 и 20 без возможности изменения этих значений: неудивительно, что светодиод не меняет состояние, вы согласны?

Кстати, 50 мс — это очень короткий временной интервал: если вы хотите, чтобы светодиод включался, а затем выключался, увеличьте задержку до 200 или более.

,

1

Ваш код неверен. analogRead(ldrVal) не считывает значение аналогового контакта и не сохраняет его в ldrVal, это функция, результатом которой является значение аналогового контакта.

Попробуйте это изменение:

void loop() {

int newValue = analogRead(ldrVal);
Serial.println(newValue);
if (newValue > lvalue) {  //Проверяем newValue, а не ldrVal
    digitalWrite(led, HIGH);
}
delay (50);

if (newValue < lvalue)
{
    digitalWrite(led, LOW);
}
delay (1000);
}
,