Сверхчувствительный детектор ЭМП на Arduino Nano: пошаговая инструкция
Компоненты и материалы
| Компонент | Описание | Кол-во |
|---|---|---|
| Arduino Nano R3 | Микроконтроллер | 1 |
| Adafruit LCD 16x2 (белый на синем) | Дисплей для индикации уровня поля | 1 |
| Пьезоизлучатель (Buzzer) | Звуковая сигнализация | 1 |
| Светодиод | Световая индикация | 1 |
| Переключатель (Toggle Switch) | Выбор диапазона чувствительности | 1 |
Приложения и сервисы
- Arduino IDE
О проекте
Простое устройство для обнаружения слабых электромагнитных полей. Относительная интенсивность отображается на LCD, сопровождается звуковым и световым сигналом. В качестве антенны используется медный провод (диаметр 1.5 мм), можно применить любой провод или металлическую пластину.
Чувствительность регулируется в коде и заменой резистора между A0 и землей. Переключатель переключает два значения резистора, меняя диапазон чувствительности — это позволяет калибровать прибор, сравнивая с эталонным промышленным детектором.

Схема минимальна: Arduino Nano и несколько внешних компонентов.
Код объединяет два проекта: VU-метр на LCD (автор KTAudio) и EMF-детектор Aaron ALAI, с модификациями для стабильности. Доступен для скачивания по ссылке.
Устройство обнаруживает поля от кабелей под напряжением (без нагрузки). Поле от старого CRT-монитора улавливается на расстоянии 3+ метров.
Детектор размещен в удобном корпусе, питание — крона 9В.
Код
EMF Detector (C/C++)
/* Arduino based VU meter by KTAudio. Developed by ThomAce (Tamas Kamocsai) based on siemenwauters, theredstonelabz and michiel H's VU meter. GNU GPL License v3 Developer: ThomAce (Tamas Kamocsai) Mail: thomacepcg@gmail.com Version: 1.0 Last modification date: 2019.09.24 Original version: https://www.instructables.com/id/ARDUINO-VU-METER/ Original description: VU meter by siemenwauters, theredstonelabz and michiel H don't forget to like and subscribe to support my work. tnx Modified by mircemk (Mirko Pavleski) */
#include <LiquidCrystal.h>
byte Bar[8] = { B11111, B00000, B11111, B11111, B11111, B11111, B00000, B11111 };
byte L[8] = { B00111, B01000, B10100, B10100, B10100, B10111, B01000, B00111 };
byte R[8] = { B00111, B01000, B10110, B10101, B10110, B10101, B01000, B00111 };
byte EndMark[8] = { B10000, B01000, B00100, B00100, B00100, B00100, B01000, B10000 };
byte EmptyBar[8] = { B11111, B00000, B00000, B00000, B00000, B00000, B00000, B11111 };
byte peakHoldChar[8] = { B11111, B00000, B01110, B01110, B01110, B01110, B00000, B11111 };
String main_version = "1.0";
int right;
const int numReadings = 5;
int indexR = 0;
int totalR = 0;
int maxR = 0;
int inputPinR = A0;
int volR = 0;
int rightAvg = 0;
long peakHoldTime = 100;
long peakHold = 0;
int rightPeak = 0;
long decayTime = 0;
long actualMillis = 0;
int pin10 = 10;
int val = 0;
int pin9 = 9;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
lcd.begin(40, 2);
lcd.createChar(1, Bar);
lcd.createChar(3, R);
lcd.createChar(4, EmptyBar);
lcd.createChar(5, EndMark);
lcd.createChar(6, peakHoldChar);
String KTAudio = " MIRCEMK";
for (int i = 0; i <= 16; i++) {
lcd.setCursor(0, 0);
lcd.print(KTAudio.substring(0, i));
delay(50);
}
KTAudio = " EMF-detector " + main_version;
for (int i = 0; i <= KTAudio.length(); i++) {
lcd.setCursor(0, 1);
lcd.print(KTAudio.substring(0, i));
delay(50);
}
delay(500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Loading...");
for (int i = 0; i < 16; i++) {
lcd.setCursor(i, 1);
lcd.write(4);
}
for (int i = 0; i < 16; i++) {
lcd.setCursor(i, 1);
lcd.write(1);
delay(50);
}
delay(500);
lcd.clear();
decayTime = millis();
}
void loop() {
lcd.setCursor(0, 0);
lcd.write(" EMF-intensity");
actualMillis = millis();
lcd.setCursor(0, 1);
lcd.write(3);
lcd.setCursor(15, 1);
lcd.write(5);
totalR = analogRead(inputPinR);
if(totalR >= 1){
totalR = constrain(totalR, 0, 100);
totalR = map(totalR, 0, 100, 1, 255);
analogWrite(pin10, totalR);
analogWrite(pin9, totalR);
}else{
analogWrite(pin10, 0);
analogWrite(pin9, 0);
}
if(totalR > maxR) { maxR = totalR; }
indexR++;
if (indexR >= numReadings) { indexR = 0; right = maxR; maxR = 0; }
volR = right / 3;
if(volR > 14) { volR = 14; }
if (volR < (rightAvg - 2)) {
if (decayTime < actualMillis) rightAvg--;
volR = rightAvg;
} else if (volR > (rightAvg + 2)) {
volR = (rightAvg + 2);
rightAvg = volR;
} else { rightAvg = volR; }
if (volR > rightPeak) { rightPeak = volR; }
drawBar(volR, rightPeak, 1);
if (decayTime < actualMillis) decayTime = (millis() + 50);
if (peakHold < actualMillis) { peakHold = (millis() + peakHoldTime); rightPeak = -1; }
}
void drawBar(int data, int peakData, int row) {
if (peakData < 2) { peakData = -1; }
for (int col = 1; col < 15; col++) {
lcd.setCursor(col, row);
if (col < data) { lcd.write(1); }
else if (peakData == col) { lcd.write(6); }
else { lcd.write(4); }
}
}
Схемы
Производственный процесс
- Создание осциллографа на Arduino Nano с дисплеем Nokia 5110 (20 кГц): простое DIY-руководство
- DIY детектор землетрясений на ADXL335 с усилением ОУ OP07
- Создание анимации и игр на LCD 16×2 с Arduino UNO
- Умный вольтметр на Arduino и смартфоне — простое DIY-проект
- Детектор аудиочастот на Arduino: измеряем пик громкости с высокочувствительным модулем
- Сборка DIY VR-скейтборда на Arduino, Google Cardboard и Bluetooth
- Самодельный осциллограф на Arduino Nano (10 Гц – 50 кГц) с ЖК-дисплеем 128×64
- DIY Arduino Radionics EMR Treatment Device — радионическое устройство
- Надежная погодная станция на Arduino с датчиками DHT
- Создание дешевого детектора молний на Arduino Uno