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


Эксперимент 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. }

Объявляем переменные и настраиваем кнопку.

  1. button = Pin(0, Pin.IN)
  2. state_old = 1
  3. count = 0

В переменной state_old будем хранить прошлое состояние кнопки.

Рассмотрим основной цикл программы:

  1. while True:
  2. new_state = button.value()
  3. if new_state == 0 and state_old == 1:
  4. rand_bits = random.getrandbits(5)
  5. rand_digit = bit_summ(rand_bits)
  6. rand_digit+=1
  7. draw_digit(rand_digit)
  8. state_old = new_state

В бесконечном цикле программа ждет нажатия на кнопку А, сравнивая ее текущее состояние с логическим нулем, а предыдущее с логической единицей. Если это состояние обнаружено, то генерируем число, состоящее из 5 случайных битов:

  1. rand_bits = random.getrandbits(5)

Для получения случайного числа воспользуемся функцией 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

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

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