Arduino 项目笔记 | Arduino LED Memory Game 颜色记忆游戏机

2023-10-30 13:20

本文主要是介绍Arduino 项目笔记 | Arduino LED Memory Game 颜色记忆游戏机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

成果展示

颜色记忆游戏机 |Arduino UNO


1. 线路链连接

在这里插入图片描述

1.1 原理图

在这里插入图片描述

1.2 PCB

在这里插入图片描述
免费PCB打样
Arduino LED Memory Game 颜色记忆机资料下载

1.3 烧录 Bootloader

在这里插入图片描述

在这里插入图片描述
第二部分:Burn bootloader

2. 程序实现

#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978#define CHOICE_OFF      0 //Used to control LEDs
#define CHOICE_NONE     0 //Used to check buttons
#define CHOICE_RED  (1 << 0)
#define CHOICE_GREEN    (1 << 1)
#define CHOICE_BLUE (1 << 2)
#define CHOICE_YELLOW   (1 << 3)#define LED_RED     10
#define LED_GREEN   3
#define LED_BLUE    13
#define LED_YELLOW  5// Button pin definitions
#define BUTTON_RED    9
#define BUTTON_GREEN  2
#define BUTTON_BLUE   12
#define BUTTON_YELLOW 6// Buzzer pin definitions
#define BUZZER1  4
#define BUZZER2  7// Define game parameters
#define ROUNDS_TO_WIN      13 //Number of rounds to succesfully remember before you win. 13 is do-able.
#define ENTRY_TIME_LIMIT   3000 //Amount of time to press a button before game times out. 3000ms = 3 sec#define MODE_MEMORY  0
#define MODE_BATTLE  1
#define MODE_BEEGEES 2// Game state variables
byte gameMode = MODE_MEMORY; //By default, let's play the memory game
byte gameBoard[32]; //Contains the combination of buttons as we advance
byte gameRound = 0; //Counts the number of succesful rounds the player has made it throughvoid setup()
{//Setup hardware inputs/outputs. These pins are defined in the hardware_versions header file//Enable pull ups on inputspinMode(BUTTON_RED, INPUT_PULLUP);pinMode(BUTTON_GREEN, INPUT_PULLUP);pinMode(BUTTON_BLUE, INPUT_PULLUP);pinMode(BUTTON_YELLOW, INPUT_PULLUP);pinMode(LED_RED, OUTPUT);pinMode(LED_GREEN, OUTPUT);pinMode(LED_BLUE, OUTPUT);pinMode(LED_YELLOW, OUTPUT);pinMode(BUZZER1, OUTPUT);pinMode(BUZZER2, OUTPUT);//Mode checkinggameMode = MODE_MEMORY; // By default, we're going to play the memory game// Check to see if the lower right button is pressedif (checkButton() == CHOICE_YELLOW) play_beegees();// Check to see if upper right button is pressedif (checkButton() == CHOICE_GREEN){gameMode = MODE_BATTLE; //Put game into battle mode//Turn on the upper right (green) LEDsetLEDs(CHOICE_GREEN);toner(CHOICE_GREEN, 150);setLEDs(CHOICE_RED | CHOICE_BLUE | CHOICE_YELLOW); // Turn on the other LEDs until you release buttonwhile(checkButton() != CHOICE_NONE) ; // Wait for user to stop pressing button//Now do nothing. Battle mode will be serviced in the main routine}play_winner(); // After setup is complete, say hello to the world
}void loop()
{attractMode(); // Blink lights while waiting for user to press a button// Indicate the start of game playsetLEDs(CHOICE_RED | CHOICE_GREEN | CHOICE_BLUE | CHOICE_YELLOW); // Turn all LEDs ondelay(1000);setLEDs(CHOICE_OFF); // Turn off LEDsdelay(250);if (gameMode == MODE_MEMORY){// Play memory game and handle resultif (play_memory() == true) play_winner(); // Player won, play winner toneselse play_loser(); // Player lost, play loser tones}if (gameMode == MODE_BATTLE){play_battle(); // Play game until someone losesplay_loser(); // Player lost, play loser tones}
}//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//The following functions are related to game play only// Play the regular memory game
// Returns 0 if player loses, or 1 if player wins
boolean play_memory(void)
{randomSeed(millis()); // Seed the random generator with random amount of millis()gameRound = 0; // Reset the game to the beginningwhile (gameRound < ROUNDS_TO_WIN) {add_to_moves(); // Add a button to the current moves, then play them backplayMoves(); // Play back the current game board// Then require the player to repeat the sequence.for (byte currentMove = 0 ; currentMove < gameRound ; currentMove++){byte choice = wait_for_button(); // See what button the user pressesif (choice == 0) return false; // If wait timed out, player losesif (choice != gameBoard[currentMove]) return false; // If the choice is incorect, player loses}delay(1000); // Player was correct, delay before playing moves}return true; // Player made it through all the rounds to win!
}// Play the special 2 player battle mode
// A player begins by pressing a button then handing it to the other player
// That player repeats the button and adds one, then passes back.
// This function returns when someone loses
boolean play_battle(void)
{gameRound = 0; // Reset the game frame back to one framewhile (1) // Loop until someone fails {byte newButton = wait_for_button(); // Wait for user to input next movegameBoard[gameRound++] = newButton; // Add this new button to the game array// Then require the player to repeat the sequence.for (byte currentMove = 0 ; currentMove < gameRound ; currentMove++){byte choice = wait_for_button();if (choice == 0) return false; // If wait timed out, player loses.if (choice != gameBoard[currentMove]) return false; // If the choice is incorect, player loses.}delay(100); // Give the user an extra 100ms to hand the game to the other player}return true; // We should never get here
}// Plays the current contents of the game moves
void playMoves(void)
{for (byte currentMove = 0 ; currentMove < gameRound ; currentMove++) {toner(gameBoard[currentMove], 150);// Wait some amount of time between button playback// Shorten this to make game harderdelay(150); // 150 works well. 75 gets fast.}
}// Adds a new random button to the game sequence, by sampling the timer
void add_to_moves(void)
{byte newButton = random(0, 4); //min (included), max (exluded)// We have to convert this number, 0 to 3, to CHOICEsif(newButton == 0) newButton = CHOICE_RED;else if(newButton == 1) newButton = CHOICE_GREEN;else if(newButton == 2) newButton = CHOICE_BLUE;else if(newButton == 3) newButton = CHOICE_YELLOW;gameBoard[gameRound++] = newButton; // Add this new button to the game array
}//The following functions control the hardware// Lights a given LEDs
// Pass in a byte that is made up from CHOICE_RED, CHOICE_YELLOW, etc
void setLEDs(byte leds)
{if ((leds & CHOICE_RED) != 0)digitalWrite(LED_RED, HIGH);elsedigitalWrite(LED_RED, LOW);if ((leds & CHOICE_GREEN) != 0)digitalWrite(LED_GREEN, HIGH);elsedigitalWrite(LED_GREEN, LOW);if ((leds & CHOICE_BLUE) != 0)digitalWrite(LED_BLUE, HIGH);elsedigitalWrite(LED_BLUE, LOW);if ((leds & CHOICE_YELLOW) != 0)digitalWrite(LED_YELLOW, HIGH);elsedigitalWrite(LED_YELLOW, LOW);
}// Wait for a button to be pressed. 
// Returns one of LED colors (LED_RED, etc.) if successful, 0 if timed out
byte wait_for_button(void)
{long startTime = millis(); // Remember the time we started the this loopwhile ( (millis() - startTime) < ENTRY_TIME_LIMIT) // Loop until too much time has passed{byte button = checkButton();if (button != CHOICE_NONE){ toner(button, 150); // Play the button the user just pressedwhile(checkButton() != CHOICE_NONE) ;  // Now let's wait for user to release buttondelay(10); // This helps with debouncing and accidental double tapsreturn button;}}return CHOICE_NONE; // If we get here, we've timed out!
}// Returns a '1' bit in the position corresponding to CHOICE_RED, CHOICE_GREEN, etc.
byte checkButton(void)
{if (digitalRead(BUTTON_RED) == 0) return(CHOICE_RED); else if (digitalRead(BUTTON_GREEN) == 0) return(CHOICE_GREEN); else if (digitalRead(BUTTON_BLUE) == 0) return(CHOICE_BLUE); else if (digitalRead(BUTTON_YELLOW) == 0) return(CHOICE_YELLOW);return(CHOICE_NONE); // If no button is pressed, return none
}// Light an LED and play tone
// Red, upper left:     440Hz - 2.272ms - 1.136ms pulse
// Green, upper right:  880Hz - 1.136ms - 0.568ms pulse
// Blue, lower left:    587.33Hz - 1.702ms - 0.851ms pulse
// Yellow, lower right: 784Hz - 1.276ms - 0.638ms pulse
void toner(byte which, int buzz_length_ms)
{setLEDs(which); //Turn on a given LED//Play the sound associated with the given LEDswitch(which) {case CHOICE_RED:buzz_sound(buzz_length_ms, 1136); break;case CHOICE_GREEN:buzz_sound(buzz_length_ms, 568); break;case CHOICE_BLUE:buzz_sound(buzz_length_ms, 851); break;case CHOICE_YELLOW:buzz_sound(buzz_length_ms, 638); break;}setLEDs(CHOICE_OFF); // Turn off all LEDs
}// Toggle buzzer every buzz_delay_us, for a duration of buzz_length_ms.
void buzz_sound(int buzz_length_ms, int buzz_delay_us)
{// Convert total play time from milliseconds to microsecondslong buzz_length_us = buzz_length_ms * (long)1000;// Loop until the remaining play time is less than a single buzz_delay_uswhile (buzz_length_us > (buzz_delay_us * 2)){buzz_length_us -= buzz_delay_us * 2; //Decrease the remaining play time// Toggle the buzzer at various speedsdigitalWrite(BUZZER1, LOW);digitalWrite(BUZZER2, HIGH);delayMicroseconds(buzz_delay_us);digitalWrite(BUZZER1, HIGH);digitalWrite(BUZZER2, LOW);delayMicroseconds(buzz_delay_us);}
}// Play the winner sound and lights
void play_winner(void)
{setLEDs(CHOICE_GREEN | CHOICE_BLUE);winner_sound();setLEDs(CHOICE_RED | CHOICE_YELLOW);winner_sound();setLEDs(CHOICE_GREEN | CHOICE_BLUE);winner_sound();setLEDs(CHOICE_RED | CHOICE_YELLOW);winner_sound();
}// Play the winner sound
// This is just a unique (annoying) sound we came up with, there is no magic to it
void winner_sound(void)
{// Toggle the buzzer at various speedsfor (byte x = 250 ; x > 70 ; x--){for (byte y = 0 ; y < 3 ; y++){digitalWrite(BUZZER2, HIGH);digitalWrite(BUZZER1, LOW);delayMicroseconds(x);digitalWrite(BUZZER2, LOW);digitalWrite(BUZZER1, HIGH);delayMicroseconds(x);}}
}// Play the loser sound/lights
void play_loser(void)
{setLEDs(CHOICE_RED | CHOICE_GREEN);buzz_sound(255, 1500);setLEDs(CHOICE_BLUE | CHOICE_YELLOW);buzz_sound(255, 1500);setLEDs(CHOICE_RED | CHOICE_GREEN);buzz_sound(255, 1500);setLEDs(CHOICE_BLUE | CHOICE_YELLOW);buzz_sound(255, 1500);
}// Show an "attract mode" display while waiting for user to press button.
void attractMode(void)
{while(1) {setLEDs(CHOICE_RED);delay(100);if (checkButton() != CHOICE_NONE) return;setLEDs(CHOICE_BLUE);delay(100);if (checkButton() != CHOICE_NONE) return;setLEDs(CHOICE_GREEN);delay(100);if (checkButton() != CHOICE_NONE) return;setLEDs(CHOICE_YELLOW);delay(100);if (checkButton() != CHOICE_NONE) return;}
}// Notes in the melody. Each note is about an 1/8th note, "0"s are rests.
int melody[] = {NOTE_G4, NOTE_A4, 0, NOTE_C5, 0, 0, NOTE_G4, 0, 0, 0,NOTE_E4, 0, NOTE_D4, NOTE_E4, NOTE_G4, 0,NOTE_D4, NOTE_E4, 0, NOTE_G4, 0, 0,NOTE_D4, 0, NOTE_E4, 0, NOTE_G4, 0, NOTE_A4, 0, NOTE_C5, 0};int noteDuration = 115; // This essentially sets the tempo, 115 is just about right for a disco groove :)
int LEDnumber = 0; // Keeps track of which LED we are on during the beegees loop// Do nothing but play bad beegees music
// This function is activated when user holds bottom right button during power up
void play_beegees()
{//Turn on the bottom right (yellow) LEDsetLEDs(CHOICE_YELLOW);toner(CHOICE_YELLOW, 150);setLEDs(CHOICE_RED | CHOICE_GREEN | CHOICE_BLUE); // Turn on the other LEDs until you release buttonwhile(checkButton() != CHOICE_NONE) ; // Wait for user to stop pressing buttonsetLEDs(CHOICE_NONE); // Turn off LEDsdelay(1000); // Wait a second before playing songdigitalWrite(BUZZER1, LOW); // setup the "BUZZER1" side of the buzzer to stay low, while we play the tone on the other pin.while(checkButton() == CHOICE_NONE) //Play song until you press a button{// iterate over the notes of the melody:for (int thisNote = 0; thisNote < 32; thisNote++) {changeLED();tone(BUZZER2, melody[thisNote],noteDuration);// to distinguish the notes, set a minimum time between them.// the note's duration + 30% seems to work well:int pauseBetweenNotes = noteDuration * 1.30;delay(pauseBetweenNotes);// stop the tone playing:noTone(BUZZER2);}}
}// Each time this function is called the board moves to the next LED
void changeLED(void)
{setLEDs(1 << LEDnumber); // Change the LEDLEDnumber++; // Goto the next LEDif(LEDnumber > 3) LEDnumber = 0; // Wrap the counter if needed
}

待改进地方:

  1. 锂电池充电电路TP4056;
  2. 电源开关;
  3. 单片机芯片尺寸小一点、便宜点的封装和型号(TSSOP20封装);
  4. 外壳设计

参考资料

  • [1] 【YouTube】https://www.youtube.com/watch?v=Tcp_6L80kY0&ab_channel=ViralScience-ThehomeofCreativity

  • [2] 【B站】Arduino颜色记忆游戏机,你能过几关?

  • [3] 【YouTube】 HOW TO MAKE LED MEMORY GAME USING ARDUINO

  • [4] KiCad #学习笔记02#|国产在线电路设计软件立创EDA (Arduino UNO 单片机最小系统电路原理图)

  • [5] 【烧录bootloader报错!】 Yikes Invalid device signature.Double check connections and try again, or use -F to over 原因是芯片坏了!;还有端口号灰色是因为忘记安装串口驱动了!

  • [6] Yikes! Invalid device signature. Fail to burn bootloader and read fuses

  • [7] 【YouTube】SOLVED !!! 1E 95 0F or Yikes Invalid Device Signature Error of Arduino Bootloader : Atmega 328 U

这篇关于Arduino 项目笔记 | Arduino LED Memory Game 颜色记忆游戏机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/308198

相关文章

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

Jenkins中自动化部署Spring Boot项目的全过程

《Jenkins中自动化部署SpringBoot项目的全过程》:本文主要介绍如何使用Jenkins从Git仓库拉取SpringBoot项目并进行自动化部署,通过配置Jenkins任务,实现项目的... 目录准备工作启动 Jenkins配置 Jenkins创建及配置任务源码管理构建触发器构建构建后操作构建任务

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学