===== Эксперимент 27. Электронная игральная кость =====
Проведем более сложный эксперимент. Создадим действующее и полезное устройство − электронную игральную кость. Она может быть очень полезной при игре в различные настольные игры. По нажатию на кнопку устройство будет генерировать случайное число в промежутке от 1 до 6 и показывать его на 7и сегментном индикаторе.
==== Схема эксперимента ====
Оставим собранную ранее схему без изменений.
{{ :products:esp-iot:exp11_sch.png?nolink |}}
//Рисунок 1. Электрическая принципиальная схема эксперимента//
Токоограничительные резисторы обязательны!
{{ :products:esp-iot:exp11_mont.png?direct&600 |}}
//Рисунок 2. Монтажная схема эксперимента//
==== Программный код эксперимента ====
#define BUTTON_PIN 0
bool button_state = LOW;
bool button_old_state = LOW;
int segments[7] = {14, 13, 4, 5, 12, 16, 15}; // ABCDEFG
int digits[10][7] = {
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 1, 0, 1, 1}, // 9
};
void draw_digit(int digit) {
for (int i = 0; i < 7; i++) {
if (digits[digit][i]) digitalWrite(segments[i], HIGH);
else digitalWrite(segments[i], LOW);
}
}
void setup() {
for (int i = 0; i < 7; i++){
pinMode(segments[i], OUTPUT);
}
pinMode(BUTTON_PIN, INPUT);
draw_time(0);
}
void loop() {
button_state = digitalRead(BUTTON_PIN);
if (button_state == LOW and button_old_state == HIGH) {
draw_time(random(1, 7));
}
button_old_state = button_state;
}
Логика программы мало отличается от предыдущего эксперимента. Новым дня нас будет получение случайного значения. Для этого воспользуемся функцией ''random(min, max)'' она возвращает случайное число в диапазоне от min до max.
Чтобы не заводить дополнительные переменные, мы сразу передаем результат функции ''random()'' в функцию ''draw_digit''. Данная функция полностью скопирована из предыдущего эксперимента без изменений, только тогда она называлась ''draw_time''
Полученное число выводим на индикатор с помощью функции ''draw_digit''.
draw_time(random(1, 7));
==== Дополнительные задания ====
* Добавь визуальный эффект, чтобы при нажатии на кнопку на дисплее пробегали несколько цифр, прежде чем выводился бы результат