dott.cicala Inserito: 1 settembre 2019 Segnala Inserito: 1 settembre 2019 (modificato) Ecco la mia versione di rilevatore di fulmini 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 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. Modificato: 1 settembre 2019 da dott.cicala
dott.cicala Inserita: 5 settembre 2019 Autore Segnala Inserita: 5 settembre 2019 (modificato) 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: 5 settembre 2019 da dott.cicala
dott.cicala Inserita: 7 settembre 2019 Autore Segnala Inserita: 7 settembre 2019 (modificato) 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: 7 settembre 2019 da dott.cicala
dott.cicala Inserita: 7 settembre 2019 Autore Segnala Inserita: 7 settembre 2019 (modificato) int NoiseFilt = 3; // 1...7 Soglia rumore int DistFilt = 8; // 1...10 Soglia disturbo Modificato: 7 settembre 2019 da dott.cicala
dott.cicala Inserita: 7 settembre 2019 Autore Segnala Inserita: 7 settembre 2019 (modificato) Test disturbi Modificato: 7 settembre 2019 da dott.cicala
gabri-z Inserita: 7 settembre 2019 Segnala Inserita: 7 settembre 2019 Preciso che sono anche sordo ; ma è il piano che lo disturba ?
dott.cicala Inserita: 7 settembre 2019 Autore Segnala Inserita: 7 settembre 2019 E' il relè che disturba. E' collegato a vibratore
dott.cicala Inserita: 8 settembre 2019 Autore Segnala Inserita: 8 settembre 2019 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.
Livio Orsini Inserita: 8 settembre 2019 Segnala Inserita: 8 settembre 2019 18 ore fa, dott.cicala scrisse: E' il relè che disturba. lo fai lavorare come un rocchetto di Rumkhoff. 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?
dott.cicala Inserita: 8 settembre 2019 Autore Segnala Inserita: 8 settembre 2019 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"
Livio Orsini Inserita: 9 settembre 2019 Segnala Inserita: 9 settembre 2019 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.
rodolfok Inserita: 9 settembre 2019 Segnala Inserita: 9 settembre 2019 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
dott.cicala Inserita: 15 settembre 2019 Autore Segnala Inserita: 15 settembre 2019 (modificato) 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 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! lo stesso segnale /16 all'oscilloscopio Siamo fuori frequenza e il ricevitore è sordo! Per fortuna il registro ci viene in aiuto I bit da 0 a 3 servono per aggiungere al loop capacità a passi di 8pF fino a 120pF 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 Ora siamo in frequenza! Bisogna disattivare la funzione di misura.... lightning.displayOscillator(false, ANTFREQ); ...e aspettare il prossimo temporale. Modificato: 15 settembre 2019 da dott.cicala
Livio Orsini Inserita: 15 settembre 2019 Segnala Inserita: 15 settembre 2019 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?
dott.cicala Inserita: 15 settembre 2019 Autore Segnala Inserita: 15 settembre 2019 Quello che so è quanto letto nel ds. Si parla di un algoritmo ma non si va oltre a questo
Livio Orsini Inserita: 16 settembre 2019 Segnala Inserita: 16 settembre 2019 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.
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora