Поворотник для велика, на Digispark ATtiny85
- Войдите на сайт для отправки комментариев
Сб, 30/05/2020 - 14:06
Всем здарова! Хотел сделать поворотники для велика, на 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
не понял, как одной кнопкой выбирается аж три режима - ON, OFF и FAST ?
Просто он без ON, OFF не будет выключатся 1 нажатием кнопки
не вижу, зачем вообще нужен режим 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Млять - вот какой-то му..жик сказал, что % - это целочисленное деление и все суют его в свои программы как маньяк в целку. % - это в си остаток от деления! И нахера оно в этой программе я не понимаю.
Учите язык!
кстати. насчет enum с типами действий (Actions) - не нужно туда вносить отдельно действия для первого светодиода и отдельно для второго. enum - это тип данных, он должен быть общий. А различать действия для разных диодов вы будете, присваивая конкретное действие переменным nextAction1 и nextAction2
Млять - вот какой-то му..жик сказал, что % - это целочисленное деление и все суют его в свои программы как маньяк в целку. % - это в си остаток от деления! И нахера оно в этой программе я не понимаю.
Учите язык!
нормально тут все. имхо. Первую половину каждых 200мс светик горит, вторую выключен.
нормально тут все. имхо. Первую половину каждых 200мс светик горит, вторую выключен.
И точно - чето затупил. Хотя тенденция % есть.
Спасибо за упрощение! А проблему решить сможете?
Спасибо за упрощение! А проблему решить сможете?
у вас в коде я проблем не вижу. А кнопки как подключены? Подтяжка используется?
Я использовал библеотеку OneButton, там я писал куда кнопка подключена, как будет нажиматься (Один раз, зажатие, двойное нажатие). Я использываю (одно нажатие) и всё.
А проблема такова: у каждого светодиода есть своя кнопка. Я нажимаю любую из кнопок и моргают все светодиоды.
А я хочу чтобы каждый светодиод моргал со своей кнопки. Правый светодиод правой кнопкой, Левый светодиод левой.
Я использовал библеотеку OneButton, там я писал куда кнопка подключена, как будет нажиматься (Один раз, зажатие, двойное нажатие). Я использываю (одно нажатие) и всё.
А проблема такова: у каждого светодиода есть своя кнопка. Я нажимаю любую из кнопок и моргают все светодиоды.
А я хочу чтобы каждый светодиод моргал со своей кнопки. Правый светодиод правой кнопкой, Левый светодиод левой.
Это как раз понятно. Вопрос про схему подключения. Нарисуйте - контроллер это вещь программно-аппаратная. Тут все нюансы важны.
дел
Что то у нас одни поворотники в последнее время.) Люблю велосипедики.)
#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; }Что то у нас одни поворотники в последнее время.) Люблю велосипедики.)
Вот, гля, учитесь - никаких библиотек. Все ясно и понятно.
Я новичок мне простительно)
Я новичок мне простительно)
Не простительно, поскольку Вы открыли тему в ветке "программирование", а не в "песочнице". Соответствуйте.