Это старая версия документа!


Эксперимент 27. Электронная игральная кость

Проведем более сложный эксперимент. Создадим действующее и полезное устройство − электронную игральную кость. Она может быть очень полезной при игре в различные настольные игры. По нажатию на кнопку устройство будет генерировать случайное число в промежутке от 1 до 6 и показывать его на 7и сегментном индикаторе.

Схема эксперимента

Оставим собранную ранее схему без изменений. Рисунок 1. Электрическая принципиальная схема эксперимента

Токоограничительные резисторы обязательны!

Рисунок 2. Монтажная схема эксперимента

Программный код эксперимента

Exp28.ino
  1. #define BUTTON_PIN 0
  2.  
  3. bool button_state = LOW;
  4. bool button_old_state = LOW;
  5.  
  6. int segments[7] = {14, 13, 4, 5, 12, 16, 15}; // ABCDEFG
  7.  
  8. int digits[10][7] = {
  9. {1, 1, 1, 1, 1, 1, 0}, // 0
  10. {0, 1, 1, 0, 0, 0, 0}, // 1
  11. {1, 1, 0, 1, 1, 0, 1}, // 2
  12. {1, 1, 1, 1, 0, 0, 1}, // 3
  13. {0, 1, 1, 0, 0, 1, 1}, // 4
  14. {1, 0, 1, 1, 0, 1, 1}, // 5
  15. {1, 0, 1, 1, 1, 1, 1}, // 6
  16. {1, 1, 1, 0, 0, 0, 0}, // 7
  17. {1, 1, 1, 1, 1, 1, 1}, // 8
  18. {1, 1, 1, 1, 0, 1, 1}, // 9
  19. };
  20.  
  21. void draw_digit(int digit) {
  22. for (int i = 0; i < 7; i++) {
  23. if (digits[digit][i]) digitalWrite(segments[i], HIGH);
  24. else digitalWrite(segments[i], LOW);
  25. }
  26. }
  27.  
  28. void setup() {
  29. for (int i = 0; i < 7; i++){
  30. pinMode(segments[i], OUTPUT);
  31. }
  32. pinMode(BUTTON_PIN, INPUT);
  33. draw_time(0);
  34. }
  35.  
  36. void loop() {
  37. button_state = digitalRead(BUTTON_PIN);
  38. if (button_state == LOW and button_old_state == HIGH) {
  39. draw_time(random(1, 7));
  40. }
  41. button_old_state = button_state;
  42. }

Логика программы мало отличается от предыдущего эксперемента

Для получения случайного числа воспользуемся функцией random(min, max) она возвращает случайное число в диапазоне от min до max.

Функция принимает в качестве параметра число и возвращает сумму его бит. Но, как мы помним, мы генерируем 5 бит. Их сумма будет от 0 до 5, а нам нужно число от 1 до 6. Поэтому просто добавляем 1 к полученной сумме, чтобы получить число в требуемом интервале.

  1. rand_digit = bit_summ(rand_bits)
  2. rand_digit+=1

Полученное число выводим на индикатор с помощью функции draw_digit.

  1. draw_digit(rand_digit)

Данная функция полностью скопирована из предыдущего эксперимента без изменений, только тогда она называлась draw_time

Дополнительные задания

  • Добавь визуальный эффект, чтобы при нажатии на кнопку на дисплее пробегали несколько цифр, прежде чем выводился бы результат