Anomalia avvio procedura dopo l'alimentazione

Ciao a tutti!
Volevo chiedere una informazione in merito ad un progetto che sto realizzando per rilevare i fulmini tramite un sensore AS3935.
In particolare l'anomalia che riscontro è che quando alimento la scheda esp8266 il codice non si avvia quasi mai al primo tentativo, ma devo resettare la scheda o togliere e ridare alimentazione e resettare perchè il tutto prenda il via.
Poi una volta partito il sistema funziona correttamente senza problemi.
Ho provato anche a cambiare scheda ed il problema persiste.
A cosa potrebbe essere dovuto?
Nel prossimo post provo anche a pubblicare il codice incriminato.

Grazie mille

#include <SPI.h>
#include <AS3935.h>
#include <ESP8266WiFi.h>          //per gestire WifiClientSecure
#include <WiFiClient.h>           //per gestire la connessione alla rete Wifi

//dati per la connessione alla rete Wifi 
const char* MY_SSID = "xxx"; 
const char* MY_PWD = "xxx";

//dati per la connessione ad xxx.it
const char* host = "xxx";
const uint16_t port = 443;  

//dati sensore fulmini AS3935
int valore_calibrazione;              //valore calibrazione
void printAS3935Registers();          //funzione che rileva e stampa i parametri del sensore (rumore di fondo, spike rejection, soglia di controllo)
byte SPItransfer(byte sendByte);      //funzione che si occupa del traferimento dei dati via SPI
void AS3935Irq();                     //funzione che verifica se ci sono disturbi o fulmini e causa l'interrupt
                                                      
AS3935 AS3935(SPItransfer,D4,D3);     //primo parametro: funzione per il trasferimento dei dati via SPI     
                                      //secondo parametro: pin CS collegato alla scheda
                                      //terzo parametro:pin IRQ collegato alla scheda

//impostazione avvio millis per lettura sensore
unsigned long tempo_start_lettura_sensori = millis();
unsigned long intervallo_lettura_sensori = 600000;   //effettuiamo una lettura dei sensori ogni 600 secondi (10 minuti) 

float numero_fulmini = 0;         //numero fulmini rilevati
float distanza_fulmini = 0;       //distanza fulmini
float disturbi_rilevati = 0;      //numero disturbi rilevati


void setup()
{
  //inizializzazione seriale
  Serial.begin(9600); 

  //connessione Wifi
  connectWifi();
  
  //setup sensore fulmini AS3935
  SPI.begin();
  SPI.setDataMode(SPI_MODE1);
  SPI.setClockDivider(SPI_CLOCK_DIV16);
  SPI.setBitOrder(MSBFIRST);
  AS3935.reset();                             //ripristina tutti i valori di registro interni ai valori predefiniti
  delay(100);
  AS3935.setOutdoors();                       //setta il sensore per il funzionamento all'esterno
  AS3935.registerWrite(AS3935_NF_LEV,2);      //scrive 2 nel Noise Level register 
  
  //se il sensore non riesce a stare nel range di tolleranza la calibrazione non andrà a buon fine e restituirà false
  if(!AS3935.calibrate()) {
    //Serial.println("La calibrazione non è andata a buon fine, controllare il cablaggio");
  }
  
  valore_calibrazione=AS3935.registerRead(AS3935_TUN_CAP);        //il range è compreso tra 0 e 15
  //Serial.print("La calibrazione rilevata è (range concesso tra 0 e 15): ");
  //Serial.println(valore_calibrazione);

  AS3935.enableDisturbers();      //turn on indication of distrubers, once you have AS3935 all tuned, you can turn those off with disableDisturbers()
  printAS3935Registers();         //rileva e stampa i parametri del sensore (rumore di fondo, spike rejection, soglia di controllo)
  
  attachInterrupt(digitalPinToInterrupt(D3), AS3935Irq, RISING);  
  //usare interrupt significa che non serve controllare lo stato del pin continuamente, lo fa il chip da solo
}


void loop(){ 

  //reset di tempo_start_lettura_sensori in caso di overflow di millis che si azzera
  if (millis()-tempo_start_lettura_sensori<0) {
    tempo_start_lettura_sensori = millis();
  }

  if ((millis()-tempo_start_lettura_sensori) > intervallo_lettura_sensori){

    tempo_start_lettura_sensori = millis();

    //collegamento all'host 
    WiFiClientSecure client;
    client.setInsecure();       //non si utilizzano certificati di sicurezza

    //Serial.println(host);
    //Serial.println(port);

    //verifica se il collegamento non è andato a buon fine
    if (!client.connect(host, port)) {
      delay(5000);
      return;
    }

    //se la connessione all'host è avvenuta 
    if (client.connected()) {

      distanza_fulmini = distanza_fulmini / numero_fulmini;

      String var="numero_fulmini=" + String(numero_fulmini) + "&distanza_fulmini=" + String(distanza_fulmini) + "&disturbi_rilevati=" + String(disturbi_rilevati);
      String url = "GET /aggiungi_fulmini.php?" + var + " HTTP/1.1";

      //Serial.println(url);

      //invio url all'host per il salvataggio dei dati sul database mysql
      client.println(url);
      client.println("Host: www.xxx.it");
      client.println("Access-Control-Allow-Origin: *");
      client.println("Connection: close");
      client.println();
      client.stop();
    }

    //azzeramento delle variabili per il prossimo ciclo di rilevamento
    numero_fulmini=0;         
    distanza_fulmini=0;
    disturbi_rilevati=0;

    //Serial.println("AZZERAMENTO EFFETTUATO");
  }
}


void printAS3935Registers()
{
  int noiseFloor = AS3935.getNoiseFloor();
  int spikeRejection = AS3935.getSpikeRejection();
  int watchdogThreshold = AS3935.getWatchdogThreshold();
  //Serial.print("Il rumore di fondo è: ");
  //Serial.println(noiseFloor,DEC);
  //Serial.print("Lo spike rejection è: ");
  //Serial.println(spikeRejection,DEC);
  //Serial.print("La soglia di controllo è: ");
  //Serial.println(watchdogThreshold,DEC);  
}


byte SPItransfer(byte sendByte)
{
  return SPI.transfer(sendByte);
}


ICACHE_RAM_ATTR void AS3935Irq()                            //ICACHE_RAM_ATTR serve per caricare nella ram altrimenti con esp non funzionano gli interrupt
{
  //verifica cosa ha causato l'interrupt
  //appena leggiamo l'interrupt, il pin IRQ diventa LOW
  int irqSource = AS3935.interruptSource();   //restituisce bit 0: livello rumore troppo alto
                                              //            bit 2: rilevato disturbo
                                              //            bit 3: rilevato fulmine
    
  //if (irqSource & 0b0001){                  //rumore troppo alto  
  //  Serial.println("Livello rumore troppo alto");
  //}

  if (irqSource & 0b0100){                    //rilevato disturbo
    //Serial.println("Disturbo rilevato");   
    disturbi_rilevati=disturbi_rilevati+1;    //aumenta di 1 il contatore dei disturbi rilevati
  }  
    
  if (irqSource & 0b1000){                    //rilevato fulmine
    int distanza_fulmine = AS3935.lightningDistanceKm();    //determina la distanza del fulmine in km
      
    if (distanza_fulmine < 41 && distanza_fulmine > 0)      //40 km è la distanza di rilevamento massima
    {
      //Serial.print("Fulmine rilevato a ");
      //Serial.print(distanza_fulmine,DEC);
      //Serial.println(" km");

      numero_fulmini= numero_fulmini+1;                     //aumenta di 1 il contatore dei fulmini rilevati
      distanza_fulmini=distanza_fulmini+distanza_fulmine;   //somma tutte le distanze dei fulmini rilevati per fare al termine del ciclo una media
    }
  }
}


//funzione per la connessione alla rete wifi
void connectWifi()
{
  //WiFi.persistent(false);
  //WiFi.mode(WIFI_OFF);
  //WiFi.mode(WIFI_STA);

  WiFi.begin(MY_SSID, MY_PWD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
  }
  //Serial.println("CONNESSO");
}    

 

... io eviterei D3 (GPIO0) e D4 (GPIO2) ... questa è la tavola dei pin utilizzabili con/senza problemi su ESP8266:

... poi vedi un po' tu ... :roll_eyes:

Guglielmo

P.S.: ... ma ormai gli ESP32 costano come i vecchi ESP8266 ... perché continuate ad usare vecchie schede invece di passare a schede più performanti e con più pin disponibili ?

Con Interrupt posso usare qualsiasi altro pin senza problemi?
Se posso chiedere, per cultura personale, come mai si deve evitare di utilizzare D3 e D4?

In merito al motivo per cui uso questa scheda è semplicemente perchè ne avevo già in casa da diverso tempo.

Basta leggere ciò che è scritto nella tabella che ho messo ... :roll_eyes:

Guglielmo

Ho effettuato la modifica consigliata utilizzando questa volta i pin D1 e D2 e dopo alcune prove ora il codice sembra avviarsi correttamente.
Terrò monitorata la situazione.

Intanto grazie mille per l'aiuto e i consigli!

Bene :slight_smile: e ... in futuro, ricorda che è meglio orientarsi sugli ESP32 che sui vecchi ESP8266 :wink:

Guglielmo

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.