Почему светодиод зависает, когда я добавляю задержку?

Я новичок в arduino и подобных вещах. Поэтому я игрался с подтягивающим резистором. Он работал нормально, но проблема возникла, когда я использовал задержку, чтобы включить светодиод на несколько секунд, прежде чем он вернется в низкое состояние. Он перестал работать, когда я нажал на переключатель несколько раз. Иногда он может работать, но в максимальное время он не работает

вот код

const int buttonPin = 4;     
const int ledPin =  12;     
int buttonState = 0;    


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

void loop() {
        buttonState = digitalRead(buttonPin);
      if (buttonState == LOW) 
  {
    digitalWrite(ledPin, HIGH);
    delay(5000);
  } else 
  {
    digitalWrite(ledPin, LOW);
    delay(5000);
  }
}

, 👍1

Обсуждение

Что происходит, когда это не работает? Пожалуйста, объясните подробнее, @chrisl

состояние светодиода не меняется., @Peouse Dutta

вы не считываете показания переключателя во время задержки (5000).... вам нужно удерживать кнопку нажатой в течение 5 секунд, @jsotola

Измените вторую задержку на меньшее значение, например, 100 мс., @Gerben

одна из вещей, которую вам нужно усвоить при программировании, - это определение области сбоя... ваша программа не реагирует на нажатие кнопки, это не зависание светодиода, @jsotola


1 ответ


Лучший ответ:

5

Ваш Arduino ничего не делает во время задержки (5000). Поэтому нажатие кнопки в течение 5000 мс, когда светодиод выключен, ничего не сделает. Или вам должно очень повезти, чтобы нажать кнопку в очень короткое время между одним циклом и следующим.

Я много узнал о синхронизации и задержках с помощью этого руководства: Мигание без задержки

,

На самом деле Arduino что-то делает, просто не то, что думает оператор., @PhillyNJ

Да, он ждет, пока задержка закончится..., @ON5MF Jurgen

он никогда не ждет. Вы должны увидеть, что на самом деле делает задержка., @PhillyNJ

в случае этого кода он ждет... в противном случае вот что он делает: "Однако, некоторые вещи происходят, пока функция delay() управляет чипом Atmega, поскольку функция delay не отключает прерывания. Последовательная связь, которая появляется на выводе RX, записывается, значения PWM (analogWrite) и состояния выводов сохраняются, и прерывания будут работать так, как и должны". (Из справочника по Arduino), @ON5MF Jurgen

Вам стоит увидеть, что он делает. Тогда вы поймете, о чем я говорю., @PhillyNJ