Кнопка на Ардуино

Lorikxz

✩✩✩✩✩✩✩
26 Янв 2024
4
0
Здравствуйте! Совсем недавно начал изучать тему с Arduino и электроникой, и хотел сделать для практики светильник. Но наткнулся на проблему одну. Надо что бы после первого нажатия на тактовую кнопку, светодиод горел, а после повторного нажатия - потухал. Спасибо заранее:)
Код:
Код:
const int BLED = 11;

const int GLED = 10;

const int RLED = 9;

const int btn = 2;

int active_color;

bool turn = true;

bool lastButton = LOW;

bool currentButton = LOW;

int ledMode = 0;

int mode = 0;

int invert(int value) {

  return map(value, 0, 255, 255, 0);

}

void setup() {

pinMode(BLED, OUTPUT);

pinMode(GLED, OUTPUT);

pinMode(RLED, OUTPUT);

pinMode(btn, INPUT);

active_color = BLED;

analogWrite(RLED, invert(255));

analogWrite(GLED, invert(0));

analogWrite(BLED, invert(0));

}

bool debounce(bool last) {

  bool current = digitalRead(btn);

  if (last != current) {

    delay(5);

    current = digitalRead(btn);

    return current;

  }

}





void loop() {





  currentButton = debounce(lastButton);

  if (lastButton == LOW && currentButton == HIGH) {

    ledMode++;

  }

  lastButton = currentButton;

  if(currentButton == HIGH) {

    switch (active_color) {

      case RLED:

        active_color = BLED;

        break;

      case GLED:

        active_color = RLED;

        break;

      case BLED:

        active_color = GLED;

        break;

    }

    if (!turn)

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

        analogWrite(active_color, i);

        delay(5);

      }

    else

      for(int i = 255; i>=0; i--) {

        analogWrite(active_color, i);

        delay(5);

      }

      turn = !turn;

  }

  else if(currentButton == LOW) {

    analogWrite(RLED, LOW);

    analogWrite(GLED, LOW);

    analogWrite(BLED, LOW);

  }

}
 
Изменено:

bort707

★★★★★★✩
21 Сен 2020
3,066
914
Вы не написали, в чем проблема с текущим кодом? Он не компилируется? Или компилируется, но не работает?

Вообще, если вы разбираетесь с кнопкой, то и скетч надо приводить про кнопку. А у вас в коде просто куча каких-то не очень ясных манипуляций с выводами на светодиод.

И еще, почитайте описание команды analogWrite()
 

Lorikxz

✩✩✩✩✩✩✩
26 Янв 2024
4
0
Вы не написали, в чем проблема с текущим кодом? Он не компилируется? Или компилируется, но не работает?
Скетч работает, всё работает, вопрос в другом, как мне просто это сделать, что надо вписать в код.
Вообще, если вы разбираетесь с кнопкой, то и скетч надо приводить про кнопку. А у вас в коде просто куча каких-то не очень ясных манипуляций с выводами на светодиод.
Опять же говорю, я новичок, и мне не очень понятно, что и как. Если вы хорошо понимаете, и можете помочь улучшить код, я буду только рад.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Что бы научиться нужно понять как бы это происходило физически.
Самый простой способ это менять состояние пина выхода при нажатии. При этом даже не надо хранить состояние пина.
Однако глянув на код вижу, что он рассчитан на RGB светодиод , с несколькими режимами работы. Расскажите как он работает , и когда надо выключать ?
В коде используется задержка в 5 мс, казалось бы мелочь. но он повторятся 255 раз, а это уже больше секунды. Так делать нельзя.
Похоже что вы где то взяли код, который как то работает и пытаетесь его изменить под себя.
 

Lorikxz

✩✩✩✩✩✩✩
26 Янв 2024
4
0
Однако глянув на код вижу, что он рассчитан на RGB светодиод , с несколькими режимами работы. Расскажите как он работает , и когда надо выключать ?
Да, правильно. Мне надо что бы выключался при долгом зажатии кнопки(около 3 секунд)
Похоже что вы где то взяли код, который как то работает и пытаетесь его изменить под себя.
Тут тоже угадали почти, но только я брал его с разных источников, стараясь понять что и как делать.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,266
1,303
Москва
Не стоит мучаться самому с состояниями кнопки , можно, но утомительно.
Возьмите готовую библиотеку имени Гайвера: https://alexgyver.ru/gyverbutton/
Смотрите примеры, там уже есть все нужные варианты, в т.ч. удержангие, нажатия, отпускания , клики (т.е. нажатие и отпускание)
При удержании просто считываете состояние пина светодиода и инвертируете его:
digitalWrite(пин_светодиода,!digitalRead(пин_светодиода));
 
  • Лойс +1
Реакции: Lorikxz