0 / 0 / 0
Регистрация: 21.04.2020
Сообщений: 18
1

Мигание светодиодом от кнопки чаще

25.01.2023, 12:51. Показов 239. Ответов 6
Метки нет (Все метки)

Здравствуйте!
Я только знакомлюсь с Ардуино. Стоит задание сделать программу, чтобы светодиод мигал при каждом нажатии кнопки быстрее.
У меня появилась только такая идея:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int button = 2;
int led = 13;
void setup() {
pinMode(led, OUTPUT);
pinMode(button, INPUT);      
}
void loop(){
if (digitalRead(button) == HIGH) {
  digitalWrite(led, HIGH);   
  delay(2000);              
  digitalWrite(led, LOW);    
  delay(2000);
}
else {
 digitalWrite(led, HIGH);   
  delay(400);              
  digitalWrite(led, LOW);    
  delay(400);
}
}
Но это не полностью отвечает требованиям. Мне кажется, что тут нужен какой-либо цикл, но я не могу понять, как его выполнить. Может кто-нибудь подсказать?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2023, 12:51
Ответы с готовыми решениями:

Мигание светодиодом(ми)
и так... начитался я всякой всячины, насмотрелся видео на сайтах и захотелось чего то большего......

Плавное мигание светодиодом
Здравствуйте! Необходимо написать программу, чтобы плавно зажигать светодиод в течение двух секунд,...

Мигание светодиодом на ATMega8515 (Proteus)
Доброго времени дня. Подскажите, как реализовать мигание светодиодом определенное количество раз?...

ATmega128. Мигание светодиодом через таймер0
Добрый вечер, столкнулся с тупиком. Суть задания- на лабораторном стенде атмега128 организовать...

6
Эксперт .NET
8890 / 5666 / 1350
Регистрация: 25.05.2015
Сообщений: 17,212
Записей в блоге: 14
25.01.2023, 13:35 2
Один цикл, типа этого.
Задержка сама - переменная, меняющаяся при нажатой или отпущеной кнопке.
1
492 / 387 / 185
Регистрация: 08.04.2013
Сообщений: 1,684
25.01.2023, 14:04 3
Если не учитывать задержки от delay() лучше уж прерывания использовать и использовать millis()
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int button = 2;
int led = 13;
int tDel = 100;
 
void setup() {
  pinMode(led, OUTPUT);
  pinMode(button, INPUT_PULLUP);
}
 
void loop(){
 
if (digitalRead(button) == HIGH) { tDel+= 20;}
 
digitalWrite(led, HIGH);
delay(tDel);
digitalWrite(led, LOW);
delay(tDel);
 
}
Добавлено через 5 минут
и менять interval
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void loop() {
  // выясняем не настал ли момент сменить состояние светодиода
 
  unsigned long currentMillis = millis(); // текущее время в миллисекундах
 
  if(currentMillis - previousMillis > interval) {
    // сохраняем последний момент, когда менялось состояние светодиода
    previousMillis = currentMillis;
 
    // изменяем состояние светодиода на противоположное
    if(ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
    // устанавливаем высокий или низкий уровень напряжения на выходе
    // основываясь на значении переменной ledState
    digitalWrite(ledPin, ledState);
  }
}
Добавлено через 18 минут
Если хочется играть с кнопками дирзайте (это без кнопок)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
int button = 2;
int ledPin = 13;
int ledState = LOW; // состояние светодиода: ВКЛ/ВЫКЛ
long previousMillis = 0; // время, когда состояние светодиода обновлялось
long interval = 1000;
long previousMillisT = 0; 
long intervalT = 2000;
 
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(button, INPUT_PULLUP);
}
 
void loop() {
 
 unsigned long currentMillis = millis(); // текущее время в миллисекундах
 
  if(currentMillis - previousMillisT > intervalT) {
    previousMillisT = currentMillis;
    interval-=50;
    if (interval<=50) interval=1000;
 
  }
 
  if(currentMillis - previousMillis > interval) {
     previousMillis = currentMillis;
 
    // изменяем состояние светодиода на противоположное
    if(ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
    // устанавливаем высокий или низкий уровень напряжения на выходе
    // основываясь на значении переменной ledState
    digitalWrite(ledPin, ledState);
  }
}
1
0 / 0 / 0
Регистрация: 21.04.2020
Сообщений: 18
25.01.2023, 14:54  [ТС] 4
Вот такое вот сделала:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int button = 2;
int led = 13;
void setup() {
pinMode(led, OUTPUT);
pinMode(button, INPUT);
}
void loop(){
if (digitalRead(button) == HIGH) {
digitalWrite(led, HIGH);
delay(2000);
digitalWrite(led, LOW);
delay(2000);
}
else{
  for (int i=1; i<100; i++) {
digitalWrite(led, HIGH);
delay(1000/i);
digitalWrite(led, LOW);
delay(1000/i);
}
}
}
Теперь частота меняется, но при одном нажатии кнопки. Не могу понять никак, как так сделать, чтоб при одном нажатии была одна частота (1 сек, например), при втором нажатии чаще (пусть в 2 раза), и так дальше учащалось от нажатия? Не подскажете?
0
492 / 387 / 185
Регистрация: 08.04.2013
Сообщений: 1,684
25.01.2023, 17:13 5
Вы не внимательны, ищите в чем разница между вашим и моим кодом, и делайте выводы, если не поняли читайте, что значит дребезг, зачем INPUT_PULLUP и как понять if (digitalRead(button) == HIGH) { tDel-= 20;} Что происходит когда работает delay(), и почему при нажатии кнопка (не)реагирует как надо
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int button = 2;
int led = 13;
int tDel = 2000;
 
void setup() {
  pinMode(led, OUTPUT);
  pinMode(button, INPUT_PULLUP);
}
void loop(){
if (digitalRead(button) == HIGH) { tDel-= 20;}
 
digitalWrite(led, HIGH);
delay(tDel);
digitalWrite(led, LOW);
delay(tDel);
 
}
0
0 / 0 / 0
Регистрация: 21.04.2020
Сообщений: 18
25.01.2023, 17:15  [ТС] 6
Хорошо, попробую разобраться. Спасибо.
0
492 / 387 / 185
Регистрация: 08.04.2013
Сообщений: 1,684
25.01.2023, 18:00 7
Цитата Сообщение от marat_miaki Посмотреть сообщение
if (digitalRead(button) == HIGH) { tDel-= 20;}
я мог ошибиться точнее надо
C++
1
if (digitalRead(button) == LOW)
при использовании pinMode(button, INPUT_PULLUP);

Добавлено через 43 минуты
В общем вот вам код, который более менее реагирует на кнопки ( разовое нажатие) без delay() можете значения по сом порту смотреть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
int button = 2;
int ledPin = 13;
int ledState = LOW; // состояние светодиода: ВКЛ/ВЫКЛ
long previousMillis = 0; // время, когда состояние светодиода обновлялось
long interval = 1000;
 
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(button, INPUT_PULLUP);
  Serial.begin(9600);
}
bool flag = false;  // Для отработки нажатия 
void loop() {
  // читаем инвертированное значение для удобства
  bool btnState = !digitalRead(button);
  if (btnState && !flag) {  // обработчик нажатия
    flag = true;
    interval-= 100;
    if (interval<=0) interval=1000;
    Serial.println(interval);
  }
  if (!btnState && flag) {  // обработчик отпускания
    flag = false;  
  }
 
  unsigned long currentMillis = millis(); // текущее время в миллисекундах
  if(currentMillis - previousMillis > interval) {
     previousMillis = currentMillis;
    // изменяем состояние светодиода на противоположное
    if(ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;
    // устанавливаем высокий или низкий уровень напряжения на выходе
    // основываясь на значении переменной ledState
    digitalWrite(ledPin, ledState);
  }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.01.2023, 18:00
Помогаю со студенческими работами здесь

Мигание светодиодом на PIC. Организация задержки
объясните пожалуйста как сформировать чередующуюся еденицу и нолик длительностью 1(2) секунды, при...

Управление светодиодом от кнопки (VMLab)
Здравствуйте. С программе VMLab нужно смоделировать мигание светодиода с кнопкой. Кнопка нажата -...

Управление светодиодом при нажатии кнопки
Доброго времени суток всем. В универе поставили задачу: запрограммировать МК mcs8051. Нужно...

Управление светодиодом по нажатию кнопки (ATMega32, ASM, Proteus)
Работаю в AVR, через Протеус схему сделал и микроконтроллером. Проблема в том, что сначало диод...

Постоянное мигание (раз в секунду, а то и чаще) светодиода HDD
Проблема такая: Постоянно мигает светодиод занятости жесткого диска, раз в секунду и чаще даже...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru