22. April 2018

Blitzdetektor

Wie funktioniert der Blitzdetektor?
Die Widerstände arbeiten als Spannungsteiler, sodass die Spannung beim analogen Eingang des Arduinos auf ca. 2,5 Volt liegt. Durch den hochohmigen Widerstand wird der Eingang empfindlicher. Findet im Umkreis von ca. 3 bis 15 Kilometer eine Entladung statt, empfängt die Antenne die Energien. Durch den Impuls, der von der Schaltung erzeugt wird, nimmt der Arduino am analogen Eingang den Blitz wahr. Nach der Fertigstellung kann der Blitzsensor auch mit dem Blitz einer Fotokamera getestet werden.

Störungen beheben

Manchmal kann es passieren, dass der Blitzdetektor anschlägt, obwohl gar kein Gewitter in der Nähe ist. Diese Störungen werden meist durch das Netzteil verursacht. Denn sämtliche Störungen vom Stromnetz gehen über den Computer bis hin zum Arduino, wo sie als Blitze wahrgenommen werden. Am besten wird der Arduino-Controller mit einer Batterie versorgt bzw. ein Laptop mit Akkubetrieb für die Messungen verwendet. Außerdem können Hochspannungsleitungen oder andere starke magnetische Felder ganz in der Nähe Störungen bringen.

Als Download haben wir hier einen Arduino-Code, der über den Analogen Input A5 die Schaltung mit den Widerständen und der Antenne auswertet. Das Programm läuft in einer Dauerschleife und öffnet bei einen Blitzschlag die Klasse „sendData“. Im Serial-Monitor ist jeder Blitzeinschlag ersichtlich und ein Zähler läuft mit, der die vergangenen Sekunden zwischen den letzten und den derzeitigen Blitzschlag anzeigt.

Aruino Sketch:
//More information at: https://www.aeq-web.com?ref=arduinoide

#define FASTADC 1
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

int data = 512;
int storage[512];

long FlashStart;
long FlashEnd;
long tmr;
int reading;
int count;
int maximum;
int minimum;
bool toSend;

void setup() {
#if FASTADC
sbi(ADCSRA, ADPS2) ;
cbi(ADCSRA, ADPS1) ;
cbi(ADCSRA, ADPS0) ;
#endif

Serial.begin(9600);
pinMode(A5, INPUT);
Serial.println(micros());

FlashStart = 0;
FlashEnd = 0;
reading = 0;
count = 0;
maximum = 0;
minimum = 1023;
toSend = false;
tmr = millis();
}

void loop() {
reading = (analogRead(A5));
storage[count] = reading;
if ((!toSend) && (count != 0) && ((reading > storage[count – 1] + 10) || (reading < storage[count – 1] – 10))) {
toSend = true;
}

count = count + 1;
if ((count == 512) && (toSend))
{
count = 0;
FlashEnd = millis();
sendData();
FlashStart = millis();

}
else if (count == 512) {
count = 0;
FlashEnd = millis();
FlashStart = millis();

}

}

void sendData()
{
int getout;
for (int i = 0; i < data; i++) {
getout = storage[i];
}
double tm = ((millis() – tmr) / 1000);
Serial.print(„Flash Value: „);
Serial.print(getout);
Serial.print(“ – Last Flash: „);
Serial.print(tm);
Serial.println(“ sec“);
tmr = millis();
toSend = false;
}