Симулятор стоп-сигнала - белый светодиод не включается при нажатии кнопки

Я работаю над относительно простым симулятором светофора, в котором помимо кнопки используются четыре светодиода: красный, зеленый, желтый и белый. 3 цветных светодиода стоп-сигнала включаются, как настоящий стоп-сигнал. Если кнопка нажата, когда горит зеленый светодиод, белый свет должен загореться, пока зеленый свет все еще горит (это может произойти только один раз). Раньше цикл стоп-сигнала не работал, но теперь белый свет не включается при нажатии кнопки (см. ниже)

Редактировать: цикл стоп-сигнала теперь работает, благодаря вашему вкладу, но белый свет по-прежнему не загорается, когда я нажимаю кнопку. Это может быть проблемой при использовании задержки вместо millis(), но я не уверен, что это самый простой способ реализовать исправление. Какие-нибудь советы? Мой код ниже. Спасибо!

const int g_led = 3;
const int y_led = 4;
const int r_led = 5;
const int w_led = 6;
const int g_delay = 4000; // настроить время тестирования в соответствии с требованиями
const int y_delay = 2000;
const int r_delay = 3000;

int g_ledState;
int buttonState;
bool counter = false;

const int buttonPin = 2;

//функция зеленого светодиода с условием для белого светодиода
void green_light(){
  digitalWrite(g_led, HIGH);
  digitalWrite(y_led, LOW);
  digitalWrite(r_led, LOW);
  digitalWrite(w_led, LOW);
  g_ledState = 1;
  buttonState = digitalRead(buttonPin);
if (buttonState == HIGH && g_ledState == 1 && counter == false){
  digitalWrite(w_led, HIGH);
    counter = true;
  }
  else{
    digitalWrite(w_led, LOW);
    counter = true;
  }
}

void yellow_light(){
  digitalWrite(y_led, HIGH);
  digitalWrite(g_led, LOW);
  digitalWrite(r_led, LOW);
  digitalWrite(w_led, LOW);
  g_ledState=0;
}

void red_light(){
  digitalWrite(r_led, HIGH);
  digitalWrite(y_led, LOW);
  digitalWrite(g_led, LOW);
  digitalWrite(w_led, LOW);
  g_ledState=0;
}

void setup() {
  // поместите сюда код установки для однократного запуска:
  pinMode(g_led, OUTPUT);
  pinMode(y_led, OUTPUT);
  pinMode(r_led, OUTPUT);
  pinMode(w_led, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
//основной цикл светофора
  green_light();
  delay(g_delay);
  yellow_light();
  delay(y_delay);
  red_light();
  delay(r_delay);
}

, 👍1

Обсуждение

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

У вас задержки очень короткие - 20 и 50 мс. Я предлагаю вам увеличить их, например, g_delay = 5000; для тестирования. Вы должны увидеть, как загорится зеленый светодиод, если он подключен правильно. Затем можно переходить к другим частям., @DrG

g_ledState никогда не будет высоким в то время, когда вы проверяете его в условном операторе, потому что он установлен в низкий уровень предыдущим вызовом red_light(). Также счетчик всегда принудительно обнуляется, прежде чем вы проверите его значение. Возможно, счетчик должен быть глобальным или статическим. Обычно такие упражнения предназначены для предотвращения использования delay() для определения времени и требуют вместо этого явного использования millis(). У вас есть внешние подтягивающие резисторы на контактах кнопок?, @6v6gt

Это имеет смысл; теперь световой цикл работает, но белый свет все еще не загорается, когда я нажимаю кнопку. Счетчик теперь глобальный, и у меня на кнопке есть подтягивающий резистор. Я предполагаю, что проблема заключается в использовании delay(), но я не очень разбираюсь в использовании millis(). Любые советы о том, как это будет работать в этом случае? Я обновил свой код в исходном вопросе. Большое спасибо всем вам!, @Weston K.


2 ответа


0

Попробуйте так

allowed to happen once). My code compiles, but none of the lights turn on when I run it. I'm pretty sure I set the circuit correctly, so I want to see if I'm missing any issues in my code (below). Thank you!

//переменные
const int g_led = 3;
const int y_led = 4;
const int r_led = 5;
const int w_led = 6;
const int g_delay = 1000;
const int y_delay = 500;
const int r_delay = 1000;
int g_ledState;
int buttonState;

const int buttonPin = 2;

//Функции светодиода
void green_light(){

  int counter=0;

// условие, позволяющее кнопке включить белый светодиод, ЕСЛИ горит зеленый светодиод, а цикл белого светодиода еще не запущен
if (buttonState == HIGH && g_ledState == 1 && counter == 0){
  digitalWrite(w_led, HIGH);
    counter =1;
  }
  else{
    digitalWrite(w_led, LOW);
    counter=0;
  }

  digitalWrite(g_led, HIGH);
  digitalWrite(y_led, LOW);
  digitalWrite(r_led, LOW);
  digitalWrite(w_led, LOW);
  g_ledState=1;
  button state=digitalRead(buttonPin);




}

void yellow_light(){
  digitalWrite(y_led, HIGH);
  digitalWrite(g_led, LOW);
  digitalWrite(r_led, LOW);
  digitalWrite(w_led, LOW);
  g_ledState=0;
}

void red_light(){
  digitalWrite(r_led, HIGH);
  digitalWrite(y_led, LOW);
  digitalWrite(g_led, LOW);
  digitalWrite(w_led, LOW);
  g_ledState=0;
}

void setup() {
  // поместите сюда код установки для однократного запуска:
  pinMode(g_led, OUTPUT);
  pinMode(y_led, OUTPUT);
  pinMode(r_led, OUTPUT);
  pinMode(w_led, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  // поместите сюда ваш основной код для многократного запуска:

//основной цикл светофора
  green_light();
  delay(g_delay);
  yellow_light();
  delay(y_delay);
  red_light();
  delay(r_delay);



}

Обратите внимание, что использование задержки не рекомендуется, но этот способ может помочь.

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

//переменные
const int g_led = 3;
const int y_led = 4;
const int r_led = 5;
const int w_led = 6;
const int g_delay;
const int y_delay;
const int r_delay;
int g_ledState;
int buttonState;
int oldbuttonState;
const int buttonPin = 2;

Switch (white){
case 1:
//ничего не делать
break;

case 2 :
   buttonState=digitalRead(buttonPin);

   // условие, позволяющее кнопке включить белый светодиод, ЕСЛИ горит зеленый светодиод, а цикл белого светодиода еще не запущен
if (buttonState == HIGH && counter == 0){
  digitalWrite(w_led, HIGH);
    counter =1;
  }
  else{
    digitalWrite(w_led, LOW);

  }   
counter=buttonState;
//переключаемся на случай 3
 white=3;
break;

case 3 :
//вернемся ко второму варианту и продолжим чтение кнопки
white=2;
break;

}
//Функции светодиода
void green_light(){

  digitalWrite(g_led, HIGH);
  digitalWrite(y_led, LOW);
  digitalWrite(r_led, LOW);
  digitalWrite(w_led, LOW);

// начинаем читать кнопку
  white=2;
  g_delay=Millis();

}

void yellow_light(){
// остановить чтение кнопки
  white=1;
  digitalWrite(y_led, HIGH);
  digitalWrite(g_led, LOW);
  digitalWrite(r_led, LOW);
  digitalWrite(w_led, LOW);
  y_delay=millis();
}

void red_light(){
 // остановить чтение кнопки
  white=1
  digitalWrite(r_led, HIGH);
  digitalWrite(y_led, LOW);
  digitalWrite(g_led, LOW);
  digitalWrite(w_led, LOW);
  r_delay=millis();
}

Switch (cases){
//основной цикл светофора
case 1 :
  green_light();
  /// ждем 3 секунды
  if (millis() - g_delay >=3000){
     yellow_light();
}
 cases=2;
 break;

case 2 :
  /// ждем 2 секунды
  if (millis() - y_delay >=2000){
     red_light();
}
cases=3;
break;

 case 3 :
 // ждем 5 секунд
  if (millis() - r_delay >=5000){
      cases=1;
}
cases=1;
break;

}

void setup() {
  // поместите сюда код установки для однократного запуска:
  pinMode(g_led, OUTPUT);
  pinMode(y_led, OUTPUT);
  pinMode(r_led, OUTPUT);
  pinMode(w_led, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  // поместите сюда ваш основной код для многократного запуска:
cases=1;


}

Это не тестировалось, просто попробуйте

,

Спасибо, это очень помогло! Я возился с первой версией ваших модификаций, так как она работает наиболее плавно. Хотя световой цикл теперь работает, белый свет по-прежнему не загорается при нажатии кнопки. Может ли это быть из-за того, что задержки прерывают выполнение условного выражения в green_light()? Я не очень разбираюсь в использовании millis(), но если бы это было решением, я был бы признателен за некоторые рекомендации о том, как его реализовать. Спасибо!, @Weston K.


0

У вас нет сведений о цепи... ТАК...

Большинству светодиодных индикаторов требуется напряжение от 2 до 2,2 В и ток от 8 до 25 мА. для включения белых светодиодов обычно требуется 3,1 В и минимум 25 мА.

Кроме того, у микропроцессоров есть ограничения на ток, который может отдавать вывод. Если вы используете микросхему на 3,3 В, не все напряжение будет поступать на светодиод.

ознакомьтесь со спецификациями микро- и белого светодиода. У меня такое чувство, что вы обнаружите проблему либо с микроконтактом, либо с поставкой.

Попробуйте отключить цветной светодиод для проверки кода. Если светодиод работает, попробуйте подключиться к какой-либо схеме драйвера для питания белого светодиода.

,