Menu
CoddyTech

Бросок кубика

Часть раздела Дисплеи и датчики путешествия по 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() запускается в одну и ту же микросекунду после каждого включения.

challenge icon

Задание

Средне

Кнопка подключена к выводу 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;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Дисплеи и датчики

Потренируйтесь самостоятельно: Песочница Arduino