Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/ReadASCIIString

Материал из Онлайн справочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

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


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

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

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

  • Плата Arduino;
  • Макетная плата Breadboard;
  • Провода-перемычки;
  • RGB-светодиод с общим анодом;
  • Три 220-омовых резистора;

Цепь

ReadASCIIString bb.png

Для создания этой цепи понадобится пять проводов. Возьмите красный провод и подсоедините его к одному из длинных вертикальных рядов на 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 будет выведено соответствующее этому цвету шестнадцатеричное значение.

  1. /*
  2.  Считывание строки данных в кодировке ASCII
  3.  В этом скетче демонстрируется функция Serial.parseInt().
  4.  Ее задача – анализировать данные в кодировке ASCII, разделенные запятыми,
  5.  сохранять результат в int-переменные, а затем использовать их
  6.  для управления цветом RGB-светодиода.
  7.  
  8.  Цепь. Тут используется RGB-светодиод с общим анодом, поэтому:
  9.  * Красный катод подключаем к 3-ему цифровому контакту
  10.  * Зеленый – к 5-ому цифровому контакту
  11.  * Синий – к 6-ому цифровому контакту
  12.  * Анод – к 5-вольтовому контакту
  13.  
  14.  Создан 13 августа 2012 Томом Иго (Tom Igoe)
  15.  
  16.  Этот код не защищен авторским правом.
  17.  */
  18.  
  19. // задаем контакты для «суб-светодиодов»:
  20. const int redPin = 3;
  21. const int greenPin = 5;
  22. const int bluePin = 6;
  23.  
  24. void setup() {
  25.   // инициализируем последовательную передачу данных:
  26.   Serial.begin(9600);
  27.   // делаем цифровые контакты выходными:
  28.   pinMode(redPin, OUTPUT);
  29.   pinMode(greenPin, OUTPUT);
  30.   pinMode(bluePin, OUTPUT);
  31. }
  32.  
  33. void loop() {
  34.   // если доступны какие-нибудь данные, считываем их:
  35.   while (Serial.available() > 0) {
  36.  
  37.     // ищем во входных данных подходящее целое число:
  38.     int red = Serial.parseInt();
  39.     // ищем еще раз:
  40.     int green = Serial.parseInt();
  41.     // и еще:
  42.     int blue = Serial.parseInt();
  43.  
  44.     // ищем символ новой строки – он должен стоять в конце вашего сообщения:
  45.     if (Serial.read() == '\n') {
  46.       // ограничиваем данные диапазоном от 0 до 255,
  47.       // а затем инвертируем их.
  48.       // если вы используете RGB-светодиод с общим катодом,
  49.       // вместо этих формул впишите просто "constrain(color, 0, 255)":
  50.       red = 255 - constrain(red, 0, 255);
  51.       green = 255 - constrain(green, 0, 255);
  52.       blue = 255 - constrain(blue, 0, 255);
  53.  
  54.       // задаем красному, зеленому и синему «суб-светодиодам» необходимую яркость:
  55.       analogWrite(redPin, red);
  56.       analogWrite(greenPin, green);
  57.       analogWrite(bluePin, blue);
  58.  
  59.       // выводим три этих числа одной строкой в шестнадцатеричном виде:
  60.       Serial.print(red, HEX);
  61.       Serial.print(green, HEX);
  62.       Serial.println(blue, HEX);
  63.     }
  64.   }
  65. }

См.также

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

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

  1. Arduino - Read ASCII String