December 7, 2025
Description
🐍 Nagini Wine Dispenser – Snake Head Pour Spout Inspired by Wizard World
This is a fan-made 3D printed wine dispenser shaped like a snake emerging from a magical book, inspired by a famous fantasy universe - HARRY POTTER . The liquid flows directly from the snake’s mouth, creating a magical and eye-catching party effect enhanced by flowing LED lights.
For best results, the head should be printed in 3 separate parts. This makes printing easier, improves surface quality, and allows clean installation of the internal tubing, pump, and electronics.
🔧 Required Hardware (Besides the 3D Print)
To build the fully functional version, you will need:
12V liquid pump
12V power supply
Arduino (UNO or Nano)
Relay module (Active LOW)
Hall magnetic field sensor
3x LEDs
Silicone tube / hose (inserted through the head from the pump directly into the bottle)
Wires and basic connectors
The tube runs through the printed head, connects to the pump, and goes directly into the wine bottle.
⚙ How It Works
The system is activated using a magnet and a Hall magnetic field sensor. When the magnet is brought close to the sensor, the Arduino detects the magnetic field, turns on the 12V pump via the relay, and starts the flowing LED animation.
When the magnet is removed, the pump immediately stops and all LEDs turn off automatically.
💻 Arduino Code
const int hallPin = 2; // Hall sensor (DO)
const int pumpPin = 13; // Pump relay ACTIVE LOW
const int led1Pin = 3; // LED 1
const int led2Pin = 4; // LED 2
const int led3Pin = 5; // LED 3
// LED animation step time (ms)
const unsigned long ledStepInterval = 200;
unsigned long lastLedStepTime = 0;
int ledStep = 0;
void setup() {
pinMode(hallPin, INPUT);
pinMode(pumpPin, OUTPUT);
digitalWrite(pumpPin, HIGH);
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(led3Pin, OUTPUT);
allLedsOff();
}
void loop() {
int hallState = digitalRead(hallPin);
// LOW = magnet detected
bool magnetDetected = (hallState == LOW);
if (magnetDetected) {
digitalWrite(pumpPin, LOW);
updateLedAnimation();
} else {
digitalWrite(pumpPin, HIGH);
allLedsOff();
ledStep = 0;
}
}
void allLedsOff() {
digitalWrite(led1Pin, LOW);
digitalWrite(led2Pin, LOW);
digitalWrite(led3Pin, LOW);
}
// Flowing LED animation
void updateLedAnimation() {
unsigned long now = millis();
if (now - lastLedStepTime < ledStepInterval) return;
lastLedStepTime = now;
allLedsOff();
switch (ledStep) {
case 0: digitalWrite(led1Pin, HIGH); break;
case 1: digitalWrite(led2Pin, HIGH); break;
case 2: digitalWrite(led3Pin, HIGH); break;
case 3: digitalWrite(led2Pin, HIGH); break;
default:
digitalWrite(led1Pin, HIGH);
ledStep = -1;
break;
}
ledStep++;
}
If you have any questions about the build or wiring, I can provide a detailed step-by-step instruction.
License:
Creative Commons — Attribution — Noncommercial