Помогите пожалуйста, нужно написать код, который с помощью одной кнопки управляет яркостью светодиода

Wolf_19

✩✩✩✩✩✩✩
15 Дек 2022
4
0
Оформи код соответствующим тэгом
Помогите пожалуйста, нужно написать код, который с помощью одной кнопки управляет яркостью светодиода. Есть светодиод, который подключен в порт Д2, кнопка подключена в порт Д5. Нужно чтобы при нажатии кнопки светодиод загорался на 20% яркости, и с каждым нажатием увеличивал яркость на 20%, по достижении 100% нужно чтобы алгоритм работал в обратной последовательности (уменьшал яркость).
Начало кода:
boolean butt_flag = 0;
boolean butt;
int val = 0;
void setup()
{
pinMode(3, OUTPUT);
pinMode(5, INPUT_PULLUP); // сюда подключена кнопка
}
void loop() {
butt = !digitalRead(5); // считать текущее положение кнопки

if (butt == 1 && butt_flag == 0)
{
butt_flag = 1;
val++; // увеличиваем яркость
analogWrite(3, val);
}

}
 
Изменено:

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
98
В конце дописать: если кнопка отжата и флаг 1,то флаг 0.
Вводим дополнительный флаг направления f_dir(к примеру).
Далее.В первом условии убираем val++,и добавляем:
1. Если f_dir ВВЕРХ,то val++
2. Если val>=255,то r_dir ВНИЗ
3 Если f_dir ВНИЗ,то val--
4. Если val<=0,то f_dir ВВЕРХ.
Возможно я где-то что-то упустил,пишу с телефона на толчке в неудобный момент.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
98
@Wolf_19,там где проверяется нажатие кнопки,написать проверку флага направления,чтобы знать,увеличивать или уменьшать значение. Следом проверять достижение крайних значений val. Если дошли до низа или до верха,то флаг направления меняем.
 
  • Лойс +1
Реакции: Wolf_19

viktor1703

★★★✩✩✩✩
9 Дек 2021
632
150
В добавку нужно ввести ещё один флаг, что кнопка была нажата и пока она не отпущена, то значение val не менять. Иначе будут чудеса в виде случайных значений яркости, а по факту за одно, даже короткое нажатие МК будет несколько сотен тысяч раз в секунду прибавлять - убавлять яркость.
 
  • Лойс +1
Реакции: te238s и Wolf_19

Wolf_19

✩✩✩✩✩✩✩
15 Дек 2022
4
0
Оформи код соответствующим тэгом
@te238s, при выводе значений val в мониторинг порта выдает какую-то дичь
код:
boolean butt_flag = 0;
boolean butt;
boolean f_dir;
int val = 0;
void setup()
{
pinMode(3, OUTPUT);
pinMode(5, INPUT_PULLUP); // сюда подключена кнопка
}
void loop() {
butt = !digitalRead(5); // считать текущее положение кнопки
if (butt == 1 && butt_flag == 0)
{
butt_flag = 1;
val= val+20; // увеличиваем яркость
analogWrite(3, val);
Serial.println(val);
}
if (butt == 0 && butt_flag == 1)
{
butt_flag = 0;
}
}
 

Вложения

viktor1703

★★★✩✩✩✩
9 Дек 2021
632
150
Для вставки кода используй тэгIMG_20221219_201223.jpg
C++:
boolean butt_flag = 0;
boolean butt;
boolean f_dir;
int val = 0;
void setup()
{
pinMode(3, OUTPUT);
pinMode(5, INPUT_PULLUP); // сюда подключена кнопка
}
void loop() {
butt = !digitalRead(5); // считать текущее положение кнопки
if (butt == 1 && butt_flag == 0)
{
butt_flag = 1;
val= val+20; // увеличиваем яркость
analogWrite(3, val);
Serial.println(val);
}
if (butt == 0 && butt_flag == 1)
{
butt_flag = 0;
}
}
А где же вывод в монитор порта? Пардон, вижу. Но вот инициализации serial не вижу в setup()
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,975
634
45
@Wolf_19, Зачем нужна подтяжка на кнопку (к тому же на неправильную ногу) когда в коде итак включается подтяжка?
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
632
150
И ещё я тут прикинул, что если изменять val по 20, то это получается по 7,8%. Чтобы было по 20% нужно изменять ≈ по 51. Утром после ночной смены плохо считал, поэтому ерунду посоветовал.
 

Normalek

★✩✩✩✩✩✩
6 Авг 2021
140
39
C++:
bool butt, butt_flag, _pwn;
uint8_t val = 0;

void setup() {
  Serial.begin(115200);
  pinMode(3, OUTPUT);
  pinMode(5, INPUT_PULLUP); 
}
void loop() {
  butt = digitalRead(5);
  if(!butt && !butt_flag) {
    butt_flag = true;
    _pwn ? val -= 51:val += 51;
    if(!val || val == 255) _pwn = !_pwn;
    analogWrite(3, val);
    Serial.println(val);
  }
  if (butt && butt_flag) butt_flag = false;
}
@Boroda22, Микроконтроллер ATmega в Ардуино имеет внутренние подтягивающие резисторы (резисторы, подключенные к питанию внутри микросхемы), которыми можно управлять. Если вы предпочитаете использовать их вместо внешних резисторов, подключенных к земле, - используйте параметр INPUT_PULLUP в функции pinMode(). Это позволит инвертировать поведение подключенного к выводу внешнего датчика: HIGH будет означать его отключение, а LOW - включение.
 
  • Лойс +1
Реакции: Boroda22

te238s

★★✩✩✩✩✩
14 Ноя 2021
374
98
А кнопка точно правильно подключена? Если не ошибаюсь, выводы тактовой кнопки попарно соединены. По рисунку получается от 5v через резистор сразу на землю.
Только дошло,резистор лишний. Просто,как выше сказали,подтяжку внутреннюю включи,должно сработать.