Скетч с диодом и кнопкой
- Войдите на сайт для отправки комментариев
Ср, 12/10/2022 - 12:40
Люди добрые, помогите пожалйста написать простой скетч. Вроде понимаю как включить лед по кнопке, и примерно понял скетч с плавным увеличением/уменьшением яркости. Но никак не могу написать скетч, чтобы при клике по кнопке лед плавно загарелся, и при следующем клике плавно потух
Люди добрые, помогите пожалйста написать простой скетч. Вроде понимаю как включить лед по кнопке, и примерно понял скетч с плавным увеличением/уменьшением яркости. Но никак не могу написать скетч, чтобы при клике по кнопке лед плавно загарелся, и при следующем клике плавно потух
а что именно не получается?
Где скетч, хоть и не получившийся?
самое близкое что мне удалось собрать - по нажатию кнопки лед начал постпенно загараться и гаснуть без остановки. а мне нужно чтобы он плавно загарелся и продолжил гореть, пока не нажму кнопку еще раз, чтобы он плавно погас. Не получается сам скетч сформулировать. Ардуино только начинаю осваивать, поэтому для меня такое сочетание - дремучий лес
Сейчас вот в эту сторону копаю
#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; }Нужно разбить задачу на несколько подзадач. Для начала сделать функцию, которая будет плавно зажигать или гасить светодиод.
Потом нужно разбираться с кнопками. Примерно так:
Вводятся два флага - bool ledUp, ledDown, каждая кнопка отвечает за своей флаг, при клике поднимает его (присваивает true). Функция, отвечающая за светодиод следит за этими флагами и если они не равны false, зажигает или гасит светодиод. В конце цикла сбрасывает флаги (присваивает им false). Как-то так
Предыдущий скетч выглядел примерно так
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); }}две функции уже есть void LedUp() строки 10-15 и void LedDown() 18-21
две функции уже есть void LedUp() строки 10-15 и void LedDown() 18-21
И, самое главное, это даже не будет первым шагом в правильном направлении, т.к. для того, чтобы передалать скетч из типа "delay" в тип "millis" его нужно переписывать с нуля (т.е. в нем невозможно использовать те функции, которые уже якобы есть).
Нужно разбить задачу на несколько подзадач. Для начала сделать функцию, которая будет плавно зажигать или гасить светодиод.
Потом нужно разбираться с кнопками. Примерно так:
Вводятся два флага - bool ledUp, ledDown, каждая кнопка отвечает за своей флаг, при клике поднимает его (присваивает true). Функция, отвечающая за светодиод следит за этими флагами и если они не равны false, зажигает или гасит светодиод. В конце цикла сбрасывает флаги (присваивает им false). Как-то так
Кроме того, при сброшенных флагах теряется информация о том, в каком состоянии мы оставили светодиод. И, скажем, при попытка повторно включить уже включенный он будет резко сбрасываться в 0, после чего плавно разгораться, что, как мне кажется, не соответствует условиям задачи.
Лучше применить конечный автомат с 4-мя состояниями:
- светодиод выключен,
- светодиод загорается,
- светодиод горит,
- светодиод тухнет.
Лучше применить конечный автомат с 4-мя состояниями:
- светодиод выключен,
- светодиод загорается,
- светодиод горит,
- светодиод тухнет.
Жди вопрос - А где тут кнопки? ))
Поскольку только начинаю осваивать - всё вышесказанное для меня прозвучало как китайская грамота)
две функции уже есть void LedUp() строки 10-15 и void LedDown() 18-21
И, самое главное, это даже не будет первым шагом в правильном направлении, т.к. для того, чтобы передалать скетч из типа "delay" в тип "millis" его нужно переписывать с нуля (т.е. в нем невозможно использовать те функции, которые уже якобы есть).
пусть учится разбивать на подзадачи хотя бы, а то видишь - китайская грамота "иэсансыулютипатюши"
Ну пока что гугл оказался полезнее и информативнее
Два флага - это как бы избыточно. Тем более, что не исключен вариант конфликта между ними.
Кроме того, при сброшенных флагах теряется информация о том, в каком состоянии мы оставили светодиод. И, скажем, при попытка повторно включить уже включенный он будет резко сбрасываться в 0, после чего плавно разгораться, что, как мне кажется, не соответствует условиям задачи.
Флаги определяют текущее направление. Хотя, можно сделать и один, типа int8_t и задавать там дельту - плюс будет означать включение, минус - выключение. Заодно и скорость изменения яркости. А текущее состояние все равно должно быть в какой-то переменной - к чему-то же дельту прибавлять/отнимать нужно.
Лучше применить конечный автомат с 4-мя состояниями:
- светодиод выключен,
- светодиод загорается,
- светодиод горит,
- светодиод тухнет.
Что бы там ни говорили злые языки, но конечный автомат точно так же должен опрашивать кнопки и точно так же должен иметь функцию включения/выключения. Т.е. все ровно то же самое )))
Ну пока что гугл оказался полезнее и информативнее
Теперь понял, у каво надо спрашивать в первую очередь?
Два флага - это как бы избыточно. Тем более, что не исключен вариант конфликта между ними.
Кроме того, при сброшенных флагах теряется информация о том, в каком состоянии мы оставили светодиод. И, скажем, при попытка повторно включить уже включенный он будет резко сбрасываться в 0, после чего плавно разгораться, что, как мне кажется, не соответствует условиям задачи.
Флаги определяют текущее направление. Хотя, можно сделать и один, типа int8_t и задавать там дельту - плюс будет означать включение, минус - выключение. Заодно и скорость изменения яркости. А текущее состояние все равно должно быть в какой-то переменной - к чему-то же дельту прибавлять/отнимать нужно.
Лучше применить конечный автомат с 4-мя состояниями:
- светодиод выключен,
- светодиод загорается,
- светодиод горит,
- светодиод тухнет.
Что бы там ни говорили злые языки, но конечный автомат точно так же должен опрашивать кнопки и точно так же должен иметь функцию включения/выключения. Т.е. все ровно то же самое )))
Спасибо большое, самые полезные ответы, теперь хоть приблизительно понимаю по каким командам информацию искать, как (если) доделаю скину сюда на оценку))
Желательно в пятницу, ближе к вечеру скидывать.
Во, блин! Программа 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); }Направление меняется по отпусканию кнопки. Мне так больше нравиться. Менять направление можно в любой момент, даже если не зажглось до конца, повторное нажатие будет гасить.
Желательно в пятницу, ближе к вечеру скидывать.
на пятницу я одну тему хочу дохоливарить )))
Желательно в пятницу, ближе к вечеру скидывать.
на пятницу я одну тему хочу дохоливарить )))
Какую именно пятницу?))
Поскольку только начинаю осваивать - всё вышесказанное для меня прозвучало как китайская грамота)
Ну пока что гугл оказался полезнее и информативнее
Наверное это тоже путь, но если бы вы доперли сами - для развития навыка программирования это было бы полезнее. Понимание чужого кода из интернета, увы, дает куда меньше - это как ответ в конце учебника подсмотреть.