![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Сегодня продолжу освоение платформы Arduino, взяв за основу предыдущую схему с тремя диодами http://zigmund-balash.livejournal.com/341329.html. Автономное мигание, конечно интересно, но для будущих опытов с разными датчиками, вроде температуры или освещенности, нужно уметь выводить куда-то данные с этих датчиков. Самое простое — вывести их на последовательный порт Serial. Но перед тем, как начать выводить данные, поупражняюсь в их вводе, тем более что уже готовая схема для этого очень подходит. Это вообще очень удобно — брать уже что-то работающее и учить это делать что-то еще или что-то иначе. Так и поступлю.
Итак, схема с тремя светодиодами старая. Только «землю» я взял не из пина PWR.GND, а с пина GND рядом с DIGITAL.13 пином. Понятно, что счетчик заработал, правда не сразу — я при новой сборке подключил два из трех резисторов к той же ножке диода, что и землю. Stupid me. Поправил — замигало.
Монитор порта запускается из той же среды разработки IDE нажатием Ctrl-Shift-M или через меню Инструменты->Монитор_Порта. Удобно, не нужны никакие отдельные утилиты вроде PuTTY.
Для справки по работе с передачей данных смотрю сюда: https://www.arduino.cc/en/Tutorial/ReadASCIIString, но у меня будет упрощенный набор команд управления. Я буду отсылать одну букву из набора {'r', 'g', 'b'} и она будет включать или выключать диод. то есть, говоря умно, инвертировать его свечение.
Программа выглядит так:
//объявляем переменные с номерами пинов
int r = 11;
int g = 12;
int b = 13;
String str;
int r_state = LOW;
int g_state = LOW;
int b_state = LOW;
void setup() //процедура setup
{
Serial.begin(9600); // Включаем порт
//объявляем используемые порты
pinMode(r, OUTPUT);
pinMode(g, OUTPUT);
pinMode(b, OUTPUT);
}
void loop() //процедура loop
{
while (Serial.available() > 0) { // Считываем команду
str = Serial.readString();
if(str.length() > 0) // Защита от пустых строк
{
if(str[0] == 'r')
{
r_state = (r_state == HIGH ? LOW : HIGH); // инверсия красного
digitalWrite(r, r_state); //включаем красный
}
if(str[0] == 'g')
{
g_state = (g_state == HIGH ? LOW : HIGH);
digitalWrite(g, g_state); //включаем зеленый
}
if(str[0] == 'b')
{
b_state = (b_state == HIGH ? LOW : HIGH);
digitalWrite(b, b_state); //включаем синий
}
}
}
}
Видео не прилагаю, так как там ничего интересного. Отсылаю буквы, включаю и выключаю диоды. Эту программу можно усложнять, но мне пока хватит. Наблюдаемая странность — если быстро отправлять по букве, то плата не успевает это обработать, куда-то теряются следующие буквы, только первая влияет. Но я подумаю об этом после.
Еще замечание. При отправке на плату данных на ней мигает светодиод RX. Вангую, что когда позже буду отправлять что-то с платы, то будет мигать TX. Это магия.
И еще. По видео закрадывается крамольная мысль завести треногу и снимать для Youtube видео этих опытов. Но я пока с собой справляюсь.
Итак, схема с тремя светодиодами старая. Только «землю» я взял не из пина PWR.GND, а с пина GND рядом с DIGITAL.13 пином. Понятно, что счетчик заработал, правда не сразу — я при новой сборке подключил два из трех резисторов к той же ножке диода, что и землю. Stupid me. Поправил — замигало.
Монитор порта запускается из той же среды разработки IDE нажатием Ctrl-Shift-M или через меню Инструменты->Монитор_Порта. Удобно, не нужны никакие отдельные утилиты вроде PuTTY.
Для справки по работе с передачей данных смотрю сюда: https://www.arduino.cc/en/Tutorial/ReadASCIIString, но у меня будет упрощенный набор команд управления. Я буду отсылать одну букву из набора {'r', 'g', 'b'} и она будет включать или выключать диод. то есть, говоря умно, инвертировать его свечение.
Программа выглядит так:
//объявляем переменные с номерами пинов
int r = 11;
int g = 12;
int b = 13;
String str;
int r_state = LOW;
int g_state = LOW;
int b_state = LOW;
void setup() //процедура setup
{
Serial.begin(9600); // Включаем порт
//объявляем используемые порты
pinMode(r, OUTPUT);
pinMode(g, OUTPUT);
pinMode(b, OUTPUT);
}
void loop() //процедура loop
{
while (Serial.available() > 0) { // Считываем команду
str = Serial.readString();
if(str.length() > 0) // Защита от пустых строк
{
if(str[0] == 'r')
{
r_state = (r_state == HIGH ? LOW : HIGH); // инверсия красного
digitalWrite(r, r_state); //включаем красный
}
if(str[0] == 'g')
{
g_state = (g_state == HIGH ? LOW : HIGH);
digitalWrite(g, g_state); //включаем зеленый
}
if(str[0] == 'b')
{
b_state = (b_state == HIGH ? LOW : HIGH);
digitalWrite(b, b_state); //включаем синий
}
}
}
}
Видео не прилагаю, так как там ничего интересного. Отсылаю буквы, включаю и выключаю диоды. Эту программу можно усложнять, но мне пока хватит. Наблюдаемая странность — если быстро отправлять по букве, то плата не успевает это обработать, куда-то теряются следующие буквы, только первая влияет. Но я подумаю об этом после.
Еще замечание. При отправке на плату данных на ней мигает светодиод RX. Вангую, что когда позже буду отправлять что-то с платы, то будет мигать TX. Это магия.
И еще. По видео закрадывается крамольная мысль завести треногу и снимать для Youtube видео этих опытов. Но я пока с собой справляюсь.