Затухающий светодиод с кнопкой
Мне нужно сделать для школы проект. Что когда я удерживаю кнопку, она исчезает. Но как только вы отпустите кнопку, он должен немедленно остановиться. Но когда я снова удерживаю кнопку, она должна начаться снова с исчезновением, но яркость должна начинаться с 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);
}
}
@maxim peeters, 👍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
}
}
Объяснение
- Всегда делайте отступы в коде (чтобы { и } были понятны. Обратите внимание, что каждое новое { увеличивает отступ на два пробела, каждое } уменьшает отступ на два пробела.
- Для значений, которые не изменяются, используйте #define. Это предотвращает (в данном случае) сохранение нескольких байтов в ценном пространстве памяти. Это важно, особенно если вы используете массивы.
- Вы использовали 9 в
digitalWrite(9, LOW);
, что, вероятно, было ошибкой, всегда используйте определения везде, где это возможно. Я бы также использовал#define DELAY_TIME 100
вместо жестко запрограммированного значения 100. - Я добавляю пробелы до/после значений (например,
switchButton == HIGH
). Неважно, делаете вы это или нет, но будьте последовательными. - Используйте хорошие имена переменных (
switchButton
более понятно, чемval
). - Используйте
brightness += FadeAmount;
вместоbrightness = Brightness + FadeAmount;
; это обычный способ увеличения (или уменьшения/умножения/чего угодно) значения переменной. - Используйте ( и ) в нетривиальных операторах if, таких как
if ((brightness <= 0) || (brightness >= 255))
, это может сэкономить вам часы поиска, если вы когда-нибудь допустите ошибку (в этом случае функциональных изменений нет).
Удачи в вашем проекте.
,
@Michel Keijzers
Смотрите также:
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
о да, спасибо большое. я скоро проверю., @maxim peeters
Ух ты, сколько хороших советов по программированию! (проголосовало), @Duncan C