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).
Do wykonanie układu potrzebne będą:
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.
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.
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.
// 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 } }
Alai A., 2009. EMF Detector
Cunningham C., 2009. Making the Arduino EMF detector