/* * Simple EMF Meter for ESP32 * OpenParanormal Project * * Lights up LEDs based on electromagnetic field strength * Similar to commercial K2 meters * * Hardware: * - ESP32 DevKit * - 5x LEDs (Green, Yellow, Orange, Red, Red) * - 5x 220Ω resistors * - Hall effect sensor (A3144) or coil antenna * * Wiring: * LED 1 (Green) → GPIO 13 → 220Ω → GND * LED 2 (Yellow) → GPIO 12 → 220Ω → GND * LED 3 (Orange) → GPIO 14 → 220Ω → GND * LED 4 (Red) → GPIO 27 → 220Ω → GND * LED 5 (Red) → GPIO 26 → 220Ω → GND * * Hall Sensor: * VCC → 3.3V * GND → GND * OUT → GPIO 34 */ // LED pins #define LED1 13 // Green - Low #define LED2 12 // Yellow - Medium-Low #define LED3 14 // Orange - Medium #define LED4 27 // Red - High #define LED5 26 // Red - Very High // Sensor pin (analog) #define SENSOR_PIN 34 // Thresholds for LED activation #define THRESHOLD1 100 #define THRESHOLD2 200 #define THRESHOLD3 400 #define THRESHOLD4 800 #define THRESHOLD5 1500 // Smoothing #define SAMPLES 10 int readings[SAMPLES]; int readIndex = 0; int total = 0; void setup() { Serial.begin(115200); Serial.println("OpenParanormal EMF Meter"); // Set LED pins as outputs pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT); pinMode(LED5, OUTPUT); // Initialize sensor pin pinMode(SENSOR_PIN, INPUT); // Initialize readings array for (int i = 0; i < SAMPLES; i++) { readings[i] = 0; } // Startup animation startupAnimation(); } void loop() { // Read sensor with smoothing int rawValue = analogRead(SENSOR_PIN); // Subtract oldest reading total = total - readings[readIndex]; // Read new value readings[readIndex] = rawValue; // Add to total total = total + readings[readIndex]; // Advance to next position readIndex = (readIndex + 1) % SAMPLES; // Calculate average int emfValue = total / SAMPLES; // Debug output Serial.print("EMF Value: "); Serial.println(emfValue); // Light up LEDs based on thresholds if (emfValue >= THRESHOLD1) { digitalWrite(LED1, HIGH); } else { digitalWrite(LED1, LOW); } if (emfValue >= THRESHOLD2) { digitalWrite(LED2, HIGH); } else { digitalWrite(LED2, LOW); } if (emfValue >= THRESHOLD3) { digitalWrite(LED3, HIGH); } else { digitalWrite(LED3, LOW); } if (emfValue >= THRESHOLD4) { digitalWrite(LED4, HIGH); } else { digitalWrite(LED4, LOW); } if (emfValue >= THRESHOLD5) { digitalWrite(LED5, HIGH); } else { digitalWrite(LED5, LOW); } delay(100); // Small delay for stability } void startupAnimation() { // Light up LEDs in sequence for (int i = 0; i < 3; i++) { digitalWrite(LED1, HIGH); delay(100); digitalWrite(LED2, HIGH); delay(100); digitalWrite(LED3, HIGH); delay(100); digitalWrite(LED4, HIGH); delay(100); digitalWrite(LED5, HIGH); delay(200); // Turn all off digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); delay(200); } }