Как заставить 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 ответ
Я вижу две проблемы:
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 мА).
- Акцептант векселей ИКТ
- Возникла проблема с входом Dreading, он должен воспроизводить зуммер, но не
- Команда strtok() с Serial связью
- Как изменить переменную при нажатии кнопки, подключенной к контакту 2
- Реализовать связь Visible Light с помощью Arduino
- 4-битный счетчик вверх и вниз
- Как программно обнаружить последовательный порт Arduino на разных платформах?
- Скетч мигания ESP8266 не мигает светодиодом
Последовательный монитор посылает символ "0" с кодом ASCII 48. таким образом, 48 не равно 0. о других недостатках читайте в ответе Мишеля, @Juraj
Вы используете реальное оборудование или просто симулятор, как показано выше? Если вы используете реальное оборудование, большинство Arduino UNO имеют встроенный светодиод на выводе 13; внешний светодиод не требуется. Если вы используете симулятор ext. Возможно, понадобится светодиод. Светодиод должен быть правильно подключен анодом к контакту 13, а катодом (стороной с кольцом) - к GND, вы это проверяли? Мишель объяснил вам, как правильно закодировать его, и дал вам советы, как подключить внешний светодиод, если в вашем Arduino отсутствует встроенный светодиод или вы хотите попробовать другой вывод на реальном оборудовании., @Peter Paul Kiefer