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 со значением «Погода ясная».
  1. Выведите значения переменных в монитор порта с помощью Serial.println(), каждое на новой строке.
  2. Загрузите код на плату Рудирон.
  3. Откройте монитор порта с настройкой скорости 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 остаётся пустой.