Привет всем пользователям сайта 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 .