possible emi freezing serial monitor?

I am working on a retrofit kit for the old manuall propane scare cannons. here are the items I am ussing

arduino uno rev 3 HV transformer (Spark Gap Igniter - 4.8V) [urlhttps://www.sparkfun.com/products/11218][/url] 12v siloniod

here is my schematic

and my code is too long for this post.

The problem I have been having is that the serial monitor keeps freezing. The program continues to run and does what it is supposed to. In order to view the procces again thu the serial monitor I have to unplug the arduino and the usb, close the arduino IDE. plug it all back in and start again. I have tried terra term and it freezes as well. I have unpluged the siloniod and the transformer and the serial monitor works flawlessly. Thru the proccess of elimination I have deducted that the problem is the ignitor. I have moved it 4 - 5 feet away from the arduino and it seemed to help a little. when it is unpluged the serial monitor works flawlessly.

so my questions are. have I grounded things the wrong way? Do I need to put a diode in the line? do I need some other type of suppressor?

here is my code

//Propane cannon ver 1.0  
//Program written By
//                      Kenneth Nagle
//                          08/18/2013
//  This program is intended for the retro fit of the mechanical propane scare cannons
//
//
//
// initializing var for pins
const int
test_switch = 8,// sets digital pin 9  to a button
cannon_live_led = 7,// sets digital pin 11 to green led that will indicate the cannon is live
warning_light = 5,//sets pin for red led that will indicate the cannon is about to fire
propane  = 3,// sets pin to turn the propane on
propane_dir = 12,// sets the current in the right direction for propane
ignitor   =11,// turns the ignitor on
ignitor_dir = 13,// sets the dirrection of the current for the ignitor
photoRPin = 1;// sets anolog pin 0 as input from photo resistor



// initializing states
int buttonState = 0; // to make sure the button is set to low
int ignitor_on = 20; // sets the voltage for ignitor to around 6v
int ignitor_off = 0; // sets the voltage for ignitor to 0v

// initializing var for light levels 
int lightLevel; // the current light level
int eveninglight = 255; // set this number to the light level you want the cannon to start firing
int morninglight = 280; // set this number to the light level you want the cannon to stop firing
int test_lightlevel; // for purpose of serial printing the current light level

// initializing var for times

int sensor_delay = 2000; // sets the delay for the time between reading sensors
long randNumber; // this will be used to create a random number that will be added to min_time
                  // so the cannon will go off at random intervolts
int min_time;  // the minimum amount of time between cannon ignition                  
int counter; // this will be randNumber + min_time
int counter_delay = 1000; // sets the delay between count cycles; // this will be used to set the count at seconds or minutes
                          // 1000 = sec
                          // 60000 = min
int ignitor_delay = 1000; // the amount of time the ignitor will spark in mill sec
int propane_delay = 2000; // the amount of time the silonoid will be open in mill sec


void setup() {
 Serial.begin(9600); // baud rate of serial connection
 // set the pins up
  pinMode(cannon_live_led,OUTPUT); // sets cannon_on_led digital pin 7 to output
  pinMode(propane_dir, OUTPUT);  // sets ignitor, digital pin 12 to output
  pinMode(ignitor_dir, OUTPUT);  // sets ignitor, digital pin 13 to output
  pinMode(test_switch,INPUT);  // sets test_button, digital pin 8 to output
  pinMode(warning_light, OUTPUT);  // sets warning_light, digital pin 6 to output 
  lightLevel=analogRead(photoRPin); // sets lightlevel as the input from photoRPin analog pin 0 "current light level"
  
 

// setup delays
sensor_delay = 2000; // sets the delay for the time between reading sensors

// print starting info
  lightLevel=analogRead(photoRPin); // reads current light level 0-1024
  buttonState = digitalRead(test_switch); // reads the current button state 0=off 1=on
  test_lightlevel = (lightLevel); // puts the current light level in the var test_lightlevel for printing to serial connection
 
  Serial.println("start propane cannon program ver 1.0"); // prints name of the program to serial monitor
  Serial.print("the light level is "); // prints text serial monitor
  Serial.println(test_lightlevel); //prints current light level to serial monitor
  Serial.print("the button state is ");// prints text the serial monitor
  Serial.println(buttonState);// prints current button state to serial monitor 1=on 0=off

}

void loop()
{ // beging of main loop
  digitalWrite(cannon_live_led, LOW);
  int test;
  
  delay(5000);// delayed to have time to bring up serial monitor
  lightLevel=analogRead(photoRPin); // reads current light level 0-1024
  buttonState = digitalRead(test_switch); // reads the current button state 0=off 1=on
  test_lightlevel = (lightLevel); // puts the current light level in the var test_lightlevel for printing to serial connection
 
    if(buttonState==HIGH) // if the buttton is on
      { //beging of if (buttonState==high)
        // fire the cannon
        while (buttonState==HIGH) // continue as long as the switch is in the on position
        { // beging of the while button is on loop
        buttonState = digitalRead(test_switch); // reads the current button state 0=off 1=on
          if (buttonState==LOW) // if the switch has been turned off
            { // beging of if button is still on
              break;//end the while loop
            }//end of if button is still on
        digitalWrite(cannon_live_led, HIGH);// turn the green led on to indicate the cannon is live
        test = fire(); // the fire function
        Serial.println("the button is on"); // prints text to serial monitor
        }// end of the while button is on loop
      } //end of if (buttonState==high)
     else if(eveninglight>lightLevel)// if the value for evening light is greater that the current light level
       { //beging of if (eveninglight>lightLevel)
         // fire the cannon
         lightLevel=analogRead(photoRPin); // reads current light level 0-1024
         Serial.print("it is evening the light level is ");// prints text to serial monitor
         Serial.println(test_lightlevel);// prints the current light level to serial monitor
            while (morninglight>lightLevel) // continue as long as the light level is below the level mor morning
                { // beging of the while evening light loop
                    buttonState = digitalRead(test_switch); // reads the current button state 0=off 1=on
                    lightLevel=analogRead(photoRPin); // reads current light level 0-1024
                      if (morninglight<lightLevel) // if the light level is above morning light turn cannon off
                        { // beging of if button is still on
                          break;//end the while loop
                        }//end of if button is still on
                    digitalWrite(cannon_live_led, HIGH);// turn the green led on to indicate the cannon is live
                    test = fire(); // the fire function
                    Serial.println("the button is off"); // prints text to serial monitor
                }// end of the while button is on loop
       } // end of if (eveninglight>lightLevel)
     else // if the switch is not on and the current light level is greater than evening light 
       { // beging of default state
         Serial.println("the cannon is off");// prints text to serial monitor
         Serial.println("it is too bright for the cannon to be on.");// prints text to serial monitor
         Serial.print("the current light level is ");// prints text to serial monitor
         Serial.println(test_lightlevel);// prints the current light level to serial monitor
         Serial.println("#");// prints the current # to serial monitor to seperate new reading
         Serial.println("#");// prints the current # to serial monitor to seperate new reading
         delay(5000);
       } // end of default state
}//end of main loop
int fire()//this is the function to fire the cannon
    {// the beging of the fire function
       Serial.print("Morninglight is ");
       Serial.println(morninglight);
       Serial.print("eveninglight is ");
       Serial.println(eveninglight);
       Serial.print("the current light level is ");
       Serial.println(test_lightlevel);
       int led_1;
       
       counter = 0;
      min_time = 0;
      randNumber = random(0, 15);
      counter = (min_time+randNumber);
      Serial.print("the randNumber is "); 
      Serial.println(randNumber); 
        while (counter>0)
           {
             Serial.print("the count is  "); 
             Serial.println(counter);
             counter = counter-1;
              if (counter==1)
               {
                 Serial.println("warning light should be on");
                 digitalWrite(warning_light, HIGH);
               }
              if(counter==0)
               {
                 Serial.println("siloniod valve should be open");
                 //digitalWrite(propane,HIGH);
                  digitalWrite(propane_dir, HIGH);
                  analogWrite(propane, 255);
                  delay(2000);
                  digitalWrite(propane_dir, HIGH);
                  analogWrite(propane, 0);
                   delay(1000);
                  digitalWrite(ignitor_dir, HIGH);
                  analogWrite(ignitor, 255);
                  delay(1000);
                  digitalWrite(ignitor_dir, HIGH);
                  analogWrite(ignitor, 0);
                  digitalWrite(warning_light, LOW);
                  Serial.println("warning_light should be off");
                 //break;
                }
                
             
            delay(counter_delay);
           } 
    delay(sensor_delay); // transmits according to the delay
   }// the end of the fire function

Try posting the schematic or a photo (I think you'll find you can do that now, its prevented in a first post for spam-reduction reasons).

Any high voltage discharge is going to generate interference, and also the supply wires to the device may need good decoupling added - a key question is how far is the discharge from all the sensitive circuitry?

the spark is generated about three feet from the circuitry. I did not post the actual schematic because it seems that the breadboard design image was more clear. Does the image not display correctly?

Link to image https://sites.google.com/site/aocstormrising/propane%20cannon%20v1_0%20640.jpg

or download it here https://sites.google.com/site/aocstormrising/propane%20cannon%20v1_0%20640.jpg?attredirects=0&d=1