Button и светодиод

mgprog

✩✩✩✩✩✩✩
25 Май 2023
1
0
Добрый день, есть следующий код. Когда загорается светодиод нужно успеть нажать кнопку. Но что-то работает странно!
C++:
const int ledPin = 13;     
const int buttonPin = 2;   

volatile bool ledOn = false;   

void setup() {
  pinMode(ledPin, OUTPUT);       
  pinMode(buttonPin, INPUT_PULLUP);     

  Serial.begin(9600);
}

void loop() {
  if (!ledOn) {
    int randomDelay = random(1000, 5000);
    digitalWrite(ledPin, HIGH);
    delay(randomDelay);
    digitalWrite(ledPin, LOW);

    delay(randomDelay);
  }

  if (digitalRead(buttonPin) == HIGH) {
    Serial.println("Yes");
    delay(1000);
  }
}
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,181
1,278
Москва
Такое не делается с delay. Хотя.. если кнопку записать на прерывание и сделать аппаратный антидребезг, то должно работать.
Для срабатывания достаточно прост одержать кнопку нажатой. Т.е. ловить надо не высокий сигнал , а переход с низкого на высокий.
Пауза между изменением состояния светодиода тоже должна быть разной.
 
  • Лойс +1
Реакции: Intagan и mgprog

poty

★★★★★★✩
19 Фев 2020
2,986
894
@mgprog, как написали, так и работает. Пройдитесь по коду последовательно, строчка за строчкой, убедитесь в этом сами.
@Старик Похабыч, там логика отсутствует напрочь.
 

te238s

★★✩✩✩✩✩
14 Ноя 2021
375
94
Это просто опрос кнопки со случайной периодичностью 2-10 секунд.
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
539
132
что-то работает странно
Нормально работает. Включился на рандомное время, выключился, через рандомное время вывод в serial слова "Yes" если не нажата кнопка, а если нажата, то ничего не выводится. И все заново. Работает как велено микроконтроллеру.
 
  • Лойс +1
Реакции: te238s