Remote Wireless Igniter

by MosesJLJMGPhillips in Circuits > Arduino

46 Views, 1 Favorites, 0 Comments

Remote Wireless Igniter

image.jpg
image.jpg
image.jpg

This is a wireless igniter that uses a remote control to trigger a relay which burns through some steel wool (or Nichrome wire would be just as good).

As the steel wool glows red hot and melts, it ignites an explosive such as gunpowder or something. Probably couldn’t ignite a fuse, but maybe if you used cotton wool.

This setup allows you to stand a safe distance away from a small explosion.

Also, it enables you to not just press a button, but put a code into the remote for extra security.

Supplies

image.jpg
IMG_4794.jpeg
IMG_4791.jpeg
IMG_4790.jpeg
IMG_4795.jpeg
IMG_4796.jpeg
IMG_4800.jpeg
IMG_4799.jpeg
IMG_4797.jpeg
IMG_4801.jpeg
IMG_4802.jpeg
IMG_4803.jpeg
IMG_4804.jpeg
IMG_4805.jpeg
image.jpg
IMG_4806.jpeg

1 x Arduino Uno

3 x Male to Male Jumper wires

8 x Female to Male Jumper wires

1 x Relay Module

1 x Two Core Wire (the longer, the safer your microcontroller!)

2 x Crocodile Clip Wires

2 x 9V Batteries

1 x 9V to Arduino connector wire

1 x 9V clip on connector wire

1 x IR Receiver

1 x IR Remote

1 x Ball of Steel Wool

1 x Red LED (can of course be any other colour)

1 x Small Solderless Breadboard

1 x Container (metal tin is best to protect electronics from explosion, with plastic tupperware inside to prevent short-circuit)

1 x 220 ohm Resistor

Connect Components to Arduino

image.jpg
image.jpg


Arduino:

5V to + Rail on breadboard


IR Receiver:

GND to Arduino GND

VCC to + Rail on breadboard

SIG to Arduino Pin 2


Relay Module:

GND to Arduino GND

VCC to + Rail on breadboard

SIG to Arduino Pin 7


LED:

+ Leg to 220 ohm Resistor

- Leg to Arduino GND


Resistor:

Leg one to Arduino Pin 3

Leg two to Led + Leg

Attach Two Core Wire to Relay Output, and Two-core Wire to Crocodile Clip Wires

Attach one core wire of the two-core wire to the Positive (red) wire of the 9V snap-on connector. Connect the Negative (black) wire of the 9V snap-on connector to the Relay Module Positive Output, and the other core wire to Relay Module Negative Output. Then on the other side of the two-core wire attach one core wire to a crocodile clip wire, and the other core wire to the other crocodile clip wire.

Attach Steel Wool/Nichrome Wire

image.jpg
image.jpg

Cut a piece of steel wool or Nichrome wire about 2cm long, and attach one end to one crocodile clip wire, and the other end to the other crocodile clip wire.

If you use steel wool, (which melts), or if you are detonating an explosive, you will need to repeat this step every time.

Flash the Code

Now to flash the code to the Arduino. This code adds extra security, because

A) it only recognises the correct code from the remote

B) you have to put the code in within ten seconds

C) it uses a watchdog, so if the Arduino gets stuck in a dangerous position, it will reset automatically.

(This code is built for two relays in series for extra safety, but I didn’t end up putting both in.)

Copy and paste the following code into the Arduino IDE:


// Remote Igniter Code

// By Moses J.L.J.M.G. Phillips

#include <IRremote.h>

#include <avr/wdt.h> // Include the internal Watchdog Timer library


// --- Pin Definitions ---

const int IR_RECEIVE_PIN = 2;

const int RELAY_PIN_A = 7; // Primary control line

const int RELAY_PIN_B = 8; // Secondary control line (Logic link)

const int STATUS_LED = 3; // Wired to a separate LED on Pin 3


// --- Combo Configuration ---

// These are mapped to your specific remote's captured 32-bit hex values

const unsigned long CODE_1 = 0xE916FF00; // '1' button

const unsigned long CODE_2 = 0xF30CFF00; // '2' button

const unsigned long CODE_3 = 0xBA45FF00; // '3' button

const unsigned long CODE_4 = 0xE916FF00; // '4' button (shares the same hex footprint on your remote)

const unsigned long CODE_POWER = 0xA15EFF00; // 'Power' button


const int SEQUENCE_LENGTH = 5;

// The precise 5-digit key ordering: 1 -> 2 -> 3 -> 4 -> Power

const unsigned long SECRET_SEQUENCE[SEQUENCE_LENGTH] = {CODE_1, CODE_2, CODE_3, CODE_4, CODE_POWER};


// --- Timing Configuration ---

const unsigned long TIMEOUT_DURATION = 10000; // 10s code entry limit

const unsigned long WARNING_DURATION = 5000; // 5s arming warning period


// --- State Variables ---

int currentStep = 0;

unsigned long sequenceStartTime = 0;

bool isArmed = false;

unsigned long armStartTime = 0;


void flashErrorLED() {

digitalWrite(STATUS_LED, HIGH);

delay(150);

digitalWrite(STATUS_LED, LOW);

}


void setup() {

// PRECAUTION 4: Set pins LOW *before* enabling output to completely eliminate boot-glitches

digitalWrite(RELAY_PIN_A, LOW);

digitalWrite(RELAY_PIN_B, LOW);

digitalWrite(STATUS_LED, LOW);

pinMode(RELAY_PIN_A, OUTPUT);

pinMode(RELAY_PIN_B, OUTPUT);

pinMode(STATUS_LED, OUTPUT);


Serial.begin(9600);

IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK);

Serial.println(F("System Booted. Enabling Watchdog..."));

// FIXED: Expanded the Watchdog window to 4 seconds to prevent the 1-second trigger delay from tripping it.

wdt_enable(WDTO_4S);

Serial.println(F("System Ready. Enter code (10s limit)..."));

}


void loop() {

// PRECAUTION 2: "Reset" the watchdog timer on every single loop iteration.

wdt_reset();


// Handle the Active Arming / Warning Cycle (Precaution 3)

if (isArmed) {

unsigned long elapsedArmTime = millis() - armStartTime;

// Create a rapid warning blink on the separate LED without using blocking delay()

if ((elapsedArmTime / 100) % 2 == 0) {

digitalWrite(STATUS_LED, HIGH);

} else {

digitalWrite(STATUS_LED, LOW);

}


// Check if any IR button is pressed during the warning phase to trigger an ABORT

if (IrReceiver.decode()) {

if (IrReceiver.decodedIRData.decodedRawData != 0x0) {

Serial.println(F("!!! ABORT SIGNAL DETECTED !!! Sequence canceled."));

isArmed = false;

digitalWrite(STATUS_LED, LOW);

flashErrorLED();

}

IrReceiver.resume();

}


// If the 5-second countdown finishes without an abort, execute trigger

if (isArmed && (elapsedArmTime >= WARNING_DURATION)) {

isArmed = false;

Serial.println(F("WARNING COMPLETE: Activating outputs..."));

// PRECAUTION 1: Dual-Pin activation sequence

digitalWrite(STATUS_LED, HIGH); // Solid status light

digitalWrite(RELAY_PIN_A, HIGH);

digitalWrite(RELAY_PIN_B, HIGH);

delay(1000);

digitalWrite(RELAY_PIN_A, LOW);

digitalWrite(RELAY_PIN_B, LOW);

digitalWrite(STATUS_LED, LOW);

Serial.println(F("Execution finished. System reset."));

}

return; // Skip normal code processing while armed

}


// Handle code entry expiration timeout

if (currentStep > 0 && (millis() - sequenceStartTime >= TIMEOUT_DURATION)) {

Serial.println(F("TIMEOUT: 10 seconds exceeded. Sequence reset."));

currentStep = 0;

flashErrorLED();

}


// Process standard IR code inputs

if (IrReceiver.decode()) {

unsigned long receivedCode = IrReceiver.decodedIRData.decodedRawData;

if (receivedCode != 0x0) {

Serial.print(F("Received: 0x"));

Serial.println(receivedCode, HEX);

if (currentStep == 0) {

sequenceStartTime = millis();

}

if (receivedCode == SECRET_SEQUENCE[currentStep]) {

currentStep++;

Serial.print(F("Correct! Progress: "));

Serial.print(currentStep);

Serial.print(F("/"));

Serial.println(SEQUENCE_LENGTH);

if (currentStep == SEQUENCE_LENGTH) {

Serial.println(F("CODE ACCEPTED: Entering 5-second Arming Countdown. Press ANY key to abort!"));

isArmed = true;

armStartTime = millis();

currentStep = 0;

}

}

else {

Serial.println(F("WRONG BUTTON: Sequence reset."));

currentStep = 0;

flashErrorLED();

// Fixed syntax checkpoint: Explicitly evaluates against index [0] of the array

if (receivedCode == SECRET_SEQUENCE[0]) {

currentStep = 1;

sequenceStartTime = millis();

Serial.println(F("Started new attempt with first button."));

}

}

}

IrReceiver.resume();

}

}

Housing the Electronics

image.jpg
image.jpg

Cut two small holes in the front of your tin, and one in the back. Put the plastic tupperware in, then stuff the electronics into that.

Push the two core wire through the hole in the back (you will have to remove the crocodiles clip wires first), and the LED through one of the front holes, and the IR Receiver through the other front hole.

Testing.

Snap on the two 9V batteries. The Arduino’s green light will turn on. Close the tin’s lid.

Put in the code on the remote, with the remote facing the IR receiver. My code is 1234 then red Power button, but you can change that by changing the IR codes in the code.

If you put in the wrong code, the red LED will flash once. If you put in the right code, the red LED will flash on and off for five seconds, then the relay will click on and the steel wool will glow red hot and melt!

When using this to ignite something, stretch the two core wire to its full length to protect the Arduino, put the explosive touching the steel wool, or even better with the steel wool wrapped around the explosive, then stand at least 5m away from the Igniter box on the opposite side to the explosive. Then put in the code, stay far back, and wait for the explosion.

If it doesn’t go off after ten seconds, put in the code again. If it still doesn’t work after a further minute, cautiously go forward and check that everything is working. Use something to shield you, in case the explosive goes off unexpectedly.