Мигание светодиодом по нажатию тактовой кнопки.

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Groompel, 24 июл 2017.

  1. Groompel

    Groompel Нуб

    Всем привет, есть задний фонарь на велосипед, хотел по бокам добавить еще по 3 светодиода желтых для того, чтобы использовать их как поворотники. Идея вот в чем: нажимаю на кнопку "left" - мигают 3 левых светодиода, следовательно "right" - 3 правых. Сделал сначала с функцией delay, но потом понял, что светодиод не возможно будет выключить, так как ардуино как бы "отдыхает" во время delay. Попытался создать скетч по незнакомому, но очень желанному millis(). Получилось что-то, но работает всё странно: нажимаю кнопку, светодиоды могут либо загореться все вместе и просто стоять так, либо могут мигать (как и нужно). С выключением всё сложнее, выключается в какие-то определенные промежутки, так понял заданными мной с помощью millis. Надеюсь на вашу помощь. Спасибо.
     
  2. Groompel

    Groompel Нуб

    Код (C++):
    boolean button_state_left = 0;
    boolean button_state_right = 0;
    int  button_left = 7;
    int  button_right = 8;
    int val = 0;
    unsigned long time_m1;
    unsigned long time_m2 = 0;
    int = 200;
    void left_signal() {
      Serial.println("Turn Left");
      if (millis() - time_m1 > interval)
      {
        time_m1 = millis();
        if (val == LOW)
          val = HIGH;
        else
          val = LOW;
        digitalWrite(9, val);
        digitalWrite(2, val);
        digitalWrite(3, val);
      }
    }

    void right_signal() {
      Serial.println("Turn Right");

      if (millis() - time_m2 > interval)
      {
        time_m2 = millis();
        if (val == LOW)
          val = HIGH;
        else
          val = LOW;
        digitalWrite(4, val);
        digitalWrite(5, val);
        digitalWrite(6, val);
      }
    }
    void turn_off() {
      digitalWrite(9, LOW);
      digitalWrite(2, LOW);
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      Serial.println("STOP BLINKING");
    }
    void setup() {
      // put your setup code here, to run once:
      pinMode(9, OUTPUT);
      pinMode(2, OUTPUT);
      pinMode(3, OUTPUT);
      pinMode(4, OUTPUT);
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      pinMode(7, INPUT);
      pinMode(8, INPUT);
      Serial.begin(9600);
    }

    void loop() {
      // put your main code here, to run repeatedly:
      if (digitalRead(button_left) == HIGH)
      {
        button_state_left = !button_state_left;
        delay(40);
      };


      if (digitalRead(button_right) == HIGH)
      {
        button_state_right = !button_state_right;
        delay(40);
      };
      if (button_state_right == HIGH)
      {
       
    right_signal();
      }
      if (button_state_left == HIGH)
      {
         left_signal();
      };


    }
    }
     
    Последнее редактирование: 24 июл 2017
  3. Limoney

    Limoney Гик

    Посмотрите в IDE arduiono пример BlinkWithoutDelay
     
  4. Groompel

    Groompel Нуб

    Спасибо за ответ. Я ориентировался как раз на него, когда делал этот скетч. Прикол в том, что там скетч просто по морганию, а у меня моргание по нажатию, что немного усложняет его. Проблема как раз-таки во времени нажатия, как-будто ардуино уже занята в этот момент морганием и не может считывать с кнопки.
    P.S. Моргают светодиоды на ура, просто выключаются с трудом.
     
  5. vvr

    vvr Инженерище

    заводите переменную state = 0; и по нажатию кнопки меняете её на state = 1; и наоборот.
    в состоянии 0 светик выключен, 1 - мигает )))
     
  6. Groompel

    Groompel Нуб

    Да вроде так и сделал, но не выходит. =/
    В коде есть переменные button_state_left и button_state_right, каждый отвечает за левый и правый сигнал соответсвтвенно. Проблема возникает тогда, когда доходит дело до выключения. Да и включение тоже странное: то мигает, то просто горит. Вообщем, бред какой-то.
     
  7. vvr

    vvr Инженерище

    1. научитесь работать с кнопками с учётом дребезга
    2. сделайте сначала для одного канала. когда всё будет гуд наращивайте свои хотелки
     
  8. Kelvin

    Kelvin Гик

    Поворотники - не лучшая идея для велосипедов. Жесты более заметны для водителей и их в любом случае надо использовать. Можете конечно сделать себе перчатки со светодиодом. Когда показываешь жест (или без автоматизации, та же кнопка), светодиод включается и видно руку хорошо водителю. (Только как это все компактно сделать, надо подумать). У меня впрочем тоже велосипеды имеются, в свободное время займусь этой идеей, хотя у меня столько проектов сейчас) Если сделаю, поделюсь.
     
    Groompel нравится это.
  9. Groompel

    Groompel Нуб

    Спасибо, вообще планировал комбинировать и то, и то. То есть синхронизировать и руки и фонари сзади. Да, днём будет их видно не очень, но в темное время суток самое то.