Затухающий светодиод с кнопкой

Мне нужно сделать для школы проект. Что когда я удерживаю кнопку, она исчезает. Но как только вы отпустите кнопку, он должен немедленно остановиться. Но когда я снова удерживаю кнопку, она должна начаться снова с исчезновением, но яркость должна начинаться с 0. У меня есть программа, но когда я снова нажимаю, она просто начинается с предыдущей яркости. Пожалуйста, помогите. Это мой код:

int led = 9;          
int brightness = 5;    
int fadeAmount = 5;    

void setup() {
   Serial.begin(9600);
    pinMode(led, OUTPUT);
}
void loop() {
  int val = digitalRead(2);
  Serial.println(val);
if (val==HIGH){
  analogWrite(led, brightness);
  brightness = brightness + fadeAmount;
  if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount; }
  delay(100);
}
else{ 

  digitalWrite(9, LOW);
}
}

, 👍0


1 ответ


1

Основная проблема заключается в том, что вам приходится сбрасывать яркость на 0, когда переключатель находится в положении LOW. Кстати, я не тестировал скетч, а только скомпилировал его.

int led = 9;          
int brightness = 5;    
int fadeAmount = 5;    

void setup() {
   Serial.begin(9600);
    pinMode(led, OUTPUT);
}
void loop() {
  int val = digitalRead(2);
  Serial.println(val);
if (val==HIGH){
  analogWrite(led, brightness);
  brightness = brightness + fadeAmount;
  if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount; }
  delay(100);
}
else{ 

  digitalWrite(9, LOW);
  brightness = 0;    // Перезапуск с яркостью 0
}
}

Некоторые другие улучшения приводят к следующему:

#define LED_PIN      9  
#define DELAY_TIME 100        
int brightness = 5;    
int fadeAmount = 5;    

void setup() {
   Serial.begin(9600);
   pinMode(LED_PIN, OUTPUT);
}

void loop() {
  int switchButton = digitalRead(2);
  Serial.println(switchButton);

  if (switchButton == HIGH) {
    analogWrite(LED_PIN, brightness);
    brightness += fadeAmount;
    if ((brightness <= 0) || (brightness >= 255)) {
      fadeAmount = -fadeAmount; 
    }
    delay(DELAY_TIME );
  }
  else { 
    digitalWrite(LED_PIN, LOW);
    brightness = 0;    // Перезапуск с яркостью 0
  }
}

Объяснение

  1. Всегда делайте отступы в коде (чтобы { и } были понятны. Обратите внимание, что каждое новое { увеличивает отступ на два пробела, каждое } уменьшает отступ на два пробела.
  2. Для значений, которые не изменяются, используйте #define. Это предотвращает (в данном случае) сохранение нескольких байтов в ценном пространстве памяти. Это важно, особенно если вы используете массивы.
  3. Вы использовали 9 в digitalWrite(9, LOW);, что, вероятно, было ошибкой, всегда используйте определения везде, где это возможно. Я бы также использовал #define DELAY_TIME 100 вместо жестко запрограммированного значения 100.
  4. Я добавляю пробелы до/после значений (например, switchButton == HIGH). Неважно, делаете вы это или нет, но будьте последовательными.
  5. Используйте хорошие имена переменных (switchButton более понятно, чем val).
  6. Используйте brightness += FadeAmount; вместо brightness = Brightness + FadeAmount;; это обычный способ увеличения (или уменьшения/умножения/чего угодно) значения переменной.
  7. Используйте ( и ) в нетривиальных операторах if, таких как if ((brightness <= 0) || (brightness >= 255)), это может сэкономить вам часы поиска, если вы когда-нибудь допустите ошибку (в этом случае функциональных изменений нет).

Удачи в вашем проекте.

,

о да, спасибо большое. я скоро проверю., @maxim peeters

Ух ты, сколько хороших советов по программированию! (проголосовало), @Duncan C