Светодиодный диммер не гаснет

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

int blue_led=10;

void setup() {  
  pinMode(blue_led,OUTPUT);
}

void loop() {

  int voltage=0;

  for(int i=0;i<=255;i+1){

    analogWrite(blue_led,voltage);
    voltage=voltage+1;
    delay(8);
  }
   int volts=255;

   for(int i=0;i<=255;i+1){

    analogWrite(blue_led,volts);
    volts=volts-1;
    delay(8);
   }


}

, 👍2


1 ответ


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

2

Ваш цикл for() должен заканчиваться либо на "i=i+1", либо на "i++", либо на "i +=1". В вашем коде вы просто говорите i+1, что на самом деле не влияет на «i». Так что первый цикл продолжается бесконечно, а переменная «напряжение» (которое не должно превышать 255) продолжает уходить в «недопустимый» диапазон. Arduino, вероятно, преобразует недопустимые значения в 0. В конце концов, поскольку «напряжение» — это всего лишь 2-байтовое целое число, оно, наконец, снова станет 0. Это произойдет за 65536 * 8 мс, что должно составлять около 8,7 минут. Но я не думаю, что это то, чего ты хочешь. ;-)

,

i можно было бы использовать вместо voltage и volts, не так ли? Я имею в виду, максимальное напряжение 255?, @brasofilo

Конечно, можно использовать «i», потому что 255 действительно является максимально допустимым значением для контактов ШИМ. Но опять же, «i» в коде OP никогда не превысит «0», пока цикл for() не будет исправлен. Вот полезная статья об этом... https://www.allaboutcircuits.com/projects/using-the-arduinos-analog-io/, @Randy

Я понимаю. Я только что внес изменения, и все работает отлично! Спасибо!, @ThisUsernameHasBeenTaken

Спасибо за объяснение, Рэнди. @ThisUsernameHasBeenTaken, если ответ решил вашу проблему, вы можете пометить его как принятый (см. [справочный центр](https://arduino.stackexchange.com/help/someone-answers)), @brasofilo

Только что сделал :) Спасибо, @ThisUsernameHasBeenTaken

Также обратите внимание, что использование задержки, как правило, является плохой идеей. (Ваш код зависает до тех пор, пока не истечет время задержки, поэтому ваш Arduino не сможет делать что-либо еще во время этой паузы.) Вы должны привыкнуть к написанию кода, который записывает текущее значение millis() и ожидает, пока оно увеличится до желаемое конечное значение. Поищите в Google «Arduino мигает без задержки» для объяснения этого., @Duncan C