DIY Arduino旋风游戏与WS2812B LED环-G

 

这一次,我将向您展示如何制作一款基于街机游戏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板制成的合适盒子中,并涂有自粘彩色壁纸。

IMG_20211026_222153.jpg
IMG_20211101_181726.jpg
原理图.jpg
#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(){
  
}

生成海报
点赞 0

创世纪

单片机学习,电子制作DIY学习与分享,各种新鲜的,有趣的,好玩的,一起来吧!机器人、无人机、树莓派/Raspberry Pi、arduino、极客、创客等

暂无评论

发表评论

相关推荐

自制一辆arduino主控的小型铲车

简介:JCB机器JCB机械非常受欢迎,因为它是民用工业中的重型建筑设备。JCB也被称为反铲装载机。它可用于非常快速地装卸卡车。它用于道路建设,卡车装卸以及更多其他用途。每个建筑公司都使用它,因为它足够快并且可以举起沉重的重量。步骤1:视频步骤2:使用的材料1,ArduinoNano-1个2.游戏杆模块-2个3.伺服电机(180度)-4号4.公对母跳线-根据要求5.公对公跳线-根据要求6.直流轴电机-2个7.按钮-2个8.迷你面包板9.电源-5V1Amps步骤3:3D零件这些是JCB的3D装配零件。步骤4:从物理建筑开始-伺服电机1首先使用Fevikwik将带有附接部件的臂固定在相应的插槽中。然

多用途便携式自动高度调节架-arduino系列

简介:便携式多功能自动高度调节架身高是公共场所的主要问题。由于身高问题,孩子们在公共场所受到的影响更大。由于高度问题而出现的问题是1)第一名是从公斤孩子到高中孩子的学校,所以高度变化很大,所以要用洗手盆,现在几天后要用洗手液进入。2)父母带孩子到酒店洗手盆高度。3)在公司和办公室人脸识别考勤系统中,如果适合矮个子的矮个子人受苦,如果适合矮个子的矮个子人受苦。就像很多地方一样。我看到在公共场所的孩子无法伸手去洗手盆,有些人想帮忙,或者他们举起洗手盆。现在有一天因大流行而触及其他地方的公众希望减少。因此,主要针对在上学时要上学的孩子,他们打算消毒它,我计划根据自己站立的人移动其高度的高度调节器。它

DIY-制造一个随机提问的闹钟

简介:制作一个随机询问问题的闹钟您平时起床有困难吗?早上设置十多个闹钟,但仍然无法唤醒并发呆时将其关闭。当您醒来并发现自己迟到时,便怪闹钟没有发出任何声音。为了帮助我更好地完成996个工作日,特制了一个简单的小型闹钟-随机问问题的闹钟。令人不愉快的哭声使您无法入睡。另外,在回答过程中,您必须专心听问题,否则,您将无法判断是在问“一加一是多少”还是“多少个单词中有多少个单词”是一个加一个。”“它是家庭必备产品,是将您逼入生活顶峰的发起者。材料清单:ArduinoUNO×1IO扩展板×1语音识别×1语音合成模块×1DS3231MMEMS精密RTC×17.4VLipo2500mAh电池×1数字按钮(

DIY 自平衡Arduino机器人-【单片机教程-创客】

关于DIY自平衡机器人的,我将向您展示如何构建自己的自平衡机器人。我尝试构建该项目,但未能获得预期的结果。但是这款机器人的表现相当不错且准确,尽管与我以前的机器人相比,这并不完美。