Magic Atmospheric Effects for your Tabletop Terrain

light up terrain ritual circles

Looking to add an impressive, glowing effect to your tabletop terrain or D&D scenery? With just a few affordable components, some simple wiring, and a touch of code (provided), you can create a 3D printed terrain piece that lights up like arcane magic!

This glowing ritual circle is perfect for fantasy or sci-fi settings, whether you’re summoning eldritch horrors or powering up ancient tech.


🧙‍♂️ What You’ll Need to build this terrain

Here’s a list of materials I used to create the glowing ritual circle:

  • 3D printed ritual circle – You can grab the STL file from Saucermen Studios
  • Neo-Pixel LED ring – I used a 16 LED ring
  • Microcontroller – Arduino, ESP32, or any similar board will do
  • A few wires
  • 5V power source – A USB battery pack or phone charger works great

⚙️ Where to Get the Parts

I sourced the electronics cheaply through AliExpress, but similar components can be found on Amazon, eBay, or your local electronics supplier. Altogether, this build cost less than $10.


🧠 Coding the Magic (With Help from ChatGPT)

To animate the LEDs, I used ChatGPT to help generate the code. I asked:

“Create two sequences for the ring on pin 13 of Arduino and 16 LED nano pixel ring. First: a symmetrical blue sparkle effect lasting 3 seconds. Second: a popping green magical explosion lasting 6 seconds.”

It responded with perfectly usable Arduino code, which I uploaded to the microcontroller. You can customize this code to match the tone of your game—be it eerie, chaotic, or divine.

You can also use the code below:

#include <Adafruit_NeoPixel.h>

#define PIN         13
#define NUM_LEDS    16

#define SEQ_ONE_DURATION  3000   // 3 seconds
#define SEQ_TWO_DURATION  6000   // 6 seconds
#define TOTAL_DURATION    (SEQ_ONE_DURATION + SEQ_TWO_DURATION)

#define FADE_SPEED        20
#define SPARK_CHANCE      30

Adafruit_NeoPixel ring = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

// For sparkle logic
uint8_t sparkle_brightness[NUM_LEDS];

// For timing
unsigned long startTime = 0;

void setup() {
  ring.begin();
  ring.setBrightness(255); // Full brightness, we control individual pixel brightness
  ring.show();

  for (int i = 0; i < NUM_LEDS; i++) {
    sparkle_brightness[i] = 0;
  }

  startTime = millis();
}

void loop() {
  unsigned long currentTime = millis();
  unsigned long elapsed = (currentTime - startTime) % TOTAL_DURATION;

  ring.clear();

  if (elapsed < SEQ_ONE_DURATION) {
    runSequenceOne(elapsed);
  } else {
    runSequenceTwo();
  }

  ring.show();
  delay(30); // Control update speed
}

// --- Sequence ONE: 4-way mirrored faint blue rotation ---
void runSequenceOne(unsigned long elapsed) {
  static unsigned long lastStep = 0;
  static int step = 0;

  if (millis() - lastStep > 100) {
    step = (step + 1) % 4; // 4 steps per quarter rotation
    lastStep = millis();
  }

  for (int offset = -1; offset <= 1; offset++) {
    int pos = (step + offset + 4) % 4;
    uint8_t brightness = 10;
    if (offset == 0) brightness = 50;
    else if (abs(offset) == 1) brightness = 20;

    for (int q = 0; q < 4; q++) {
      int idx = (pos + q * 4) % NUM_LEDS;
      ring.setPixelColor(idx, ring.Color(0, 0, brightness));
    }
  }
}

// --- Sequence TWO: Green magical sparkles ---
void runSequenceTwo() {
  for (int i = 0; i < NUM_LEDS; i++) {
    if (sparkle_brightness[i] == 0 && random(0, SPARK_CHANCE) == 0) {
      sparkle_brightness[i] = 255; // Start sparkle
    }

    if (sparkle_brightness[i] > 0) {
      sparkle_brightness[i] = max(sparkle_brightness[i] - FADE_SPEED, 0);
    }

    ring.setPixelColor(i, ring.Color(0, sparkle_brightness[i], 0));
  }
}

🔌 Wiring It All Up

  • 5V from the LED ring to the 5V pin on your board
  • GND to GND
  • Data Input to Pin 13 on your microcontroller

Once wired, upload the code via the Arduino IDE, and your 3D printed terrain will burst to life with a dramatic glow.


✨ Assembly Tips for your terrain

I recommend dry-fitting everything first. Once you’re happy with the positioning, use a bit of hot glue or superglue to secure the LED ring inside the ritual circle. You can diffuse the lights further with parchment paper or resin for a mystical glow.


🧪 Use Cases for Glowing Terrain

  • Highlight key objectives in a dungeon crawl
  • Mark teleportation circles or magical wards
  • Bring life to cyberpunk terminals or sci-fi consoles
  • Upgrade your D&D scenery with animated lighting effects

This is a great way to bring your 3D printed terrain to life and impress players with interactive tabletop elements.


📦 STL Download & More Info

You can download the STL for the ritual circle here:
👉 Darkmyth Dungeon Ritual Circle with LED Integration – Saucermen Studios

I’ll post the exact Arduino code and links to components in an upcoming blog update.


🧙‍♂️ Miniature Credit

The wizard mini featured in the video/photos is the Thalmor Mage by Marco R Sassi.