Thunder & Lightning Animation
Updated
revised d. bodnar  11-08-2019

Overview
The Thunder & Lightning Animation that I developed a few years ago has become very popular.  You can see the original web page here:
http://www.trainelectronics.com/Animation-thunder-lightning/

I have had a number of requests for modifications from YouTube viewers and folks who have built up the circuit.  This web page and associated video show the updates that I have made to the circuit and software. 

The goals of the update are:

  • To simplify construction by creating and making available a custom 2 sided circuit board
  • To add a relay output option that can turn on lights or motorized items when the sound starts, turning them off when the sound stops
  • To add a second trigger input that can be used for a number of optional behaviors
  • To add a second relay output that can be used to activate an additional motor or lights
 

 

For the basic Thunder & Lightning effect you can ignore Trig2, LED1, LED2, Relay 1 and Relay 2.  If you want some animation to be activated for the duration of the sound Relay 1 and LED 1 can be used.
There are also two "spare" inputs, labeled 7 & 6 as those are the input pins they are connected to.

Rather than putting a relay and the associated circuitry on the circuit board I opted to use an inexpensive 5 volt relay module.  This device connects to 5 volts, ground and an output pin on the Arduino.  The small yellow jumper allows you to decide if the relay triggers when the input pin goes high or low.  There are other 5 volt relay modules without this option but I find it very convenient should I need to change the status of how the relay operates.

Available at Amazon here:https://www.amazon.com/s?k=Dafurui+8Pcs+DC+5V+1+Channel+Relay&i=industrial&ref=nb_sb_noss
It is best to order the board that has a Hi/Low trigger option as shown here

 

 

 

Parts
 
  • Circuit board or hand wired prototype board
  • Arduino Pro Mini (Amazon or eBay)
  • DF Player (Amazon or eBay)
  • 7805 Voltage Regulator (Amazon or eBay)
  • IRL520 or IRL540 (Amazon or eBay)
  • 1 gig or larger MicroSD card (Amazon or eBay)
  • resistors:  1K, 470, 10K
  • LEDs
  • 5 volt relay board (Amazon or eBay) - single relay, High/Low jumper
  • 10uF tantalum capacitor
  • Sperker (4 ohm)

 

/*
   REVISED for new circuit board - 10-21-2019
   d. bodnar - 9-06-2016
   Lightning & thunder for CHP castle
*/

#include <DFPlayer_Mini_Mp3.h>
const int s1 =  A3;  // directly trigger file #1 - not yet implemented
const int s5 = A2;   // directly trigger file #5 - not yet implemented
const int buttonPin = 3;     // TRIG 1 the number of the pushbutton pin
const int buttonPin2 = 9;  // TRIG 2 Switch #2 on new board
const int buttonState2 = 0;
int buttonState = 0;         // variable for reading the pushbutton status
int buusyPin = 10;// buusyPin = 10; // sound player busy --- NOT DONE ON BOARD!!!!!!!!!!!!!!!!!!
int bsy = 0;
int LEDstripLight = 12; // WAS 13   IRL520 to LED strip light
int spare1 = 7; // spare input #1
int spare2 = 6; // spare input #2

const int relay1 = 13;  // relay connection #1
const int relay2 = 11;  // relay connection #2
int sensorPin = A0;    // Audio level samples
int sensorValue = 0;  // variable to store the value coming from the sensor
int buttn = 0;
int buttn2 = 0;

//***************************************SETUP*************************************
void setup () {
  pinMode(buttonPin, INPUT);
  pinMode(LEDstripLight, OUTPUT);
  pinMode(buusyPin, INPUT);
  pinMode(buttonPin, INPUT);
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  digitalWrite(relay1, LOW);
  Serial.begin (9600);
  mp3_set_serial (Serial); //set Serial for DFPlayer-mini mp3 module
  mp3_set_volume (30);          // must remove mp3_reset(); to get this to work
  Serial.println("From Web Page");
}

//.......................................LOOP................................................
void loop () {
  Serial.println("");
  Serial.println("Waiting for Button Push");
  do {

    buttn = digitalRead(buttonPin); // pins closest to power pins
    buttn2 = digitalRead(buttonPin2); //
    Serial.println(buttn2);
    //    if (buttn2 == 0) {
    //      digitalWrite(relay1, HIGH);
    //    }
    //    else {
    //      digitalWrite(relay1, LOW);
    //    }
  } while (buttn == 0);

  Serial.println("Button Hit");
  digitalWrite(relay1, HIGH);
  mp3_play(1);
  delay(100);
  do {
    sensorValue = analogRead(sensorPin);
    Serial.print(sensorValue);
    Serial.print(" ");
    if (sensorValue >= 750) {
      Serial.println("large number! ");
      digitalWrite(LEDstripLight, HIGH);
    }
    if (sensorValue <= 666) {
      digitalWrite(LEDstripLight, LOW);
    }
    bsy = digitalRead(buusyPin);
  } while (bsy == 0); // zero when sound active
  digitalWrite(relay1, LOW);
}

//...................................... END LOOP ........................................