Arduino UNO

IGOGUEST
Offline
Зарегистрирован: 14.12.2020

Цель: прописать еще одну кнопку по нажатию которой светодиод должен начать мигать с заданной ранее яркостью, с одинаковой частотой

1 #define PLUS_BUTTON_PIN 2
2 #define MINUS_BUTTON_PIN 3
3 #define LED_PIN 9
4 int brightness = 100;
5 boolean plusUp = true;
6 boolean minusUp = true;
7 int S = 35;
8 void setup()
9 {
10 pinMode(LED_PIN, OUTPUT);
11 pinMode(PLUS_BUTTON_PIN, INPUT_PULLUP);
12 pinMode(MINUS_BUTTON_PIN, INPUT_PULLUP);
13 }
14 void loop()
15 {
16 analogWrite(LED_PIN, brightness);
17 plusUp = handleClick(PLUS_BUTTON_PIN, plusUp, +S);
18 minusUp = handleClick(MINUS_BUTTON_PIN, minusUp, -S);
19}
20 boolean handleClick(int buttonPin, boolean wasUp, int delta)
21 {
22 boolean isUp = digitalRead(buttonPin);
23 if (wasUp && !isUp) {
24 delay(10);
25 isUp = digitalRead(buttonPin);
26 if (!isUp)
27 brightness = constrain(brightness + delta, 0, 255);
28 }
29 return isUp;
30}
Помогающим- заранее спасибо! ,Старожилы простите) надеюсь нормально вопрос задал на этот раз(3) ы)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

код ненормально вставил

nik182
Offline
Зарегистрирован: 04.05.2015
IGOGUEST
Offline
Зарегистрирован: 14.12.2020
 #define PLUS_BUTTON_PIN 2
 #define MINUS_BUTTON_PIN 3
 #define LED_PIN 9
 int brightness = 100;
 boolean plusUp = true;
 boolean minusUp = true;
 int S = 35;
 void setup()
 {
 pinMode(LED_PIN, OUTPUT);
 pinMode(PLUS_BUTTON_PIN, INPUT_PULLUP);
 pinMode(MINUS_BUTTON_PIN, INPUT_PULLUP);
 }
 void loop()
 {
 analogWrite(LED_PIN, brightness);
 plusUp = handleClick(PLUS_BUTTON_PIN, plusUp, +S);
 minusUp = handleClick(MINUS_BUTTON_PIN, minusUp, -S);
}
 boolean handleClick(int buttonPin, boolean wasUp, int delta)
 {
 boolean isUp = digitalRead(buttonPin);
 if (wasUp && !isUp) {
 delay(10);
 isUp = digitalRead(buttonPin);
 if (!isUp)
 brightness = constrain(brightness + delta, 0, 255);
 }
 return isUp;
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

Уно здесь не причём. Абсолютно одинаков вопрос длялюбой платы среды, даже ESP32. Вопрос надо формулировать по теме. Например: Расширение функционала кнопок. Или : Как добавить кнопку.  

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
#define NEW_BUTTON_PIN 4
 pinMode(NEW_BUTTON_PIN, INPUT_PULLUP);

ну и так далее

IGOGUEST
Offline
Зарегистрирован: 14.12.2020

Проблема не в создании новой кнопки, я не знаю как заставить светодиод моргать по её нажатию, что бы кусок отвечающий за моргание не конфликтовал с уже готовым куском кода

sadman41
Offline
Зарегистрирован: 19.10.2016

См. статью "blink без delay".

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

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

nik182
Offline
Зарегистрирован: 04.05.2015

IGOGUEST пишет:
Проблема не в создании новой кнопки, я не знаю как заставить светодиод моргать по её нажатию, что бы кусок отвечающий за моргание не конфликтовал с уже готовым куском кода

Вот уже ближе к смыслу вопроса. Так и надо было писать - как независимо моргать светодиодом.

Просто эта задача решается таймером деда Семёна. По нажатию кнопки запускается таймер и по его срабатыванию включается или выключается светодиод. Таймеров и кнопок может быть много. Все работают независимо друг от друга.

Дед! Подскажешь где его таймер взять?   

b707
Offline
Зарегистрирован: 26.05.2017

nik182 пишет:

Так и надо было писать - как независимо моргать светодиодом.

Просто эта задача решается таймером деда Семёна. По нажатию кнопки запускается таймер и по его срабатыванию включается или выключается светодиод. Таймеров и кнопок может быть много. Все работают независимо друг от друга.

Дед! Подскажешь где его таймер взять?   

вот уже несколько раз писал - ничего не имею против Деда и его Таймеров, но убежден, что каждый новичок должен хотя бы один раз написать блинк на миллисе сам. А таймер - для новичков это некий вид читерства. использовать таймеры надо разрешать тогда. когда миллисы уже освоены.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вот я тоже думаю, что наиболее конструктивен подход, изложенный в сообщениях №7, 8 и 10.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

ничего не имею против Деда и его Таймеров, но убежден, что каждый новичок должен хотя бы один раз написать блинк на миллисе сам. 

Полностью согласен

IGOGUEST
Offline
Зарегистрирован: 14.12.2020

код на мигание я писал раньше, но я не знаю как его включить в новый

#define PLUS_BUTTON_PIN     2
#define MINUS_BUTTON_PIN    3
#define LED_PIN             9
#define MIG_BUTTON_PIN      5
 
int brightness = 100;
boolean plusUp = true;
boolean minusUp = true;
int S = 35;
 
void setup()
{
  
  pinMode(LED_PIN, OUTPUT);
  pinMode(PLUS_BUTTON_PIN, INPUT_PULLUP);
  pinMode(MINUS_BUTTON_PIN, INPUT_PULLUP);
  pinMode(MIG_BUTTON_PIN, INPUT_PULLUP);
}
 
void loop()
{
   int buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH){
     miganie();
     digitalWrite(ledPin, HIGH);
    }
}
  void miganie(){
  for (int a =0; a <3; a++){
       digitalWrite(ledPin, HIGH);
       delay(100);
       digitalWrite(ledPin, LOW);
       delay(100);
  }
  }
  analogWrite(LED_PIN, brightness);
  plusUp = handleClick(PLUS_BUTTON_PIN, plusUp, +S);
  minusUp = handleClick(MINUS_BUTTON_PIN, minusUp, -S);
}
boolean handleClick(int buttonPin, boolean wasUp, int delta)
{
  boolean isUp = digitalRead(buttonPin);
  if (wasUp && !isUp) {
    delay(10);
    isUp = digitalRead(buttonPin);
     if (!isUp)    
      brightness = constrain(brightness + delta, 0, 255);
  }
  return isUp; 
}

 

IGOGUEST
Offline
Зарегистрирован: 14.12.2020

или вот без delay

#define PLUS_BUTTON_PIN     2
#define MINUS_BUTTON_PIN    3
#define LED_PIN             9
#define MIG_BUTTON_PIN      5
 
int brightness = 100;
boolean plusUp = true;
boolean minusUp = true;
int S = 35;
 
void setup()
{
  
  pinMode(LED_PIN, OUTPUT);
  pinMode(PLUS_BUTTON_PIN, INPUT_PULLUP);
  pinMode(MINUS_BUTTON_PIN, INPUT_PULLUP);
  pinMode(MIG_BUTTON_PIN, INPUT_PULLUP);
}
 
void loop()
{
  if (millis() - previousMillis > interval) {
    previousMillis = millis();   
    if (value == LOW)
      value = HIGH;
    else
      value = LOW;
    digitalWrite(ledPin, value);
  }
  
  analogWrite(LED_PIN, brightness);
  plusUp = handleClick(PLUS_BUTTON_PIN, plusUp, +S);
  minusUp = handleClick(MINUS_BUTTON_PIN, minusUp, -S);
}
boolean handleClick(int buttonPin, boolean wasUp, int delta)
{
  boolean isUp = digitalRead(buttonPin);
  if (wasUp && !isUp) {
    delay(10);
    isUp = digitalRead(buttonPin);
     if (!isUp)    
      brightness = constrain(brightness + delta, 0, 255);
  }
  return isUp; 
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

IGOGUEST пишет:
код на мигание я писал раньше, но я не знаю как его включить в новый

Ну, тут есть разные способы, в частности:

- узнать,

- придумать.