Урок 5 (Часть 2): Arduino Serial

Привет всем пользователям сайта kiloom.ru, сегодня я продолжаю говорить о Arduino Serial .

Расскажу, как передать что-то или выполнить команду в Arduino. В моем случае буду включать и выключать светодиод.

Давайте поговорим как это все будет происходить, в COM порт будем записывать (1) — светодиод засветиться, (0) — погаснет, другая информация — ошибка. Но есть одно но сейчас я вам наглядно покажу а потом расскажу. Не спешите сразу работать с кодом, сперва прочитайте описание.

int val=0;
void setup()
{
Serial.begin(9600);
}
 
void loop()
{
while(Serial.available()==0);
val = Serial.read();
Serial.println(val);
}

Вот тут самое интересное строка while(Serial.available()==0); функция Serial.аvailable() проверяет, есть ли в COM порте доступные для чтения данные, а за счет while мы будем «топтаться» на месте и ожидать данные.

Потом все как обычно, val = Serial.read(); — записываем значение в переименую val, и печатаем переименую val в порт Serial.println(val);

Теперь попробуем это в деле: прошиваем контролер, нажимаем Serial monitor, в строке вводим (1) и нажимаем send и обратно получаем (49) СТОП.

По программе мы должны получить обратно число (1) , происходит это из за разных типов данных данных, мы отправляли символ char (1), а контролер отправляет десятичное представление символа (1) это будет (49). Все символы представлены в таблице:

Есть очень крутой способ это все изменить, мы просто заменим одну строчку программы — вместо val = Serial.read(); мы запишем val = Serial.read() — ‘0’; но это работает только с цифрами (нам этого достаточно для включения светодиода). Но почему так происходит? Например, мы знаем что символ 0=48; а число 1=49; вот мы и пишем от val отнять символ ‘0’ (не забываем что одинарные скобки означают символ). Вот и выходит, что мы находим разницу между символом ‘1’ и ‘0’, (49-48 = 1),

Теперь можно написать код для управления светодиодом:

int val=0;
int led=13;
void setup()
{
pinMode(led,OUTPUT);
Serial.begin(9600);
}
 
void loop()
{
while(Serial.available()==0);
val = Serial.read()-'0';

if (val==1)
{
digitalWrite(led,HIGH);
}
else if(val==0)
{
digitalWrite(led,LOW);
}
else
Serial.println("ERROR");
}

Не забываем про скобки о которых я говорил в первой части.

И что мы видим в этом коде? Все по стандартному: while(Serial.available()==0); val = Serial.read()-‘0′; ожидаем и записываем получение число в переменную.

Потом говорим: if (val==1) (если val равен (1)), тогда digitalWrite(led,HIGH); — включаем светодиод.

Дальше мы делаем супер ход — else if(val==0) оно нам говорит: если не выполняется первое условие и условие val == 0 выполняется, тогда digitalWrite(led,LOW); — выключаем светодиод, если же оба условия ложны, тогда else Serial.println(«ERROR»); — в порт пишется ERROR .

Добавить комментарий

Ваш адрес email не будет опубликован.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>