Как заставить Arduino реагировать на последовательную информацию?

Я хочу написать программу, которая позволит мне управлять светодиодом, подключенным к контакту 13 Arduino. При запуске программы светодиод должен погаснуть. Пользователь должен открыть последовательный монитор для связи с Arduino. Если пользователь посылает символ "1" через последовательный монитор, то светодиод должен загореться. Если пользователь посылает символ "0" через последовательный монитор, то светодиод должен погаснуть.

Поэтому я попробовал:

void setup()
{
  pinMode(13, OUTPUT);
}

void loop()
{
  int bytenum = Serial.available();
  if (bytenum != 0)
  {
    int bval = Serial.read();
    if (bval != 0)
    {
        digitalWrite(13, HIGH);
    }
  }
  digitalWrite(13, LOW);
}

Но при запуске светодиод никогда не загорается:

, 👍-1

Обсуждение

Последовательный монитор посылает символ "0" с кодом ASCII 48. таким образом, 48 не равно 0. о других недостатках читайте в ответе Мишеля, @Juraj

Вы используете реальное оборудование или просто симулятор, как показано выше? Если вы используете реальное оборудование, большинство Arduino UNO имеют встроенный светодиод на выводе 13; внешний светодиод не требуется. Если вы используете симулятор ext. Возможно, понадобится светодиод. Светодиод должен быть правильно подключен анодом к контакту 13, а катодом (стороной с кольцом) - к GND, вы это проверяли? Мишель объяснил вам, как правильно закодировать его, и дал вам советы, как подключить внешний светодиод, если в вашем Arduino отсутствует встроенный светодиод или вы хотите попробовать другой вывод на реальном оборудовании., @Peter Paul Kiefer


1 ответ


0

Я вижу две проблемы:

1. Скетч

Линия:

digitalWrite(13, LOW);

всегда выполняется, то есть светодиод (который может быть сломан, см. Ниже) горит очень мало времени, вероятно, недостаточно, чтобы быть видимым.

Вы можете использовать следующий скетч (для 0 и 1, чтобы выключить/включить его):

const uint8_t LED = 13;

void setup()
{
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
}

void loop()
{
  while (available_characters != 0)
  {
    switch (Serial.read())
    {
      case '0':
        digitalWrite(LED, LOW); 
        break;
        
      case '1': 
        digitalWrite(LED, HIGH);
        break;
        
      default:
        // Ignore
        break;
    }
  }
}

Вы можете сделать этот скетч меньше, если хотите, чтобы " 0 " было выключено, а все остальное-включено:

const uint8_t LED = 13;

void setup()
{
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
}

void loop()
{
  while (Serial.available() != 0)
  {
    digitalWrite(LED, Serial.read() == '0' ? LOW : HIGH);
  }
}

2. Отсутствие резистора

Я думаю, что ваш светодиод теперь сломан, и, надеюсь, только светодиод, а не ваш Arduino.

Всегда используйте резистор непосредственно перед или после светодиода при подключении светодиода. В качестве ориентира используйте, например, 220R или 330R.

Запомните формулу: V = I * R

Хитрость в том, что светодиоды имеют прямое напряжение (Vf), поэтому фактическая формула такова:

 (V - Vf) = I * R

Сейчас большинство светодиодов выдерживают в основном 20 мА, но 10 мА более чем достаточно, чтобы сделать их яркими.

Ниже приведен список типичных значений прямого напряжения. Предположим, что это 1,8 В, так как в вашем примере вы используете красный.

Минимальное значение используемого резистора:

(5 V - 1.8 V) = 0.01 A * R <=>
3.2 V = 0.01 A * R <=>
R = 320 ohm

Поэтому используйте резистор 330 Ом. (обратите внимание, что 220 Ом все равно приведет к менее чем 20 мА).

,