Перейти к содержимому
7. Демонстрация результата

7. Демонстрация результата

Занятие 9. Демонстрация результата — и Задание 4

Цель занятия: обучающиеся выводят результат всеми каналами регламента: экран/консоль, цвет, звук, стрелка мотора на шкале.

Разминка-вспоминание (5 мин)

  1. При каком наборе (A, B) выражение Задания 2 ложно?
  2. Как перевести угол оси в цифру на шкале 8 делений? (интервальный возврат: занятие 4)
  3. Что особенного делает Задание 4 с числом 0?

Разбор (worked example): полное решение Задания 4 регламента — 30 баллов

Условие (Приложение 1). Устройство с двухцветной индикацией (зелёный/красный) и шкалой «+/−» со стрелкой на оси мотора (можно доразметить шкалу занятия 4). По команде судьи: сгенерировать случайное число −5…5, вывести на экран/консоль (5 б.); чётное → зелёный, нечётное → красный (5 б.); положительное → стрелка на «+», отрицательное → на «−» (5 б.); ноль → стартовое положение: индикаторы не горят, стрелка на «0». Две проверки (по 15 б.), перезапуск разрешён. Остановка по команде судьи. Итого 30.

Дерево решений

    flowchart TD
    G[n = random от -5 до 5] --> E[вывести n на экран/консоль]
    E --> Z{n == 0?}
    Z -- да --> S0[индикаторы выкл, стрелка на 0 — стартовое положение]
    Z -- нет --> P{n % 2 == 0?}
    P -- да --> GR[зелёный индикатор]
    P -- нет --> RD[красный индикатор]
    GR --> SGN{n > 0?}
    RD --> SGN
    SGN -- да --> PLUS[стрелка на «+»]
    SGN -- нет --> MINUS[стрелка на «−»]
  

Ноль — первым: иначе он провалится в «чётное-зелёное» и попытка потеряет 10 баллов из 15.

Конструкция

Шкала занятия 4 дорабатывается: три метки — «0» вверху, «+» на +90°, «−» на −90°. Стрелка на оси мотора-вывода; при старте программы стрелка выставляется на «0» — это и есть стартовое положение системы. Индикация — зелёный и красный светодиоды стенда через indicator().

Эталонный код (C++, ESP32)

#include "stend.h"

void strelka(int posDeg) {                 // 0 = «0», +90 = «+», -90 = «−» (стрелка на «0» при включении)
  needleTo(posDeg);
}

void waitPress(Btn b = BTN_R) {      // ждать нажатие И отпускание — иначе одно нажатие сработает дважды
  while (!pressed(b)) delay(10);
  while (pressed(b))  delay(10);
}

void raund() {
  int n = random(-5, 6);                   // от -5 до 5: верхняя граница не входит
  Serial.printf("Число: %d\n", n);         // 5 баллов
  screen(String(n));

  if (n == 0) {                            // особый случай — первым!
    indicator(LED_OFF);                    // индикаторы не горят
    strelka(0);                            // стрелка на «0»
    return;
  }

  indicator(n % 2 == 0 ? LED_GREEN : LED_RED);   // 5 баллов
  strelka(n > 0 ? 90 : -90);                     // 5 баллов
}

void setup() {
  Serial.begin(115200);
  stendBegin();
  randomSeed(esp_random());
  indicator(LED_OFF);
  strelka(0);                              // стартовое положение системы
  for (int i = 0; i < 2; i++) {            // две проверки без перезапуска — надёжнее
    waitPress();                           // команда судьи = кнопка
    raund();
  }
}

void loop() {}

Разбор: needleTo отсчитывает угол от положения стрелки при включении — перед каждой сдачей ставьте стрелку на «0» и только потом включайте питание; возврат в стартовое положение перед раундом гарантирует, что судья видит переход стрелки, а не остаточное состояние; хотя перезапуск разрешён, цикл на два раунда избавляет от лишних действий под стрессом.

Каналы вывода компетенции 3 — полный набор. Экран/консоль: Serial.println, screen. Цвет: indicator(LED_GREEN); мигание — цикл цвет/LED_OFF с паузой (пример 3.1: «чётное — мигать красным» решается тем же raund с циклом мигания). Звук: beep(440, 500) — частота и длительность различают «сигнал 1» и «сигнал 2». Стрелка/шкала: needleTo; «остаток от деления на шкале» из примера 3.1 — это strelka((n % k) * 45) на шкале занятия 4.

Практика

Доразметить шкалу и совместить ноль

Метки «0», «+», «−»; прогнать strelka(0/90/-90) — стрелка попадает в метки визуально точно.

Контрольная точка: сдача Задания 4

Наставник-судья, две проверки, остановка по команде. Цель — 30/30. Прогонять до выпадения нуля хотя бы раз (или временно подменить ГСЧ на n = 0 для теста ветки).

Пример 1.2.1 регламента

«Показание датчика меньше порога — один сигнал, больше — другой»: собрать на звуке (beep 300 Гц vs 900 Гц) и на цвете. Это интеграция занятия 2 с сегодняшним выводом.

Остаток на шкале

Пример 3.1: ввести A энкодером, показать A % 8 стрелкой на шкале 8 делений.

Техника безопасности. Стрелка мотора движется программно — не держать пальцы у шкалы во время раунда; закрепить шкалу так, чтобы стрелка не могла задеть кабели; звуковые сигналы — умеренной громкости.

Типичные ошибки

  1. Ноль после проверки чётности — 0 % 2 == 0 → загорается зелёный, а должно быть «не горят». Ноль первым.
  2. Шкала сбилась относительно нулевой метки мотора после переноски — стрелка «плюс» смотрит вбок. Ритуал: совместить метки перед каждой сдачей.
  3. Ветка нуля не протестирована — вероятность нуля 1/11, за две проверки может не выпасть на тренировке, но выпадет на турнире.
  4. Индикация меняется до вывода числа — судья фиксирует события по порядку условия: сначала число на экран, потом свойства.

Мини-проверка выхода

Задание 4 сдано на 30/30, ветка нуля продемонстрирована принудительно; блиц: «почему стрелку возвращаем на 0 перед каждым раундом?»

Уровни сложности