Arduino:Примеры/ReadASCIIString: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
м (Замена текста — «<syntaxhighlight lang="c">» на «<syntaxhighlight lang="c" enclose="div">»)
 
Нет описания правки
 
(не показано 5 промежуточных версий 2 участников)
Строка 5: Строка 5:
==Считывание строки данных в кодировке ASCII <ref>[http://www.arduino.cc/en/Tutorial/ReadASCIIString Arduino - Read ASCII String]</ref>==
==Считывание строки данных в кодировке ASCII <ref>[http://www.arduino.cc/en/Tutorial/ReadASCIIString Arduino - Read ASCII String]</ref>==


Данный скетч использует функцию '''Serial'''.[[Arduino:Справочник языка Arduino/Функции/Функции передачи данных/Serial/parseInt()|parseInt()]] для обнаружения значений, разделенных знаками препинания и прочими символами, не относящимся ни к буквенным, ни к цифровым. Взять, к примеру, запятую – этот символ часто используется для разграничения в сплошном потоке цифр отдельных кусочков информации (этот формат часто называют '''значением, разделенным запятыми'''). Впрочем, тут могут пригодится и другие символы, например, пробел или точка.
Данный скетч использует функцию Serial.[[Arduino:Справочник языка Arduino/Функции/Функции передачи данных/Serial/parseInt()|parseInt()]] для обнаружения значений, разделенных знаками препинания и прочими символами, не относящимся ни к буквенным, ни к цифровым. Взять, к примеру, запятую – этот символ часто используется для разграничения в сплошном потоке цифр отдельных кусочков информации (этот формат часто называют значением, разделенным запятыми). Впрочем, тут могут пригодится и другие символы, например, пробел или точка.
В данном случае программа будет анализировать входные данные, а затем с их помощью задаст цвет для '''RGB-светодиода'''. Входные данные будут передаваться вами через окно '''Serial Monitor''' – вам нужно будет вводить числовые строчки вроде '''«5,220,70»'''.
 
В данном случае программа будет анализировать входные данные, а затем с их помощью задаст цвет для [[RGB-светодиод]]а. Входные данные будут передаваться вами через окно Serial Monitor – вам нужно будет вводить числовые строчки вроде «5,220,70».


==Необходимое оборудование==
==Необходимое оборудование==


* Плата '''Arduino''';
* [[Плата Arduino]] - 1 шт.
* Макетная плата '''Breadboard''';
* [[Макетная плата]] - 1шт.
* Провода-перемычки;
* Провода-перемычки;
* '''RGB'''-светодиод с общим анодом;
* [[RGB-светодиод с общим анодом]] - 1шт.
* Три 220-омовых резистора;
* [[Резистор]] на [[220 Ом]] - 3 шт.


== Цепь ==
== Цепь ==


[[File:readASCIIString_bb.png]]
[[File:readASCIIString_bb.png|frame|center|'''Рис. 1.''' Подключение к плате Arduino RGB-светодиода с общим анодом|alt=Подключение к плате Arduino RGB-светодиода с общим анодом]]
 
Для создания этой цепи понадобится пять проводов. Возьмите красный провод и подсоедините его к одному из длинных вертикальных рядов на Breadboard, а другой конец красного провода – к 5-вольтовому контакту на [[Arduino]].
 
Теперь займемся [[RGB-светодиод]]ом (он состоит из трех разноцветных «суб-светодиодов» – красного, зеленого и синего). Для начала сверимся с паспортом изделия, чтобы определить, какой контакт за что отвечает. Теперь подключим [[анод]] [[RGB-светодиод]]а к линии с 5-вольтовым питанием, создание которого описывалось в предыдущем абзаце.
 
При помощи оставшихся проводов подключаем красный катод к 3-ему контакту, зеленый – к 5-ому, а синий – к 6-ому, но не напрямую, а через [[резистор]]ы.


Для создания этой цепи понадобится пять проводов. Возьмите красный провод и подсоедините его к одному из длинных вертикальных рядов на '''Breadboard''', а другой конец красного провода – к 5-вольтовому контакту на '''Arduino'''.
Поскольку используемый нами [[RGB-светодиод]] имеет общий [[анод]], а не [[катод]], логика работы конкретного «суб-светодиода» получается инвертированной. Если мы подадим на него через функцию [[Arduino:Справочник языка Arduino/Функции/Аналоговый ввод/вывод/analogWrite()|analogWrite()]] максимальное значение (255), мы его не включим, а выключим; если подадим минимальное (0) – включим в полную силу. В указанной ниже программе есть фрагмент с вычислениями, благодаря которым [[RGB-светодиод]] (точнее, каждому из трех цветных [[светодиод]]ов, которые находятся внутри него) все же получает данные о нужном уровне яркости. Фактически, вместо [[Arduino:Справочник языка Arduino/Функции/Аналоговый ввод/вывод/analogWrite()|analogWrite(pin, brightness)]] вы будете использовать [[Arduino:Справочник языка Arduino/Функции/Аналоговый ввод/вывод/analogWrite()|analogWrite(pin, 255-brightness)]], где '''brightness''' – это яркость.
Теперь займемся '''RGB-светодиодом''' (он состоит из трех разноцветных '''«суб-светодиодов»''' – красного, зеленого и синего). Для начала сверимся с паспортом изделия, чтобы определить, какой контакт за что отвечает. Теперь подключим анод '''RGB-светодиода''' к линии с 5-вольтовым питанием, создание которого описывалось в предыдущем абзаце.
При помощи оставшихся проводов подключаем красный катод к 3-ему контакту, зеленый – к 5-ому, а синий – к 6-ому, но не напрямую, а через резисторы.
Поскольку используемый нами '''RGB-светодиод''' имеет общий анод, а не катод, логика работы конкретного «суб-светодиода» получается инвертированной. Если мы подадим на него через функцию [[Arduino:Справочник языка Arduino/Функции/Аналоговый ввод/вывод/analogWrite()|analogWrite()]] максимальное значение (255), мы его не включим, а выключим; если подадим минимальное (0) – включим в полную силу. В указанной ниже программе есть фрагмент с вычислениями, благодаря которым '''RGB-светодиод''' (точнее, каждому из трех цветных светодиодов, которые находятся внутри него) все же получает данные о нужном уровне яркости. Фактически, вместо [[Arduino:Справочник языка Arduino/Функции/Аналоговый ввод/вывод/analogWrite()|analogWrite]](pin, brightness) вы будете использовать [[Arduino:Справочник языка Arduino/Функции/Аналоговый ввод/вывод/analogWrite()|analogWrite]](pin, 255-brightness), где '''brightness''' – это яркость.


==Код==
==Код==


Для начала зададим константы для контактов, к которым подключен '''RGB-светодиод'''. Так будет проще отличить друг от друга '''«суб-светодиоды»''' (зеленый, красный и синий) при написании главной части программы.
Для начала зададим константы для контактов, к которым подключен [[RGB-светодиод]]. Так будет проще отличить друг от друга «суб-светодиоды» (зеленый, красный и синий) при написании главной части программы.


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
const int redPin = 3;
const int redPin = 3;
const int greenPin = 5;
const int greenPin = 5;
Строка 35: Строка 39:
</syntaxhighlight>
</syntaxhighlight>


В секции [[Arduino:Справочник языка Arduino/setup()‎|setup()‎]] задаем последовательную передачу данных между '''Arduino''' и компьютером со скоростью '''9600 бит в секунду''':
В секции [[Arduino:Справочник языка Arduino/setup()‎|setup()‎]] задаем последовательную передачу данных между [[Arduino]] и [[компьютер]]ом со скоростью 9600 бит в секунду:


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
Serial.begin(9600);
Serial.begin(9600);
</syntaxhighlight>
</syntaxhighlight>


Далее делаем три '''«цветных»''' контакта выходными контактами:
Далее делаем три «цветных» контакта выходными контактами:


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
pinMode(redPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(greenPin, OUTPUT);
Строка 51: Строка 55:
В секции [[Arduino:Справочник языка Arduino/loop()|loop()]] воспользуемся оператором [[Arduino:Справочник языка Arduino/Управляющие операторы/while|while]], благодаря которому программа начнет работать, как только в буфере появятся новые данные, которые надо будет прочитать:
В секции [[Arduino:Справочник языка Arduino/loop()|loop()]] воспользуемся оператором [[Arduino:Справочник языка Arduino/Управляющие операторы/while|while]], благодаря которому программа начнет работать, как только в буфере появятся новые данные, которые надо будет прочитать:


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
while (Serial.available() > 0) {
while (Serial.available() > 0) {
</syntaxhighlight>
</syntaxhighlight>


Далее объявляем несколько локальных переменных, в которых будем хранить полученную информацию – она как раз и будет использоваться для того, чтобы менять яркость светодиодов. Чтение этой информации, разделенной запятыми, будет осуществляться с помощью команды Serial.[[Arduino:Справочник языка Arduino/Функции/Функции передачи данных/Serial/parseInt()|parseInt()]]:
Далее объявляем несколько локальных переменных, в которых будем хранить полученную информацию – она как раз и будет использоваться для того, чтобы менять яркость [[светодиод]]ов. Чтение этой информации, разделенной запятыми, будет осуществляться с помощью команды Serial.[[Arduino:Справочник языка Arduino/Функции/Функции передачи данных/Serial/parseInt()|parseInt()]]:


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
int red = Serial.parseInt();
int red = Serial.parseInt();
int green = Serial.parseInt();
int green = Serial.parseInt();
Строка 63: Строка 67:
</syntaxhighlight>
</syntaxhighlight>


Теперь проверяем, написан ли символ перевода строки, т.е. '''«\n»''':
Теперь проверяем, написан ли символ перевода строки, т.е. «\n»:


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
if (Serial.read() == '\n') {
if (Serial.read() == '\n') {
</syntaxhighlight>
</syntaxhighlight>


Далее, используя функцию [[Arduino:Справочник языка Arduino/Функции/Математические функции/constrain()|constrain()]], удерживаем полученные значения в необходимом для нас диапазоне ('''0-255'''), чтобы иметь возможность воспользоваться широтно-импульсной модуляцией ('''ШИМ'''). То есть в случае, если во входных данных будет число, не попадающее в этот диапазон, [[Arduino:Справочник языка Arduino/Функции/Математические функции/constrain()|constrain()]] «пригладит» его до нужного значения. Затем, вычтя это число из 255, вы получите значение, создающее разность потенциалов между контактом, подключенным к '''Arduino''', и общим анодом '''RGB-светодиода''' – это и заставит нужный '''«суб-светодиод»''' гореть с заданной яркостью.  
Далее, используя функцию [[Arduino:Справочник языка Arduino/Функции/Математические функции/constrain()|constrain()]], удерживаем полученные значения в необходимом для нас диапазоне (0-255), чтобы иметь возможность воспользоваться [[широтно-импульсной модуляцией]] ([[ШИМ]]). То есть в случае, если во входных данных будет число, не попадающее в этот диапазон, [[Arduino:Справочник языка Arduino/Функции/Математические функции/constrain()|constrain()]] «пригладит» его до нужного значения. Затем, вычтя это число из 255, вы получите значение, создающее [[разность потенциалов]] между контактом, подключенным к [[Arduino]], и общим анодом [[RGB-светодиод]]а – это и заставит нужный «суб-светодиод» гореть с заданной яркостью.  


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
red = 255 - constrain(red, 0, 255);
red = 255 - constrain(red, 0, 255);
green = 255 - constrain(green, 0, 255);
green = 255 - constrain(green, 0, 255);
Строка 77: Строка 81:
</syntaxhighlight>
</syntaxhighlight>


Теперь, когда мы (посредством вычитания из 255) переформатировали значения для '''ШИМ''', воспользуемся функцией [[Arduino:Справочник языка Arduino/Функции/Аналоговый ввод/вывод/analogWrite()|analogWrite()]], чтобы поменять цвет RGB-светодиода:
Теперь, когда мы (посредством вычитания из 255) переформатировали значения для [[ШИМ]], воспользуемся функцией [[Arduino:Справочник языка Arduino/Функции/Аналоговый ввод/вывод/analogWrite()|analogWrite()]], чтобы поменять цвет [[RGB-светодиод]]а:


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
analogWrite(redPin, red);
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(greenPin, green);
Строка 85: Строка 89:
</syntaxhighlight>
</syntaxhighlight>


Отсылаем данные от каждого '''«суб-светодиода» на Serial Monitor''' в шестнадцатеричном виде:
Отсылаем данные от каждого «суб-светодиода» на Serial Monitor в шестнадцатеричном виде:


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
Serial.print(red, HEX);
Serial.print(red, HEX);
Serial.print(green, HEX);
Serial.print(green, HEX);
Строка 95: Строка 99:
Наконец, закрываем скобки от операторов [[Arduino:Справочник языка Arduino/Управляющие операторы/if|if]] и [[Arduino:Справочник языка Arduino/Управляющие операторы/while|while]], а также скобку главного цикла.  
Наконец, закрываем скобки от операторов [[Arduino:Справочник языка Arduino/Управляющие операторы/if|if]] и [[Arduino:Справочник языка Arduino/Управляющие операторы/while|while]], а также скобку главного цикла.  


<syntaxhighlight lang="c" enclose="div">
<syntaxhighlight lang="c">
     }
     }
   }
   }
Строка 101: Строка 105:
</syntaxhighlight>
</syntaxhighlight>


Запрограммировав '''Arduino''', открываем окно '''Serial Monitor'''. Отправляя сообщение с новой порцией данных, не забудьте поставить завершающий символ '''«новой строки»'''. Вводимые числа должны быть в диапазоне '''от 0 до 225''', а формат сообщения должен быть следующим – Красный, Зеленый, Синий (т.е. три числа через запятую). Когда вы отправите эти данные на плату Arduino, присоединенный к ней светодиод загорится цветом, соответствующим этим данным, а на '''Serial Monitor''' будет выведено соответствующее этому цвету шестнадцатеричное значение.  
Запрограммировав [[Arduino]], открываем окно Serial Monitor. Отправляя сообщение с новой порцией данных, не забудьте поставить завершающий символ «новой строки». Вводимые числа должны быть в диапазоне от 0 до 225, а формат сообщения должен быть следующим – Красный, Зеленый, Синий (т.е. три числа через запятую). Когда вы отправите эти данные на [[плату Arduino]], присоединенный к ней [[светодиод]] загорится цветом, соответствующим этим данным, а на Serial Monitor будет выведено соответствующее этому цвету шестнадцатеричное значение.  


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
/*
/*
  Считывание строки данных в кодировке ASCII
  Считывание строки данных в кодировке ASCII
Строка 181: Строка 185:


<references />
<references />
{{Навигационная таблица/Портал/Arduino}}
[[Категория:Пример]]
[[Категория:Пример]]
[[Категория:Примеры]]
[[Категория:Примеры]]
[[Категория:Пример программирования Arduino]]
[[Категория:Пример программирования Arduino]]
[[Категория:Примеры программирования Arduino]]
[[Категория:Примеры программирования Arduino]]

Текущая версия от 11:20, 8 июля 2023

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Считывание строки данных в кодировке ASCII [1]

Данный скетч использует функцию Serial.parseInt() для обнаружения значений, разделенных знаками препинания и прочими символами, не относящимся ни к буквенным, ни к цифровым. Взять, к примеру, запятую – этот символ часто используется для разграничения в сплошном потоке цифр отдельных кусочков информации (этот формат часто называют значением, разделенным запятыми). Впрочем, тут могут пригодится и другие символы, например, пробел или точка.

В данном случае программа будет анализировать входные данные, а затем с их помощью задаст цвет для RGB-светодиода. Входные данные будут передаваться вами через окно Serial Monitor – вам нужно будет вводить числовые строчки вроде «5,220,70».

Необходимое оборудование

Цепь

Подключение к плате Arduino RGB-светодиода с общим анодом
Рис. 1. Подключение к плате Arduino RGB-светодиода с общим анодом

Для создания этой цепи понадобится пять проводов. Возьмите красный провод и подсоедините его к одному из длинных вертикальных рядов на Breadboard, а другой конец красного провода – к 5-вольтовому контакту на Arduino.

Теперь займемся RGB-светодиодом (он состоит из трех разноцветных «суб-светодиодов» – красного, зеленого и синего). Для начала сверимся с паспортом изделия, чтобы определить, какой контакт за что отвечает. Теперь подключим анод RGB-светодиода к линии с 5-вольтовым питанием, создание которого описывалось в предыдущем абзаце.

При помощи оставшихся проводов подключаем красный катод к 3-ему контакту, зеленый – к 5-ому, а синий – к 6-ому, но не напрямую, а через резисторы.

Поскольку используемый нами RGB-светодиод имеет общий анод, а не катод, логика работы конкретного «суб-светодиода» получается инвертированной. Если мы подадим на него через функцию analogWrite() максимальное значение (255), мы его не включим, а выключим; если подадим минимальное (0) – включим в полную силу. В указанной ниже программе есть фрагмент с вычислениями, благодаря которым RGB-светодиод (точнее, каждому из трех цветных светодиодов, которые находятся внутри него) все же получает данные о нужном уровне яркости. Фактически, вместо analogWrite(pin, brightness) вы будете использовать analogWrite(pin, 255-brightness), где brightness – это яркость.

Код

Для начала зададим константы для контактов, к которым подключен RGB-светодиод. Так будет проще отличить друг от друга «суб-светодиоды» (зеленый, красный и синий) при написании главной части программы.

const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;

В секции setup()‎ задаем последовательную передачу данных между Arduino и компьютером со скоростью 9600 бит в секунду:

Serial.begin(9600);

Далее делаем три «цветных» контакта выходными контактами:

pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);

В секции loop() воспользуемся оператором while, благодаря которому программа начнет работать, как только в буфере появятся новые данные, которые надо будет прочитать:

while (Serial.available() > 0) {

Далее объявляем несколько локальных переменных, в которых будем хранить полученную информацию – она как раз и будет использоваться для того, чтобы менять яркость светодиодов. Чтение этой информации, разделенной запятыми, будет осуществляться с помощью команды Serial.parseInt():

int red = Serial.parseInt();
int green = Serial.parseInt();
int blue = Serial.parseInt();

Теперь проверяем, написан ли символ перевода строки, т.е. «\n»:

if (Serial.read() == '\n') {

Далее, используя функцию constrain(), удерживаем полученные значения в необходимом для нас диапазоне (0-255), чтобы иметь возможность воспользоваться широтно-импульсной модуляцией (ШИМ). То есть в случае, если во входных данных будет число, не попадающее в этот диапазон, constrain() «пригладит» его до нужного значения. Затем, вычтя это число из 255, вы получите значение, создающее разность потенциалов между контактом, подключенным к Arduino, и общим анодом RGB-светодиода – это и заставит нужный «суб-светодиод» гореть с заданной яркостью.

red = 255 - constrain(red, 0, 255);
green = 255 - constrain(green, 0, 255);
blue = 255 - constrain(blue, 0, 255);

Теперь, когда мы (посредством вычитания из 255) переформатировали значения для ШИМ, воспользуемся функцией analogWrite(), чтобы поменять цвет RGB-светодиода:

analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue);

Отсылаем данные от каждого «суб-светодиода» на Serial Monitor в шестнадцатеричном виде:

Serial.print(red, HEX);
Serial.print(green, HEX);
Serial.println(blue, HEX);

Наконец, закрываем скобки от операторов if и while, а также скобку главного цикла.

    }
  }
}

Запрограммировав Arduino, открываем окно Serial Monitor. Отправляя сообщение с новой порцией данных, не забудьте поставить завершающий символ «новой строки». Вводимые числа должны быть в диапазоне от 0 до 225, а формат сообщения должен быть следующим – Красный, Зеленый, Синий (т.е. три числа через запятую). Когда вы отправите эти данные на плату Arduino, присоединенный к ней светодиод загорится цветом, соответствующим этим данным, а на Serial Monitor будет выведено соответствующее этому цвету шестнадцатеричное значение.

/*
 Считывание строки данных в кодировке ASCII
 В этом скетче демонстрируется функция Serial.parseInt(). 
 Ее задача – анализировать данные в кодировке ASCII, разделенные запятыми,
 сохранять результат в int-переменные, а затем использовать их 
 для управления цветом RGB-светодиода.
 
 Цепь. Тут используется RGB-светодиод с общим анодом, поэтому: 
 * Красный катод подключаем к 3-ему цифровому контакту
 * Зеленый – к 5-ому цифровому контакту
 * Синий – к 6-ому цифровому контакту
 * Анод – к 5-вольтовому контакту
 
 Создан 13 августа 2012 Томом Иго (Tom Igoe)
 
 Этот код не защищен авторским правом.
 */

// задаем контакты для «суб-светодиодов»:
const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;

void setup() {
  // инициализируем последовательную передачу данных:
  Serial.begin(9600);
  // делаем цифровые контакты выходными:
  pinMode(redPin, OUTPUT); 
  pinMode(greenPin, OUTPUT); 
  pinMode(bluePin, OUTPUT); 
}

void loop() {
  // если доступны какие-нибудь данные, считываем их:
  while (Serial.available() > 0) {

    // ищем во входных данных подходящее целое число:
    int red = Serial.parseInt(); 
    // ищем еще раз:
    int green = Serial.parseInt(); 
    // и еще:
    int blue = Serial.parseInt(); 

    // ищем символ новой строки – он должен стоять в конце вашего сообщения:
    if (Serial.read() == '\n') {
      // ограничиваем данные диапазоном от 0 до 255,
      // а затем инвертируем их.
      // если вы используете RGB-светодиод с общим катодом,
      // вместо этих формул впишите просто "constrain(color, 0, 255)":
      red = 255 - constrain(red, 0, 255);
      green = 255 - constrain(green, 0, 255);
      blue = 255 - constrain(blue, 0, 255);

      // задаем красному, зеленому и синему «суб-светодиодам» необходимую яркость:
      analogWrite(redPin, red);
      analogWrite(greenPin, green);
      analogWrite(bluePin, blue);

      // выводим три этих числа одной строкой в шестнадцатеричном виде:
      Serial.print(red, HEX);
      Serial.print(green, HEX);
      Serial.println(blue, HEX);
    }
  }
}

См.также

  1. if
  2. while
  3. Serial
  4. Serial Call and Response ASCII

Внешние ссылки