В этом уроке вы будете опираться на урок 24, добавив возможность управления светодиодами с Вашего компьютера с помощью последовательного монитора Arduino. Последовательный монитор - это "трос" между компьютером и вашим MEGA2560. Он позволяет отправлять и получать текстовые сообщения, удобные для отладки, а также управления MEGA2560 с клавиатуры! Например, вы сможете отправлять команды с Вашего компьютера, чтобы включить светодиоды. В этом уроке вы будете использовать точно такие же детали и макет, как и в уроке 24.
После того как вы загрузили этот эскиз на свой MEGA2560, нажмите на самую
правуюкнопку на панели инструментов в Arduino IDE. Кнопка обведена кружком ниже:
Нажмите кнопку последовательный монитор, чтобы включить последовательный
монитор. Основные сведения о последовательном мониторе подробно представлены в
Уроке 1.
После подключения, пожалуйста, откройте программу в папке с кодом
Урок 25 и нажмите кнопку Загрузить, чтобы загрузить
программу. См. Урок 2 для
получения подробной информации о загрузке программы при наличии ошибок.
Как и следовало ожидать, эскиз основан на эскизе, использованном в Уроке 24.
Вам будет полезно обратиться к полному тексту в вашей Arduino IDE.
В функции "настройка" в конце есть три новые строки:
void setup()
{
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
updateShiftRegister();
Serial.begin(9600);168
while (! Serial); // Wait until Serial is ready - Leonardo
Serial.println("Enter LED Number 0 to 7 or 'x' to clear");
}
Во-первых, у нас есть команда " Serial.begin(9600)". Она запускает
последовательную связь, так что MEGA2560 может посылать команды через
USB-соединение. Значение 9600 называется "скоростью передачи данных" соединения.
Это то, как быстро данные должны быть отправлены. Вы можете изменить это
значение на более высокое, но вам также придется изменить последовательный
монитор Arduino на то же значение. Мы обсудим это позже, а пока оставим его на
9600. Строка, начинающаяся с "while", гарантирует, что на другом конце есть
что-то еще. USB-соединение для Arduino, чтобы поговорить с ним, прежде чем он
начнет отправлять сообщения. В противном случае сообщение может быть отправлено,
но не отображено. Эта линия на самом делен еобходима только в том случае, если
вы используете Arduino Leonardo, потому что Arduino MEGA2560 автоматически
сбрасывает плату Arduino при открытии последовательного монитора, в товремя как
с Leonardo этого не происходит. Последняя из новых строк в "setup" отправляет
сообщение, которое мы видим в верхней части последовательного монитора. Функция
"loop" - это место, где происходит все действие:
void loop()
{
if (Serial.available())
{
char ch = Serial.read(); if
(ch >= '0' && ch <= '7')
{
int led = ch - '0';
bitSet(leds, led);
updateShiftRegister();
Serial.print("Turned on LED ");
Serial.println(led);
}
if (ch == 'x')
{
leds = 0;
updateShiftRegister();169
Serial.println("Cleared");
}
}
}
Все, что происходит внутри цикла, содержится в операторе "if". Таким образом,
если вызов встроенной функции Arduino "Serial.available ()" не является
"истинным", то больше ничего не произойдет. Serial. available() вернет "true",
если данные были отправлены на MEGA2560 и готовы к обработке. Входящие
сообщения хранятся в так называемом буфере,и функция Serial.available()
возвращает true, если этот буфер не пуст. Если сообщение было получено, то оно
переходит к следующей строке кода:
char ch = Serial.read();
Это считывает следующий символ из буфера и удаляет его из буфера. Он также
присваивает его переменной 'ch'. Переменная 'ch' имеет тип 'char', который
расшифровывается как 'character' и, как следует из названия, содержит один
символ. Если вы следовали инструкциям в подсказке в верхней части
последовательного монитора, то этот символ будет либо однозначным числом от
0 до 7, либо буквой "х". Оператор "if" в следующей строке проверяет, является
ли он одной цифрой, проверяя, является ли "ch" больше или равно символу "0" и
меньше или равно символу "7". Это выглядит немного странно, сравнивая
персонажей таким образом, но вполне приемлемо. Каждый символ представлен
уникальным числом, называемым его значением ASCII. Это означает, что когда мы
сравниваем символы с помощью <= и >=, на самом деле сравниваются значения ASCII.
Если тест пройдет, то мы перейдем к следующей строке:
int led = ch - '0';
Теперь мы выполняем арифметику над символами! Мы вычитаем цифру "0" из любой
введенной цифры. Итак, если вы набрали "0", ТО "0" - "0" будет равно 0. Если вы
набрали "7", то "7" - "0" будет равно числу 7, потому что на самом деле это
значения ASCII, которые используются при вычитании. Поскольку мы знаем номер
светодиода, который хотим включить, нам просто нужно установить этот бит в
переменную "светодиоды" и обновить регистр сдвига.
bitSet(leds, led);
updateShiftRegister();
Следующие две строки пишут обратно подтверждающее сообщение на последовательный
монитор
Serial.print("Turned on LED ");
Serial.println(led);
В первой строке используется Serial. print, а не Serial.println. Разница
между ними заключается в том, что Serial.print не запускает новую строку после
печати того, что находится в ее параметре. Мы используем это в первой строке,
потому что мы печатаем сообщение в двух частях. Сначала общий бит: "включен
светодиод", а затем номер светодиода. Номер светодиода хранится в переменной
'int', а не в текстовой строке. Serial. print может принимать либо текстовую
строку, заключенную в двойные кавычки, либо 'int' или для это имеет значение
практически для любого типа переменной. После оператора "if", который
обрабатывает случай, когда была обработана одна цифра, есть второй оператор
"if", который проверяет, является ли "ch" буквой "x".
if (ch == 'x')
{
leds = 0;
updateShiftRegister();
Serial.println("Cleared");
}
Если это так, то он очищает все светодиоды и отправляет подтверждающее
сообщение.
Обсуждение на форуме
Copyright © R9AL 2020 Все права защищены