Приветствую поклонников Ардуино! В одной из предыдущих статей, мы научили контроллер выводить информацию через последовательный порт. Продолжим :-)
До недавних пор, мы присваивали значения переменным, которые используются для выполнения различных действий, внутри самой программы. Например, чтобы изменить количество и длительность миганий светодиодов, необходимо «залезть» вовнутрь прошивки и изменить значения переменных ответственных за данные операции. С одной стороны, нечего посторонним «шариться» по коду, а вот с другой стороны – представьте себе, что вам будут ежедневно приносить десятки контроллеров, в которых нужно поменять одно-два значения. Для решения данной дилемма нужно предоставить пользователю возможность изменять рабочие параметры без вмешательства в основной код. Чтобы сделать это, воспользуемся последовательным портом. Пара «контроллер-оператор» будет обмениваться информацией по последовательному порту.
Практическую часть сегодняшней статьи, мы будет «обкатывать» на всеми любимой схеме с двумя светодиодами.
Эта схема позволит нам управлять двумя независимыми светодиодами, что подключены к выводам платы А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
Продолжение следует...