Начало программирования
в среде Arduino IDE
Компоненты программы:
- подключение библиотек;
- константы и глобальные переменные;
- функция setup (void setup);
- функция loop (void loop);
- дополнительные функции .
Подключение библиотек
Библиотека – это мощный инструмент, позволяющий быстро писать программы. Библиотека представляет собой код, подключаемый в программу, который содержит инструменты для работы с различными датчиками и модулями, различные математические инструменты и инструменты для работы микроконтроллера.
Константы и глобальные переменные
При написании программ возможно подключение констант и переменных.
Константа – объект, у которого имеется постоянная величина, не изменяющая своего значения. Каждая константа имеет свое имя.
Переменная – объект, который принимает определенное значение и хранит его. Диапазон допустимых значений зависит от типа переменной. Каждая переменная имеет свое уникальное имя. В отличие от констант, переменная может менять свое значение в ходе работы программы.
Константы и глобальные переменные
Глобальные переменные – переменные, которые инициализируются (создаются) только один раз и используются в любом разделе программы. Глобальные переменные задаются перед функцией настройки void setup.
Локальные переменные могут использоваться только в пределах тех функций, в которых они были объявлены, и создаются столько раз, сколько раз выполняется функция .
Функции
Функции – это способ группировки программных команд, имеющих свое название и выполняющих конкретную задачу. Они помогают сделать программу проще для чтения и понимания, а также позволяют занимать меньше памяти микроконтроллера.
Функции void
Тип данных void , переводится с английского, как пустота, и не возвращает никаких значений при ее исполнении или завершении. Данный тип данных используется в программе, как минимум, в двух обязательных функциях – void setup и void loop , но возможно его использование и в других функциях, написанных пользователем.
Функция void setup
Функция setup выполняется один раз – при запуске микроконтроллера, что позволяет нам описать настройки и режимы работы для платы Arduino, такие как, например, объявление режима работы пинов. То есть в части setup мы подготавливаем микроконтроллер к выполнению основной программы.
Функция void loop
Функция loop (основная программа) выполняется в бесконечном цикле после завершения работы функции setup. Именно здесь и пишется основная выполняемая программа, команды для работы с числами, модулями, радиодеталями.
Пример программы
Команды void setup
Как мы уже с вами знаем, внутри команды void setup происходит передача информации плате о том, как мы хотим с ней работать.
Например, нам необходимо передать информацию через 1 пин, а принять через второй. Для этого воспользуемся командой pinMode:
Внутри команды pinMode в скобках указывается сначала номер пина, а затем режим его работы:
INPUT – прием сигнала;
OUTPUT – передача сигнала.
void setup()
{
pinMode(1, INTPUT);
pinMode(2, OUTPUT);
}
Команды void loop
Внутри команды void loop может использоваться огромное множество команд. Рассмотрим команды приема и передачи данных через цифровые, аналоговые (А) пины и пины с ШИМ (~):
void loop()
{
digitalWrite(пин, HIGH или LOW); // передача цифрового сигнала (1 или 0);
digitalRead(пин); // чтение цифрового сигнала (0 или 1);
analogWrite(пин, 0-255); // передача аналогового сигнала через ШИМ;
analogRead(пин); // чтение аналогового сигнала (0-1023);
}
Команды приема-передачи данных
void setup {} - функция настройки платы;
void loop {} – бесконечно повторяющаяся; функция;
pinMode(пин, OUTPUT или INPUT) – объявление режима работы пина;
digitalWrite(пин, HIGH или LOW) – передача цифрового сигнала высокого или низкого уровня;
analogWrite(пин, 0-255) – передача аналогового сигнала в диапазоне 0-255;
digitalRead(пин) – прием цифрового сигнала (0-1);
analogRead(пин) – прием аналогового сигнала в диапазоне 0-1023;
delay(мс) – задержка между выполнением команд в милисекундах.
void setup {
pinMode(3,OUTPUT);
pinMode(2, INPUT);
pinMode(A4, INPUT);
};
void loop {
digitalWrite(3, 1);
analogWrite(3, 255);
digitalRead(2);
analogRead(A4);
delay(1000);
}
Запрограммируем светофор? Попробуйте сами
Задача 1: запрограммировать светофор, который будет включать и выключать по очереди три сигнала: красный, желтый, зеленый каждые 3 секунды.
Задача 2: Светофор должен включать: красный – 4 с., желтый – 2 с., зеленый – 6 с. После середины времени работы зеленого сигнала светофора должен начать мигать желтый сигнал 3 раза, вплоть до окончания работы зеленого сигнала.
Задача 1: включение сигналов поочередно
Задача 2: моргаем желтым сигналом
Типы данных
Тип данных
boolean
Занимаемая память
Диапазон
1 байт
char
0..1
1 байт
byte
Особенности
int
Принимает логические значения true или false / истина или ложь
-128…127
1 байт
2 байта
Хранит в себе алфавитно-цифровой символ из таблицы ASCII. ( char a = "i“)
0…255
unsigned int
2 байта
Целочисленный тип данных
-32 768…32 767
word
Целочисленный тип данных
0…65 535
2 байта
long
Целочисленный тип данных
unsigned long
0…65 535
4 байта
-2 147 438 648…
float
Целочисленный тип данных, аналог unsigned int
4 байта
2 147 483 647
Целочисленный тип данных
4 байта
0…4 294 967 295
double
String
8 байт
-3.4028235E+38…
Целочисленный тип данных
3.4028235E+38
-3.4028235E+38…
Вещественный тип данных. Хранит в себе числа с плавающей точкой (дроби) с точностью до 6 знаков
3.4028235E+38
Вещественный тип данных. Хранит в себе числа с плавающей точкой (дроби) с точностью до 6 знаков. Аналог float
Строка – совокупность символов. Аналог char, но состоит из одного или нескольких элементов
Математические операторы
Математические операторы используются для выполнения различных вычислений в ходе работы программы.
a + b // оператор сложения +
a - b // оператор вычитания –
a * b // оператор умножения *
a / b // оператор деления
a % b // нахождение остатка от деления
a = b // оператор присваивания (a = 5)
b // a больше b a a = b // a больше или равно b a a == b // a равно b a != b // a не равно b " width="640"
Операторы сравнения
Задача операторов сравнения – сравнить значения чисел, строк или переменных. Если они удовлетворяют условию, то выполняется действие, если нет, то выполняется другое, или не выполняется ничего.
a b // a больше b
a
a = b // a больше или равно b
a
a == b // a равно b
a != b // a не равно b
10 and a 10 и a if (a 10 && a 10 и a || или or – логическое «или»; if (a 10 || a 10 или a if (a 10 or a 10 или a ! или not – логическое отрицание «не». (a b); // истина !(a b); // ложь " width="640"
Логические операторы
Кроме того, для сравнений также используются некоторые логические операторы, когда есть необходимость объединить несколько условий:
&& или and – логическое «и»
if (a 10 and a 10 и a
if (a 10 && a 10 и a
|| или or – логическое «или»;
if (a 10 || a 10 или a
if (a 10 or a 10 или a
! или not – логическое отрицание «не».
(a b); // истина
!(a b); // ложь
Серийный порт
Серийный порт – интерфейс, позволяющий последовательно передавать данные от устройства к компьютеру и наоборот побитно.
Серийный порт позволяет вывести на экран информацию для пользователя или отладки программы, если это обозначено в программе.
Кроме обычных, символьных, строковых и числовых данных, данных в среде Arduino IDE и Tinkercad возможно построение различных графиков.
Серийный порт (передача данных)
Для работы серийного порта необходимо задать команду Serial.begin в функции void setup. В данной команде мы указываем с какой скоростью будут передаваться данные в обе стороны. Стандартной для Arduino считается скорость 9600 бод, но возможно использование и других значений.
void setup() {
Для вывода информации на экран используется команда Serial.print(), а команда Serial.println() переносит следующее значение на новую строку.
Serial.begin(9600);
}
void loop() {
Serial.print("x="); // одна строка
Serial.println(x); // на новой строке
Serial.println("78"); // на новой строке
Serial.println(66); // на новой строке
}
N.B.
Если вы хотите вывести строковое значение – возьмите его в апострофы
Серийный порт (чтение данных)
Помимо передачи данных, данные приходящие в серийный порт можно и считывать. Это необходимо, например, когда мы каждый раз подставляем новые значения для работы программы. В этом случае мы сами дадим плате новые значения, и нам не придется переписывать программу, загружать ее в плату снова.
Для чтения значений используется команды:
void loop() {
Serial.read(); // чтение строки, передаваемой в серийный порт
Serial.parseInt(); // чтение числа типа int, передаваемого в серийный порт
Serial.parseFloat(); // // чтение числа типа float, передаваемого в серийный порт
}
Конструкции и циклы
Различные конструкции нужны нам, когда мы хотим, чтобы действия повторялись, выполнялись или не выполнялись в зависимости от условий.
В языке C++ существуют следующие конструкции и циклы:
- оператор ветвления if (если);
- цикл for (счетчик) – повторяет действия n раз;
- цикл while (пока) – выполняется пока условие не истинно
- Оператор выбора switch – позволяет выполнить команды в соответствии с четко определенным значением переменной.
Оператор ветвления if
Оператор ветвления if выполняет команды в зависимости от истинности заданного условия. Если условие истинно, то начинает свою работу основная часть команд конструкции if, если же нет, то часть else (иначе).
if ( знак сравнения ) {
команды;
} else if ( знак сравнения ) {
команды;
} else {
команды;
}
50) { // иначе если i 50 i=i/2; // i делим на 2 } else { // иначе i=i+1; // прибавляем i единицу } " width="640"
Оператор ветвления if
Оператор ветвления if выполняет команды в зависимости от истинности заданного условия. Если условие истинно, то начинает свою работу основная часть команд конструкции if, если же нет, то часть else (иначе).
if (i
i=i*2; // i умножаем на 2
} else if (i 50) { // иначе если i 50
i=i/2; // i делим на 2
} else { // иначе
i=i+1; // прибавляем i единицу
}
Схема подключения кнопки
Задачи на ветвление
Задача 1: Задано целое число через серийный порт. Если оно является положительным, то вычесть из него 1. Если число отрицательное – прибавить 2. Вывести полученное число в серийный порт.
Задача 2: Задано натуральное число А через серийный порт. Проверить, является ли число четным. Результат вывести на экран.
Задача 3: Через серийный порт вводится пора года. Вывести названия месяцев для этой поры года.
Задача 4: Напишите программу, которая принимает с клавиатуры три числа: два первых должны быть длиной сторон катетов прямоугольного треугольника, а третье – длиной гипотенузы. Программа должна проверить, соответствуют ли введенные
значения этому требованию. Результат вывести в серийный порт.
Задачи на ветвление
Задача 5: Составить программу, которая будет управлять свечением светодиода. Если кнопка нажата – светодиод горит.
Задача 6: Составить программу, которая будет управлять свечением светодиода по нажатию кнопки. Первое нажатие – включает светодиод, второе отключает.
Задача 7: Напишите программу, которая принимает с клавиатуры двузначное положительное число и проверяет, какая из его двух цифр является большей. В соответствии с результатом проверки надо вывести в серийный порт соответствующее текстовое сообщение. Не следует выводить на экран никакого сообщения, если число составлено из одинаковых цифр.
Задача 8: Решить квадратное уравнение вида ax 2 + bx + c = 0. Действия по решению демонстрировать через серийный порт.
Цикл for (счетчик)
Цикл for предназначен для выполнения действий в цикле, если мы знаем сколько раз должно выполняться действие.
Для счета мы должны создать переменную-счетчик и присвоить ей первоначальное значение, затем указать условия для счетчика при которых выполняется работа, а затем действие с переменной счетчиком при каждом новом повторении цикла.
for (int =; знак сравнения ; оператор ) {
команда;
}
Цикл for (счетчик)
Цикл for предназначен для выполнения действий в цикле, если мы знаем сколько раз должно выполняться действие.
for (int i=1; i
digitalWrite(i, 1); // выполнять действие
}
Задачи на цикл for
Задача 1: Вывести все целые числа от a до b в столбец в серийном порте. Значения чисел a и b задаются в через серийный порт.
Задача 2: Зажечь последовательно 5 светодиодов через каждые 0,5 секунд.
Задача 3: Вывести через серийный порт таблицу умножения до ста числа а. Число а задается через серийный порт.
Задача 4: Вывести в серийный порт четные числа от 2 до 60 по 5 в строке.
Задача 5: Зажечь плавно светодиоды при помощи ШИМ.
Задача 6: Три раза подать сигнал «SOS» при помощи светодиодов и азбуки Морзе.
Цикл while (пока)
Цикл while позволяет выполнять команды пока выполняются условия. В отличие от цикла for, мы не знаем сколько раз будут выполняться команды.
while ( )
{
команда;
}
Цикл while (пока)
Цикл while позволяет выполнять команды пока выполняются условия. В отличие от цикла for, мы не знаем сколько раз будут выполняться команды.
while (y
y=y+2; // прибавить к y 2 analogWrite(7,y); // вывести значение y на 7 пин
}
Задачи на цикл while
Задача 1: Пока кнопка нажата должен гореть светодиод.
Задача 2: Пока кнопка нажата, должны с задержкой 0,3 секунды по очереди загораться светодиоды и выключаться в обратную сторону.
Задача 3: Найти факториал числа, заданного через серийный порт. Результат вывести на экран.
Задача 4: Высчитать количество цифр в числе, заданном через серийный порт. Результат вывести на экран.
Задача 5: Составить программу разложения натурального числа n на простые множители. Множители вывести на экран через серийный порт.
Оператор switch (выбора)
Оператор switch позволяет создать более удобное ветвление в зависимости от значения переменной. Применяется для удобства записи при большом количестве переменных, как аналог конструкции if.
switch (переменная) {
case :
выполнимые команды;//выполняется если значение переменной совпадает
break; // прервать работу оператора
case :
выполнимые команды;//выполняется если значение переменной совпадает
break; // прервать работу оператора
default:
выполнимые команды; //выполняется если значение переменной не совпадает ни с одним значением case
break; // прервать работу оператора
}
Оператор switch (выбора)
Оператор switch позволяет создать более удобное ветвление в зависимости от значения переменной. Применяется для удобства записи при большом количестве переменных, как аналог конструкции if.
switch (i) {
case :
выполнимые команды; //выполняется если значение переменной равно 5
break; // прервать работу оператора
case :
выполнимые команды; //выполняется если значение переменной равно 15
break; // прервать работу оператора
default:
выполнимые команды; //выполняется если значение не совпадает ни с одним из вариантов выбора
break; // прервать работу оператора
}
Задачи на оператор case
Задача 1: собрать схему из 5 светодиодов и 5 кнопок. Каждая из кнопок по нажатию должна включать свой определенный светодиод.
Задача 2: Написать программу, которая будет выводить в серийный порт расписание уроков в зависимости от заданного в серийный порт дня.
Задача 3: Найти произведение цифр заданного n -значного числа. Допускаются числа до пяти знаков включительно с помощью оператора switch.
Задача 5: Составить программу которая проверяет тест. Составить тест из 5 вопросов, вопросы выводятся на экране вместе с вариантами ответов. Каждый верный ответ – 1 балл. Итоговую оценку вывести на экран.
Спасибо за работу!