An interactive sword-forging game inspired by the Greek god of fire.
Our mission is to create an interactive and educational experience that brings engineering principles to life for children through the lens of Greek mythology. Inspired by Hephaestus, the god of fire and forges, our project combines hands-on fabrication, electronics, and coding in a way that is fun, intuitive, and engaging. By challenging players to forge a sword through a light-and-button sequence, we aim to spark curiosity, promote problem-solving, and make STEM learning both accessible and exciting within the vibrant environment of the Boston Children’s Museum.
This image showcases our finished project, “The Forge of Hephaestus,” fully assembled and functional. The sword insertion mechanism activates the Arduino, triggering the LED strip and launching the button sequence displayed on the laptop screen. With all components, hardware, software, and design, successfully integrated, this version was presented at the Boston Children’s Museum as a fully interactive exhibit for kids to enjoy.
Tools Used: Arduino • Processing • SolidWorks • AutoCAD • Laser Cutter • 3D Printer
Skills Gained: Circuit wiring • CAD modeling • 3D printing • Programming with Arduino & Processing • Prototyping • Engineering design iteration
Our design was inspired by Hephaestus’s forge. We wanted the box to feel like a real forge, glowing with light, where inserting the sword would activate a magical process. The button sequence mimics a crafting challenge, turning the forge into an interactive game.
This early version was our way of exploring different ideas and figuring out the direction of the project. We built a simple cardboard box with a hole on top for the sword. When inserted, it would trigger the Arduino. One of the connected LEDs would flash, confirming that the activation system was working.
In this version, we added more LED lights inside the box and made the structure sturdier. This was also the stage where we decided to incorporate a button sequence mechanic, so we added three colored buttons on top. To improve the appearance, we taped over the cardboard for a cleaner and more polished look. This version brought us much closer to our final design.
This stage marked the beginning of final assembly. We transitioned from cardboard to wood, which we cut precisely using the tools in the MakerCase. All our components were ready to be integrated into this sturdier enclosure. We painted the entire box black to give it a sleek, mysterious forge-like appearance, setting the tone for the final design.
This final version brought everything together. The sword activation, LED light strip, button sequence, Arduino, and Processing interface were all fully functional and integrated. We refined the aesthetics, secured all components inside, and tested it extensively to ensure it was ready for public interaction. This prototype represents the culmination of our design process, a fully working, polished game built to engage and inspire kids at the Boston Children’s Museum.
This is the 3D-printed sword that participants use during the game. It’s designed to be inserted into the front of the forge to start the interaction.
The sword is inserted into this slot on the forge, which triggers the Arduino and begins the button sequence display.
This photo shows the Arduino and wiring setup that connects the buttons. When a button is pressed, it sends signals to the computer for processing.
This is the screen shown to the children. It displays the random button sequence they must replicate using the physical buttons on the forge.
This technical drawing shows the custom 3D-printed hammer we designed for our project. Created in SolidWorks, it includes detailed views and a title block for documentation. This part was printed and used as a prize reward at the end of the game.
// RGB LED strip pins (common anode)
const int redPin = 9;
const int greenPin = 10;
const int bluePin = 11;
// Button pins
const int buttonPins[3] = {2, 3, 4};
bool buttonStates[3] = {false, false, false};
int sequence[5];
int inputIndex = 0;
bool playing = false;
bool waitingForStart = true;
unsigned long debounceDelay = 50;
unsigned long lastDebounceTime[3] = {0, 0, 0};
bool lastRead[3] = {true, true, true}; // starts HIGH due to INPUT_PULLUP
void setup() {
Serial.begin(9600);
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
for (int i = 0; i < 3; i++) {
pinMode(buttonPins[i], INPUT_PULLUP);
}
setColor(0, 0, 0); // LEDs off
}
void loop() {
if (waitingForStart && Serial.available()) {
char cmd = Serial.read();
if (cmd == 'S') {
startGame();
}
}
if (playing) {
for (int i = 0; i < 3; i++) {
bool reading = digitalRead(buttonPins[i]);
if (reading != lastRead[i]) {
lastDebounceTime[i] = millis();
}
if ((millis() - lastDebounceTime[i]) > debounceDelay) {
// Button has changed and stabilized
if (reading == LOW && buttonStates[i] == false) {
buttonStates[i] = true;
// VALID button press!
if (i == sequence[inputIndex]) {
inputIndex++;
if (inputIndex >= 5) {
Serial.println("W");
showWinEffect();
stopGame();
}
} else {
Serial.println("L");
showLoseEffect();
startGame(); // auto-restart on loss
}
} else if (reading == HIGH && buttonStates[i] == true) {
buttonStates[i] = false; // button released
}
}
lastRead[i] = reading;
}
}
}
void startGame() {
Serial.println("STARTING");
inputIndex = 0;
playing = true;
waitingForStart = false;
setColor(255, 0, 0); // Red LED on
for (int i = 0; i < 5; i++) {
sequence[i] = random(0, 3);
Serial.println(sequence[i]);
}
}
void stopGame() {
playing = false;
waitingForStart = true;
setColor(0, 0, 0);
}
void showWinEffect() {
playing = false;
for (int i = 0; i < 50; i++) {
setColor(random(255), random(255), random(255));
delay(100);
}
setColor(0, 0, 0);
}
void showLoseEffect() {
playing = false;
for (int i = 0; i < 4; i++) {
setColor(255, 0, 0);
delay(300);
setColor(0, 0, 0);
delay(200);
}
}
void setColor(int r, int g, int b) {
analogWrite(redPin, 255 - r);
analogWrite(greenPin, 255 - g);
analogWrite(bluePin, 255 - b);
}
import processing.serial.*;
Serial myPort;
int[] sequence = new int[5];
color[] buttonColors = {
color(255, 255, 0), // Button 0 = Yellow
color(255, 255, 255), // Button 1 = White
color(0, 255, 0) // Button 2 = Green
};
int sequenceIndex = 0;
boolean waitingForSequence = true;
boolean gameActive = false;
String result = "";
PFont font;
void setup() {
size(800, 800);
println("Available ports:");
println(Serial.list());
myPort = new Serial(this, "COM3", 9600);
myPort.clear();
myPort.bufferUntil('\n');
font = createFont("Georgia-Bold", 32); // Sturdy, forged style font
textFont(font);
textAlign(CENTER, CENTER);
textSize(48);
delay(1500);
println("Sending 'S' to Arduino...");
myPort.write('S');
}
void draw() {
drawForgeBackground();
if (waitingForSequence) {
fill(255, 220, 180);
text("Awaiting the forge's command...", width / 2, height / 4);
} else if (gameActive) {
fill(255, 240, 200);
text("Forge this sequence:", width / 2, height / 6);
for (int i = 0; i < 5; i++) {
drawForgedButton(width / 2 - 160 + i * 80, height / 3, buttonColors[sequence[i]]);
}
}
if (result.equals("W")) {
showWinEffect();
} else if (result.equals("L")) {
showLoseEffect();
}
}
void drawForgeBackground() {
// Ember gradient from bottom to top
for (int y = 0; y < height; y++) {
stroke(lerpColor(color(30, 10, 10), color(100, 50, 10), float(y) / height));
line(0, y, width, y);
}
}
void drawForgedButton(float x, float y, color c) {
pushMatrix();
translate(x, y);
noStroke();
fill(c);
rectMode(CENTER);
rect(0, 0, 60, 60, 12); // Slightly rounded
// Glow overlay
fill(255, 255, 255, 50);
ellipse(0, -10, 30, 15);
popMatrix();
}
void serialEvent(Serial p) {
String line = myPort.readStringUntil('\n');
if (line == null) return;
line = line.trim();
println("Received: " + line);
if (line.equals("STARTING")) {
sequenceIndex = 0;
waitingForSequence = true;
gameActive = false;
result = "";
} else if (line.equals("W") || line.equals("L")) {
result = line;
} else {
int val = int(line);
if (val >= 0 && val <= 2 && sequenceIndex < 5) {
sequence[sequenceIndex++] = val;
if (sequenceIndex == 5) {
waitingForSequence = false;
gameActive = true;
}
}
}
}
void showWinEffect() {
for (int i = 0; i < 10; i++) {
background(lerpColor(color(255, 255, 100), color(255, 180, 0), random(1)));
fill(30);
textSize(60);
text("FORGED IN VICTORY!", width / 2, height / 2);
delay(80);
}
result = "";
}
void showLoseEffect() {
for (int i = 0; i < 4; i++) {
background(120, 0, 0);
fill(255, 80, 80);
textSize(56);
text("THE FORGE REJECTS YOU!", width / 2, height / 2);
delay(150);
background(30);
delay(150);
}
result = "";
}
Pseudocode:
This flowchart outlines the Arduino’s logic. When the sword is inserted, the Arduino sends a random button sequence and waits for user input. Based on the input, it either flashes red (for wrong) or runs a colorful LED animation (for correct).
This shows how the Processing program receives data from the Arduino. It displays the button sequence and waits for input. Depending on the outcome, it either shows a win animation or a try-again message.
Design & Iteration Process
Our project began with the idea of simulating Hephaestus’s forge, a glowing box that activates when a sword is inserted and challenges the user with a button sequence. We initially attempted to use a motion sensor to detect the sword and trigger the sequence automatically. However, multiple motion sensors burned out, and the setup proved too unreliable.
After troubleshooting, we switched to a manual start system triggered by the sword insertion, which allowed the program to generate a random button sequence every time. This method worked consistently and gave us more control over the interaction. When the correct sequence was completed, the 5V LED strip lit up as feedback.
What set our project apart was the physicality and mythological theme. The forge design, glowing red light, and sword mechanism gave a tactile, immersive feel that tied well into the story of Hephaestus.
Throughout the process, we applied multiple stages of the engineering design process, brainstorming, prototyping, testing, and redesigning. We gained hands-on experience with laser cutting, 3D printing, and Arduino wiring. These skills were new to many of us, and successfully integrating them into a working system was a big milestone.
Contact any of the team members below to get more information on the project