Поворотник для велика, на Digispark ATtiny85

Zaur.
Offline
Зарегистрирован: 30.05.2020

Всем здарова! Хотел сделать поворотники для велика, на Digispark. У каждого светодиода есть своя кнопка. Нажимаешь на правою мигает правый светодиод, на левую кнопку левый. Но что-то не получилось(. Я нажимая на любую из 2х кнопок а моргают все 2 светодиода. Библеотека OneButtone.

Принцип работы:Нажимаешь правою кнопку и моргает правый светодиод, нажимаешь на эту же кнопку он выключается. Также и с левой.



Скетч:

#include "OneButton.h"

typedef enum {
  ACTION_OFF1,  // Выключить сведотдиод1
  ACTION_ON1, // Включить светодиод1
  ACTION_FAST1, // Быстро моргать1
  ACTION_ON2, // Включить светодиод2
  ACTION_OFF2, // Выключить сведотдиод2
  ACTION_FAST2, // Быстро моргать2
}

MyActions;

OneButton button1(3, true); //Кнопка1 подключена к 3 пину
OneButton button2(4, true); //Кнопка2 подключена к 4 пину

MyActions nextAction1 = ACTION_OFF1; //Выключенный светодиод
MyActions nextAction2 = ACTION_OFF2; //Выключенный светодиод

void setup() {
  pinMode(2, OUTPUT); // Светодиод подключен к 2 пину
  pinMode(1, OUTPUT); // Светодиод подключен к 1 пуну
  button1.attachClick(ClickFunction1);
  button2.attachClick(ClickFunction2);
}

void loop() {
  unsigned long now1 = millis();
  unsigned long now2 = millis();

  button1.tick();
  button2.tick();

  delay(10);

  if (nextAction1 == ACTION_OFF1) {
    // ничего не делать
    digitalWrite(1, LOW);
  } else if (nextAction1 == ACTION_ON1) {
    // Включить светодиод
    digitalWrite(1, HIGH);
  }
  else if (nextAction1 == ACTION_FAST1) {
    // Быстро моргать
    if (now1 % 200 < 100) { // Частота моргания
      digitalWrite(1, LOW);
    } else {
      digitalWrite(1, HIGH);
    } // if
  } // if

  if (nextAction2 == ACTION_OFF2) {
    // // Ничего неделать
    digitalWrite(2, LOW);
  } else if (nextAction2 == ACTION_ON2) {
    // Включить светодиод
    digitalWrite(2, HIGH);
  } else if (nextAction2 == ACTION_FAST2) {
    // Быстро моргать
    if (now2 % 200 < 100){ // Частота моргания
      digitalWrite(2, LOW);
    } else {
      digitalWrite(2, HIGH);
    } // if
  } // if
} //loop

void ClickFunction1() {
  if (nextAction1 == ACTION_OFF1) {
    nextAction1 = ACTION_ON1;
    nextAction1 = ACTION_FAST1;

  } else if (nextAction1 == ACTION_FAST1) {
    nextAction1 = ACTION_OFF1;
  } // if
} // ClickFunction1


void ClickFunction2() {
  if (nextAction2 == ACTION_OFF2) {
    nextAction2 = ACTION_ON2;
    nextAction2 = ACTION_FAST2;

  } else if (nextAction2 == ACTION_FAST2) {
    nextAction2 = ACTION_OFF2;
  } // if
} // ClickFunction2

 

b707
Онлайн
Зарегистрирован: 26.05.2017

не понял, как одной кнопкой выбирается аж три режима - ON, OFF и FAST ?

 

Zaur.
Offline
Зарегистрирован: 30.05.2020

Просто он без ON, OFF не будет выключатся 1 нажатием кнопки

b707
Онлайн
Зарегистрирован: 26.05.2017

не вижу, зачем вообще нужен режим ON , он полностью дублируется с FAST

вот так можно упростить (на примере одного светодиода) - в ЛУП оставить только режим FAST, режим OFF отрабатывать только в Click

void loop() {
  unsigned long now1 = millis();
  
  button1.tick();
  
  if (nextAction1 == ACTION_FAST1) {
    // Быстро моргать
    if (now1 % 200 < 100) { // Частота моргания
      digitalWrite(1, LOW);
    } else {
      digitalWrite(1, HIGH);
    } // if
  } // if

  
} //loop

void ClickFunction1() {
  if (nextAction1 == ACTION_OFF1) {
    nextAction1 = ACTION_FAST1;

  } else if (nextAction1 == ACTION_FAST1) {
    nextAction1 = ACTION_OFF1;
    digitalWrite(1, LOW);
  } // if
} // ClickFunction1

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Млять - вот какой-то му..жик сказал, что % - это целочисленное деление и все суют его в свои программы  как маньяк в целку. % - это в си остаток от деления! И нахера оно в этой программе я не понимаю.

Учите язык!

b707
Онлайн
Зарегистрирован: 26.05.2017

кстати. насчет enum с типами действий (Actions) - не нужно туда вносить отдельно действия для первого светодиода и отдельно для второго. enum - это тип данных, он должен быть общий. А различать действия для разных диодов вы будете, присваивая конкретное действие переменным nextAction1 и nextAction2

b707
Онлайн
Зарегистрирован: 26.05.2017

mykaida пишет:

Млять - вот какой-то му..жик сказал, что % - это целочисленное деление и все суют его в свои программы  как маньяк в целку. % - это в си остаток от деления! И нахера оно в этой программе я не понимаю.

Учите язык!

нормально тут все. имхо. Первую половину каждых 200мс светик горит, вторую выключен.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

b707 пишет:

нормально тут все. имхо. Первую половину каждых 200мс светик горит, вторую выключен.

И точно - чето затупил. Хотя тенденция % есть.

Zaur.
Offline
Зарегистрирован: 30.05.2020

Спасибо за упрощение! А проблему решить сможете?

b707
Онлайн
Зарегистрирован: 26.05.2017

Zaur. пишет:

Спасибо за упрощение! А проблему решить сможете?


у вас в коде я проблем не вижу. А кнопки как подключены? Подтяжка используется?

Zaur.
Offline
Зарегистрирован: 30.05.2020

Я использовал библеотеку OneButton, там я писал куда кнопка подключена, как будет нажиматься (Один раз, зажатие, двойное нажатие). Я использываю (одно нажатие) и всё.

А проблема такова: у каждого светодиода есть своя кнопка. Я нажимаю любую из кнопок и моргают все светодиоды. 

А я хочу чтобы каждый светодиод моргал со своей кнопки. Правый светодиод правой кнопкой, Левый светодиод левой.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Zaur. пишет:

Я использовал библеотеку OneButton, там я писал куда кнопка подключена, как будет нажиматься (Один раз, зажатие, двойное нажатие). Я использываю (одно нажатие) и всё.

А проблема такова: у каждого светодиода есть своя кнопка. Я нажимаю любую из кнопок и моргают все светодиоды. 

А я хочу чтобы каждый светодиод моргал со своей кнопки. Правый светодиод правой кнопкой, Левый светодиод левой.

Это как раз понятно. Вопрос про схему подключения. Нарисуйте - контроллер это вещь программно-аппаратная. Тут все нюансы важны.

Zaur.
Offline
Зарегистрирован: 30.05.2020

b707
Онлайн
Зарегистрирован: 26.05.2017

дел

Green
Offline
Зарегистрирован: 01.10.2015

Что то у нас одни поворотники в последнее время.) Люблю велосипедики.)

#define KEY_LEFT      2
#define KEY_RIGHT     3
#define LED_LEFT      4
#define LED_RIGHT     5
#define DEBOUNCE_TIME 30
#define BLINK_TIME    300

#define in(x)         pinMode(x, INPUT_PULLUP)
#define out(x)        pinMode(x, OUTPUT)
#define pin(x)        !digitalRead(x)
#define off(x)        digitalWrite(x, LOW)
#define toggle(x)     digitalWrite(x, !digitalRead(x))

bool left, right;
int timer;

void setup() {
  in(KEY_LEFT);
  in(KEY_RIGHT);
  off(LED_LEFT);  out(LED_LEFT);
  off(LED_RIGHT); out(LED_RIGHT);
  timer = 0;
}

void loop() {
  delay(1);
  char key = getKey();
  if (key == 1<<KEY_LEFT) {
    left = !left;
    right = false;
    setup();
  }
  if (key == 1<<KEY_RIGHT) {
    right = !right;
    left = false;
    setup();
  }

  if (left)
    blink(LED_LEFT);
  else if (right)
    blink(LED_RIGHT);
  else
    setup();

}

char getKey() {
  static char timer;
  static char old;
  char key = pin(KEY_LEFT)<<KEY_LEFT | pin(KEY_RIGHT)<<KEY_RIGHT;
  if (old != key) {
    old = key;
    timer = DEBOUNCE_TIME;
  }
  else if (timer && !--timer)
    return key;
  return 0;
}
 
void blink(char pin) {
  if (!timer)
    toggle(pin);
  if (++timer >= BLINK_TIME)
    timer = 0;
}

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Green пишет:

Что то у нас одни поворотники в последнее время.) Люблю велосипедики.)

Вот, гля, учитесь - никаких библиотек. Все ясно и понятно. 

Zaur.
Offline
Зарегистрирован: 30.05.2020

Я новичок мне простительно)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

Zaur. пишет:

Я новичок мне простительно)

Не простительно, поскольку Вы открыли тему в ветке "программирование", а не в "песочнице". Соответствуйте.