Detektor pola elektromagnetycznego


Tomasz Bartuś



2017-11-12
Ładowarka słoneczna (modyfikacja)

Wstęp

Telewizor, odkurzacz, głośniki zestawu hi-fi, ładowarka telefonu... W XXI wieku otaczają nas urządzenia elektryczne. Każde z nich generuje słabsze bądź silniejsze pole elektromagnetyczne. Czasami, rozpoznanie gdzie takie pola występują i jak są silne ma znaczenie praktyczne. Dzieje się tak np. gdy musimy wywiercić otwór w ścianie i nie jesteśmy pewni czy w wybranym miejscu nie ma kabli instalacji energetycznej. W takim i podobnych przypadkach niezwykle pomocne okazują się być detektory pola elektromagnetycznego.

Tym razem chciałbym przedstawić układ detektora pól elektromagnetycznych zbudowany na bazie Arduino. Autorem projektu jest A. Alai (2009). Układ został zmodyfikowany przez C. Cunninghama (2009) przez dodanie paska diod LED. Prezentowany układ (oraz oryginalny szkic) został nieznacznie przeze mnie rozbudowany o sygnalizację dźwiękową (Fig. 1).

Układ detektora pola elektromagetycznego
Fig. 1. Układ detektora pola elektromagetycznego

Do wykonanie układu potrzebne będą:

Lista części

  1. Arduino (Nano),
  2. 10-cio segmentowy moduł diod LED,
  3. rezystor 330Ω (10 szt.),
  4. rezystor 100Ω (1 szt.),
  5. rezystor 3,3MΩ (1 szt.),
  6. buzzer z generatorem 5V,
  7. płytka prototypowa,
  8. przewody

Zasada działania

Układ zasilamy 5V przez standardową przetwornicę do płytek prototypowych. Zasilamy ją pakietem 2 ogniw Li-ion 18650 (Fig. 2). Sercem układu jest płytka mikrokontrolera Arduino Nano.

Schemat układu
Fig. 2. Schemat układu detektora pola elektromagnetycznego

Do pinów D2-D11, poprzez rezystory 330Ω podłączono anody 10-cio segmentowego modułu diod LED. W układzie zastosowano pasek 10-ciu diod LED złożony z: jednej diody niebieskiej, czterech diod zielonych, trzech diod żółtych i dwóch diod czerwonych (Fig. 3). Moduł ma za zadanie, za pomocą ilości zaświeconych diod, informować o mocy pola elektromagnetycznego. Katody diod LED podłączono do masy.

Schemat zastosowanego panelu 10-ciu diod LED
Fig. 3. Schemat zastosowanego panelu 10-ciu diod LED

Elementem wykonawczym układu jest sonda w postaci kawałka drutu o długości do kilkudziesięciu cm podłączona do pinu analogowego A5. Sonda jest podłączona przez rezystor 3,3MΩ do masy. Ostatnim elementem układu jest buzzer z generatorem. Jego zadanie polegać będzie na informowaniu za pomocą zmiennego tonu o mocy pola elektromagnetycznego. Pin + buzzera poprzez rezystor 100Ω podłączono do pinu cyfrowego D12 układu Arduino. Wejście _ buzzera podłączono do masy układu.

Film




Kod



// NEW EMF Detector for LED Bargraph v1.0
// 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
// modified for use buzzer signalization by Tomasz Bartuś

#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 = 2;
int LED2 = 3;
int LED3 = 4;
int LED4 = 5;
int LED5 = 6;
int LED6 = 7;
int LED7 = 8;
int LED8 = 9;
int LED9 = 10;
int LED10 = 11;
int Buzzer = 12;

// 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);
  pinMode(12, 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
      if (average <= 150){
          tone(Buzzer, 500);
      }
    } else{                                   // and if it's not ...
      digitalWrite(LED1, LOW);                // turn that LED off
      noTone(Buzzer);
    }

    if (average > 150){
      digitalWrite(LED2, HIGH);
      if (average <= 250){
          tone(Buzzer, 1000);
      }
    } else{
      digitalWrite(LED2, LOW);
    }

    if (average > 250){
      digitalWrite(LED3, HIGH);
      if (average <= 350){
          tone(Buzzer, 1500);
      }
    } else{
      digitalWrite(LED3, LOW);
    }

    if (average > 350){
      digitalWrite(LED4, HIGH);
      if (average <= 450){
          tone(Buzzer, 2000);
      }
    } else{
      digitalWrite(LED4, LOW);
    }

    if (average > 450){
      digitalWrite(LED5, HIGH);
      if (average <= 550){
          tone(Buzzer, 2500);
      }
    } else{
      digitalWrite(LED5, LOW);
    }

    if (average > 550){
      digitalWrite(LED6, HIGH);
      if (average <= 650){
          tone(Buzzer, 3000);
      }
    } else{
      digitalWrite(LED6, LOW);
    }

    if (average > 650){
      digitalWrite(LED7, HIGH);
      if (average <= 750){
          tone(Buzzer, 3500);
      }
    } else{
      digitalWrite(LED7, LOW);
    }

    if (average > 750){
      digitalWrite(LED8, HIGH);
      if (average <= 850){
          tone(Buzzer, 4000);
      }
    } else{
      digitalWrite(LED8, LOW);
    }

    if (average > 850){
      digitalWrite(LED9, HIGH);
      if (average <= 950){
          tone(Buzzer, 4500);
      }
    } else{
      digitalWrite(LED9, LOW);
    }

    if (average > 950){
      digitalWrite(LED10, HIGH);
      if (average <= 1024){
          tone(Buzzer, 5000);
      }
    } else{
      digitalWrite(LED10, LOW);
    }

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

Wykorzystane materiały

Alai A., 2009. EMF Detector
Cunningham C., 2009. Making the Arduino EMF detector

 
 

Doktorat

Spis treści
Rozdzialy
Abstrakt [pl]
Abstract [eng]