Переключение режимов одной кнопкой на ардуино Nano

Обсуждаем приемники, передатчики, радиомикрофоны, жучки, генераторы, ВЧ-усилители, антенны и прочее радиохозяйство
Ответить
Родился
Сообщения: 4
Зарегистрирован: Вт дек 08, 2020 22:33:15

Сообщение virtum007 »

Хочу запрограмировать ардуино нано, так чтобы скетч по управлению простой белой led лентой мог переключаться от одной кнопки тактовой 4х контактной , своего рода переход от одного режима к другому, перерыл очень много инфы, но ничего не нашел дельного. Кроме как плавное управление яркостью и кнопкой а как соединить все в один скетч не понимаю

// пин управления
#define LED_WHITE_PIN 11

void setup() {
// устанавливаем пин в режим выхода
pinMode(LED_WHITE_PIN, LOW);
}

void loop() {
// устанавливаем яркость ленты от минимальной до максимальной
for (int brightness = 0; brightness < 255; brightness++) {
analogWrite(LED_WHITE_PIN, brightness);
delay(5);
}
// устанавливаем яркость ленты от максимальной до минимальной
for (int brightness = 255; brightness >= 0; brightness--) {
analogWrite(LED_WHITE_PIN, brightness);
delay(5);
}
}




И управление кнопкой button_press_modes
/*
Отработка нажатия кнопки: нажатие, двойное нажатие, удержание.
Логика работы:
нажали (с антидребезгом)
если отпустили до hold, считать отпущенной
если удерживаем больше hold, считать зажатой
если отпустили и прошло больше double_timer, считать 1 нажатием
если отпустили и прошло меньше double_timer и нажали снова, считать что нажата 2 раз
если была нажата 2 раз и отпущена, считать что была нажата 2 раза

Я специально вывел отдельные флажки, которые нужно опускать каждый раз после отработки нажатия.
Это сделано для того, чтобы пользоваться разными режимами нажатия абсолютно в любом месте программы
*/

#define button1B 3 // пин кнопки button1

boolean button1S; // храним состояния кнопок (S - State)
boolean button1F; // флажки кнопок (F - Flag)
boolean button1R; // флажки кнопок на отпускание (R - Release)
boolean button1P; // флажки кнопок на нажатие (P - Press)
boolean button1H; // флажки кнопок на удержание (многократный вызов) (H - Hold)
boolean button1HO; // флажки кнопок на удержание (один вызов при нажатии) (HO - Hold Once)
boolean button1D; // флажки кнопок на двойное нажатие (D - Double)
boolean button1DP; // флажки кнопок на двойное нажатие и отпускание (D - Double Pressed)

#define double_timer 100 // время (мс), отведённое на второе нажатие
#define hold 500 // время (мс), после которого кнопка считается зажатой
#define debounce 80 // (мс), антидребезг
unsigned long button1_timer; // таймер последнего нажатия кнопки
unsigned long button1_double; // таймер двойного нажатия кнопки

void setup() {
Serial.begin(9600);
pinMode(button1B, INPUT_PULLUP);
}

void loop() {
//-------опрос кнопок--------
button1S = !digitalRead(button1B);
buttons(); //отработка кнопок
//-------опрос кнопок--------

// отработка режимов (опускание флага обязательно!)
if (button1P) {
Serial.println("pressed");
button1P = 0;
}
if (button1D) {
Serial.println("double");
button1D = 0;
}
if (button1H && button1HO) {
Serial.println("hold once");
button1HO = 0;
}
/*
if (button1H) {
Serial.println("hold");
button1H = 0;
}
*/
}

//------------------------ОТРАБОТКА КНОПОК-------------------------
void buttons() {
//-------------------------button1--------------------------
// нажали (с антидребезгом)
if (button1S && !button1F && millis() - button1_timer > debounce) {
button1F = 1;
button1HO = 1;
button1_timer = millis();
}
// если отпустили до hold, считать отпущенной
if (!button1S && button1F && !button1R && !button1DP && millis() - button1_timer < hold) {
button1R = 1;
button1F = 0;
button1_double = millis();
}
// если отпустили и прошло больше double_timer, считать 1 нажатием
if (button1R && !button1DP && millis() - button1_double > double_timer) {
button1R = 0;
button1P = 1;
}
// если отпустили и прошло меньше double_timer и нажата снова, считать что нажата 2 раз
if (button1F && !button1DP && button1R && millis() - button1_double < double_timer) {
button1F = 0;
button1R = 0;
button1DP = 1;
}
// если была нажата 2 раз и отпущена, считать что была нажата 2 раза
if (button1DP && millis() - button1_timer < hold) {
button1DP = 0;
button1D = 1;
button1_timer = millis();
}
// Если удерживается более hold, то считать удержанием
if (button1F && !button1D && !button1H && millis() - button1_timer > hold) {
button1H = 1;
}
// Если отпущена после hold, то считать, что была удержана
if (!button1S && button1F && millis() - button1_timer > hold) {
button1F = 0;
button1H = 0;
button1_timer = millis();
}
//-------------------------button1--------------------------
}
//------------------------ОТРАБОТКА КНОПОК-------------------------
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Схему нарисуй.
Docendo discimus
Контактная информация:
Реклама
Родился
Сообщения: 4
Зарегистрирован: Вт дек 08, 2020 22:33:15

Сообщение virtum007 »

Изображение
Вот схема управления с постоянным током через мосфет ключ
Мосфет подключаю к ардуино к 3 цифровому пину и заземляю его а ленту питаю от 12 вольт белая, минусом через мосфет открываю его, кнопку подключаю ко 2 пину так как там стоит резистор на сопративление 20кОм и заземляю ее туда же на цифровом порту GND
Аватара пользователя
Сообщения: 1781
Зарегистрирован: Пн июн 24, 2013 23:00:42
Откуда: Казахстан

Сообщение Рязанцев Владислав »

Ой, нагородили то функций. А что конкретно нужно я так и не понял.
Переключать между какими режимами?
Изображение
Ваши хотелки за ваши деньги
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Ардуина для чего?
Docendo discimus
Контактная информация:
Реклама
Родился
Сообщения: 4
Зарегистрирован: Вт дек 08, 2020 22:33:15

Сообщение virtum007 »

Ардуина должна управлять яркостью led ленты, я хочу чтобы были зацикленные процессы по управлению яркостью, например
1 Просто свтетит лента без изменений Цикл
2 Плавно гаснет и плавно зажигается Цикл
3 Имеет эффект Стробо, и так далее но все это должно быть привязано к тактовой кнопке при нажатии на которую я мог переключаться поочередно от цикла к циклу 1,2,3-ий и т.д как гирлянда но только белая))
Буду очень благодарен, за помощь.
Данный проект будет использоватся в коммерческих целях, отблагодарю донатом как пойдут продажи!)
Koshkin_victor21@mail.ru моя почта
Реклама
Аватара пользователя
Сообщения: 1781
Зарегистрирован: Пн июн 24, 2013 23:00:42
Откуда: Казахстан

Сообщение Рязанцев Владислав »

Создаете переменную

int Program;

дальше

Если нажата кнопка, увеличить число

Код: Выделить всё

if(!digitalRead(2)) 
{Program+=1;
delay(1000);}

Счет ограничиваем от 0 до 2

Код: Выделить всё

if(Program>=3)
{Program=0;}

Код: Выделить всё

switch (Program) {

    case 0: 
то что делает по умолчанию
      break;
    case 1:   
вторая программа
      break;
    case 2:   
третья программа
      break;
  }
Вывод 2 кнопка, подтянуть к плюсу, нажатие по минусу.

Добавлено after 4 minutes 10 seconds:
А вообще ардуины много будет, хватит Attiny13 вполне
Изображение
Ваши хотелки за ваши деньги
Родился
Сообщения: 4
Зарегистрирован: Вт дек 08, 2020 22:33:15

Сообщение virtum007 »

Рязанцев Владислав спасибо большое, щас буду пробовать как все сделаю отпишусь.
Друг Кота
Аватара пользователя
Сообщения: 15741
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Достаточно ограничиться стандартной процедурой обработки кнопки с последующей обработкой указателя на функцию, значение которого меняется после обработки текущего нажатия.
8)
Друг Кота
Сообщения: 19495
Зарегистрирован: Чт фев 20, 2014 18:57:55

Сообщение Morroc »

Боюсь когда автор сможет сознательно воспользоваться этим советом у него вопросов как в теме уже возникать не будет )

Вангую, что следующий вопрос будет "почему кнопка срабатывает не всегда или ее приходится держать нажатой долго ?"
"Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл /
"Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Аватара пользователя
Сообщения: 1781
Зарегистрирован: Пн июн 24, 2013 23:00:42
Откуда: Казахстан

Сообщение Рязанцев Владислав »

[uquote="Morroc",url="/forum/viewtopic.php?p=3942426#p3942426"]"почему кнопка срабатывает не всегда или ее приходится держать нажатой долго ?"[/uquote]
Не чаще чем раз в секунду) Ну лень мне было антидребезг нормальный писать. Да и там, как и тут если малые значения поставить, при обычном нажатии может пару раз прибавить.
Изображение
Ваши хотелки за ваши деньги
Ответить

Вернуться в «Радиотехника: приемники, передатчики, антенны»