Я думаю все посетители нашего сайта когда-нибудь в своей жизни играли в игры, в которых требовалось бросать кубик (игральные кости) и в зависимости от того, сколько очков выпадало на грани кубика, столько мы делали действий (например, шагов) в игре. Естественно, суть этой затеи заключалась в том, чтобы получить случайное число в диапазоне от 1 до 6 – то есть каждая грань кубика соответствовала одному из чисел в этом диапазоне. В этой статье мы реализуем аналогичное устройство в цифровом формате с помощью платы Arduino Uno. Но вместо того чтобы бросать кубик в нашем проекте мы будем нажимать кнопку чтобы получить случайное число от 0 до 6.
Необходимые компоненты
- Плата Arduino UNO (купить на AliExpress) (Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158).
- Семисегментный дисплей (с общим анодом).
- Кнопки.
- Резистор 1 кОм.
- Питающее напряжение.
- Макетная плата.
- Соединительный провода.
Работа схемы
Схема устройства представлена на следующем рисунке.
На представленной схеме плата Arduino управляет всем процессом. Первая кнопка на схеме используется для запуска кубика ("броска игральной кости)", а вторая – для сброса кубика.
Чтобы получить случайное число плата Arduino использует функцию rand(). Результат, получаемый с помощью данной функции, мы сохраняем во временной переменной. Когда первая кнопка (dice) нажата сохраненное в переменной случайное число выводится на семисегментный дисплей. О том, как подключить Arduino к семисегментному дисплею, можно прочитать в этой статье.
Семисегментный дисплей с общим анодом подключен к контактам 6, 5, 4, 3, 2, 1, 0 Arduino. Общий анод семисегментного дисплея соединен с напряжением +5 В через резистор 220 Ом (можно использовать и 1 кОм). Две кнопки (dice (кубик) и reset (сброс)) подсоединены к цифровым контактам 14 (A0) и 15 (A1) Arduino, а вторые их концы подсоединены к земле (GND).
Исходный код программы
Сначала мы в программе должны инициализировать цифровые контакты, к которым подключен семисегментный дисплей.
int pin[7]={6,5,4,3,2,1,0};
Потом мы создадим массив из 6 цифр – они будут выполнять роль цифр на гранях кубика.
char digit[6]={0x02, 0x79, 0x24, 0x30, 0x19, 0x12};
Затем мы должны сконфигурировать соответствующие контакты на ввод и вывод данных.
void setup()
{
for(int i=0;i<7;i++)
pinMode(pin[i], OUTPUT);
pinMode(dice, INPUT);
pinMode(resett, INPUT);
digitalWrite(dice, HIGH);
digitalWrite(resett, HIGH);
}
Затем запишем часть кода, которая будет отображать ноль на семисегментом дисплее – значение по умолчанию.
int temp=0x40;
for(int i=0;i<7;i++)
{
int temp1=temp&0x01;
digitalWrite(pin[i], temp1);
temp=temp>>1;
}
Теперь вызовем функцию rand() чтобы получить случайное число.
int temp=rand();
А когда мы нажмем первую кнопку (dice) программа должна извлечь это случайное число из переменной и передать его на семисегментный дисплей используя оператор побитового сдвига.
if(digitalRead(dice)==0)
{
int k=temp%6;
temp=digit[k];
wait();
for(int i=0;i<7;i++)
{
int temp1=temp&0x01;
digitalWrite(pin[i], temp1);
temp=temp>>1;
}
delay(200);
}
Аналогично и для кнопки сброса (reset).
В представленной программе в один момент времени мы передаем одиночный бит. Поэтому мы используем цикл, который выполняется 7 раз, чтобы полностью передать число на семисегментный дисплей, то есть сегмент за сегментом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
#define resett 15 #define dice 14 char digit[6]={0x02, 0x79, 0x24, 0x30, 0x19, 0x12}; int pin[7]={6,5,4,3,2,1,0}; void setup() { for(int i=0;i<7;i++) pinMode(pin[i], OUTPUT); pinMode(dice, INPUT); pinMode(resett, INPUT); digitalWrite(dice, HIGH); digitalWrite(resett, HIGH); int temp=0x40; for(int i=0;i<7;i++) { int temp1=temp&0x01; digitalWrite(pin[i], temp1); temp=temp>>1; } delay(1000); } void loop() { int temp=rand(); if(digitalRead(dice)==0) { int k=temp%6; temp=digit[k]; wait(); for(int i=0;i<7;i++) { int temp1=temp&0x01; digitalWrite(pin[i], temp1); temp=temp>>1; } delay(200); } if(digitalRead(resett)==0) { temp=0x40; for(int i=0;i<7;i++) { int temp1=temp&0x01; digitalWrite(pin[i], temp1); temp=temp>>1; } } } void wait() { for(int m=0;m<10;m++) { for(int k=0;k<6;k++) { int ch=digit[k]; for(int l=0;l<7;l++) { char tem2=ch&0x01; digitalWrite(pin[l], tem2); ch=ch>>1; } delay(50); } } } |