>
Этот устройство представляет из себя панель с четырьмя кнопка, четырьмя светодиодами и цифровым дисплеем.
Светодиоды загораются в рандомном порядке, а пользователь должен в этом же порядке нажать кнопки. С каждым разом (уровнем) сложность возрастает, и уровень отображается на цифровом дисплее.
Как это работает можно посмотреть на видео.
-8 диодов;
-7-сегментный дисплей -2 шт;-Две интегральных схемы 4511;-Монтажная плата;-Адаптер питания 5 В;-Ардуино Нано;
-Плата расширения Arduino Nano;
-Светодиоды -4 шт;
-Сверлильный станок;
-Торцовочная пила;-Зажимы;-Лазерный резак;-Паяльник;-Стриппер;-Компьютер;-ПВА;
-Древесина;
-Крепеж;
-Черный акрил;

Сначала мастер разработал проект устройства в программе Fusion 360. Для корпуса мастер выбрал тиковое дерево, а для лицевой панели – черный акрил.




Дальше нужно сделать корпус. Как уже говорилось ранее, материал для корпуса – тиковое дерево. Толщина планок 10 мм, ширина 40 мм. Согласно чертежам производит распиловку деталей.








Отверстия в лицевой панели (для кнопок, светодиодов и дисплея) и отверстия в верхней панели (для крепежа) мастер вырезает на лазерном резаке.
Файлы для резки прилагаются.
UI.svgTestCut.svg






Для этого проекта мастер использовал ранее разработанную плату для другого проекта. В данном случае на печатной плате установлены две микросхемы 4511. Интегральная схема 4511 помогает управлять каждым дисплеем с помощью двоичного кода, для чего требуется только четыре входа на дисплей. В результате общее количество портов ввода-вывода достигает 16. Это позволяет использовать всего одну плату Arduino Nano.
Файлы Gerber для изготовления платы можно скачать ниже.
7Segment.brdШаг пятый: схема
Можно не изготавливать печатную плату, а собрать схему на перфорированной плате. Нумерация и соответствие портов основаны на коде, приведенном на следующем шаге.
Первое, что нужно иметь в виду при монтаже, это компактность. Нужно чтобы все эти компоненты могли поместиться внутри корпуса.
Все проводные соединения необходимо заизолировать.Шаг шестой: код
Ниже прилагается файл, содержащий весь код проекта. Все, что нужно сделать, это загрузить файл, IDE Arduino и загрузить код в Arduino Nano.
Код работает следующим образом
Программа начинается с создания случайного списка из 99 целых чисел в диапазоне от 1 до 4. Уровень устанавливается на 1, и отображается первый бит шаблона. Как только пользователь вводит ожидаемое количество нажатий кнопки (например, уровень 1 = 1 нажатие кнопки), код проверяет ввод по списку из 99 целых чисел. Если он совпадает, код повторяется, и уровень увеличивается до 2 (и так далее). Если ввод неверен, код перезапустится. Показать / Скрыть текст//Written by Rehaan Irani, July 2021
int list[99];
int list2[99];
int x = 1;
int y = 0;
int z = 0;
int level = 1;
int w;
int c;
int d;
int e;
int f;
int g;
int i;
int j;
int h;
void setup() {
//Declaring all our pins
Serial.begin(9600);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(14, OUTPUT);
pinMode(15, OUTPUT);
pinMode(17, OUTPUT);
pinMode(18, OUTPUT);
pinMode(10, INPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);
pinMode(13, INPUT);
//This loop creates the random sequence of 99 random numbers between 1 and 4
for (int i=0; i <= 98; i++){
list[i] = random(1, 5);
}
}
//Reset function that we will call if the user inputs the incorrect pattern
void(* resetFunc) (void) = 0;
//Main Loop
void loop() {
//Condition set to ensure the user makes an input before the next sequence is shown
if (x == 1) {
//For loop displays the pattern on the LEDs – depends on the level
for (int i = 0; i <= level; i++) {
//Each if statement operates an LED which is triggered depending on if the integer is 1,2,3 or 4
if (list[i] == 1) {
digitalWrite(15, HIGH);
delay(1000);
digitalWrite(15, LOW);
}
if (list[i] == 2) {
digitalWrite(14, HIGH);
delay(1000);
digitalWrite(14, LOW);
}
if (list[i] == 3) {
digitalWrite(17, HIGH);
delay(1000);
digitalWrite(17, LOW);
}
if (list[i] == 4) {
digitalWrite(18, HIGH);
delay(1000);
digitalWrite(18, LOW);
}
}
//If x is 0, the above code will not run again until x is set back to 1
x = 0;
}
/////////////////////////////////////////
//These IF statements record the users input depending on which button they press
if (digitalRead(12) == 1) {
list2[y] = 1;
y += 1;
delay(500);
}
if (digitalRead(18) == 1) {
list2[y] = 2;
y += 1;
delay(500);
}
if (digitalRead(10) == 1) {
list2[y] = 3;
y += 1;
delay(500);
}
if (digitalRead(13) == 1) {
list2[y] = 4;
y += 1;
delay(500);
}
/////////////////////////////////////////////////////////////////
//This IF statements set the condition for running the check which only happens when the number of user inputs = level
if (y == level + 1) {
//This for loop checks each user input against the random list
for (int i = 0; i <= level; i++) {
//If the lists match, nothing happens, the program continues
if (list2[i] == list[i]) {
Serial.print("h");
//ELSE, if the lists do not match, the program calls on the reset function to restart from the beginning
} else {
Serial.print("FUNCTION RESTART");
resetFunc();
}
//x is set to one because the lists match and the next sequence can be shown
} x = 1;
//level is increased by one to display one more number on the random list
level += 1;
//y is 0 to reset the users inputs
y = 0;
}
//The rest of the code deals with displaying the level on the 7 segment displays
//This part below separates numbers into its two digits (e.g. 43 = 4 and 3)
int v;
int randomNumber = level%10;
v = level – randomNumber;
int randomNumber2 = v/10;
//The first digit is converted to binary
if (z > 7) {// 1st Digit Write
f = HIGH;
randomNumber = randomNumber % 8;
} else {
f = LOW;
}
if (randomNumber > 3) {
e = HIGH;
randomNumber = randomNumber % 4;
} else {
e = LOW;
}
if (randomNumber > 1) {
d = HIGH;
randomNumber = randomNumber % 2;
} else {
d = LOW;
}
if (randomNumber > 0) {
c = HIGH;
randomNumber = randomNumber % 1;
} else {
c = LOW;
}
//The second digit is converted to binary
if (randomNumber2 > 7) {// 2nd Digit Write
j = HIGH;
randomNumber2 = randomNumber2 % 8;
} else {
j = LOW;
}
if (randomNumber2 > 3) {
i = HIGH;
randomNumber2 = randomNumber2 % 4;
} else {
i = LOW;
}
if (randomNumber2 > 1) {
h = HIGH;
randomNumber2 = randomNumber2 % 2;
} else {
h = LOW;
}
if (randomNumber2 > 0) {
g = HIGH;
randomNumber2 = randomNumber2 % 1;
} else {
g = LOW;
}
//The binary output is sent and displayed on the 7 segment displays
digitalWrite(2, j);
digitalWrite(3, i);
digitalWrite(4, h);
digitalWrite(5, g);
digitalWrite(6, f);
digitalWrite(7, e);
digitalWrite(8, d);
digitalWrite(9, c);
}Шаг седьмой: питание
Для питания устройства используется адаптер питания 5 В. Плюс адаптера подключается к Vin, а минус к GND на Arduino Nano.Все готово.