Эксперимент 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. Чтобы не заводить дополнительные переменные, мы сразу передаем результат функции random() в функцию draw_digit. Данная функция полностью скопирована из предыдущего эксперимента без изменений, только тогда она называлась draw_time

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

  1. draw_time(random(1, 7));

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

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