Go Down

Topic: EMF Detector - increasing sensitivity? (Read 2 times) previous topic - next topic


Dec 17, 2012, 04:44 am Last Edit: Dec 17, 2012, 05:24 am by arduinokov Reason: 1

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).

Code: [Select]

// 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);
     digitalWrite(LED2, LOW);

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

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

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

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

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

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

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

   if (average > 950){
     digitalWrite(LED10, HIGH);
     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




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  :)


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.



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.


Dec 17, 2012, 07:22 pm Last Edit: Dec 17, 2012, 10:07 pm by oric_dan(333) Reason: 1
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.


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.


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.



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



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.
Formal verification of safety-critical software, software development, and electronic design and prototyping. See http://www.eschertech.com. Please do not ask for unpaid help via PM, use the forum.

Go Up