Big Ben Gingerbread

Elizabeth Tower/ Big Ben is crafted with gingerbread in 2025 inspired by Josie’s trip to London. The construction gingerbread is baked and the pieces are cut using the CO2 laser after modifying on a 3D plan of Big Ben we found online. The edges were routered to make for a snug fit. Isomalt was used for the windows. The lights and bells were activated by a button that triggered a MP3 player and neopixel strip.

// Big_Ben_Elizabeth_Tower_2025_button_activated_neopixel_strip_mp3_player_with_speaker 
#include <Adafruit_NeoPixel.h>
#define PIN            4    // The pin number the NeoPixel data line is connected to
#define NUMPIXELS      90   // The number of NeoPixels in your strip
const int buttonPin = 2;  // the number of the pushbutton pin
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int buttonState = 0; 

#include <SoftwareSerial.h>

#define ARDUINO_RX 5//should connect to TX of the Serial MP3 Player module
#define ARDUINO_TX 6//connect to RX of the module
SoftwareSerial mySerial(ARDUINO_RX, ARDUINO_TX);//
static int8_t Send_buf[8] = {0} 

#define NEXT_SONG 0X01 
#define PREV_SONG 0X02 
#define CMD_PLAY_W_INDEX 0X03 //DATA IS REQUIRED (number of song)
#define VOLUME_UP_ONE 0X04
#define VOLUME_DOWN_ONE 0X05
#define CMD_SET_VOLUME 0X06//DATA IS REQUIRED (number of volume from 0 up to 30(0x1E))
#define SET_DAC 0X17
#define CMD_PLAY_WITHVOLUME 0X22 //data is needed  0x7E 06 22 00 xx yy EF;(xx volume)(yy number of song)
#define CMD_SEL_DEV 0X09 //SELECT STORAGE DEVICE, DATA IS REQUIRED
#define DEV_TF 0X02 //HELLO,IM THE DATA REQUIRED
#define SLEEP_MODE_START 0X0A
#define SLEEP_MODE_WAKEUP 0X0B
#define CMD_RESET 0X0C//CHIP RESET
#define CMD_PLAY 0X0D //RESUME PLAYBACK
#define CMD_PAUSE 0X0E //PLAYBACK IS PAUSED
#define CMD_PLAY_WITHFOLDER 0X0F//DATA IS NEEDED, 0x7E 06 0F 00 01 02 EF;(play the song with the directory \01\002xxxxxx.mp3
#define STOP_PLAY 0X16
#define PLAY_FOLDER 0X17// data is needed 0x7E 06 17 00 01 XX EF;(play the 01 folder)
#define SET_CYCLEPLAY 0X19//data is needed 00 start; 01 close
#define SET_DAC 0X17//data is needed 00 start DAC OUTPUT;01 DAC no output

void setup() {
  pinMode(buttonPin, INPUT);
  strip.begin(); // Initialize the NeoPixel strip object (REQUIRED)
  strip.show();  // Turn off all pixels initially (optional, but good practice)
  strip.setBrightness(50); // Set brightness (0-255). Call once in setup.
  Serial.begin(9600);//Start our Serial coms for serial monitor in our pc
  mySerial.begin(9600);//Start our Serial coms for THE MP3
  delay(500);//Wait chip initialization is complete
  sendCommand(CMD_SEL_DEV, DEV_TF);//select the TF card  
  delay(200);//wait for 200ms
}

void loop() {
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    strip.fill(strip.Color(255, 147, 41)); // Set all pixels in RAM to Red (R, G, B)
    strip.show(); 
  }

    //sendCommand(CMD_PLAY_W_INDEX, 0X01);
    sendCommand(CMD_PLAY_WITHVOLUME, 0X0F01);
    delay(35000);
  } 
  else {
    strip.fill(strip.Color(0, 0, 0)); 
    strip.show(); 

}}

void sendCommand(int8_t command, int16_t dat)
{
 delay(20);
 Send_buf[0] = 0x7e; //starting byte
 Send_buf[1] = 0xff; //version
 Send_buf[2] = 0x06; //the number of bytes of the command without starting byte and ending byte
 Send_buf[3] = command; //
 Send_buf[4] = 0x00;//0x00 = no feedback, 0x01 = feedback
 Send_buf[5] = (int8_t)(dat >> 8);//datah
 Send_buf[6] = (int8_t)(dat); //datal
 Send_buf[7] = 0xef; //ending byte
 for(uint8_t i=0; i<8; i++)//
 {
   mySerial.write(Send_buf[i]) ;//send bit to serial mp3
   Serial.print(Send_buf[i],HEX);//send bit to serial monitor in pc
 }
 Serial.println();
}

Leave a comment