EMF Detector - increasing sensitivity?

Hi,

I have built a simple EMF detector using this tutorial: http://blog.makezine.com/2009/05/15/making-the-arduino-emf-detector/. My daughter is crazy about the TV show "Supernatural" and I am trying to build a simple one for her for Christmas so she can go "demon hunting". If you have seen the show, you'll know what I mean.

It is working well, but I was wondering if there is a simple way to increase it's sensitivity?

I am using 330 Ohm resistors from the pins to the LEDs and a 3.9 M Ohm resistor to the antenna (the code, provided with the tutorial is attached).

// EMF Detector for LED Bargraph v1.0
// 5.12.2009
// original code/project by Aaron ALAI - aaronalai1@gmail.com
// modified for use w/ LED bargraph by Collin Cunningham - collin@makezine.com


#define NUMREADINGS 15 // raise this number to increase data smoothing

int senseLimit = 15; // raise this number to decrease sensitivity (up to 1023 max)
int probePin = 5; // analog 5
int val = 0; // reading from probePin

int LED1 = 11;  // connections
int LED2 = 10;  // to
int LED3 = 9;   // LED
int LED4 = 8;   // bargraph
int LED5 = 7;   // anodes
int LED6 = 6;   // with
int LED7 = 5;   // resistors
int LED8 = 4;   // in
int LED9 = 3;   // series
int LED10 = 2;  // 

// variables for smoothing

int readings[NUMREADINGS];                // the readings from the analog input
int index = 0;                            // the index of the current reading
int total = 0;                            // the running total
int average = 0;                          // final average of the probe reading


void setup() {

  pinMode(2, OUTPUT);  // specify LED bargraph outputs
  pinMode(3, OUTPUT); 
  pinMode(4, OUTPUT); 
  pinMode(5, OUTPUT); 
  pinMode(6, OUTPUT); 
  pinMode(7, OUTPUT); 
  pinMode(8, OUTPUT); 
  pinMode(9, OUTPUT); 
  pinMode(10, OUTPUT); 
  pinMode(11, OUTPUT); 

  Serial.begin(9600);  // initiate serial connection for debugging/etc

  for (int i = 0; i < NUMREADINGS; i++)
    readings[i] = 0;                      // initialize all the readings to 0
}

void loop() {

  val = analogRead(probePin);  // take a reading from the probe

  if(val >= 1){                // if the reading isn't zero, proceed

    val = constrain(val, 1, senseLimit);  // turn any reading higher than the senseLimit value into the senseLimit value
    val = map(val, 1, senseLimit, 1, 1023);  // remap the constrained value within a 1 to 1023 range

    total -= readings[index];               // subtract the last reading
    readings[index] = val; // read from the sensor
    total += readings[index];               // add the reading to the total
    index = (index + 1);                    // advance to the next index

    if (index >= NUMREADINGS)               // if we're at the end of the array...
      index = 0;                            // ...wrap around to the beginning

    average = total / NUMREADINGS;          // calculate the average


    if (average > 50){                // if the average is over 50 ...
      digitalWrite(LED1, HIGH);   // light the first LED
    }
    else{                         // and if it's not ...
      digitalWrite(LED1, LOW);    // turn that LED off
    }


    if (average > 150){               // and so on ...
      digitalWrite(LED2, HIGH);
    }
    else{
      digitalWrite(LED2, LOW);
    }

    if (average > 250){
      digitalWrite(LED3, HIGH);
    }
    else{
      digitalWrite(LED3, LOW);
    }


    if (average > 350){
      digitalWrite(LED4, HIGH);
    }
    else{
      digitalWrite(LED4, LOW);
    }

    if (average > 450){
      digitalWrite(LED5, HIGH);
    }
    else{
      digitalWrite(LED5, LOW);
    }

    if (average > 550){
      digitalWrite(LED6, HIGH);
    }
    else{
      digitalWrite(LED6, LOW);
    }

    if (average > 650){
      digitalWrite(LED7, HIGH);
    }
    else{
      digitalWrite(LED7, LOW);
    }

    if (average > 750){
      digitalWrite(LED8, HIGH);
    }
    else{
      digitalWrite(LED8, LOW);
    }

    if (average > 850){
      digitalWrite(LED9, HIGH);
    }
    else{
      digitalWrite(LED9, LOW);
    }

    if (average > 950){
      digitalWrite(LED10, HIGH);
    }
    else{
      digitalWrite(LED10, LOW);
    }

    Serial.println(val); // use output to aid in calibrating
  }
}

I am strictly a basic hobbyist with Arduinos so any help would be greatly appreciated XD

You should add up an amplifier:
http://www.talkingelectronics.com/projects/FieldStrengthMeterMkl/FieldStrengthl.html

Hi,

Thanks for your reply. Could you or someone be more specific please? What kind of amplifier part? Where would it go in the schematic?

Thanks :slight_smile:

Simpler version: http://electroschematics.com/622/field-strength-meter-2/
Negative terminal of the milliampermeter goes to arduino analog input, R3 and R4 are not necessary. I'd add a cap 0.1 uF in parallel to arduino input and ground.

Hi,

I know this is a lot to ask, but I am trying to put this together before Christmas. Could someone diagram the addition of the milliampermeter? Sorry, I am a real noob. Here is the initial diagram:

emf_detector_led_bargraph2 by kovalik, on Flickr

You would have my undying gratitude XD If it is not possible, I totally understand. I'll keep trying myself.

OP, it's debatable whether you'll find any ghosts in the house using that probe, :-). What
it's really doing is using the probe wire to pick up the magnetic field given off by alternating
current in the power mains. See the part where it says "a magnetic field circulates around
a current-carrying wire" in this link, except in the AC mains, it's alternating.

http://www.khadley.com/courses/lectures_ph102/lecture5_28_10.aspx

The first FSM schematic circuit was tuned for 100-300 Mhz, which is useless for you, the
2nd was more general - just a basic amplifier. In your diagram, the Leds are just the display
device, and you would want to insert an amplifier between the probe and Arduino A/D
converter pin. Basically that "probe" is just a big antenna.

The following ckt would probably work, using an MPF102 FET bought at Radio Shack.

http://www.sciencelobby.com/field-effect-transistor/junction-fet-as-an-amplifier.html

Use the 3.3M where it shows 1M, use the probe instead of the 0.1 uF input capacitor,
forget about the 22 uF cap, and use a short to the A/D converter where it shows the 0.1
uF output cap. Supply power from the Arduino 5V pin. So, just MPF102 and 3 resistors.

Thanks for your reply. So "the ghost" has to be plugged in to the wall for the "probe" to pick it up. I understand. I will read the rest and try to understand.

Cheers XD

Also, in the video, it looked like the probe had a bare wire tip. Bad idea, as someone
can stick that into a 120VAC outlet. So, insulate the probe tip with tape, etc.

Hi,

I have a working breadboard version and I replaced the "probe" with an old telescoping antenna. It works great and is safer.

:smiley:

You could increase the 3.3Mohm resistor to 10Mohm, that will increase the sensitivity somewhat. To increase it further, add an amplifier, as has already been suggested.