Обсуждаем приемники, передатчики, радиомикрофоны, жучки, генераторы, ВЧ-усилители, антенны и прочее радиохозяйство
Ответить

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

Вт дек 08, 2020 23:04:15

Хочу запрограмировать ардуино нано, так чтобы скетч по управлению простой белой 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() {
//----------
// нажали (с антидребезгом)
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();
}
//----------
}
//---------- КНОПОК-------------------------

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

Ср дек 09, 2020 09:41:27

Схему нарисуй.

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

Ср дек 09, 2020 11:39:54

Изображение
Вот схема управления с постоянным током через мосфет ключ
Мосфет подключаю к ардуино к 3 цифровому пину и заземляю его а ленту питаю от 12 вольт белая, минусом через мосфет открываю его, кнопку подключаю ко 2 пину так как там стоит резистор на сопративление 20кОм и заземляю ее туда же на цифровом порту GND

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

Ср дек 09, 2020 12:05:11

Ой, нагородили то функций. А что конкретно нужно я так и не понял.
Переключать между какими режимами?

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

Ср дек 09, 2020 12:07:53

Ардуина для чего?

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

Ср дек 09, 2020 14:26:00

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

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

Чт дек 10, 2020 07:36:43

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

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 вполне

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

Чт дек 10, 2020 08:59:30

Рязанцев Владислав спасибо большое, щас буду пробовать как все сделаю отпишусь.

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

Чт дек 10, 2020 10:41:04

Достаточно ограничиться стандартной процедурой обработки кнопки с последующей обработкой указателя на функцию, значение которого меняется после обработки текущего нажатия.
8)

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

Ср дек 16, 2020 17:54:57

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

Вангую, что следующий вопрос будет "почему кнопка срабатывает не всегда или ее приходится держать нажатой долго ?"

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

Ср дек 16, 2020 18:54:06

"почему кнопка срабатывает не всегда или ее приходится держать нажатой долго ?"

Не чаще чем раз в секунду) Ну лень мне было антидребезг нормальный писать. Да и там, как и тут если малые значения поставить, при обычном нажатии может пару раз прибавить.
Ответить