Мигающие огни ARDUINO

Я создаю схему с помощью своего Arduino, чтобы, когда он получает «1» или «2» или «а» включает или выключает светодиоды. Но я хотел, чтобы свет блеснуть и не знаю как делать петли в петлях или если это то, что я нужно делать вообще. Любая помощь будет очень признательна, и код будет ниже.

//-----------------ЭЛЕКТРОНИКА--------------------------------//

int left = 11;
int stoP = 12;
int right = 8;

//переменные
int Received = 0;
int left_state =0;
int stoP_state = 0;
int right_state = 0;

void setup() {
  Serial.begin(9600);
  pinMode(left,OUTPUT);
  pinMode(stoP,OUTPUT);
  pinMode(right,OUTPUT); 
}

void loop() {

  if (Serial.available() > 0)
  {
    Received = Serial.read();
  }

////////////////ЛЕВЫЙ//////////////////

if (left_state == 0 && Received == '1')

{
  digitalWrite(left,HIGH);  
  Received = 0;
  left_state = 1;
}

if (left_state == 1 && Received == '1')

{
  digitalWrite(left,LOW);
  Received = 0;
  left_state = 0;
}
////////////////////////////////////


///////////////останавливаться////////////////

if (stoP_state == 0 && Received == 'a')

{
  digitalWrite(stoP,HIGH);  
  Received = 0;
  stoP_state = 1;
}

if (stoP_state == 1 && Received == 'a')

{
  digitalWrite(stoP,LOW);
  Received = 0;
  stoP_state = 0;
}

 /////////////////////////////////

 ///////////верно///////////////

if (right_state == 0 && Received == '2')

{
  digitalWrite(right,HIGH);  
  Received = 0;
  right_state = 1;
}

if (right_state == 1 && Received == '2')

{
  digitalWrite(right,LOW);
  Received = 0;
  right_state = 0;
}
}

, 👍-1

Обсуждение

Вы можете отключить светодиоды через короткое время, используя millis(). Вы можете посмотреть на пример BlinkWithoutDelay, который поставляется с Arduino IDE., @chrisl


1 ответ


0

Как уже упоминал Крисл, вы должны использовать функцию millis.

Помимо установки вывода ВЫСОКИМ, вы сохраняете переменную для каждого состояния для времени запуска и устанавливаете ее, когда соответствующее состояние установлено на 1:

unsigned long left_start_time = millis();

Затем в цикле вы проверяете каждое состояние, когда оно равно 1 (включено или мигает), и включаете или выключаете вывод, например:

if (left_state == 1)
{
    digitalWrite((millis() - left_startTime % 400) < 400 / 2) ? HIGH : LOW);
}

Это означает, что первая половина периода 400 мс (время % 400 < 200) будет ВЫСОКОЙ, а вторая половина (время % 400 >= 200) будет НИЗКОЙ.

Улучшения:

  • Не используйте 400, а постоянное значение.
  • Не используйте отдельные переменные для левой/правой/остановки, а поместите их в структуру, сохраняя состояние, время, вывод и ключ активации ('1', '2', 'a') вместе.
  • Если вы сделаете все вышеперечисленное, вы сможете упростить свою программу (и избежать дублирования кода), параметризовав свой код.
,