Бросок кубика
Часть раздела Дисплеи и датчики путешествия по Arduino на Coddy. Урок 5 из 24.
random(1, 7) выбирает целое число от 1 до 6. Первое число — наименьшее возможное; второе на единицу больше наибольшего.
Внутри платы нет настоящей случайности. random() вычисляет каждое число на основе предыдущего, начиная с числа, которое называется начальным значением. При одном и том же начальном значении она выдает одни и те же числа при каждом запуске: ваши игральные кости будут показывать 2, 2, 6, 3 каждый раз после включения.
randomSeed() задает начальное значение. Передайте ей что-нибудь, что меняется от запуска к запуску, например время первого нажатия кнопки. micros() отсчитывает миллионные доли секунды, и никто не нажимает кнопку дважды в одну и ту же микросекунду:
if (!seeded) {
randomSeed(micros());
seeded = true;
}
int roll = random(1, 7);Задавать начальное значение в setup() бесполезно: setup() запускается в одну и ту же микросекунду после каждого включения.
Задание
СреднеКнопка подключена к выводу 10, и заготовка уже определяет момент её нажатия. Сделай игральную кость:
- при каждом нажатии выбирай
random(1, 7)и отображай результат с помощьюshowDigit() - только при первом нажатии вызывай
randomSeed(micros()), чтобы результаты бросков различались от запуска к запуску
Нажми Run и нажми кнопку несколько раз, затем нажми Check.
Попробуйте сами
const int segmentPins[7] = {2, 3, 4, 5, 6, 7, 8}; // a, b, c, d, e, f, g
// По одному шаблону на цифру, читать справа налево: последний бит соответствует сегменту a.
// gfedcba
const byte digits[10] = {
0b0111111, // 0
0b0000110, // 1
0b1011011, // 2
0b1001111, // 3
0b1100110, // 4
0b1101101, // 5
0b1111101, // 6
0b0000111, // 7
0b1111111, // 8
0b1101111 // 9
};
void showDigit(int n) {
for (int i = 0; i < 7; i++) {
if (bitRead(digits[n], i) == 1) {
digitalWrite(segmentPins[i], LOW); // горит
} else {
digitalWrite(segmentPins[i], HIGH); // выключен
}
}
}
const int buttonPin = 10;
bool wasPressed = false;
bool seeded = false;
void setup() {
for (int i = 0; i < 7; i++) {
pinMode(segmentPins[i], OUTPUT);
}
pinMode(buttonPin, INPUT_PULLUP);
showDigit(0);
}
void loop() {
bool pressed = digitalRead(buttonPin) == LOW;
if (pressed != wasPressed) {
if (pressed) {
// кнопка только что нажата: сгенерировать число от 1 до 6 и показать его
}
delay(50); // дать кнопке время стабилизироваться
}
wasPressed = pressed;
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Дисплеи и датчики
1Семисегментные дисплеи
Семисегментный дисплейШаблоны цифр в байтахСчёт на дисплееОбратный отсчёт до нуляБросок кубикаПотренируйтесь самостоятельно: Песочница Arduino