Программирование Arduino урок 14 — чтение из последовательного порта

Приветствую поклонников Ардуино! В одной из предыдущих статей, мы научили контроллер выводить информацию через последовательный порт. Продолжим 🙂

До недавних пор, мы присваивали значения переменным, которые используются для выполнения различных действий, внутри самой программы. Например, чтобы изменить количество и длительность миганий светодиодов, необходимо «залезть» вовнутрь прошивки и изменить значения переменных ответственных за данные операции. С одной стороны, нечего посторонним «шариться» по коду, а вот с другой стороны – представьте себе, что вам будут ежедневно приносить десятки контроллеров, в которых нужно поменять одно-два значения.  Для решения данной дилемма нужно предоставить пользователю возможность изменять рабочие параметры без вмешательства в основной код. Чтобы сделать это, воспользуемся последовательным портом. Пара «контроллер-оператор» будет обмениваться информацией по последовательному порту.

Практическую часть сегодняшней статьи, мы будет «обкатывать» на всеми любимой схеме с двумя светодиодами.

Эта схема позволит нам управлять двумя независимыми светодиодами, что подключены к выводам платы Аrduino.

На данный момент, наша программа имеет следующий вид.

Напоминаю ещё раз, что приведённый код выступаем примером, чтобы было легче восстановить в памяти уже пройденный материал. Чтобы научится писать код – нужно писать код, а не «копипастить» разбросанную по просторам интернета информацию.

Пробежимся по коду:

  • В верхней части программы объявляем переменные и присваиваем им значения (мы пока работаем с переменными типа int и String)
  • В цикле «SETUP» настраиваем последовательный порт и конфигурим два вывода arduino на выход (OUTPUT).
  • В цикле «LOOP» создаём два цикла с фиксированным числом итераций (повторений): в одном мигаем зелёным светодиодом, а в другом — красным. Количество миганий и их длительность задаются в верхней части программы.

Нам нужно, чтобы контроллер спрашивал у пользователя, сколько раз нужно мигнуть зелёным светодиодом, а затем, сколько раз мигнуть красным.  Чтобы принять данные от пользователя, нужно выполнить три действия:

  • Отправить запрос пользователю для ввода данных;
  • Подождать, пока пользователь введёт значение;
  • Считать информацию из последовательного порта.

Участок кода, который будет отправлять запрос «ввода данных» расположим в цикле «LOOP». То бишь, запрос будет отправляться каждый раз после прогонки двух циклов FOR. Объявляем переменные, присвоив им нулевые значения. С одной стороны присвоение нуля переменным, которые будет вводить пользователь, излишняя предосторожность, но мало ли, какой там сбой может произойти… лучше всегда занулять 🙂

Заменяем:

int blinkNumberGreen = 3;

int blinkNumberRed = 3;

на

int blinkNumberGreen = 0;

int blinkNumberRed = 0;

Теперь разберемся с кодом самого «запроса».

Serial.println(«Сколько раз Вы хотите, чтобы зелёный светодиод мигал?»);

    while(Serial.available()==0)

    {  

    }

blinkNumberGreen=Serial.parseInt();

Первая строка – отправляем сообщение пользователю с информацией о том, что мы от него хотим.

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

Теперь перейдём непосредственно к условию Serial.available () == 0.

Serial.available () — это функция, которая возвращает «1», если пользователь вводит данные, и «0», если пользователь ничего не вводит. Таким образом, контроллер будет ждать, пока оператор не введёт данные, иными словами, пока Seraial.available () == 0, условие истинное, и программа останется в цикле while.
while(Serial.available()==0) { }

Обратите внимание, что мы ничего не делаем в цикле while, между двумя фигурными скобками нет команд. Цель этой строки — заставить программу «зациклится» до того момента, пока пользователь не введет данные.
После того, как пользователь введёт данные, Serial.avaialbe () станет «1», и программа перейдет к следующей строке кода.

blinkNumberGreen=Serial.parseInt();

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

Размещаем «запросы» в начале цикла LOOP для зелёного и красного светодиода соответственно.

Сохраняем прошивку, загружаем её в контроллер и открываем «монитор порта». Читаем сообщение, вводим значение в маленьком поле, а затем нажимаем отправить или клавишу ввода (энтер).

П.С. Лично у меня появляется, какой-то дискомфорт от того, что я не вижу введённых мною значений. Будем это исправлять.

Домашнее задание:

  • Сделайте так, чтобы пользователь сам вводил длительность пребывания светодиода в включенном/выключенном состояниях;
  • Сделайте так, чтобы запрос к пользователю происходил всего один раз, а в дальнейшем программа благополучно обходилась без пользователя.

lesson_14

Продолжение следует…

ПОДЕЛИТЕСЬ С ДРУЗЬЯМИ!


About alexlevchenko

Ценю в людях честность и открытость. Люблю мастерить разные самоделки. Нравится переводить статьи, ведь кроме того, что узнаешь что-то новое - ещё и даришь другим возможность окунуться в мир самоделок.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

* Copy This Password *

* Type Or Paste Password Here *