Почему потенциометр выполняет функцию переключателя «вкл/выкл» в моей программе?

Я использую ультразвуковой датчик HC-SRO4 и потенциометр D10K. Итак, я просто повозился с потенциометром в программе, а затем попытался изменить яркость светодиода, который включается при выполнении определенного условия, но вместо этого потенциометр действует как переключатель ВКЛ/ВЫКЛ. Я хотел бы узнать, почему это происходит и как я могу нормально изменить яркость светодиода в этой ситуации.

long duration;
int distance;
int trigPin = 9;
int echoPin = 10;
int buzzer = 11;
int LED = 3;
boolean detected = false;
#define pot 0
int val = 0;

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(trigPin,OUTPUT);
  pinMode(echoPin,INPUT);
  pinMode(buzzer,OUTPUT);
  Serial.begin(9600);
}

void loop() {
  digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance= duration*0.034/2;
val  = analogRead(pot);
val  = map(val, 0, 1023, 0, 255);
Serial.println  (distance);

if(distance < 50 && distance != 0){ // distance != 0  because sometimes the distance's first value is sometimes 0 which ruins the purpose of
 // the program
  analogWrite(LED, val);
  alarm();
  detected = true; 
}
else if(detected){ 
  digitalWrite(LED,LOW);
  alarm();
}
}

void alarm(){
  tone(buzzer, 450);
  delay(100);
  tone(buzzer, 1000);
  delay(100);
  }

, 👍0

Обсуждение

Напишите эскиз, используя только горшок и светодиод., @Juraj

Ну, я сделал, и это работает отлично. Я могу изменить яркость светодиода. Но я не понимаю, почему это не делается в коде выше. @Juraj, @Arman Samma

поскольку analogWrite зависит от показаний датчика расстояния, @Juraj

Проблема в том, что я не могу изменить яркость, пока это условие выполняется? Ну, когда я делаю условие истинным (помещаю какой-нибудь объект перед датчиком), я поворачиваю потенциометр, и он все равно работает как переключатель ВКЛ/ВЫКЛ., @Arman Samma


1 ответ


Лучший ответ:

7

Ответ очень прост. Вы используете вывод 12 для светодиода. Вывод 12 не может выполнять analogWrite(). Этот вывод не поддерживает ШИМ на Arduino UNO (Atmega 328)

Вывод 3 тоже не в порядке. Использование функции tone() отключает ШИМ на выводе 3. Из ссылки: «Использование функции tone() будет мешать выходу ШИМ на выводах 3 и 11».

,

Извините. Я изменил свой светодиодный пин на 12 (сейчас я его поменяю на 3), потому что я с ним возился. Изначально это был пин ШИМ, когда возникла эта проблема, @Arman Samma

@ArmanSamma: Пожалуйста, убедитесь, что любой публикуемый вами код всегда соответствует вопросу., @Edgar Bonet

Я не понимаю. Как и почему функция tone() отключает ШИМ на выводе 3? @Juraj, @Arman Samma

"tone()" в ответе — это ссылка. Прочитайте ссылку на функцию тона., @Juraj