7. Демонстрация результата
Занятие 9. Демонстрация результата — и Задание 4
Цель занятия: обучающиеся выводят результат всеми каналами регламента: экран/консоль, цвет, звук, стрелка мотора на шкале.
Разминка-вспоминание (5 мин)
- При каком наборе (A, B) выражение Задания 2 ложно?
- Как перевести угол оси в цифру на шкале 8 делений? (интервальный возврат: занятие 4)
- Что особенного делает Задание 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» и только потом включайте питание; возврат в стартовое положение перед раундом гарантирует, что судья видит переход стрелки, а не остаточное состояние; хотя перезапуск разрешён, цикл на два раунда избавляет от лишних действий под стрессом.
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 делений.
Типичные ошибки
- Ноль после проверки чётности — 0 % 2 == 0 → загорается зелёный, а должно быть «не горят». Ноль первым.
- Шкала сбилась относительно нулевой метки мотора после переноски — стрелка «плюс» смотрит вбок. Ритуал: совместить метки перед каждой сдачей.
- Ветка нуля не протестирована — вероятность нуля 1/11, за две проверки может не выпасть на тренировке, но выпадет на турнире.
- Индикация меняется до вывода числа — судья фиксирует события по порядку условия: сначала число на экран, потом свойства.
Мини-проверка выхода
Задание 4 сдано на 30/30, ветка нуля продемонстрирована принудительно; блиц: «почему стрелку возвращаем на 0 перед каждым раундом?»