硬件 | |||
---|---|---|---|
1 | Arduino Nano R3 | ||
1 | WS2812 环形带 60 个 LED | ||
1 | 带按钮的旋转编码器 | ||
1 | 自制大街机按钮 | ||
1 | 通用晶体管 NPN | ||
1 | 蜂鸣器 | ||
2 | 电阻器 220 欧姆 | ||
1 | 通孔电阻器,820欧姆 | ||
软件 | |||
1 |
Arduino IDE
|
||
工具 | |||
1 | 烙铁(通用) | ||
1 | 焊锡丝,无铅 |
这一次,我将向您展示如何制作一款基于街机游戏Cyclone的有趣游戏,玩家在游戏中尝试阻止LED在特定位置绕圆圈滚动。游戏的目标是在骑行灯到达指示的(红色)LED 时停止骑行灯。如果成功,难度级别将增加。如果不成功,游戏将重新启动。
环由60个LED组成(15个LED的4个四分之一圆形新像素)。戒指支架是用3D打印机制成的,您可以在下面下载.stl文件。在环的中间是一个由6个RGB LED组成的条带,实际上代表了六个级别。基本代码取自oKeeg的Instructable,我做了一些修改,使游戏更加有趣。
- 首先,我降低了二极管的光强度,因为在我的游戏版本中,LED是直接可见的。
- 然后,环包含60个LED,而不是40个LED,因为我在以前的一个项目(LED环形时钟)中使用它。
- 我还添加了另外两个关卡,因此游戏现在总共有6个关卡。
- 下一个非常重要的修改是我在游戏中添加了声音,现在玩起来更有趣了。
- 最后,我做了一个大的街机按钮,以便更准确地玩。
游戏需要由5V / 3A或更高的电源供电。这是一个非常简单的项目,仅由几个组件组成:
- Arduino纳米微控制器
- WS2812 发光环,带 60 个 RGB 灯
- WS2812 灯带,带 6 个 RGB 灯条
- 一个晶体管
- 蜂鸣器
- 和大街机按钮
您在图片中看到的实时时钟模块未激活,是我之前项目的一部分。
我们还可以使用上一个项目遗留下来的旋转编码器按钮。在这种情况下,设备小巧紧凑,但使用此按钮更加困难。
打开游戏时,所有 LED 都会以不同的颜色亮起。现在,按下按钮,游戏开始。目标是在旋转二极管正好位于静态二极管上时按下按钮。在前两个电平中,三个二极管是静态的,而在下一个电平中只有一个。此外,随着每个下一个级别,二极管速度增加,因此在所需的时刻按下按钮变得越来越困难。每完成一个电平,水平排的一个二极管就会亮起。总共有六个级别,因此此行包含六个 dode。如果我们未能通过关卡,游戏就会从头开始。如果你通过了所有六个关卡,游戏也会从头开始。
最后,将设备内置到由PVC板制成的合适盒子中,并涂有自粘彩色壁纸。
#include "FastLED.h"
#define NUM_LEDS 60
#define DATA_PIN A0
#define SCORE_PIN 6
#define SCORE_LEDS 6
#define BRIGHTNESS 55
CRGB leds[NUM_LEDS];
CRGB sleds[NUM_LEDS];
bool reachedEnd = false;
byte gameState = 0;
//byte ledSpeed = 0;
int period = 1000;
unsigned long time_now = 0;
byte Position = 0;
byte level = 0;
const byte ledSpeed[6] = {50, 40, 30, 20, 14, 7};
//Debounce
bool findRandom = false;
byte spot = 0;
void setup() {
// put your setup code here, to run once:
FastLED.addLeds(leds, NUM_LEDS);
FastLED.addLeds(sleds, SCORE_LEDS);
pinMode(A3, INPUT_PULLUP);
Serial.begin(9600);
Serial.println("Reset");
}
void loop() {
// put your main code here, to run repeatedly:
FastLED.setBrightness(BRIGHTNESS );
if (gameState == 0) {
fill_rainbow(leds, NUM_LEDS, 0, 20); //2 = longer gradient strip
fill_rainbow(sleds, SCORE_LEDS, 0, 40); //2 = longer gradient strip
if (digitalRead(A3) == LOW) {
Position = 0;
findRandom = true;
delay(500);
for (byte i = 0; i < NUM_LEDS; i ) {
leds[i].setRGB(0, 0, 0);
delay(40);
FastLED.show();
int thisPitch = map (i, 60, 0, 100, 1500);
tone(9, thisPitch,120);
}
for (byte i = 0; i < SCORE_LEDS; i ) {
sleds[i].setRGB(0, 0, 0);
delay(100);
FastLED.show();
}
gameState = 1;
}
FastLED.show();
}
if (gameState == 1) {
period = ledSpeed[0];
if (millis() > time_now period) {
time_now = millis();
if (findRandom) {
spot = random(56) 3;
findRandom = false;
}
leds[spot - 1].setRGB(255, 140, 0);
leds[spot].setRGB(0, 255, 0);
leds[spot 1].setRGB(255, 110, 0);
sleds[0].setRGB(0, 255, 0);
PlayGame(spot - 1, spot 1);
}
if (digitalRead(A3) == LOW) {
delay(300);
findRandom = false;
if (Position > spot - 1 && Position < spot 3) {
level = gameState;
gameState = 98;
} else {
gameState = 99;
}
}
}
if (gameState == 2) {
// period = 320;
period = ledSpeed[1];
if (millis() > time_now period) {
time_now = millis();
if (findRandom) {
spot = random(56) 3;
findRandom = false;
}
leds[spot - 1].setRGB(255, 190, 0);
leds[spot].setRGB(0, 255, 0);
leds[spot 1].setRGB(255, 190, 0);
sleds[1].setRGB(255, 255, 0);
PlayGame(spot - 1, spot 1);
}
if (digitalRead(A3) == LOW) {
delay(300);
if (spot - 1 && Position < spot 3) {
level = gameState;
gameState = 98;
} else {
gameState = 99;
}
}
}
if (gameState == 3) {
period = ledSpeed[2];
if (millis() > time_now period) {
time_now = millis();
if (findRandom) {
spot = random(56) 3;
findRandom = false;
}
leds[spot].setRGB(0, 255, 0);
sleds[2].setRGB(255, 50, 0);
PlayGame(spot, spot);
}
if (digitalRead(A3) == LOW) {
delay(300);
if (Position == spot 1) {
level = gameState;
gameState = 98;
} else {
gameState = 99;
}
}
}
if (gameState == 4) {
period = ledSpeed[3];
if (millis() > time_now period) {
time_now = millis();
if (findRandom) {
spot = random(56) 3;
findRandom = false;
}
leds[spot].setRGB(0, 255, 0);
sleds[3].setRGB(255, 0, 0);
PlayGame(spot, spot);
}
if (digitalRead(A3) == LOW) {
delay(300);
if (Position == spot 1) {
level = gameState;
gameState = 98;
} else {
gameState = 99;
}
}
}
if (gameState == 5) {
period = ledSpeed[4];
if (millis() > time_now period) {
time_now = millis();
if (findRandom) {
spot = random(56) 3;
findRandom = false;
}
leds[spot].setRGB(0, 255, 0);
sleds[4].setRGB(0, 50, 255);
PlayGame(spot , spot);
}
if (digitalRead(A3) == LOW) {
delay(300);
if (Position == spot 1) {
level = gameState;
gameState = 98;
} else {
gameState = 99;
}
}
}
if (gameState == 6) {
period = ledSpeed[5];
if (millis() > time_now period) {
time_now = millis();
if (findRandom) {
spot = random(56) 3;
findRandom = false;
}
leds[spot].setRGB(0, 255, 0);
sleds[5].setRGB(0, 150, 255);
PlayGame(spot , spot);
}
if (digitalRead(A3) == LOW) {
delay(300);
if (Position == spot 1) {
level = gameState;
gameState = 98;
} else {
gameState = 99;
}
}
}
if (gameState == 98) {
winner();
}
if (gameState == 99) {
loser();
}
}
void PlayGame(byte bound1, byte bound2) {
leds[Position].setRGB(255, 0, 0);
if (Position < bound1 1 || Position > bound2 1) {
leds[Position - 1].setRGB(0, 0, 0);
}
FastLED.show();
Position ;
if (Position >= NUM_LEDS) {
leds[Position - 1].setRGB(0, 0, 0);
Position = 0;
}
}
void winner() {
for (byte i = 0; i < 3; i ) {
for (byte j = 0; j < NUM_LEDS; j ) {
leds[j].setRGB(0, 255, 0);
tone(9, 1000, 250);
}
FastLED.show();
delay(500);
clearLEDS();
FastLED.show();
delay(500);
}
findRandom = true;
Position = 0;
gameState = level 1;
if (gameState > 6) {
gameState = 0;
}
}
void loser() {
for (byte i = 0; i < 3; i ) {
for (byte j = 0; j < NUM_LEDS; j ) {
leds[j].setRGB(255, 0, 0);
tone(9, 200, 250);
}
FastLED.show();
delay(500);
clearLEDS();
FastLED.show();
delay(500);
}
gameState = 0;
}
void clearLEDS() {
for (byte i = 0; i < NUM_LEDS; i ) {
leds[i].setRGB(0, 0, 0);
}
}
void winAll(){
}
暂无评论