Vai al contenuto
PLC Forum


Velleman VMA343 LIGHTNING SENSOR


dott.cicala

Messaggi consigliati

Ecco la mia versione di rilevatore di fulmini

 

Fulmine.JPG.d7483c685494f4dbefab1853fc82f378.JPG

Si parte da un'articolo pubblicato sulla rivista 217 di Elettronica In dove viene descritto il funzionamento del chip AS3935.

Viene fornita una breakout board FT1234M che ha una piedinatura diversa sia da quella descritta nell'articolo che da quanto riportato sul foglietto a corredo :wallbash:

 

Io l'ho usata in I2c assegnando l'indirizzo 3.

A tale scopo sulla breakout board ci sono due piazzolle AD0-AD1 che vanno chiuse con una goccia di stagno verso il +

Il Jumper JCS va chiuso, JS1 va lasciato aperto.

 

Tutto l'insieme è a scopo didattico, per casi diversi andrà curata come si deve l'alimentazione di Arduino.

 

Ho previsto un led che guizzerà ad ogni impulso rilevato, di qualsiasi natura sia. Il display darà informazioni più specifiche sulla natura dell'impulso rilevato.

 

RV2 serve a regolare la soglia di attivazione del fototriac U1 che avviene solo al rilevamento di fulmini ed agisce sulla distanza, o almeno questa è l'intenzione in quanto durante le prove...non c'è stato alcun temporale e nessun fulmine.

 

Lo schetch ha bisogno di queste librerie:


<Wire.h>
<LiquidCrystal.h>
"SparkFun_AS3935.h"

 

La sua pubblicazione avverrà non appena avrà superato il battesimo del temporale con fulmini e saette.

:smile:

 

Modificato: da dott.cicala
Link al commento
Condividi su altri siti


Questa sera pioggerellina senza nemmeno un fulmine :(

 

Metto a disposizione il codice utilizzato per le prove per eventuali interessati e volenterosi.

- Andrebbe modificato per sfruttare l'interrupt e migliorare la cancellazione delle rilevazioni precedenti in assenza di ulteriori impulsi

- Non ho scritto la parte relativa alla lettura dell'analogica e al comando del fototriac.

- Non ho nessun display I2c quindi la visualizzazione è sul solito 16x2 

//******************************************************************************
/*
                  Rilevatore di fulmini con AS3935 via I2C
                     Display LCD16x2 - interfaccia 4bit
*/
//******************************************************************************
// Librerie
//******************************************************************************
#include <Wire.h>
#include <LiquidCrystal.h>
#include "SparkFun_AS3935.h"
//********************************************************************************
#define I2C_Addr        0x03      // Indirizzo I2C= 3 ;
#define INTERNO         0x12 
#define ESTERNO         0xE
#define RUMORE          0x01
#define DISTURBO        0x04
#define FULMINE         0x08
//******************************************************************************
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
SparkFun_AS3935 lightning(I2C_Addr);
//******************************************************************************
const int Led   = 2;              // Arduino pin3 = Led
const int lampo = 4;              // Arduino pin4 = AS3935 IRQ
const int MOC   = 5;              // Fototriac
//******************************************************************************
int Conteggio   = 0;
int NoiseFilt   = 3;              // 1...7 
int DistFilt    = 6;              // 1...10
int Spurie      = 0;
int SogliaMoc   = 0;
int AttMils     = 0; 
int Dly         = 0;
byte attdist    = 0;
long Energia    = 0;
//********************************************************************************
// Attivazione fototriac al superamento distanza di sicurezza
//********************************************************************************
void Alrm()
{
 ;  // da scrivere
}
//********************************************************************************
void setup()
{
  //******************************************************************************
  // Messaggio iniziale
  //******************************************************************************
  // Scrive monitor
  Serial.begin(115200); 
  Serial.println("Rileva Fulmini con AS3935");
  
  // Scrive LCD
  lcd.begin(16, 2);
  lcd.print(" Rileva Fulmini");
  lcd.setCursor(0,1);
  lcd.print("   con AS3935");
  delay(5000);
  lcd.clear(); 
 
  //******************************************************************************
  // Assegno pins
  //******************************************************************************
  pinMode(lampo, INPUT); 
  pinMode(Led, OUTPUT);
  pinMode(MOC, OUTPUT);
  Wire.begin();
  //******************************************************************************
  // Verifico inizializzazione avvenuta
  //******************************************************************************
  if(!lightning.begin()) {
    
    // Scrive monitor    
    Serial.println ("AS3935 non avviato!");
     
    // Scrive LCD
    lcd.clear();
    lcd.print("     AS3935");
    lcd.setCursor(0,1);
    lcd.print("  non avviato!");
    while(1); 
  }
  else
    
    // Scrive monitor 
    Serial.println("AS3935 in attesa");
    
    // Scrive LCD
    lcd.clear();
    lcd.print(" Nessun fulmine");
    lcd.setCursor(0,1);
    lcd.print("  rilevato  :)  ");

    //Sensibilità
    lightning.setIndoorOutdoor(INTERNO);    // Alta sensibilità
    //lightning.setIndoorOutdoor(OUTDOOR); // Sensibilità ridotta

    //Mascheramento disturbi
    lightning.maskDisturber(false);

    //Filtro rumore
    lightning.setNoiseLevel(NoiseFilt);

    //Reiezione spurie
    lightning.spikeRejection(Spurie); 

    //Soglia Rivelatore
    lightning.watchdogThreshold(DistFilt);  

    //lightning.resetSettings();
}

//******************************************************************************
//
//******************************************************************************
void loop()
{
  //****************************************************************************
  // Led indicatore rilevamento impulsi
  //****************************************************************************
  if(digitalRead(lampo) == HIGH){
    digitalWrite(Led, HIGH);
    Dly = millis()+2000;
    }

  if(digitalRead(lampo) == LOW and Conteggio!=0 and (millis() > Dly)){
      Conteggio =0; 
      lcd.clear();
      lcd.print(" Nessun fulmine");
      lcd.setCursor(0,1);
      lcd.print("  rilevato  :)  ");  
  }

  Serial.println(Conteggio);
  //****************************************************************************
  // Rilevamenti impulsi
  //****************************************************************************
     
  if(digitalRead(lampo) == HIGH){

    // numero eventi
    Conteggio = lightning.readInterruptReg();

    // Rumore rilevto
    if(Conteggio == RUMORE){
      Serial.println("Rumore");
      lcd.clear(); 
      lcd.print("Presenza rumore");  
    }
    
    // Disturbo rilevato 
    if(Conteggio == DISTURBO){
      Serial.println("Disturbo"); 
      lcd.clear();
      lcd.print("Rilevato impulso");
      lcd.setCursor(0,1);
      lcd.print("di distrurbo  :("); 
    }

    // Fulmine rilevato
    if(Conteggio == FULMINE){

      attdist = lightning.distanceToStorm(); 
      Energia = lightning.lightningEnergy(); 

      Serial.println("Rilevato fulmine!"); 
      Serial.println("distanza: "); 
      Serial.println(attdist); 
      Serial.println("Km"); 
      Serial.println("Energia");
      Serial.println(Energia); 
      
      lcd.clear();
      lcd.print("Fulmini a km ");
      lcd.print(attdist); 
      lcd.setCursor(0,1);
      lcd.print("Energia: ");
      lcd.print(Energia); 

      Alrm();
    }
  }
  delay(10);
}

 

Modificato: da dott.cicala
Link al commento
Condividi su altri siti

Versione migliorata.

Manca ancora la parte del fototriac

 

//******************************************************************************
/*
                  Rilevatore di fulmini con AS3935 via I2C
                     Display LCD16x2 - interfaccia 4bit
*/
//******************************************************************************
// Librerie
//******************************************************************************
#include <Wire.h>
#include <LiquidCrystal.h>
#include "SparkFun_AS3935.h"
//********************************************************************************
#define I2C_Addr        0x03      // Indirizzo I2C= 3 ;
#define INTERNO         0x12 
#define ESTERNO         0xE
#define RUMORE          0x01
#define DISTURBO        0x04
#define FULMINE         0x08
//******************************************************************************
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
SparkFun_AS3935 lightning(I2C_Addr);
//******************************************************************************
const int Led           = 2;      // Arduino pin2 = Led
const int lampo         = 4;      // Arduino pin4 = AS3935 IRQ
const int MOC           = 5;      // Fototriac pin5
//******************************************************************************
int Conteggio           = 0;
long Dly                = 0;
int NoiseFilt           = 3;     // 1...7 
int DistFilt            = 8;     // 1...10
int Spurie              = 0;
int SogliaMoc           = 0;
byte attdist            = 0;
long Energia            = 0;
//******************************************************************************
// Settings
//******************************************************************************
void Settings()
    {
      pinMode(lampo, INPUT); 
      pinMode(Led, OUTPUT);
      pinMode(MOC, OUTPUT);
        
      //attachInterrupt(lampo,isr,FALLING);
      //Sensibilità
      lightning.setIndoorOutdoor(INTERNO);    // Alta sensibilità
      //lightning.setIndoorOutdoor(OUTDOOR);  // Sensibilità ridotta
      //Mascheramento disturbi
      lightning.maskDisturber(false);
      //Filtro rumore
      lightning.setNoiseLevel(NoiseFilt);
      //Reiezione spurie
      lightning.spikeRejection(Spurie); 
      //Soglia Rivelatore
      lightning.watchdogThreshold(DistFilt);  
      //lightning.resetSettings();
     }
//******************************************************************************
// Messaggio Iniziale
//******************************************************************************
void InitMsg()
  {
    Serial.begin(115200); 
    Serial.println("Rileva Fulmini con AS3935");
    lcd.begin(16, 2);
    lcd.print(" Rileva Fulmini");
    lcd.setCursor(0,1);
    lcd.print("   con AS3935");
    delay(5000);
    lcd.clear(); 
    Wire.begin();
  }
//******************************************************************************
// Messaggio Inizializzazione fallita
//******************************************************************************
void Fault()
    {
      Serial.println ("AS3935 non avviato!");
      lcd.clear();
      lcd.print("     AS3935");
      lcd.setCursor(0,1);
      lcd.print("  non avviato!");   
    }
//******************************************************************************
// Rilevamento rumore
//******************************************************************************
void Noise()
    {
      lcd.clear(); 
      lcd.print("Rilevato impulso");
      lcd.setCursor(0,1);
      lcd.print("di rumore  :(");
      digitalWrite(Led, HIGH);
      Dly  = 0; 
    }
//******************************************************************************
// Rilevamento distrubo
//******************************************************************************
void Disturbo()
    {
      lcd.clear();
      lcd.print("Rilevato impulso");
      lcd.setCursor(0,1);
      lcd.print("di distrurbo  :(");
      digitalWrite(Led, HIGH);
      Dly  = 0; 
    }
//******************************************************************************
// Rilevamento Fulmine
//******************************************************************************
void Fulmine()
    {
      attdist = lightning.distanceToStorm(); 
      Energia = lightning.lightningEnergy();      
      lcd.clear();
      lcd.print("Fulmini a km ");
      lcd.print(attdist); 
      lcd.setCursor(0,1);
      lcd.print("Energia: ");
      lcd.print(Energia);
      digitalWrite(Led, HIGH);
      Dly  = 0; 
    }
//******************************************************************************
// Quiete
//******************************************************************************
void Quiete()
{ 
    lcd.clear();
    lcd.print(" Nessun fulmine");
    lcd.setCursor(0,1);
    lcd.print("  rilevato  :)  ");
    Dly  = 0;
    Conteggio =0;
}
//******************************************************************************
// Rilevamento rumore
//******************************************************************************
void Alrm()
{
 ;  // da scrivere
}
//********************************************************************************
//********************************************************************************
// Inizializzazione AS3935
//********************************************************************************
//********************************************************************************
void setup()
{
  InitMsg();
  if(!lightning.begin())
    {
      Fault();
      while(1); 
    }
  else
      Settings();
      Quiete();
    }
//******************************************************************************
// Emissione messaggi
//******************************************************************************  
void loop()
{    
   Serial.println(Conteggio);
   Serial.println(Dly); 
   
  if(digitalRead(lampo) == HIGH)
    { 
      // Leggo registro AS3935
      Conteggio = lightning.readInterruptReg();
      
      // Rumore rilevto
      if(Conteggio == RUMORE)Noise();
      
      // Disturbo rilevato 
      if(Conteggio == DISTURBO)Disturbo();
  
      // Fulmine rilevato
      if(Conteggio == FULMINE)Fulmine();
    }

   if(Conteggio>0)
      {       
       if(Dly<5000)Dly++; 
       if(Dly>=20)digitalWrite(Led, LOW);
       if(Dly>=5000)Quiete();
      } 
}

 

Modificato: da dott.cicala
Link al commento
Condividi su altri siti

int NoiseFilt           = 3;     // 1...7 

Soglia rumore

 

int DistFilt            = 8;     // 1...10

Soglia disturbo

IMG_3015.JPG.3aab50a194d5dfc9d0b9acd19b948cb5.JPG

Modificato: da dott.cicala
Link al commento
Condividi su altri siti

Ieri notte temporale con fulmini.

Ne ha azzeccato uno solo che dal boato che ha fatto dev'essere caduto molto vicino, ma il marchingegno lo ha dato a 27km. Tutti gli altri li ha rilevati come rumore.

Il led guizzava ad ogni lampo.

C'è qualcosa che non va.....ovviamente.

Link al commento
Condividi su altri siti

18 ore fa, dott.cicala scrisse:

E' il relè che disturba.

 

lo fai lavorare come un rocchetto di Rumkhoff.:smile:

 

Scusa Stefano potresti toglermi una curiosità?

Aa parte il piacere della sperimentazione, che utilità porta avere un rivelatore di fulmini che, se tutto funziona perfettamente, al massimo li conta e misura la distanza del punto di caduta?

Link al commento
Condividi su altri siti

1 ora fa, Livio Orsini scrisse:

...che utilità porta avere un rivelatore di fulmini...

 E' utile al mio divertimento...e se non funziona subito è anche meglio, quando funzionerà sarò ancor più soddisfatto.

...Anche se la mia gatta è più affidabile. Se è in arrivo un temporale va a nascondersi molto prima che il fenomeno sia evidente.

 

Ad un mio collega che colleziona tappi ho chiesto cosa se ne facesse e mi ha risposto:" Li guardo":superlol:

 

 

 

 

 

 

 

Link al commento
Condividi su altri siti

Immaginavo, è il solo piaceere di farlo funzionare.

Ti capisco perfettamente, ne ho un'infinità di aggeggi, più o meno inutil,i progettati e costruiti solo per il piacere di soffisfare una curiosità o un'idea del momento. Ci lavoro sopra sino a quando riesco a farli andare come piace a me, poi li abbandono e passo ad altro.:smile:

Link al commento
Condividi su altri siti

19 ore fa, Livio Orsini scrisse:

A parte il piacere della sperimentazione, che utilità porta avere un rivelatore di fulmini che, se tutto funziona perfettamente, al massimo li conta e misura la distanza del punto di caduta?

Tale tipo di sensore viene utilizzato ad esempio in fotografia, sono le cosiddette "fototrappole per fulmini", per fotografare i fulmini appunto. Quindi un'utilità c'è in realtà.

Nel link un accessorio di questo tipo, che oltre al sensore per i fulmini incorpora anche sensori sonori e laser (ad esempio per fotografare animali nel loro ambiente naturale, per i quali ci sono anche le fototrappole "classiche").

https://it.plutotrigger.com/

 

ciao

Rodolfo

Link al commento
Condividi su altri siti

Proseguono le prove, sempre con risultati deludenti 😃

 

In casa non riesce a distinguere fra la scarica di un fulmine e il rumore se non per fulmini caduti nelle vicinanze, talmente vicini che il boato si sente a non più di un paio di secondi dal lampo, quindi a non più di un paio di km dal sensore.

 

In questo caso il fulmine viene riconosciuto ma la distanza stimata è sempre di 27km.

Facendo una ricerca in rete si trovano varie immagini dove l'indicazione 27km è la più frequente in assoluto.

 

In attesa del prossimo temporale per svolgere prove all'aperto ho letto più attentamente il datasheet.

 

In pratica l'antenna loop dovrebbe risuonare al centro banda del ricevitore che è di 500kHz, la banda passante è di 30kHz.

 

La breakout board viene venduta specificando che il loop è già calibrato, ma come lo verifichiamo?

 

Esiste un apposito registro che fa in modo che sull'uscita IRQ si presenti un onda quadra la cui frequenza, moltiplicata per un certo coefficiente, rappresenta una delle frequenze che usa il chip

 

image.png.c16e681317ae3647e33bf37779139c84.png

 

A me interessala frequenza del loop, quindi nel mio sorgente scriverò

 

#define ANTFREQ         3         // Registo lettura frequenza

 

e nel setup

 

lightning.displayOscillator(true, ANTFREQ);

di default il coefficiente di moltiplicazione vale 16.

 

Già che ero in ballo ho aggiunto la libreria 

 

#include <FreqCount.h>

per misurare la frequenza direttamente con Arduino ed avere la visualizzazione sul display, anche se ho dovuto spostare sul pin5 il collegamento dell' IRQ, perché tale pin è quello che si aspetta la libreria del frequenzimetro.

 

Ed ecco cosa misura Arduino!

image.png

 

lo stesso segnale /16 all'oscilloscopio

nocap.JPG

 

Siamo fuori frequenza e il ricevitore è sordo!

 

Per fortuna il registro ci viene in aiuto

 

image.png.6c61c0ab147073b791392f91eb5cf903.png

 

I bit da 0 a 3 servono per aggiungere al loop capacità a passi di 8pF fino a 120pF  :thumb_yello:

 

Questa è la procedura di calibrazione del loop che va eseguita ad ogni accensione...e quindi nel mio setup aggiungo

 

	  //Tuning Cap
      lightning.tuneCap(112);    

ed ecco cosa succede

image.png.d9132435c462e75d2e5606feb249c592.png

 

image.png.370392dece09c184b39bed1b073633e1.png

 

Ora siamo in frequenza!

 

Bisogna disattivare la funzione di misura....

 

lightning.displayOscillator(false, ANTFREQ);

 

 

...e aspettare il prossimo temporale.

Modificato: da dott.cicala
Link al commento
Condividi su altri siti

Ma come fa a misurare la distanza? A occhio è semplice, basta misurare il ritardo del tuono, rispetto al lampo. Poi, considerando che la velocità del suono, omettendo le compensazioni per temperature <> 20°C, è di 343.8 msec (a livello del mare), si calcola la distanza. Se fossero 2" la distanza sarebbe di 687.6 metri.Per avere uba distanza di 27 km il ritardo dovrà essere pari a circa 78".53

 

Ora, mi chiedo, visto che la scheda rileva la scarica elettrica che si propaga con velocità simile a quella della luce, sarebbe com rilevare il lampo; ma cosa si usa come equivalente del tuono? Evidentemente si usa qualche altro metodo; tu lo conosci?

Link al commento
Condividi su altri siti

Sembrerebbe che la distanza misurata sia quella dal fronte del temporale, non quella del fulmine.

In effetti sul fronte temporalesco compaiono numerosi lampi dovuti a scriche non tra terra e nube, ma tra nube e nube, solo dopo il fronte si avranno scriche tra terra e nubi.

 

però non spiega come stima la distanza, forse si rifà all'intensità della scarica.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...