Es ist ein Krampf ! Man entdeckt ein interessantes, scheinbar leicht umzusetzendes Projekt und geht mit Enthusiasmus ran an die Sache. Der Enthusiasmus fährt dann allerdings bald runter, wenn man feststellt, dass der Typ von seinem Projekt noch weniger Ahnung hat als man selbst .
Zum Beispiel war ein TIP31C-Transistor und ein Widerstand dabei, welche eigentlich völlig unnötig waren. Mal abgesehen vom teilweise frustrierenden Testen musste ich den Transistor erst (unnötigerweise) beschaffen.
Aber egal ... das Gerät funktioniert. Und es funktioniert sogar sehr gut was das Erkennen von EMF betrifft. Allerdings kriegt sich das Gerät manchmal nicht ein und piepst ununterbrochen bis man die Antenne berührt. Ich habe festgestellt, dass das auftritt, wenn ein sehr starker Impuls auf die Antenne trifft (dann schreit das Teil um Hilfe oder so). Eventuell lässt sich das softwaremäßig beheben, aber das mache ich ein anderes Mal. Jetzt brauch ich erstmal Urlaub .
Hier ein kleines Demo-Video:
Hier noch ein kurzes Demo-Video (Stromkabel, Lichtschalter):
Wen es interessiert, hier der Arduino-Code (v1):
Code: Alles auswählen
#define pitchAntenna A0 // Antenna input
#include <TimerFreeTone.h>
#define TONE_PIN 3
int melody[] = { 1600, 1800, 2000, 2200 };
int duration[] = { 250, 250, 200, 50 };
float peakPitch = 0;
float mappedPitch = 0;
float currPitch = 0; // Declaration of variables
float oldPitch = 0;
const int PIN = 9;
void setup() {
Serial.begin(115200);
pinMode(pitchAntenna, INPUT);
pinMode(PIN, OUTPUT);
int dummy = analogRead(pitchAntenna); // dummy read to settle ADC Mux
delay(50);
TimerFreeTone(TONE_PIN, 2000, 100, 10);
}
void loop() {
for (int i = 0; i < 10; i++) // Get sum of 11 ADC readings
{
currPitch += analogRead(pitchAntenna);
}
currPitch /= 11; // Divide them to get the average of 11 peaks
if (currPitch > 512) // Get upper part of the frequency spectrum of the pitch input
{
if (currPitch > peakPitch) // Check if the current pitch is higher than the previous
peakPitch = currPitch; // If it's higher, set the peak at the current pitch
else mappedPitch = map(peakPitch, 0, 1023, 800, 1823); // Maps readings to the appropriate frequency range I want to use. The ADC readings from 550 to 1023 are mapped to frequencies between 5000 and 10Hz. I noticed that the antenna was having constant peaks at 400-500, irrelevant of the objects near it, so I used the map function to get rid of values under 550
} else peakPitch = 0;
if (mappedPitch > 100) { // This works like a noise gate, increase if noise issues appear. Everything under the 100Hz range was triggered by random objects in the proximity of the Arduino, and this was added for stability
if (mappedPitch != oldPitch) {
//Serial.print(currPitch);
//Serial.print(" ");
//Serial.println(mappedPitch);
// Serial.print(" ");
//Serial.println(oldPitch);
TimerFreeTone(TONE_PIN, mappedPitch, 50, 10);
digitalWrite(PIN, HIGH);
oldPitch = mappedPitch;
} else {
digitalWrite(PIN, LOW);
}
}
}