Скетч с диодом и кнопкой

VolcharaD
Offline
Зарегистрирован: 12.10.2022

Люди добрые, помогите пожалйста написать простой скетч. Вроде понимаю как включить лед по кнопке, и примерно понял скетч с плавным увеличением/уменьшением яркости. Но никак не могу написать скетч, чтобы при клике по кнопке лед плавно загарелся, и при следующем клике плавно потух

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

VolcharaD пишет:

Люди добрые, помогите пожалйста написать простой скетч. Вроде понимаю как включить лед по кнопке, и примерно понял скетч с плавным увеличением/уменьшением яркости. Но никак не могу написать скетч, чтобы при клике по кнопке лед плавно загарелся, и при следующем клике плавно потух

а что именно не получается?

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

Где скетч, хоть и не получившийся?

VolcharaD
Offline
Зарегистрирован: 12.10.2022

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

 

VolcharaD
Offline
Зарегистрирован: 12.10.2022

Сейчас вот в эту сторону копаю

 

#define PLUS_BUTTON   3
#define MINUS_BUTTON  4

int brightness = 0;
boolean plusUp = true;
boolean minusUp = true;
 
void setup() {
   pinMode(3, OUTPUT);
   pinMode(PLUS_BUTTON, INPUT_PULLUP);
   pinMode(MINUS_BUTTON, INPUT_PULLUP);
}
 
void loop() {
   analogWrite(9, brightness);
  
   plusUp = handleClick(PLUS_BUTTON, plusUp, +20);
   minusUp = handleClick(MINUS_BUTTON, minusUp, -20);
}

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;
}

 

 

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

Нужно разбить задачу на несколько подзадач. Для начала сделать функцию, которая будет плавно зажигать или гасить светодиод. 

Потом нужно разбираться с кнопками. Примерно так:

Вводятся два флага - bool ledUp, ledDown, каждая кнопка отвечает за своей флаг, при клике поднимает его (присваивает true). Функция, отвечающая за светодиод следит за этими флагами и если они не равны false, зажигает или гасит светодиод. В конце цикла сбрасывает флаги (присваивает им false). Как-то так

VolcharaD
Offline
Зарегистрирован: 12.10.2022

Предыдущий скетч выглядел примерно так

 

const int LED=9;
const int BUTTON=3;

void setup() {
  pinMode (BUTTON, INPUT);
  pinMode (LED, OUTPUT);
}

void loop() {
  for (int i=0; i<256; i=i+1)
  if (digitalRead(BUTTON == HIGH))
   {
    analogWrite(LED, i);
    delay(10);
  }
  
  else 
  for (int i=255; i>=0; i=i-1)
  {
    analogWrite (LED, i);
  delay(10);
}}

 

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

две функции уже есть void LedUp() строки 10-15 и void LedDown() 18-21

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

ua6em пишет:

две функции уже есть void LedUp() строки 10-15 и void LedDown() 18-21

Это неправильное решение, при нем пока изменяется яркость, а это более 2.5 с, скетч не будет реагировать на кнопки.

И, самое главное, это даже не будет первым шагом в правильном направлении, т.к. для того, чтобы передалать скетч из типа "delay" в тип "millis" его нужно переписывать с нуля (т.е. в нем невозможно использовать те функции, которые уже якобы есть).

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

v258 пишет:

Нужно разбить задачу на несколько подзадач. Для начала сделать функцию, которая будет плавно зажигать или гасить светодиод. 

Потом нужно разбираться с кнопками. Примерно так:

Вводятся два флага - bool ledUp, ledDown, каждая кнопка отвечает за своей флаг, при клике поднимает его (присваивает true). Функция, отвечающая за светодиод следит за этими флагами и если они не равны false, зажигает или гасит светодиод. В конце цикла сбрасывает флаги (присваивает им false). Как-то так

Два флага - это как бы избыточно. Тем более, что не исключен вариант конфликта между ними.

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

Лучше применить конечный автомат с 4-мя состояниями:

- светодиод выключен,

- светодиод загорается,

- светодиод горит,

- светодиод тухнет.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

andriano пишет:

Лучше применить конечный автомат с 4-мя состояниями:

- светодиод выключен,

- светодиод загорается,

- светодиод горит,

- светодиод тухнет.

Жди вопрос - А где тут кнопки? ))

VolcharaD
Offline
Зарегистрирован: 12.10.2022

Поскольку только начинаю осваивать - всё вышесказанное для меня прозвучало как китайская грамота)

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

andriano пишет:

ua6em пишет:

две функции уже есть void LedUp() строки 10-15 и void LedDown() 18-21

Это неправильное решение, при нем пока изменяется яркость, а это более 2.5 с, скетч не будет реагировать на кнопки.

И, самое главное, это даже не будет первым шагом в правильном направлении, т.к. для того, чтобы передалать скетч из типа "delay" в тип "millis" его нужно переписывать с нуля (т.е. в нем невозможно использовать те функции, которые уже якобы есть).

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

VolcharaD
Offline
Зарегистрирован: 12.10.2022

Ну пока что гугл оказался полезнее и информативнее

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

andriano пишет:

Два флага - это как бы избыточно. Тем более, что не исключен вариант конфликта между ними.

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

Флаги определяют текущее направление. Хотя, можно сделать и один, типа int8_t и задавать там дельту - плюс будет означать включение, минус - выключение. Заодно и скорость изменения яркости. А текущее состояние все равно должно быть в какой-то переменной - к чему-то же дельту прибавлять/отнимать нужно. 

andriano пишет:

Лучше применить конечный автомат с 4-мя состояниями:

- светодиод выключен,

- светодиод загорается,

- светодиод горит,

- светодиод тухнет.

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

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

VolcharaD пишет:

Ну пока что гугл оказался полезнее и информативнее

Теперь понял, у каво надо спрашивать в первую очередь?

VolcharaD
Offline
Зарегистрирован: 12.10.2022

v258 пишет:

andriano пишет:

Два флага - это как бы избыточно. Тем более, что не исключен вариант конфликта между ними.

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

Флаги определяют текущее направление. Хотя, можно сделать и один, типа int8_t и задавать там дельту - плюс будет означать включение, минус - выключение. Заодно и скорость изменения яркости. А текущее состояние все равно должно быть в какой-то переменной - к чему-то же дельту прибавлять/отнимать нужно. 

andriano пишет:

Лучше применить конечный автомат с 4-мя состояниями:

- светодиод выключен,

- светодиод загорается,

- светодиод горит,

- светодиод тухнет.

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

Спасибо большое, самые полезные ответы, теперь хоть приблизительно понимаю по каким командам информацию искать, как (если) доделаю скину сюда на оценку))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Желательно в пятницу, ближе к вечеру скидывать.

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

Во, блин! Программа 10 строк. Из них 4 в лупе. Автоматы бл...

#define PIN_LED 9
#define PIN_B 3

bool dir;
byte nn=128;

void setup() {
  pinMode( PIN_LED, OUTPUT);
  pinMode( PIN_B, INPUT_PULLUP);
}

void loop() {
  if (digitalRead(PIN_B) == 0)   {delay(50); while(digitalRead(PIN_B) == 0);  dir = !dir;}; //При отпускании кнопки
  if (dir) { if (nn < 255) nn++; } else if (nn > 0) nn--;
  analogWrite(PIN_LED, nn);
  delay(20);
}

Направление меняется по отпусканию кнопки. Мне так больше нравиться. Менять направление можно в любой момент, даже если не зажглось до конца, повторное нажатие будет гасить.

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

BOOM пишет:

Желательно в пятницу, ближе к вечеру скидывать.

на пятницу я одну тему хочу дохоливарить )))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

ua6em пишет:

BOOM пишет:

Желательно в пятницу, ближе к вечеру скидывать.

на пятницу я одну тему хочу дохоливарить )))

Какую именно пятницу?))

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

VolcharaD пишет:

Поскольку только начинаю осваивать - всё вышесказанное для меня прозвучало как китайская грамота)

Тогда, возможно, прежде, чем писать на форум, следовало почитать учебник?

Morroc
Offline
Зарегистрирован: 24.10.2016

VolcharaD пишет:

Ну пока что гугл оказался полезнее и информативнее

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