3. Датчик освещённости: карточки
Занятие 3. Датчик освещённости: ввод карточками
Цель занятия: обучающиеся считывают карточку как логическое значение (белая = 1, чёрная = 0) и вводят число количеством карточек.
Разминка-вспоминание (5 мин)
- Зачем медиана, если можно взять одно показание датчика?
- Как из расстояния 17 см получить номер зоны при N=3 на поле 30 см?
- Белая карточка — это 0 или 1 по регламенту?
Разбор (worked example): калибровка и чтение карточки
Датчик отражения возвращает процент отражённого света (0–100). Абсолютные значения зависят от освещения зала и высоты датчика — поэтому порог не пишут константой из головы, его калибруют на месте:
калибровка:
положить белую карточку → W ← медиана отражения (например, 82)
положить чёрную карточку → B ← медиана отражения (например, 9)
POROG ← (W + B) / 2 # середина, максимальный запас в обе стороны
чтение:
r ← медиана отражения
значение ← 1 если r > POROG иначе 0Эталонный код (C++, ESP32):
#include "stend.h"
#include <algorithm>
int reflMedian(int n = 5) {
int v[9];
for (int i = 0; i < n; i++) v[i] = reflection();
std::sort(v, v + n);
return v[n / 2];
}
void waitPress(Btn b = BTN_R) { // ждать нажатие И отпускание — иначе одно нажатие сработает дважды
while (!pressed(b)) delay(10);
while (pressed(b)) delay(10);
}
int porog;
void setup() {
Serial.begin(115200);
stendBegin();
// --- Калибровка на месте (перед сдачей, при свете зала) ---
Serial.println("Белая карточка + кнопка"); waitPress();
int w = reflMedian();
Serial.println("Чёрная карточка + кнопка"); waitPress();
int b = reflMedian();
porog = (w + b) / 2;
Serial.printf("W = %d B = %d POROG = %d\n", w, b, porog);
}
void loop() {
// --- Чтение карточки по кнопке ---
waitPress();
int val = reflMedian() > porog ? 1 : 0;
Serial.printf("Карточка: %d\n", val);
screen(String(val));
}Разбор: калибровочный блок остаётся в боевых программах Задания 2 — свет в зале турнира другой, чем дома; порог посередине даёт запас ≈35 пунктов в обе стороны, так что лёгкое смещение карточки не ломает чтение; медиана из 5 гасит момент, когда карточку ещё подкладывают.
Практика
Откалиброваться и прочитать 10 карточек
Партнёр предъявляет карточки в случайном порядке — 10 из 10 верных на экране.
Ввод пары переменных A и B
По кнопке прочитать A, вывести; по кнопке прочитать B, вывести. Это заготовка Задания 2 (само логическое выражение — на занятии 8, сегодня только ввод).
Счётчик карточек
Реализовать «число = количество чёрных карточек, конец ввода — левая кнопка». Проверка: ввести 0, 3 и 5 — все три верно.
Стресс-тест освещением
Прочитать карточки у окна и в тени. Если появились ошибки — перекалиброваться и убедиться, что снова 10/10. Вывод записать: «калибровка — первое действие на новом месте».
Типичные ошибки
- Порог-константа «из дома» — на турнире другой свет, чёрная читается как белая. Калибровка на месте обязательна.
- Датчик выше 1 см от стола — регламент прямо требует 0,5–1 см; выше — контраст падает, ниже — карточка не пролезает.
- Чтение в момент подкладывания карточки — рука в кадре. Правило протокола: карточка лежит → потом кнопка.
- Глянцевые карточки — блик даёт «белое» на чёрной. Регламент рекомендует матовый картон — используйте его и на тренировках.
Мини-проверка выхода
Ввод пары карточек (A, B) с первого раза по протоколу «карточка → кнопка → значение на экране», оба значения верны; вопрос: «почему порог = (W+B)/2, а не 50?»