Sensore fulmini: rilevare i temporali con Arduino

Sta arrivando un temporale? Scopriamolo con questo circuito basato su un sensore di scariche elettriche atmosferiche in grado di dirci quanto รจ lontano e intenso.

I centri meteorologici effettuano il monitoraggio, oltre che dei parametri atmosferici allo scopo di stimare la probabilitร  di precipitazioni e la loro consistenza, anche dei temporali e dei fenomeni elettrostatici loro correlati, come i fulmini.

In alcune nazioni esposte a consistenti fenomeni elettrici atmosferici e ai rischi che comportano, tale attivitร  assume particolare rilievo.

Senza scomodare la cinematografia, che non ci ha fatto mancare lungometraggi del genere catastrofico con fulmini โ€œassassiniโ€, possiamo comprendere come le saette che vediamo solcare il cielo o abbattersi al suolo possano essere pericolose, per lโ€™energia notevole che possono cedere precipitando dal cielo (dove si formano) a terra, su edifici, alberi e purtroppo anche sullโ€™uomo.

Una pericolositร  che diviene ancora maggiore in quelle aree dove possono verificarsi fulmini quasi a ciel sereno, ovvero in maniera inaspettata. Senza contare i danni che i fulmini caduti vicino alle linee di distribuzione elettrica e di telecomunicazioni causano, sotto forma di sovratensioni indotte, agli apparati elettrici e soprattutto elettronici.

Lโ€™attivitร  di analisi dei fenomeni elettrici atmosferici viene svolta con varie metodiche (la piรน antica delle quali fu lโ€™aquilone di Benjamin Franklin) basate sulla valutazione preventiva degli accumuli di elettricitร  statica nellโ€™atmosfera e sullโ€™intercettazione delle scariche elettriche, con apparati complessi e costosi, tuttavia si puรฒ condurre anche in maniera amatoriale, a casa propria, grazie a dispositivi come il sensore basato sullโ€™integrato AS3935 della AMS, del quale in queste pagine vi facciamo vedere unโ€™applicazione. Il componente utilizzato riesce a captare i disturbi radioelettrici causati dallo scoccare di archi elettrici (e i fulmini sono tali) e, tramite unโ€™opportuna elaborazione, fornisce un segnale che corrisponde al rilevamento di un fulmine e della sua intensitร .

 

Un poโ€™ di teoria

I fulmini sono scariche elettriche atmosferiche aria-aria o aria-terra che si innescano a causa dellโ€™accumulo di una consistente carica elettrica, ovvero quando si crea tra due punti dellโ€™atmosfera o tra lโ€™aria e la terra (ma anche il mare o i corsi dโ€™acqua) un forte scompenso di carica elettrica; nel momento in cui la differenza di potenziale dovuta allo scompenso di carica รจ tale da superare la rigiditร  dielettrica del mezzo interposto (lโ€™aria, di solito, che sia piรน o meno umida…) scocca lโ€™arco elettrico, vale a dire la saetta, che comporta un flusso di corrente attraverso un mezzo per sua natura isolante.

La luce che ne deriva รจ causata dalla ionizzazione dei gas componenti lโ€™aria compresa tra i punti tra i quali scocca lโ€™arco, ovvero dal ritorno nei legami atomici degli elettroni asportati forzatamente dal fortissimo campo elettrico durante la scarica; lโ€™energia restituita dallโ€™elettrone prima del rientro nel legame produce un fotone, ossia una particella di luce, che nei fulmini รจ in buona parte collocata nello spettro del visibile.

Tale attivitร  elettrica รจ percettibile a distanza come fosse un segnale radioelettrico trasmesso da unโ€™emittente: lo dimostrรฒ lโ€™esperimento di Hertz, il quale fece scoccare delle scintille e rilevรฒ a distanza con un dipolo la debole tensione che ne risultava.

Infatti possiamo immaginare lo scoccare di un fulmine come fosse unโ€™oscillazione che stimola elettricamente lโ€™aria e fa propagare una carica elettrica a una distanza che dipende dalla composizione dellโ€™aria e dalle sue condizioni, nonchรฉ dalle prestazioni dellโ€™antenna ricevente e del dispositivo utilizzato per la ricezione.

Utilizzando un sensibile ricevitore RF ed elaborando il segnale ricevuto mediante un algoritmo proprietario, lโ€™integrato AS3935 determina se lโ€™attivitร  elettrica captata รจ causata da un fulmine, ovvero stima la probabile distanza sulla base dellโ€™intensitร  del segnale; per distanza si intende verosimilmente quella dallโ€™inizio del temporale o tempesta nellโ€™ambito del quale scoccano i fulmini e il chip puรฒ determinarla con sufficiente approssimazione tra un massimo di 40 km e un minimo di 1km.

Lโ€™algoritmo serve a discernere, con una certa approssimazione, tra fulmini (scariche atmosferiche) e scariche elettriche prodotte ad esempio da spinterogeni e candele di motori a benzina, motori elettrici a spazzole, forni a microonde.

Collegamento di Arduino al sensore fulmini e al display seriale

Collegamento di Arduino al sensore fulmini e al display I2C

Il sensore di fulmini

Per rendere piรน facilmente utilizzabile il sensore di scariche atmosferiche abbiamo realizzato una breakout board contenente lโ€™integrato AS3935.

Il cuore รจ chiaramente lโ€™integrato, del quale portiamo allโ€™esterno lโ€™alimentazione, il bus per la comunicazione con circuiti esterni a microcontrollore, oltre che i principali segnali di controllo. Tutte le linee da collegare allโ€™esterno o gestire dallโ€™esterno sono riportate a una fila di piazzole a passo 2,54 mm poste su un lato, alle quali รจ possibile applicare un pin-strip.

La connessione dati con lโ€™esterno avviene serialmente tramite IยฒC-Bus o SPI; in questโ€™ultimo caso impieghiamo le linee:
โ€ข MISO (Master Input Slave Output) che รจ lโ€™uscita della breakout board con la quale vengono inviati ad Arduino i dati relativi ai fulmini rilevati;
โ€ข MOSI (Master Output Slave Input) che รจ lโ€™uscita dati di Arduino con la quale vengono comunicati alla breakout board messaggi di impostazione o di conferma;
โ€ข CS (Chip Select) ovvero la linea di uscita di Arduino che abilita la breakout board allโ€™interazione sul bus SPI; il CS serve perchรฉ sullโ€™SPI possono affacciarsi vari dispositivi e per evitare collisioni dei dati occorre che ad ogni sessione di comunicazione ne venga abilitato uno solo per volta.
โ€ข SCL (clock) che corrisponde al segnale con cui viene sincronizzata la comunicazione sul bus.

I predetti segnali vengono riportati al CN1; per la linea di clock SCL e per il MOSI sono state inserite le resistenze di pull-up.
Notate che il piedino 8 dellโ€™AS3935, vale a dire il CS, in assenza di diversa impostazione viene mantenuto a livello alto dal proprio resistore di pull-up interno, ma puรฒ essere forzato a zero logico dal jumper JCS laddove non si preveda la gestione dallโ€™esterno.

Quanto alla modalitร  di comunicazione seriale, nella breakout board si puรฒ selezionare tramite un secondo jumper, siglato SI, che interviene sul piedino 9 (Select Interface); lโ€™integrato AS3935 funziona:
โ€ข in modalitร  SPI se il piedino 9 รจ posto a zero logico;
โ€ข in modalitร  IยฒC se il Select Interface รจ posto a VDD.

Nella nostra applicazione abbiamo optato per la prima, perciรฒ vedete che il jumper รจ stato chiuso.

Abbiamo poi il piedino IRQ (10), riportato al contatto 3 del connettore CN1, che comunica al microcontrollore quando IRQ รจ unโ€™uscita che lโ€™AS3935 porta a livello logico alto quando viene intercettato un fulmine e scritto in uno dei registri interni (REG0x03[3:0]) il valore corrispondente.

Procediamo con lโ€™analisi dello schema elettrico passando allo stadio dโ€™ingresso, che รจ quello attraverso cui captiamo il disturbo radioelettrico corrispondente al fulmine; esso fa capo ai piedini 2 e 3, che sono lโ€™input del radioricevitore presente nellโ€™integrato, il quale richiede allโ€™ingresso un circuito antirisonante allo scopo di sintonizzare una certa banda ed escludere disturbi a bassa frequenza e di natura estranea allo scopo.

Il circuito di sintonia รจ composto da una bobina (induttanza AF) acquistabile giร  pronta e da due condensatori in parallelo, che assicurano il valore di capacitร  richiesto per determinare la frequenza di centro banda voluta. La bobina fa anche da antenna ricevente ed assicura unโ€™ottima sensibilitร .

Il resistore R3, posto in parallelo al circuito antirisonante, peggiora il fattore di merito dello stesso ma limita superiormente lโ€™ampiezza del segnale introdotto nello stadio di sintonia; peggiorando il fattore di merito si allarga la banda sintonizzabile, il che ci va benissimo perchรฉ dobbiamo rilevare scariche elettriche che non hanno una precisa frequenza, ma cadono entro un ampio spettro.

La frequenza di centro banda dello stadio di sintonia รจ determinata dalla formula:

f = 1/6,28 x โˆšLC

dove L รจ lโ€™induttanza della bobina e C la somma di C4 e C5. Il fattore di merito Q รจ invece dato dal rapporto:

Q = f/Bw

dove Bw รจ la larghezza di banda del circuito antirisonante.

Il radioricevitore รจ del tipo ad amplificazione diretta e dispone di AGC, per regolare il guadagno in funzione del livello atteso allโ€™uscita; il condensatore C3 determina il tempo di intervento dellโ€™AGC.

Il segnale fornito viene quindi analizzato dallโ€™apposito blocco interno al chip, che lo confronta con la media del rumore di fondo e tramite lโ€™apposito algoritmo determina cosa puรฒ essere un fulmine e cosa va scartato, quindi il risultato produce una stringa di dati che viene depositata nellโ€™apposito registro e, laddove il valore corrisponda a quello di un fulmine, genera un impulso sullโ€™IRQ (piedino 3 del connettore CN1).

Concludiamo lโ€™analisi dello schema elettrico della scheda sensore con i piedini ADD0 e ADD1, che servirebbero per impostare lโ€™indirizzo dellโ€™integrato laddove per la comunicazione venisse utilizzato il bus IยฒC e che in questo caso, essendo inutilizzati, sono portati a livello logico alto collegandoli allโ€™uscita VREG (piedino 6) del regolatore di tensione interno allโ€™integrato; la tensione fornita da tale pin viene filtrata dal ripple mediante il condensatore C1.

Ciรฒ detto, passiamo a vedere come la breakout board รจ utilizzata nel circuito.

Listato 1

#include <SPI.h>

#include <AS3935.h>

#include <SoftwareSerial.h>

#define LCD_pin 5 // LCD data signal

const int NoDetect = 30;
int counter;
int NumDisturber = 0;

SoftwareSerial LCD = SoftwareSerial(0, LCD_pin);

void printAS3935Registers();

byte SPItransfer(byte sendByte);

void AS3935Irq();

AS3935 AS3935(SPItransfer, 3, 2); //change to AS3935(SPITransfer,9,3) if using slot #2

void setup() {
  serLCDInit();
  backlightOn();
  clearLCD();
  lcdPosition(0, 3);
  LCD.print(โ€œLightiningโ€);
  lcdPosition(1, 5);
  LCD.print(โ€œSensorโ€);
  delay(1500);
  clearLCD();

  Serial.begin(9600);
  SPI.begin();
  SPI.setDataMode(SPI_MODE1);
  SPI.setClockDivider(SPI_CLOCK_DIV16);
  SPI.setBitOrder(MSBFIRST);
  AS3935.reset();
  delay(10);
  AS3935.setOutdoors();
  AS3935.registerWrite(AS3935_NF_LEV, 2); //write 2 in the Noise Level register
  //AS3935.registerWrite(AS3935_SREJ,0); //write 2 in the Noise Level register and run calibration
  // if lightning detector can not tune tank circuit to required tolerance, calibration function will return false
  if (!AS3935.calibrate())
    Serial.println(โ€œTuning out of range, check your wiring, your sensor and make sure physics laws have not changed!โ€);
  // now we print the value in the calibration register TUN_CAP it is in the range 0 - 15
  tunecap = AS3935.registerRead(AS3935_TUN_CAP); //Internal calibration
  Serial.print(โ€œTuning cap register isโ€œ);
  Serial.println(tunecap);

  AS3935.enableDisturbers();
  printAS3935Registers();
  // AS3935IrqTriggered = 0;
}
void loop() {

  delay(1000);
  Serial.println(โ€œWaiting...โ€);
  if (counter == 0) {
    NumDisturber = 0;
    counter = NoDetect;
    clearLCD();
    lcdPosition(0, 1);
    LCD.print(โ€œNo lightiningโ€);
    lcdPosition(1, 4);
    LCD.print(โ€œdetectedโ€);
  } else {
    counter = counter - 1;
  }
}

void printAS3935Registers() {
  int noiseFloor = AS3935.getNoiseFloor();
  int spikeRejection = AS3935.getSpikeRejection();
  int watchdogThreshold = AS3935.getWatchdogThreshold();
  Serial.print(โ€œNoise floor is: โ€œ);
  Serial.println(noiseFloor, DEC);
  Serial.print(โ€œSpike rejection is: โ€œ);
  Serial.println(spikeRejection, DEC);
  Serial.print(โ€œWatchdog threshold is: โ€œ);
  Serial.println(watchdogThreshold, DEC);
}

// this is implementation of SPI transfer that gets passed to AS3935
{
  return SPI.transfer(sendByte);
}

void AS3935Irq() {

  int irqSource = AS3935.interruptSource();
  // returned value is bitmap field, bit 0 - noise level too high, bit 2 - disturber detected, and finally bit 3 - lightning!
  if (irqSource & amp; 0b0001)
    Serial.println(โ€œNoise level too high,
      try adjusting noise floorโ€);
  if (irqSource & amp; 0b0100) {
    NumDisturber += 1;
    Serial.println(โ€œDisturber detectedโ€);
    clearLCD();
    lcdPosition(0, 0);
    LCD.print(โ€œDisturb.Det: โ€œ);
    LCD.print(NumDisturber, DEC);
    counter = NoDetect;
  }
  if (irqSource & amp; 0b1000) {
    // need to find how far that lightning stroke, function returns approximate distance in kilometers,
    // where value 1 represents storm in detectorโ€™s near victinity, and 63 - very distant, out of range stroke
    // everything in between is just distance in kilometers
    int strokeDistance = AS3935.lightningDistanceKm();
    if (strokeDistance == 1) {
      Serial.println(โ€œStorm overhead, watch out!โ€);
      lcdPosition(1, 1);
      Serial.println(โ€œStorm overheadโ€);
      lcdPosition(1, 3);
      Serial.println(โ€œWATCH OUT!โ€);
      counter = NoDetect;
    }

    if (strokeDistance == 63) {
      Serial.println(โ€œOut of range lightning detected.โ€);
      lcdPosition(0, 2);
      Serial.println(โ€œOut of rangeโ€);
      lcdPosition(1, 0);
      Serial.println(โ€œlightning detectโ€);
      counter = NoDetect;
    }

    if (strokeDistance & lt; 63 & amp; & amp; strokeDistance & gt; 1) {
      Serial.print(โ€œLightning detectedโ€œ);
      Serial.print(strokeDistance, DEC);
      Serial.println(โ€œkilometers away.โ€);
      lcdPosition(1, 0);
      LCD.print(โ€œDistance: โ€œ);
      LCD.print(strokeDistance, DEC);
      LCD.print(โ€œkmโ€);
      counter = NoDetect;
    }
  }
}

Prevedere i fulmini con Arduino

Il progetto che vi proponiamo di realizzare consta sostanzialmente di tre elementi: il sensore di fulmini, disponibile su breakout board, una scheda Arduino Uno o Fishino Uno, il cui compito รจ analizzare il segnale fornito dal sensore ed elaborarlo per poi mostrare sul display LCD (che รจ il terzo elemento circuitale) le informazioni che ne desume, vale a dire il numero di scariche elettriche rilevate che si possono ritenere โ€œfiglieโ€ di un temporale e la distanza stimata.

Negli esempi scaricabili troverete lo sketch per gestire il sensore fulmini con Arduino e visualizzare i dati rilevati su un display seriale o I2C.

Il tutto devโ€™essere collegato come mostrato nel disegno di cablaggio visibile in queste pagine, dove la breakout board sensore fulmini si interfaccia ad Arduino tramite il connettore dellโ€™ICSP, grazie al fatto che questโ€™ultimo veicola il bus SPI completo, ossia a 4 linee.

La connessione con la breakout board avviene sfruttando le linee del bus SPI riportate sul connettore ICSP; ci sono poi GND (la massa) e Vcc (collegato al +5V) con cui la scheda prende lโ€™alimentazione da Arduino.

Il CS (attivo a livello logico zero) viene gestito dal digital I/O 3 di Arduino, impostato dallo sketch come uscita e lโ€™IRQ della breakout board รจ invece interfacciato al digital I/O 2, inizializzato come input, dato che, nello specifico, IRQ avvisa Arduino o un eventuale microcontrollore interfacciato allโ€™integrato o alla sua breakout board che puรฒ leggere il contenuto del registro.

Quando IRQ torna a zero logico รจ prevista una pausa di almeno 2 ms prima della lettura del registro.

Per la gestione del sensore fulmini da Arduino allo scopo di leggere i dati rilevati, รจ stata utilizzata una libreria sviluppata da un appartenente alla community (Raivis Rengelis) e scaricabile da github.

La gestione รจ affidata a uno sketch il cui codice riportiamo nel Listato 1.

Quanto al display LCD seriale, รจ collegato ad Arduino tramite i contatti 5V e GND per lโ€™alimentazione e il digital I/O 5, impostato come uscita, che invia i dati serialmente al contatto RX dellโ€™LCD.
Il progetto mostra come leggere i dati rilevati dalla breakout, in particolare viene rilevato un eventuale temporale mostrando lโ€™indicazione su un display LCD a comunicazione seriale.


Normalmente viene mostrata lโ€™indicazione del temporale rilevato con il numero di rilevamenti negli ultimi 60 secondi. Se entro 60 secondi non avvengono altri rilevamenti, allora viene mostrata lโ€™indicazione a display โ€œNo lightining detectedโ€ (Fig. 1). Se nel registro dellโ€™integrato รจ disponibile la distanza di rilevamento, allora viene mostrato anche questo dato nella seconda riga del display, con un messaggio del tipo:

Disturb Det. x

dove al posto di โ€œxโ€ รจ indicato quante scariche sono state rilevate. Sotto, appare la scritta (Fig. 2):

Distance: n km

dove viene indicata, al posto di โ€œnโ€ la distanza stimata da dove รจ scoccato il fulmine. Se la distanza รจ inferiore al minimo, il display mostra nella prima riga Storm overhead e nella seconda WATCH OUT!

Fig. 2ย Rilevamento di 11 fulmini a una distanza stimata di 20 km.

 

Piano di montaggio

 

Elenco Componenti:

R1รทR4: 10 kohm (0603)
C1: 1 ฮผF ceramico (0603)
C2: 100 nF ceramico (0603)
C3: 10 ฮผF ceramico (0603)
C4: 680 pF ceramico (0603)
C5: 270 pF ceramico (0603)
L1: MA5532-AEB
U1: AS3935-BQFT
Varie:
- Strip maschio 2 vie (2 pz.)
- Strip maschio 7 vie
- Jumper (2 pz.)
- Circuito stampato S1324 (26x26 mm)

I componenti vanno disposti seguendo il piano di montaggio che trovate in queste pagine, dove potete vedere il giusto orientamento di quelli polarizzati; fate attenzione a non surriscaldare la bobina, onde evitare che si sciolga lo smalto e che venga pregiudicato lโ€™isolamento.

Tutti gli elementi vanno montati sul lato superiore. Il componente piรน critico รจ lโ€™integrato AS3935, incapsulato in contenitore 16LD MLPQ (quadrato da 4×4 mm di lato) che a stretto rigore andrebbe montato con una stazione ad aria calda per il rework degli SMD, dopo aver stagnato e cosparso con il flussante le rispettive piazzole; con un poโ€™ di attenzione e manualitร  รจ possibile saldarlo, una volta compiute le predette operazioni, mediante il classico saldatore, avendo cura di toccare i pad lateralmente (il risultato non sarร  lo stesso ma funzionerร  ugualmente).

Terminate le saldature e verificato che sia tutto a posto, chiudete il ponticello JSI e lasciate aperto JCS, giacchรฉ allโ€™impostazione del Chip Select provvederร  Arduino.

Ora prendete in mano lo schema di cablaggio e, con dei cavetti jumper, collegate tra loro Arduino, il display e la breakout board secondo quanto indicato. Ricordate che lโ€™alimentazione per lโ€™insieme si fornisce in un unico punto, ossia sul connettore jack di Arduino Uno, mediante un alimentatore da 9 volt, capace di erogare 300 mA.

Prima di dare alimentazione collegate alla presa USB di Arduino un cavo USB A/B che dallโ€™altro lato inserirete in una presa USB del vostro computer, nel quale avrete avuto cura di installare lโ€™IDE Arduino (va bene qualsiasi versione tra quelle uscite negli ultimi due anni); aprite quindi il file contenente lo sketch, che dovrete aver copiato nella cartella dellโ€™IDE insieme alla libreria, quindi effettuate il download in Arduino. Fatto ciรฒ, staccate il PC e alimentate la vostra Arduino con lโ€™alimentatore, verificando che il display si accenda e mostri i messaggi: inizialmente e in assenza di attivitร , apparirร  il messaggio No lightning detected.

Se volete effettuare un test spicciolo del sistema, procuratevi un accendigas piezoelettrico (quelli a scintilla) e, mantenendolo a mezzo metro di distanza dalla breakout board premete piรน volte il pulsante per far scoccare qualche scintilla: il display dovrebbe mostrare il segnale Disturb. Det. con un numero che si aggiorna man mano che premete.

Con questo avete collaudato, seppure in maniera empirica, il sistema e siete certi che funzionerร  in campo. Per un utilizzo piรน pratico inserite il tutto in un contenitore in plastica, lavorato per far uscire il display e rendere accessibile il jack di alimentazione di Arduino. La breakout board mettetela sotto al coperchio, fissandola con del silicone sigillante; evitate le viti, che potrebbero interferire, a meno di non utilizzare quelle in teflon.

Non utilizzate contenitori metallici perchรฉ schermerebbero la bobina ricevente della breakout board, con le conseguenze immaginabili, ossia il circuito non potrร  rilevare alcun fulmine.

Ultima nota: lo sketch di Arduino prevede attualmente che per lo stadio RF sia impostato il guadagno corrispondente allโ€™utilizzo allโ€™esterno, come evidenziato nella riga di codice AS3935.setOutdoors();.

Se desiderate la modalitร  indoor, perchรฉ utilizzate il circuito in casa, dovete cambiare tale riga in AS3935.setIndoor();.

Bene, detto ciรฒ possiamo concludere ricordandovi che il progetto, come tutti quelli open, puรฒ essere personalizzato da ognuno di voi al bisogno.

 

5 Commenti

  1. Salve, nelle illustrazioni dello schema elettrico vi รจ il "disegno" dell alimentatore, volevo sapere se sarebbe possibile alimentare il circuito a batteria, o รจ troppo esoso in termini di consumo. possiedo un fishino uno rev.2 , il tutto poi andrebbe visualizzato via wifi(non userei un monitor). Sto cercando di creare una stazione meteo. PS ho acquistato da voi, l anemometro, perรฒ mi sfugge come collegarlo al fishino, nel senso che non so i cavetti a cosa corrispondono. grazie per un eventuale risposta
    • Il sensore non consuma molto, a differenza del Fishino o di un'altra scheda WiFi che inciderebbe sul consumo totale del sistema. Per l'anemometro dipende dal modello. Abbiamo il modello WINDAN che ha uscita analogica o il WIND01 che integra un reed che viene chiuso ad ogni giro delle palette
  2. Aspettavo una risposta riguardo al messaggio inviato il 23 dicembre 2023 ma nessuno mi ha risposto.Aspetto una risposta se e' possibile costruire il rilevatore di fulmini con il progranmma da inserire in arduino uno.Comprando il sensore e il display 12c.Aspetto una vostra risposta grazie

Lascia un commento

Il tuo indirizzo email non sarร  pubblicato.

Menu