Как включить 3 светодиода в повторяющейся последовательности, чтобы все три светодиода затем выключались при отпускании используемой кнопки?

По сути, как мне изменить приведенный ниже код, чтобы ВКЛ каждый из трех светодиодов по одному в повторяющейся последовательности, удерживая кнопку нажатой?

  • Красный (3 секунды).
  • Желтый (1 секунда) и
  • Зеленый (3 секунды).

Я пытаюсь заставить все три светодиода выключаться ВЫКЛ при отпускании кнопки.

Код, который я написал, не позволяет мне добиться того, что я пытаюсь сделать (я не уверен, где я ошибся):

#define Button_Pin 2  //Вывод кнопки
#define LED_Pin_1 11 //Красный светодиод
#define LED_Pin_2 10 //Желтый светодиод
#define LED_Pin_3 9  //Зеленый светодиод

byte Button_State;

void setup() {
  pinMode(Button_Pin, INPUT);
  pinMode(LED_Pin_1,  OUTPUT);
  pinMode(LED_Pin_2,  OUTPUT);
  pinMode(LED_Pin_3,  OUTPUT);
  
  
  Serial.begin(9600); 
  Serial.println("Design Part B - Digital I-O Control");
  delay(1000); 
}

void loop() {
  Button_State = digitalRead(Button_Pin);
  Serial.print("Button State: ");
  Serial.print(Button_State);
  
  
  if (Button_State == 1){
    digitalWrite(LED_Pin_1, HIGH); 
    delay(3000); //Подождите 3 секунды
    digitalWrite(LED_Pin_2, HIGH); 
    delay(1000); //Ждет 1 секунду
    digitalWrite(LED_Pin_3, HIGH); 
    delay(3000); 
    Serial.println(" --> Button Pressed --> LED ON");
  }
  else{
    digitalWrite(LED_Pin_1, LOW); 
    digitalWrite(LED_Pin_2, LOW); 
    digitalWrite(LED_Pin_3, LOW); 
    Serial.println(" Button is Released --> LED OFF");
  }
}

Используемые схемы схемы

, 👍1

Обсуждение

внимательно посмотрите на код внутри блока if (Button_State == 1){... подумайте о том, что он делает и сколько времени это занимает... затем изучите пример скетча блинкбезаутделей в Arfuino IDE, @jsotola

Когда вы включаете желтый цвет, нужно ли выключать красный? Или оно остается включенным?, @Nick Gammon

Я предполагаю, что вывод кнопки подключен к внешнему понижающему резистору, скажем, 10 кОм., @6v6gt

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

Подсказка здесь в том, что после запуска последовательности светодиодов она должна пройти до завершения — за 7 секунд — прежде чем кнопку можно будет обнаружить. Даже если вы удерживаете кнопку, скажем, 3 секунды, начиная вскоре после начала последовательности, вы можете отказаться и отпустить ее до того, как последовательность завершится, и _код никогда не проверит ее_., @JRobert

вот какой-то код, который я написал, который использует несколько таймеров... это может дать вам некоторые идеи... https://wokwi.com/projects/362275278547275777, @jsotola


2 ответа


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

0

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

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

#define pushButton_pin 2
#define grn_LED_pin 9
#define yel_LED_pin 10
#define red_LED_pin 11

bool pushButton_state;

void setup() {
pinMode(pushButton_pin, INPUT);
pinMode(grn_LED_pin, OUTPUT);
pinMode(yel_LED_pin, OUTPUT);
pinMode(red_LED_pin, OUTPUT);

Serial.begin(115200);

Serial.println("Use push button (digital input) to control 3 LEDs (digital 
output)");
delay(1000); 
}

void loop() {
pushButton_state = digitalRead(pushButton_pin); 
Serial.println(pushButton_state); 
if (pushButton_state == 1) { 
digitalWrite(grn_LED_pin, LOW); 
digitalWrite(yel_LED_pin, LOW); 
digitalWrite(red_LED_pin, HIGH); 
Serial.println(" :push button state is 1, red LED is ON"); 
delay(2000);
digitalWrite(grn_LED_pin, LOW); 
digitalWrite(yel_LED_pin, HIGH); 
digitalWrite(red_LED_pin, LOW); 
Serial.println(" :push button state is 1, yel LED is ON"); 
delay(1000); 
digitalWrite(grn_LED_pin, HIGH); 
digitalWrite(yel_LED_pin, LOW); 
digitalWrite(red_LED_pin, LOW); 
Serial.println(" :push button state is 1, grn LED is ON");
delay(2000); 
} else {
digitalWrite(grn_LED_pin, LOW); 
digitalWrite(yel_LED_pin, LOW); 
digitalWrite(red_LED_pin, LOW); 
Serial.println(" :push button state is 0, all LEDs OFF"); 
}
delay(500);
}
,

Но похоже, что отпускание кнопки не имеет немедленного эффекта. Прежде чем все светодиоды погаснут, необходимо дождаться завершения полного цикла. Чтобы улучшить это, вы должны использовать решение типа «конечный автомат», как уже было предложено. Использование операторов задержки() очень негибко. Все блокируется до тех пор, пока они не прекратятся., @6v6gt

Я заявил, что хочу, чтобы все три светодиода гасли при отпускании кнопки. Мне следовало бы более четко объяснить, чего именно я хочу достичь, поэтому прошу прощения за путаницу, однако я все равно хотел, чтобы при нажатии перед выключением он по-прежнему выполнял полный цикл., @Mars


1

Вам понадобится конечный автомат (чтобы запомнить, какой светодиод горит в данный момент) и используйте millis( ), чтобы найти текущее время в цикле, который проверяет, замкнут ли переключатель или нет.

Если переключатель замкнут, вы сравниваете текущее время (с помощью millis()) со временем, когда вы включили этот конкретный светодиод. Когда время истечет, вы продвигаете «состояние». (например, счетчик) к следующему и запомните новое время, когда произошло это изменение состояния.

,