利用arduino检测闪电

本示例中,利用arduino Uno和一些电阻及连接线建立一个闪电检测的小系统。对于普通爱好者来说,大部分的闪电检测比较昂贵,但是我们依然有办法让大家实现,感受闪电检测及其背后有趣的物理知识。本例中,利用非常简单的电路即可检测10到20公里外的闪电,是不是有点心动了,那就马上开始吧,我们后续会持续发布这样的例子。由于时间关系,不能全部翻译,如果有不明白的地方欢迎加入QQ群与大家一起沟通。

背景

当闪电发生,大量的能力以不同的形式释放。最明显的是光和声音,后者是围绕闪电的直接粒子温度上升速率的副产品,然后引起声音。但是,这还不是全部。闪电在VLF(甚低频)和LF(低频)范围内发射大量的电磁辐射,通常范围在3kHz到300kHz之间。VLF和LF类似于光波、WiFi波和微波炉波,但是在较低频率下工作的差别很大。WiFi通常工作在2.4GHz左右,即每秒24亿次振荡。VLF和LF在较低频率下工作,使用Arduino,我们可以捕获大约7kHz的频率。使用这种辐射进行闪电探测的优点在于,通常没有像闪电那样在这个频率附近发出大的脉冲,而作为电磁波,它以光速传播,这意味着传感器会在闪电发生时探测到它们(几个微秒后)。

我们的小Arduino将有一个天线(某种),一根导线,将拾取波动的电磁频谱具体约7-9kHz。这些波动将在导线中产生一个小电压+VE或-VE。我们可以使用ARDUINO的模拟引脚来选择这些波动。

准备:

  • 10k电阻2个
  • 3.3M电阻1个
  • 4对连接线
  • Arduino Uno 1块
  • 面包板 1块

正如您可能已经知道的,Arduino板上的管脚允许电压在0v到5v之间,任何低于0v和高于5v的电压都不会被读取,因此数据将丢失。更重要的是,低于0V的电压可能会损坏引脚。这将给我们带来一点问题,因为导线中产生的电压波动低于或高于0v。为了解决这个问题,我们将引脚电压设置在5v范围的中间,在2.5v,这将使用一个小技巧,一个分压器来完成。在这样做时,我们将把引脚设置为稳定的2.5伏,电压波动将具有2.5伏的起源,因此没有损坏或丢失数据。

 

利用arduino检测闪电 错过今年夏天就要等明年了
闪电监测电路

电路相当简单,我们有2x10k欧姆电阻串联从5v(红线)到GND(黑线),这基本上就是分压器。然后在2x10k欧姆电阻之间连接3.3M欧姆(兆欧姆)电阻器。与3.3M欧姆电阻器串联,在引脚A4(蓝线)上连接导线,这将使我们在引脚A4上精确地得到2.5伏。然后附上一根导线,它将作为大约6-8英寸长的天线(绿线)。这应该只从一端连接,如上文所示。

原理:

下面是最难解释的部分。如上所述,我们需要从闪电中拾取的频率大约为7kHz,并且为了读取半正弦波,采样率必须是4倍,给我们每波长4个读数。也就是说,每秒28000个样本。

ARDUINO模拟引脚只能给我们每秒钟9600个样本。有了这个采样率,我们只能捕获2kHz或稍微多一点的波,这远远不好。由于ATMEGA芯片,它可以配置成加速ADC进程的某一因素,同时保持良好的分辨率。这被称为预分频器,可以通过代码进行配置。有许多预分频器分频因子,但我们将使用因子16,从理论上讲,它将给我们77kHz的采样率。实际上,任何形式的计算都会降低这个采样率,因此我只能得到大约46kHz,这对这个项目来说仍然是非常好的。

因此,向前看,该示意图使用512字节阵列来存储来自管脚A4的电压阀。它经常读取pin值并将其写入数组中的下一个位置。一旦检测到闪电,整个阵列就通过串口发送。这可以在Arduino IDE中的绘图仪上绘图,或者可以发送到另一个Arduino或ESP8266以在线发布数据。首先最好通过Arduino IDE监视它,所以如果有一些故障,可以在那里解决。

结果:

下面是结果


结果:

#define FASTADC 1  // defines for setting and clearing register bits #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif //http://www.plclive.com  int data = 512; int storage[512];  long batchStarted; long batchEnded; int reading; int count; int maximum; int minimum; bool toSend;  void setup() { #if FASTADC  // set prescale to 16  sbi(ADCSRA,ADPS2) ;  cbi(ADCSRA,ADPS1) ;  cbi(ADCSRA,ADPS0) ; #endif   // put your setup code here, to run once:   Serial.begin(115200);   pinMode(A4,INPUT);   Serial.println(micros());      batchStarted=0;   batchEnded=0;   reading=0;   count=0;   maximum=0;   minimum=1023;   toSend=false; }   void loop() {   // put your main code here, to run repeatedly:   reading = (analogRead(A4));   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;     batchEnded = millis();     sendData();     batchStarted = millis();        }   else if (count==512){     count=0;     batchEnded = millis();     //sendData();     batchStarted = millis();      }    }  void sendData() {   Serial.print(">>>");   Serial.println(batchStarted);      for (int i=0;i<data;i++){     Serial.println(storage[i]);   }   Serial.print("<<<");   Serial.println(batchEnded);   Serial.println("END");      toSend=false; }

 

源代码Github: https://github.com/klauscam/Arduino-Lightning-Detector