3.07. Решения задач.md
Этот файл содержит решения для задач Главы №3, чтобы вы могли проверить свои программы или использовать их как подсказку. Каждое решение включает полный код и краткое объяснение, как выполнить задачу на плате Рудирон. Используйте эти решения после того, как попробуете решить задачи самостоятельно!
Практикум 3.1
Решение задачи №3.1.1. Скорость робота
Задача: Создать переменную speed
типа float
со значением 7.1
(скорость робота в км/ч) и вывести её в монитор порта.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте переменную speed
типа float
и присвойте ей значение 7.1
.
4. Выведите значение speed
в монитор порта с помощью Serial.println(speed)
.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта (Инструменты → Монитор порта или Ctrl+Shift+M) с настройкой скорости 9600 и проверьте, что отображается «7.1».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
float speed = 7.1; // Переменная speed хранит скорость робота
Serial.println(speed); // Вывести скорость в монитор порта
}
void loop() {
// Пока пусто
}
Объяснение:
Код инициализирует Serial для связи, создаёт переменную speed
типа float
(подходит для дробных чисел, таких как 7.1), и выводит её значение. Функция loop
остаётся пустой, так как вывод нужен только один раз.
Решение задачи №3.1.2. Метеостанция
Задача: Создать переменные temp
типа float
со значением 25.3
, humidity
типа int
со значением 60
, и weather
типа String
со значением «Погода ясная», затем вывести их в монитор порта.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте переменные:
temp
типаfloat
со значением25.3
.humidity
типаint
со значением60
.weather
типаString
со значением «Погода ясная».
- Выведите значения переменных в монитор порта с помощью
Serial.println()
, каждое на новой строке. - Загрузите код на плату Рудирон.
- Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображаются «25.3», «60», «Погода ясная».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
float temp = 25.3; // Переменная temp хранит температуру
int humidity = 60; // Переменная humidity хранит влажность
String weather = "Погода ясная"; // Переменная weather хранит сообщение
Serial.println(temp); // Вывести температуру
Serial.println(humidity); // Вывести влажность
Serial.println(weather); // Вывести сообщение
}
void loop() {
// Пока пусто
}
Объяснение:
Код создаёт три переменные с разными типами данных, подходящими для их значений: float
для дробной температуры, int
для целой влажности, и String
для текстового сообщения. Serial.println()
выводит каждое значение на новой строке, а loop
остаётся пустым, так как вывод нужен один раз.
Решение задачи №3.1.3. Проверка размера памяти
Задача: Вывести размеры типов данных int
, char
и byte
в монитор порта с поясняющим текстом, например, «Размер int: 4».
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Используйте функцию sizeof
для получения размеров типов int
, char
и byte
.
4. Выведите размеры в монитор порта с помощью Serial.print()
для текста и Serial.println()
для значений, чтобы получить строки вроде «Размер int: 4».
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображаются «Размер int: 4», «Размер char: 1», «Размер byte: 1».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
Serial.print("Размер int: ");
Serial.println(sizeof(int)); // Вывести размер int
Serial.print("Размер char: ");
Serial.println(sizeof(char)); // Вывести размер char
Serial.print("Размер byte: ");
Serial.println(sizeof(byte)); // Вывести размер byte
}
void loop() {
// Пока пусто
}
Объяснение:
Код использует sizeof
для определения размеров типов данных, которые в Рудирон составляют: int
— 4 байта, char
— 1 байт, byte
— 1 байт. Serial.print()
и Serial.println()
комбинируются для вывода читаемого текста. Функция loop
остаётся пустой, так как вывод нужен один раз.
Практикум 3.2
Решение задачи №3.2.1. Площадь поля для робота
Задача: Создать переменные width
типа int
со значением 4
и length
типа int
со значением 6
, вычислить площадь (width × length
) и периметр (2 × (width + length)
), сохранить в area
и perimeter
типа int
, и вывести их в монитор порта.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте переменные width
типа int
со значением 4
и length
типа int
со значением 6
.
4. Вычислите площадь (width * length
) и сохраните в переменную area
типа int
.
5. Вычислите периметр (2 * (width + length)
) и сохраните в переменную perimeter
типа int
.
6. Выведите значения area
и perimeter
в монитор порта с помощью Serial.println()
.
7. Загрузите код на плату Рудирон.
8. Откройте монитор порта (Инструменты → Монитор порта или Ctrl+Shift+M) с настройкой скорости 9600 и проверьте, что отображаются «24» и «20».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
int width = 4; // Ширина поля
int length = 6; // Длина поля
int area = width * length; // Вычислить площадь
int perimeter = 2 * (width + length); // Вычислить периметр
Serial.println(area); // Вывести площадь
Serial.println(perimeter); // Вывести периметр
}
void loop() {
// Пока пусто
}
Объяснение:
Код инициализирует Serial, создаёт переменные width
и length
, использует операторы *
и +
для вычисления площади и периметра, и сохраняет результаты в area
и perimeter
. Serial.println()
выводит «24» и «20». Функция loop
остаётся пустой, так как вывод нужен один раз.
Решение задачи №3.2.2. Площадь зоны покрытия датчика
Задача: Создать переменную radius
типа float
со значением 2.5
, вычислить площадь круга (PI × radius × radius
) с PI = 3.14159
, сохранить в area
типа float
, и вывести в монитор порта.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте переменную radius
типа float
со значением 2.5
.
4. Определите константу PI
типа float
со значением 3.14159
.
5. Вычислите площадь (PI * radius * radius
) и сохраните в переменную area
типа float
.
6. Выведите значение area
в монитор порта с помощью Serial.println()
.
7. Загрузите код на плату Рудирон.
8. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображается примерно «19.6349375».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
float radius = 2.5; // Радиус зоны покрытия
float PI = 3.14159; // Константа PI
float area = PI * radius * radius; // Вычислить площадь
Serial.println(area); // Вывести площадь
}
void loop() {
// Пока пусто
}
Объяснение:
Код создаёт переменную radius
и константу PI
, использует оператор *
для вычисления площади круга, и сохраняет результат в area
. Serial.println()
выводит значение, близкое к «19.6349375». Функция loop
остаётся пустой.
Решение задачи №3.2.3. Сравнение температур в умном доме
Задача: Создать переменные tempLiving
типа float
со значением 25.5
и tempBedroom
типа float
со значением 24.0
, сравнить их с помощью операторов отношения и условного выражения, и вывести сообщение: «Гостиная теплее», «Спальня теплее» или «Температуры равны».
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте переменные tempLiving
типа float
со значением 25.5
и tempBedroom
типа float
со значением 24.0
.
4. Используйте вложенные условные выражения (?:
) с операторами >
и ==
для выбора сообщения на основе сравнения температур.
5. Выведите сообщение в монитор порта с помощью Serial.println()
.
6. Загрузите код на плату Рудирон.
7. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображается «Гостиная теплее».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
float tempLiving = 25.5; // Температура в гостиной
float tempBedroom = 24.0; // Температура в спальне
String message = (tempLiving > tempBedroom) ? "Гостиная теплее" : (tempLiving == tempBedroom) ? "Температуры равны" : "Спальня теплее";
Serial.println(message); // Вывести сообщение
}
void loop() {
// Пока пусто
}
Объяснение:
Код создаёт переменные tempLiving
и tempBedroom
, использует условные выражения с операторами >
и ==
для сравнения температур, и выбирает сообщение. Serial.println()
выводит «Гостиная теплее». Функция loop
остаётся пустой.
Решение задачи №3.2.4. Управление освещением в умном доме
Задача: Создать переменные isDark
типа bool
со значением true
и motionDetected
типа bool
со значением false
, проверить с помощью логических операторов, истинны ли оба условия, и вывести сообщение: «Свет включён» или «Свет выключен».
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте переменные isDark
типа bool
со значением true
и motionDetected
типа bool
со значением false
.
4. Используйте оператор &&
и условное выражение для проверки, истинны ли оба условия, и выберите сообщение.
5. Выведите сообщение в монитор порта с помощью Serial.println()
.
6. Загрузите код на плату Рудирон.
7. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображается «Свет выключен».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
bool isDark = true; // Темно в комнате
bool motionDetected = false; // Движение не обнаружено
String message = (isDark && motionDetected) ? "Свет включён" : "Свет выключен";
Serial.println(message); // Вывести сообщение
}
void loop() {
// Пока пусто
}
Объяснение:
Код создаёт переменные isDark
и motionDetected
, использует &&
для проверки условий, и выбирает сообщение с помощью условного выражения. Serial.println()
выводит «Свет выключен», так как motionDetected
ложно. Функция loop
остаётся пустой.
Решение задачи №3.2.5. Счётчик нажатий кнопки
Задача: Создать переменную presses
типа int
со значением 0
, трижды увеличить на 1 и вывести каждое значение, затем уменьшить на 1 и вывести итоговое значение.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте переменную presses
типа int
со значением 0
.
4. Трижды увеличьте presses
с помощью оператора ++
, выводя каждое значение с помощью Serial.println()
.
5. Уменьшите presses
с помощью оператора --
и выведите итоговое значение.
6. Загрузите код на плату Рудирон.
7. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображаются «1», «2», «3», «2».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
int presses = 0; // Счётчик нажатий
presses++; // Увеличить на 1
Serial.println(presses); // Вывести 1
presses++; // Увеличить на 1
Serial.println(presses); // Вывести 2
presses++; // Увеличить на 1
Serial.println(presses); // Вывести 3
presses--; // Уменьшить на 1
Serial.println(presses); // Вывести 2
}
void loop() {
// Пока пусто
}
Объяснение:
Код инициализирует presses
с нуля, трижды применяет ++
для увеличения (выводя «1», «2», «3»), затем использует --
для уменьшения и выводит «2». Serial.println()
отображает каждое значение. Функция loop
остаётся пустой.
Практикум 3.3
Решение задачи №3.3.1. Предупреждение о высокой температуре
Задача: Создать переменную temp
типа float
со значением 28.0
, использовать if
, чтобы проверить, больше ли temp
значения 28, и вывести «Температура высокая!» если условие истинно.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте переменную temp
типа float
со значением 28.0
.
4. Используйте структуру if
, чтобы проверить, больше ли temp
значения 28, и выведите сообщение «Температура высокая!» с помощью Serial.println()
.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта (Инструменты → Монитор порта или Ctrl+Shift+M) с настройкой скорости 9600 и проверьте, что ничего не отображается, так как temp = 28.0
не больше 28.
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
float temp = 28.0; // Температура в теплице
if (temp > 28) {
Serial.println("Температура высокая!");
}
}
void loop() {
// Пока пусто
}
Объяснение:
Код инициализирует Serial, создаёт переменную temp
, и использует if
для проверки условия temp > 28
. Поскольку temp = 28.0
не удовлетворяет условию, ничего не выводится. Функция loop
остаётся пустой, так как вывод нужен один раз.
Решение задачи №3.3.2. Статус батареи робота
Задача: Создать переменную battery
типа int
со значением 75
, использовать if-else
для проверки заряда и вывести «Заряд полный» (больше 80), «Заряд средний» (30–80), или «Заряд низкий» (меньше 30).
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте переменную battery
типа int
со значением 75
.
4. Используйте структуру if-else
с условиями: battery > 80
, battery >= 30
, и остальное для вывода сообщений с помощью Serial.println()
.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображается «Заряд средний».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
int battery = 75; // Уровень заряда батареи
if (battery > 80) {
Serial.println("Заряд полный");
} else if (battery >= 30) {
Serial.println("Заряд средний");
} else {
Serial.println("Заряд низкий");
}
}
void loop() {
// Пока пусто
}
Объяснение:
Код создаёт переменную battery
и использует if-else
для проверки условий. Поскольку battery = 75
удовлетворяет battery >= 30
, выводится «Заряд средний». Функция loop
остаётся пустой.
Решение задачи №3.3.3. Управление скоростью вентилятора
Задача: Создать переменную temp
типа float
со значением 27.5
, использовать if-else
для проверки температуры и вывести «Вентилятор на высокой скорости» (больше 28), «Вентилятор на низкой скорости» (25–28), или «Вентилятор выключен» (меньше 25).
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте переменную temp
типа float
со значением 27.5
.
4. Используйте структуру if-else
с условиями: temp > 28
, temp >= 25
, и остальное для вывода сообщений с помощью Serial.println()
.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображается «Вентилятор на низкой скорости».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
float temp = 27.5; // Температура в комнате
if (temp > 28) {
Serial.println("Вентилятор на высокой скорости");
} else if (temp >= 25) {
Serial.println("Вентилятор на низкой скорости");
} else {
Serial.println("Вентилятор выключен");
}
}
void loop() {
// Пока пусто
}
Obъяснение:
Код создаёт переменную temp
и использует if-else
для проверки условий. Поскольку temp = 27.5
удовлетворяет temp >= 25
, выводится «Вентилятор на низкой скорости». Функция loop
остаётся пустой.
Решение задачи №3.3.4. Контроль влажности почвы
Задача: Создать переменную moisture
типа int
со значением 40
, использовать switch
для проверки значений (20, 40, 60) и вывести соответствующее сообщение или «Неизвестный уровень».
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте переменную moisture
типа int
со значением 40
.
4. Используйте структуру switch
с case
для значений 20, 40, 60 и default
для вывода сообщений с помощью Serial.println()
.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображается «Влажность нормальная».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
int moisture = 40; // Уровень влажности почвы
switch (moisture) {
case 20:
Serial.println("Сухо, включить полив");
break;
case 40:
Serial.println("Влажность нормальная");
break;
case 60:
Serial.println("Влажно, полив не нужен");
break;
default:
Serial.println("Неизвестный уровень");
}
}
void loop() {
// Пока пусто
}
Объяснение:
Код создаёт переменную moisture
и использует switch
для выбора сообщения. Поскольку moisture = 40
, выполняется case 40
, и выводится «Влажность нормальная». Команда break
завершает каждый case
. Функция loop
остаётся пустой.
Решение задачи №3.3.5. Команды для робота
Задача: Создать переменную command
типа char
со значением 'B'
, использовать switch
для проверки значений ('A'
, 'B'
, 'C'
, 'D'
) и вывести соответствующее сообщение или «Неизвестная команда».
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте переменную command
типа char
со значением 'B'
.
4. Используйте структуру switch
с case
для значений 'A'
, 'B'
, 'C'
, 'D'
и default
для вывода сообщений с помощью Serial.println()
.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображается «Робот поворачивает».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
char command = 'B'; // Команда для робота
switch (command) {
case 'A':
Serial.println("Робот движется вперёд");
break;
case 'B':
Serial.println("Робот поворачивает");
break;
case 'C':
Serial.println("Робот остановлен");
break;
case 'D':
Serial.println("Робот подаёт сигнал");
break;
default:
Serial.println("Неизвестная команда");
}
}
void loop() {
// Пока пусто
}
Объяснение:
Код создаёт переменную command
и использует switch
для выбора сообщения. Поскольку command = 'B'
, выполняется case 'B'
, и выводится «Робот поворачивает». Команда break
завершает каждый case
. Функция loop
остаётся пустой.
Практикум 3.4
Решение задачи №3.4.1. Подсчёт нажатий кнопки до лимита
Задача: Создать переменную count
типа int
со значением 0
, использовать while
для увеличения count
на 1 и вывода значения, пока count
не равно 5.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте переменную count
типа int
со значением 0
.
4. Используйте цикл while
, чтобы проверять count < 5
, увеличивать count
на 1 и выводить значение с помощью Serial.println()
.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта (Инструменты → Монитор порта или Ctrl+Shift+M) с настройкой скорости 9600 и проверьте, что отображаются «1», «2», «3», «4», «5».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
int count = 0; // Счётчик нажатий
while (count < 5) {
count++; // Увеличить счётчик
Serial.println(count); // Вывести значение
}
}
void loop() {
// Пока пусто
}
Объяснение:
Код инициализирует Serial и переменную count
. Цикл while
проверяет count < 5
, увеличивает count
с помощью ++
и выводит значение. Когда count
достигает 5, цикл завершается. Функция loop
остаётся пустой, так как вывод нужен один раз.
Решение задачи №3.4.2. Сигнал тревоги светодиодом
Задача: Использовать for
для вывода 4 пар сообщений «Включён» и «Выключён» с интервалом 0.5 секунды.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Используйте цикл for
с переменной i
от 0 до 3 (4 итерации), чтобы выводить «Включён», ждать 0.5 секунды (delay(500)
), выводить «Выключён» и ждать ещё 0.5 секунды.
4. Загрузите код на плату Рудирон.
5. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображаются 4 пары: «Включён», «Выключён».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
for (int i = 0; i < 4; i++) {
Serial.println("Включён");
delay(500); // Ждать 0.5 секунды
Serial.println("Выключён");
delay(500); // Ждать 0.5 секунды
}
}
void loop() {
// Пока пусто
}
Объяснение:
Код использует for
для 4 итераций, выводя «Включён» и «Выключён» с паузами delay(500)
. Переменная i
отслеживает итерации. Функция loop
остаётся пустой, так как вывод нужен один раз.
Решение задачи №3.4.3. Симуляция показаний температуры
Задача: Использовать for
и random(20, 31)
для вывода 5 случайных температур с интервалом 2 секунды, инициализировав randomSeed(analogRead(A0))
.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
и генератор случайных чисел с помощью randomSeed(analogRead(A0))
.
3. Используйте цикл for
с переменной i
от 0 до 4 (5 итераций), чтобы генерировать случайное значение temp
с помощью random(20, 31)
, выводить его и ждать 2 секунды (delay(2000)
).
4. Загрузите код на плату Рудирон.
5. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображаются 5 чисел от 20 до 30.
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
randomSeed(analogRead(A0)); // Инициализировать генератор случайных чисел
for (int i = 0; i < 5; i++) {
int temp = random(20, 31); // Сгенерировать температуру
Serial.println(temp); // Вывести значение
delay(2000); // Ждать 2 секунды
}
}
void loop() {
// Пока пусто
}
Объяснение:
Код инициализирует Serial и randomSeed
для псевдослучайности. Цикл for
выполняет 5 итераций, генерируя temp
с помощью random(20, 31)
и выводя его. delay(2000)
создаёт паузы. Функция loop
остаётся пустой.
Решение задачи №3.4.4. Обратный отсчёт для запуска робота
Задача: Создать переменную timer
типа int
со значением 5
, использовать for
для уменьшения timer
на 1 каждую секунду и вывода значения.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте переменную timer
типа int
со значением 5
.
4. Используйте цикл for
с переменной t
от 5 до 1, уменьшая t
на 1, выводя значение и ожидая 1 секунду (delay(1000)
).
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображаются «5», «4», «3», «2», «1».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
for (int t = 5; t >= 1; t--) {
Serial.println(t); // Вывести значение таймера
delay(1000); // Ждать 1 секунду
}
}
void loop() {
// Пока пусто
}
Объяснение:
Код использует for
для обратного отсчёта от 5 до 1, уменьшая t
с помощью t--
и выводя значение. delay(1000)
создаёт паузы. Функция loop
остаётся пустой.
Решение задачи №3.4.5. Проверка состояния датчиков
Задача: Использовать for
для проверки 3 датчиков, генерируя случайные состояния (0 или 1) с random(0, 2)
и выводя «Датчик X: ОК» или «Датчик X: Ошибка», инициализировав randomSeed(analogRead(A0))
.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
и генератор случайных чисел с помощью randomSeed(analogRead(A0))
.
3. Используйте цикл for
с переменной i
от 1 до 3, чтобы генерировать случайное значение status
с помощью random(0, 2)
и выводить сообщение с помощью условного выражения (?:
).
4. Загрузите код на плату Рудирон.
5. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображаются 3 строки, например, «Датчик 1: ОК», «Датчик 2: Ошибка», «Датчик 3: ОК».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
randomSeed(analogRead(A0)); // Инициализировать генератор случайных чисел
for (int i = 1; i <= 3; i++) {
int status = random(0, 2); // Сгенерировать состояние
String message = status == 0 ? "Датчик " + String(i) + ": ОК" : "Датчик " + String(i) + ": Ошибка";
Serial.println(message); // Вывести состояние
}
}
void loop() {
// Пока пусто
}
Объяснение:
Код инициализирует Serial и randomSeed
. Цикл for
выполняет 3 итерации, генерируя status
с помощью random(0, 2)
и формируя сообщение с помощью условного выражения. Serial.println()
выводит состояние каждого датчика. Функция loop
остаётся пустой.
Практикум 3.5
Решение задачи №3.5.1. Управление светодиодами в умном доме
Задача: Создать массив ledStates
типа int
с элементами {1, 0, 1}
, использовать for
для вывода состояния каждого светодиода («Включён» или «Выключен»).
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте массив ledStates
типа int
с элементами {1, 0, 1}
.
4. Используйте цикл for
для перебора индексов 0–2, выводя сообщение для каждого светодиода с помощью условного выражения (?:
).
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта (Инструменты → Монитор порта или Ctrl+Shift+M) с настройкой скорости 9600 и проверьте, что отображаются:
- «Светодиод 1: Включён»
- «Светодиод 2: Выключен»
- «Светодиод 3: Включён»
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
int ledStates[3] = {1, 0, 1}; // Состояния светодиодов
for (int i = 0; i < 3; i++) {
String message = ledStates[i] == 1 ? "Включён" : "Выключен";
Serial.print("Светодиод ");
Serial.print(i + 1);
Serial.print(": ");
Serial.println(message);
}
}
void loop() {
// Пока пусто
}
Объяснение:
Код инициализирует Serial и массив ledStates
. Цикл for
проходит по индексам, используя условное выражение для выбора «Включён» или «Выключен» на основе значения элемента. Serial.println()
выводит сообщения. Функция loop
остаётся пустой, так как вывод нужен один раз.
Решение задачи №3.5.2. Проверка температур в теплице
Задача: Создать массив temps
типа float
с элементами {22.5, 24.0, 23.2, 26.5}
, использовать for
для вывода температур и предупреждения, если температура превышает 25 °C.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте массив temps
типа float
с элементами {22.5, 24.0, 23.2, 26.5}
.
4. Используйте цикл for
для перебора индексов 0–3, выводя температуру каждой зоны и проверяя с помощью if
, превышает ли она 25 °C.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображается предупреждение только для зоны 4.
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
float temps[4] = {22.5, 24.0, 23.2, 26.5}; // Температуры зон
for (int i = 0; i < 4; i++) {
Serial.print("Зона ");
Serial.print(i + 1);
Serial.print(": ");
Serial.print(temps[i]);
Serial.println(" °C");
if (temps[i] > 25) {
Serial.println("Высокая температура!");
}
}
}
void loop() {
// Пока пусто
}
Объяснение:
Код инициализирует Serial и массив temps
. Цикл for
выводит температуру каждой зоны, а if
проверяет, превышает ли значение 25 °C, добавляя предупреждение для зоны 4 (26.5
). Функция loop
остаётся пустой.
Решение задачи №3.5.3. Настройка скоростей вентиляторов
Задача: Создать массив fanSpeeds
типа int
с элементами {50, 70, 90}
, использовать for
для увеличения скоростей ниже 80 на 10 и вывода обновлённых значений.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте массив fanSpeeds
типа int
с элементами {50, 70, 90}
.
4. Используйте цикл for
для перебора индексов 0–2, увеличивая скорость на 10, если она меньше 80, и выводя обновлённое значение.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображаются «60», «80», «90».
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
int fanSpeeds[3] = {50, 70, 90}; // Скорости вентиляторов
for (int i = 0; i < 3; i++) {
if (fanSpeeds[i] < 80) {
fanSpeeds[i] += 10; // Увеличить скорость
}
Serial.print("Вентилятор ");
Serial.print(i + 1);
Serial.print(": ");
Serial.print(fanSpeeds[i]);
Serial.println(" %");
}
}
void loop() {
// Пока пусто
}
Объяснение:
Код инициализирует Serial и массив fanSpeeds
. Цикл for
проверяет каждую скорость, увеличивая её на 10, если она меньше 80, и выводит результат. Скорости обновляются до {60, 80, 90}
. Функция loop
остаётся пустой.
Решение задачи №4. Контроль уровня воды в резервуарах
Задача: Создать массив waterLevels
типа int
с элементами {70, 85, 95}
, использовать for
для вывода уровней и предупреждения, если уровень выше 90 %.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте массив waterLevels
типа int
с элементами {70, 85, 95}
.
4. Используйте цикл for
для перебора индексов 0–2, выводя уровень каждого резервуара и проверяя с помощью if
, превышает ли он 90 %.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображается предупреждение только для резервуара 3.
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
int waterLevels[3] = {70, 85, 95}; // Уровни воды
for (int i = 0; i < 3; i++) {
Serial.print("Резервуар ");
Serial.print(i + 1);
Serial.print(": ");
Serial.print(waterLevels[i]);
Serial.println(" %");
if (waterLevels[i] > 90) {
Serial.println("Опасность переполнения!");
}
}
}
void loop() {
// Пока пусто
}
Объяснение:
Код инициализирует Serial и массив waterLevels
. Цикл for
выводит уровень каждого резервуара, а if
добавляет предупреждение для значений выше 90 % (резервуар 3). Функция loop
остаётся пустой.
Решение задачи №5. Обнаружение движения в системе безопасности
Задача: Создать массив motionSensors
типа bool
с элементами {false, true, false, true}
, использовать for
для вывода состояния датчиков и предупреждения при активности.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
3. Создайте массив motionSensors
типа bool
с элементами {false, true, false, true}
.
4. Используйте цикл for
для перебора индексов 0–3, выводя состояние каждого датчика с помощью условного выражения и добавляя предупреждение при true
.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображаются предупреждения для датчиков 2 и 4.
Код:
void setup() {
Serial.begin(9600); // Начать связь с компьютером
bool motionSensors[4] = {false, true, false, true}; // Состояния датчиков
for (int i = 0; i < 4; i++) {
String message = motionSensors[i] ? "Активен" : "Неактивен";
Serial.print("Датчик ");
Serial.print(i + 1);
Serial.print(": ");
Serial.println(message);
if (motionSensors[i]) {
Serial.println("Движение обнаружено!");
}
}
}
void loop() {
// Пока пусто
}
Объяснение:
Код инициализирует Serial и массив motionSensors
. Цикл for
выводит состояние каждого датчика, используя условное выражение для «Активен» или «Неактивен», и добавляет предупреждение для true
(датчики 2 и 4). Функция loop
остаётся пустой.
Практикум 3.6
Решение задачи №3.6.1. Управление освещением в умной комнате
Задача: Определить функцию controlLight
с параметрами isOccupied
(bool
) и hour
(int
), которая выводит «Свет включён», если комната занята и время от 18 до 23, иначе «Свет выключен». Вызвать с isOccupied = true
, hour = 20
.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. Определите функцию controlLight
перед setup
, которая проверяет условия с помощью if
и выводит сообщение через Serial.println()
.
3. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
4. В setup
вызовите controlLight(true, 20)
.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта (Инструменты → Монитор порта или Ctrl+Shift+M) с настройкой скорости 9600 и проверьте, что отображается «Свет включён».
Код:
void controlLight(bool isOccupied, int hour) {
if (isOccupied && hour >= 18 && hour <= 23) {
Serial.println("Свет включён");
} else {
Serial.println("Свет выключен");
}
}
void setup() {
Serial.begin(9600); // Начать связь с компьютером
controlLight(true, 20); // Вызвать функцию
}
void loop() {
// Пока пусто
}
Объяснение:
Функция controlLight
проверяет, занята ли комната (isOccupied
) и находится ли время в диапазоне 18–23 (hour
). Если оба условия истинны, выводится «Свет включён», иначе «Свет выключен». В setup
функция вызывается с true
и 20
, что удовлетворяет условиям, поэтому отображается «Свет включён». Функция loop
остаётся пустой.
Решение задачи №3.6.2. Проверка температуры в холодильнике
Задача: Определить функцию isTempSafe
с параметром temp
(float
), возвращающую true
, если температура 2–8 °C, иначе false
. Вызвать с temp = 6.5
и вывести сообщение по результату.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. Определите функцию isTempSafe
перед setup
, которая возвращает bool
на основе проверки temp
с помощью if
.
3. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
4. В setup
вызовите isTempSafe(6.5)
, сохраните результат и выведите сообщение с помощью if
.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображается «Температура безопасна».
Код:
bool isTempSafe(float temp) {
return temp >= 2 && temp <= 8;
}
void setup() {
Serial.begin(9600); // Начать связь с компьютером
float temp = 6.5; // Температура
if (isTempSafe(temp)) {
Serial.println("Температура безопасна");
} else {
Serial.println("Температура вне диапазона");
}
}
void loop() {
// Пока пусто
}
Объяснение:
Функция isTempSafe
возвращает true
, если temp
в диапазоне 2–8 °C, используя логическое выражение. В setup
функция вызывается с 6.5
, возвращает true
, и выводится «Температура безопасна». Функция loop
остаётся пустой.
Решение задачи №3.6.3. Проверка дверей в системе безопасности
Задача: Определить функцию checkDoors
с параметром doors
(массив bool
размером 3), которая выводит состояние каждой двери и предупреждение для открытых. Вызвать с doors = {false, true, false}
.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. Определите функцию checkDoors
перед setup
, которая использует for
для перебора массива и if
для проверки открытых дверей.
3. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
4. В setup
создайте массив doors
и вызовите checkDoors
.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображается предупреждение только для двери 2.
Код:
void checkDoors(bool doors[3]) {
for (int i = 0; i < 3; i++) {
String status = doors[i] ? "Открыта" : "Закрыта";
Serial.print("Дверь ");
Serial.print(i + 1);
Serial.print(": ");
Serial.println(status);
if (doors[i]) {
Serial.println("Тревога: дверь открыта!");
}
}
}
void setup() {
Serial.begin(9600); // Начать связь с компьютером
bool doors[3] = {false, true, false}; // Состояния дверей
checkDoors(doors); // Вызвать функцию
}
void loop() {
// Пока пусто
}
Объяснение:
Функция checkDoors
проходит по массиву doors
, выводя состояние каждой двери («Открыта» или «Закрыта») и предупреждение для true
. В setup
массив {false, true, false}
передаётся в функцию, и предупреждение выводится только для двери 2. Функция loop
остаётся пустой.
Решение задачи №3.6.4. Контроль влажности почвы в теплице
Задача: Определить функцию checkMoisture
с параметром moisture
(int
), которая выводит сообщение в зависимости от уровня влажности (<40, 40–70, >70). Вызвать с moisture = 35
.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. Определите функцию checkMoisture
перед setup
, которая использует if-else
для проверки moisture
и вывода сообщения.
3. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
4. В setup
вызовите checkMoisture(35)
.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображается «Полив нужен».
Код:
void checkMoisture(int moisture) {
if (moisture < 40) {
Serial.println("Полив нужен");
} else if (moisture <= 70) {
Serial.println("Влажность нормальная");
} else {
Serial.println("Влажность высокая");
}
}
void setup() {
Serial.begin(9600); // Начать связь с компьютером
checkMoisture(35); // Вызвать функцию
}
void loop() {
// Пока пусто
}
Объяснение:
Функция checkMoisture
проверяет moisture
и выводит соответствующее сообщение. Для moisture = 35
выполняется условие < 40
, поэтому выводится «Полив нужен». Функция loop
остаётся пустой.
Решение задачи №3.6.5. Проверка состояния робота
Задача: Определить функции checkBattery
, checkSensors
, checkMotors
, каждая выводит сообщение. Использовать for
для вызова каждой функции дважды с паузой 1 секунда.
Решение:
1. Откройте Arduino IDE и создайте новый скетч.
2. Определите функции checkBattery
, checkSensors
, checkMotors
перед setup
, каждая выводит сообщение через Serial.println()
.
3. В функции setup
инициализируйте последовательный порт с помощью Serial.begin(9600)
.
4. В setup
используйте цикл for
для двукратного вызова всех функций с delay(1000)
.
5. Загрузите код на плату Рудирон.
6. Откройте монитор порта с настройкой скорости 9600 и проверьте, что отображаются 6 сообщений.
Код:
void checkBattery() {
Serial.println("Батарея: ОК");
}
void checkSensors() {
Serial.println("Датчики: ОК");
}
void checkMotors() {
Serial.println("Моторы: ОК");
}
void setup() {
Serial.begin(9600); // Начать связь с компьютером
for (int i = 0; i < 2; i++) {
checkBattery();
delay(1000); // Ждать 1 секунду
checkSensors();
delay(1000); // Ждать 1 секунду
checkMotors();
delay(1000); // Ждать 1 секунду
}
}
void loop() {
// Пока пусто
}
Объяснение:
Каждая функция выводит сообщение о состоянии системы. В setup
цикл for
вызывает функции дважды, с паузами delay(1000)
, формируя 6 сообщений в порядке: «Батарея: ОК», «Датчики: ОК», «Моторы: ОК» (дважды). Функция loop
остаётся пустой.
- Страницы
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home
-
imgs
- 1. Введение
- 1.01. Лабораторная работа №1.1
- 1.02. Лабораторная работа №1.2
- 1.03. Лабораторная работа №1.3
- 1.04. Лабораторная работа №1.4
- 1.05. Лабораторная работа №1.5
- 2. Основы электроники
- 2.01. Электрический ток и параметры цепи
- 2.01.1. Лабораторная работа №2.1.1
- 2.01.2. Лабораторная работа №2.1.2
- 2.02. Сопротивление в цепи
- 2.02.1. Лабораторная работа №2.2.1
- 2.02.2. Лабораторная работа №2.2.2
- 2.03. Полупроводники
- 2.03.1. Лабораторная работа №2.3.1
- 2.03.2. Лабораторная работа №2.3.2
- 3. Основы программирование на C++
- 3.01. Типы данных и переменные
- 3.01.1. Практикум
- 3.02. Операторы в C++
- 3.02.1. Практикум
- 3.03. Структуры ветвления
- 3.03.1. Практикум
- 3.04. Структуры повторения
- 3.04.1. Практикум
- 3.05. Массивы
- 3.05.1. Практикум
- 3.06. Функции
- 3.06.1. Практикум
- 3.07. Решения задач
- 4. Программирование микроконтроллеров
- 4.01. Цифровые сигналы и GPIO
- 4.01.1. Лабораторная работа №4.1.1
- 4.01.2. Лабораторная работа №4.1.2
- 4.01.3. Лабораторная работа №4.1.3
- 4.01.4. Лабораторная работа №4.1.4
- 4.01.5. Лабораторная работа №4.1.5
- 4.01.6. Лабораторная работа №4.1.6
- 4.01.7. Лабораторная работа №4.1.7
- 4.01.8. Лабораторная работа №4.1.8
- 4.02. Аналоговые сигналы и ШИМ
- 4.02.1. Лабораторная работа №4.2.1
- 4.02.2. Лабораторная работа №4.2.2
- 4.02.3. Лабораторная работа №4.2.3
- 4.02.4. Лабораторная работа №4.2.4
- 4.02.5. Лабораторная работа №4.2.5
- 4.03. Аналоговый сигнал и АЦП
- 4.03.1. Лабораторная работа №4.3.1
- 4.03.2. Лабораторная работа №4.3.2
- 4.03.3. Лабораторная работа №4.3.3
- 4.03.4. Лабораторная работа №4.3.4
- 4.03.5. Лабораторная работа №4.3.5
- 4.04. Аналоговый сигнал и ЦАП
- 4.04.1. Лабораторная работа №4.4.1
- 4.04.2. Лабораторная работа №4.4.2
- 4.05. Генерация и измерение импульсов
- 4.05.1. Лабораторная работа №4.5.1
- 4.05.2. Лабораторная работа №4.5.2
- 4.06. Аппаратные прерывания
- 4.06.1. Лабораторная работа №4.6.1
- 4.06.2. Лабораторная работа №4.6.2
- 4.07. Псевдопараллелизм
- 4.07.1. Лабораторная работа №4.7.1
- 4.07.2. Лабораторная работа №4.7.2
- 4.08. Интерфейсы связи - UART
- 4.08.1. Лабораторная работа №4.8.1
- 4.09. Интерфейсы связи - I2C
- 4.09.1. Лабораторная работа №4.9.1
- 4.10. Интерфейсы связи - SPI
- 4.10.1. Лабораторная работа №4.10.1
- home