Elektronik-Dachbude |
Bei der ersten Version des Blitzwarners habe ich einen Arduino-Uno benutzt – das Programm und das Shield sollten aber auf jedem Board funktionieren.
Dieses Shield ist gleichzeitig Empfänger und Anzeige. Sollte sich das Gewitter noch in großer Entfernung befinden, blinkt die weiße LED selten, da nur nicht alle Entladungen empfangen werden. Je näher das Gewitter kommt, desto häufiger blinkt auch die weiße LED, bis schließlich die erste Warnstufe erreicht ist, die durch die grüne LED angezeigt wird. Sollten sich die gemessenen Blitze noch weiter häufen, zeigt die rote LED die erhöhte Warnstufe an.
C4=100nF; C5=330pF; C6=100nF; C7=22µF;
L1=250µH; L3=50µH;
LED: Pin13=
Weiß; Pin2= Grün, Pin3
= Rot;
R1=100kΩ; R2=680 Ω; R3=470 Ω; R4=220 Ω; R5=220 Ω; R6=220 Ω;
http://www.elektronik-labor.de/Projekte/Blitzwarner1.html
Es gibt aber noch eine weitere Möglichkeit Blitze
auszuwerten. Wenn das Board mit dem PC verbunden ist und ein Terminal geöffnet
ist (z.B. der in der Arduino Software integrierte „SerialMonitor“), bekommt man
immer bei einem Blitz die Meldung „Blitz!“ und eine Reihe von Messewerten angezeigt.
Ein Blitz wurde daran erkannt, dass mindestens ein Messewert
stark von den anderen abweicht (Auf dem Bild markiert). Der Grad der Abweichung
sagt etwas darüber aus, wie stark der Blitz empfangen wurde. Manche Blitze sind
noch sehr weit weg aber besonders stark, manche Blitze sehen wir besonders
deutlich aber sie sind nur schwach und manche Blitze finden in den Wolken statt und
werden nur gemessen, können aber nicht gesehen werden. Dadurch werden
gelegentlich Blitze Empfangen die wir nicht als solche wahrnehmen.
Das Programm kann noch mehr als nur aktuelle Ereignisse
anzeigen. Es verfügt zusätzlich über einen Daten-Logger. Dadurch können über
einen längeren Zeitraum Werte gesammelt werden, die man dann später aus dem
EEPROM auslesen kann. Dafür wurde die Arduino-Library EEPROM benutzt. Über den
Terminalbefehl 0 kann man den ersten Datenbereich auslesen. Insgesamt gibt es vier
Datenbereiche, die sich alle über die jeweilige Zahl (0-3) auslesen lassen. Mit
dem Befehl 100 kann man die Daten aus dem EEPROM wieder löschen. Es gibt im Elektronik-Labor ein Programm welches die Daten aus dem EEPROM grafisch darstellen
kann.
Gerade jetzt im Sommer häufen sich die Gewitter und wir konnten schon einige Messungen machen. Dabei ist mir bei einigen Versuchen aufgefallen, dass mein PC-Monitor den Empfänger ziemlich stört. Ich habe deswegen den Empfänger entweder an die Seite gelegt oder den Monitor ganz ausgeschaltet. Dadurch konnte ich deutlich mehr Blitze messen (siehe Videos).
#include <EEPROM.h>
byte A, Trigger, Sta;
word U, D;
word Daten[130];
byte B,J, I;
word Eeadr, Level, N;
word Ticks;
int Out1 = 3;
int Out2 = 2;
void setup(){
pinMode(Out1, OUTPUT);
pinMode(Out2, OUTPUT);
Serial.begin(9600);
Serial.println ("Logger");
U = analogRead(A0);
pinMode(13, OUTPUT);
Eeadr = 0;
A = 1;
Sta = 0;
Trigger= 0 ;
Level = 0;
}
void loop(){
D = analogRead(A0);
Daten[A] = D;
U = U *15;
U = U + D;
U = U /16;
if (Trigger == 1){
if (Sta == A){
Serial.println("Blitz!");
for (N = 1; N <= 32; N++){
A = A + 1;
if (A > 128){
A = 1;
}
D = Daten[A];
D = D /2;
D = D & 255;
B = D;
Serial.println (B);
if (Eeadr < 512) {
EEPROM.write(Eeadr, B);
}
Eeadr++;
digitalWrite(13, LOW);
}
I = I +1;
Sta = 0;
Trigger = 0;
Level = Level + 600;
if (Level > 6000) {
Level = 6000;
}
}
A = A + 1;
if(A > 128){
A = 1;
}
}
else{
D = D + 15;
if (D < U){
Trigger = 1;
Sta = A + 120;
if(Sta > 128){
Sta = Sta - 128;
}
digitalWrite(13, HIGH);
}
A = A +1;
if (A > 128){
A = 1;
}
if (Serial.available() > 0) {
J = Serial.read();
if (J == 100){
B = 0;
for(N = 0; N<512;N++){
EEPROM.write (N,B);
}
Eeadr = 0 ;
Serial.write("Daten Gelöscht");
}
else{
Eeadr = J *128;
for (N = 1; N<= 128; N++){
B = EEPROM.read (Eeadr);
Serial.write (B);
Eeadr ++;
}
Eeadr = 0;
}
}
}
Ticks++;
if (Ticks >= 22000) {
Ticks = 0;
if (Level > 0) {
Level--;
if (Level >2000){
Level = Level -9;
}
}
if (Level > 2000){
digitalWrite(Out2, HIGH);
}
else {
digitalWrite(Out2, LOW);
}
if (Level > 1000){
digitalWrite(Out1, HIGH);
}
else {
digitalWrite(Out1, LOW);
}
}