Introduction: Halloween Cauldron

The Halloween Cauldron is a project made by Arduino that consists of a game that simulates the conjuration of a spell.


The electronic supplies used to make the prototype are:

  • Arduino UNO (x1): The plate where the code is stored.
  • Protoboard (x1): The board where the components are placed and are electrically connected to each other.
  • Jumpers: The cables used to connect the electrical components.
  • Servomotor (x1): It is an engine that can move up to 180º and then remain in a fixed position.
  • Button (x1): It is an input that allows you to activate or deactivate an electrical component when you click on it.
  • LED's (x6): They are outputs that their function is to illuminate.
  • Photoresistor (x1): It is an electronic component whose resistance decreases when the intensity of light it receives increases.
  • Ultrasonic sensor (x1): It is a sensor that measures distance by using ultrasonic waves.
  • Buzzer (x1): It is an output that generates a sound of a certain frequency

The prototype supplies are:

  • Cauldron: The cauldron will contain the leds.
  • Paperboard box: the box will contain all the electronic components.
  • Wood: The wood will be used as a platform inside the box to elevate the components.
  • Black cloth: The cloth will be used as an altar cloth to cover the box and make it more realistic.
  • Plastic spiders (a big one and tiny ones): the big one will be moved with the servomotor and the little ones as decoration.
  • Plastic eyes: The plastic eyes will be used to activate the photoresistor and also as decoration
  • Spider web (decoration)
  • Spoon: The spoon will be used to activate the ultrasonic sensor and as decoration.

Step 1: Assemble the Circuit

This project has 3 main functions:

  1. The button is used to activate the servomotor and move the spiders.
  2. The photoresistor is used to activate the green or the blue lens depending on the light that receives. In this case will be used to change the cauldron's light when you get the eye and through it to the cauldron. The photoresistor will be placed bellow the eye.
  3. The ultrasonic sensor activates the buzzer. This sensor will be activate when you approach to it and the buzzer will reproduce the Harry Potter song.

Step 2: Code



//Define the port of blue leds.

int led1 = 7;

int led2 = 8;

int led3 = 9;

//Define the port of green leds.

int led4 = 6;

int led5 = 5;

int led6 = 4;

//Define the port of the photoresistor.

int photoresistor = A0;

int valor = 0; // how bright the LED is


// Define pins numbers of the sensor of distance.

const int trigPin = 12;

const int echoPin = 10;

const int buzzer = 11;

// Define variables for the Harry Potter song.

long duration;

int distance;

int safetyDistance;



//Create servo object

Servo myservo;

the button port.

const int buttonPin0 = 3; // the number of the pushbutton pin

//Define the state of the button(If it is pressed or not).

int buttonState;

void setup() {


// Declare pins of the leds to be outputs:

pinMode(led1, OUTPUT);

pinMode(led2, OUTPUT);

pinMode(led3, OUTPUT);

pinMode(led4, OUTPUT);

pinMode(led5, OUTPUT);

pinMode(led6, OUTPUT);

// Declare pin of the photoresistor to be an input:

pinMode(photoresistor, INPUT);

// Starts the serial communication



//Prederminates the buzzer to be without tone.


// Sets the trigPin as an Output

pinMode(trigPin, OUTPUT);

// Sets the echoPin as an Input

pinMode(echoPin, INPUT);

pinMode(buzzer, OUTPUT);

// Starts the serial communication



//Define the port of the servo.


// initialize the pushbutton pin as an input:

pinMode(buttonPin0, INPUT);


void loop() {


// Set the brightness of the photoresistor:

valor = analogRead (photoresistor);

//Prints the value of the brightness.


//Conditional function. When the value is smaller than 50, blue leds will be on. If not, green leds will be on.

if (valor <= 50) {

digitalWrite(led1, HIGH);

digitalWrite(led2, HIGH);

digitalWrite(led3, HIGH);

digitalWrite(led4, LOW);

digitalWrite(led5, LOW);

digitalWrite(led6, LOW);


else {

digitalWrite(led1, LOW);

digitalWrite(led2, LOW);

digitalWrite(led3, LOW);

digitalWrite(led4, HIGH);

digitalWrite(led5, HIGH);

digitalWrite(led6, HIGH);


//Print the value of the brightness



// Clears the trigPin

digitalWrite(trigPin, LOW);


// Sets the trigPin on HIGH state for 10 micro seconds

digitalWrite(trigPin, HIGH);


digitalWrite(trigPin, LOW);

// Reads the echoPin, returns the sound wave travel time in microseconds

duration = pulseIn(echoPin, HIGH);

// Calculating the distance

distance = duration * 0.034 / 2;

safetyDistance = distance;

//Condicional function. When the distance to the first object is smaller than 5, Harry Potter song will be displayed.

if (safetyDistance <= 5) {

digitalWrite(buzzer, HIGH);


#define NOTE_B0 31

#define NOTE_C1 33

#define NOTE_CS1 35

#define NOTE_D1 37

#define NOTE_DS1 39

#define NOTE_E1 41

#define NOTE_F1 44

#define NOTE_FS1 46

#define NOTE_G1 49

#define NOTE_GS1 52

#define NOTE_A1 55

#define NOTE_AS1 58

#define NOTE_B1 62

#define NOTE_C2 65

#define NOTE_CS2 69

#define NOTE_D2 73

#define NOTE_DS2 78

#define NOTE_E2 82

#define NOTE_F2 87

#define NOTE_FS2 93

#define NOTE_G2 98

#define NOTE_GS2 104

#define NOTE_A2 110

#define NOTE_AS2 117

#define NOTE_B2 123

#define NOTE_C3 131

#define NOTE_CS3 139

#define NOTE_D3 147

#define NOTE_DS3 156

#define NOTE_E3 165

#define NOTE_F3 175

#define NOTE_FS3 185

#define NOTE_G3 196

#define NOTE_GS3 208

#define NOTE_A3 220

#define NOTE_AS3 233

#define NOTE_B3 247

NOTE_C4 262

#define NOTE_CS4 277

#define NOTE_D4 294

#define NOTE_DS4 311

#define NOTE_E4 330

#define NOTE_F4 349

#define NOTE_FS4 370

#define NOTE_G4 392

#define NOTE_GS4 415

#define NOTE_A4 440

#define NOTE_AS4 466

#define NOTE_B4 494

#define NOTE_C5 523

#define NOTE_CS5 554

#define NOTE_D5 587

#define NOTE_DS5 622

#define NOTE_E5 659

#define NOTE_F5 698

#define NOTE_FS5 740

#define NOTE_G5 784

#define NOTE_GS5 831

#define NOTE_A5 880

#define NOTE_AS5 932

#define NOTE_B5 988

#define NOTE_C6 1047

#define NOTE_CS6 1109

#define NOTE_D6 1175

#define NOTE_DS6 1245

#define NOTE_E6 1319

#define NOTE_F6 1397

#define NOTE_FS6 1480

NOTE_G6 1568

#define NOTE_GS6 1661

#define NOTE_A6 1760

#define NOTE_AS6 1865

#define NOTE_B6 1976

#define NOTE_C7 2093

#define NOTE_CS7 2217

#define NOTE_D7 2349

#define NOTE_DS7 2489

#define NOTE_E7 2637

#define NOTE_F7 2794

#define NOTE_FS7 2960

#define NOTE_G7 3136

#define NOTE_GS7 3322

#define NOTE_A7 3520

#define NOTE_AS7 3729

#define NOTE_B7 3951

#define NOTE_C8 4186

#define NOTE_CS8 4435

#define NOTE_D8 4699

#define NOTE_DS8 4978

#define REST 0

// You can change this to make the song slower or faster.

int tempo = 144;

// Notes of the moledy followed by the duration.

// A 4 means a quarter note, 8 an eighteenth , 16 sixteenth, so on

// Negative numbers are used to represent dotted notes, so -4 means a dotted quarter note, that is, a quarter plus an eighteenth

int melody[] = {

REST, 2, NOTE_D4, 4,

NOTE_G4, -4, NOTE_AS4, 8, NOTE_A4, 4,

NOTE_G4, 2, NOTE_D5, 4,

NOTE_C5, -2,

NOTE_A4, -2,

NOTE_G4, -4, NOTE_AS4, 8, NOTE_A4, 4,

NOTE_F4, 2, NOTE_GS4, 4,

NOTE_D4, -1,


// Size of gives the number of bytes, each int value is composed of two bytes (16 bits)

// There are two values per note (pitch and duration), so for each note there are four bytes

int notes = sizeof(melody) / sizeof(melody[0]) / 2;

// this calculates the duration of a whole note in ms (60s/tempo)*4 beats

int wholenote = (60000 * 4) / tempo;

int divider = 0, noteDuration = 0;

// Iterate over the notes of the melody.

// Remember, the array is twice the number of notes (notes + durations)

for (int thisNote = 0; thisNote < notes * 2; thisNote = thisNote + 2) {

// Calculates the duration of each note

divider = melody[thisNote + 1];

if (divider > 0) {

// regular note, just proceed

noteDuration = (wholenote) / divider;

} else if (divider < 0) {

// Dotted notes are represented with
negative durations.

noteDuration = (wholenote) / abs(divider);

noteDuration *= 1.5; // increases the duration in half for dotted notes


// We only play the note for 90% of the duration, leaving 10% as a pause

tone(buzzer, melody[thisNote], noteDuration * 0.9);

// Wait for the specific duration before playing the next note.


// Stop the waveform generation before the next note.



} else {

digitalWrite(buzzer, LOW);


// Prints the distance on the Serial Monitor

Serial.print("Distance: ");



//Reads the value of the state of the pin(HIGH/LOW)

buttonState = digitalRead(buttonPin0);

//Conditional function. When the button is pressed the servo will move 180 degrees and turns to the start point.

if (buttonState == LOW) {



} else {





Step 3: Prototyping

  1. Take the box and make the holes for the components (picture)
  2. Place the wood platform inside the box (5 cm of thickness)
  3. Put the protoboard and the Arduino on the platform.
  4. Stick the servomotor, the ultrasonic sensor and the photoresistor to their respective holes (picture)
  5. Make a prolongation of the button with wood so the button could be pressed in the upper side of the box. Make a hole in the box in function of its size.
  6. Make the same holes in the cloth and stick it to the box.

Step 4: Reflection of the Project

This project has helped us to consolidate the concepts learned in class. In addition, although part of the code used has been taught in class, we have also investigated other components, such as the ultrasonic sensor and the buzzer.

On the other hand, we did not have many problems when carrying out the project, however, we had one with the buzzer code, since, while it was ringing, the rest of the code was blocked and the rest of the components could not be used.