Esp8266 riavvio improvviso

Buongiorno a tutti!

Da qualche giorno ho un problema con un ESP8266 al quale è collegato un encoder incrementale che funge da contametri lineari, un display TFT ILI9341per la visualizzazione del dato ed un pulsante per il reset di quest'ultimo.
Inoltre un raspberry richiede il dato ogni minuto per poterlo utilizzare all'interno di una pagina web

il problema è che a volte di riavvia all'improvviso e non riesco a capirne il motivo, ho provato a fornirgli alimentazioni diverse anche con batteria per evitare eventuali sbalzi di corrente che avrebbero potuto causarne il riavvio...

vi lascio di seguito il codice:

#include <Arduino.h>
#include <math.h>

// TFT display library
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include "Fonts/FreeSansBold24pt7b.h"
#include "Fonts/FreeSans9pt7b.h"

//WEB SERVER library
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

void IRAM_ATTR handleInterrupt();
//permette l'utilizzo degli interrupt usati per l'encoder

const char* SSID = "****************";
const char* psw = "****************"; 
ESP8266WebServer server(80);
//parametri wifi (SSID, password, porta)

  //PINSs
  #define encoderPinA D2
  #define encoderPinB D3
  // PIN a cui sono collegati gli encoder da definire per ogni encoder
  #define resetButton D0
  // //PIN tasto reset


  // Pins for display
  #define TFT_DC D4
  #define TFT_CS D8


double stepMtl = 6000.0;

volatile unsigned long pos = 0;
volatile double mtl = 0.0;
volatile double precMtl = 0.0;

//Variabile che memorizza la lunghezza che stiamo misurando

void IRAM_ATTR doEncoderA();
void IRAM_ATTR doEncoderB(); 
void reset();
void webCGI();
void webResetData();


// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);


void testText();
void displayGraphics();
void onLoadGraphics();

void setup() {
  Serial.begin(9600);

  tft.begin();

      //Mostra su Display;
    tft.setRotation(1);
    onLoadGraphics();

  //inizio configurazione wifi
  WiFi.mode(WIFI_STA);
  WiFi.begin(SSID, psw);

    while(WiFi.status() != WL_CONNECTED){
      Serial.print(".");
      delay(500);
    }
    //in attesa di connessione stampa caricamento
          displayGraphics();
          Serial.print("CONNESSO A: ");
          Serial.println(SSID);
          Serial.print("IP: ");
          Serial.println(WiFi.localIP());
          //quando connesso stampo parametri connessione 

    server.on("/", webCGI);
    server.on("/resetData", webResetData);
    server.on("/reset", reset);
    server.begin();


    pinMode(encoderPinA, INPUT_PULLUP);
    pinMode(encoderPinB, INPUT_PULLUP);
    pinMode(resetButton, INPUT);
    //definiamo l'input dei pin specificando che va attivata la resistenza di PULLUP
    
    attachInterrupt(digitalPinToInterrupt(encoderPinA), doEncoderA, CHANGE);
    attachInterrupt(digitalPinToInterrupt(encoderPinB), doEncoderB, CHANGE);
    //definiamo le intterupt (valore Pin int, funzione da chiamare, definisce cambiamento)

}

unsigned long dt, t1;

void loop(void) {
  server.handleClient();
  //risposta alle chiamate client
  MDNS.update();

dt = millis() - t1;
  if (dt > 1500) {

    //convert to double with step/mm
    mtl = pos/stepMtl;
    int mInt = floor(mtl);
    if(mtl < 0){ mInt += 1; }
    int mDec = fabs(floor((mtl-mInt)*10));
    if(mDec == 10){ mDec = 0;}


    if(digitalRead(resetButton) == HIGH){
      reset();
    }
    //Serial.println(pos);
    tft.fillRect(0, 20, 320, 120, ILI9341_BLACK);
    tft.setCursor(0, 100); tft.setFont(&FreeSansBold24pt7b); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(2.2);
    tft.print(mInt); //INSERIRE VARIABILE METRI
    tft.print(".");
    tft.print(mDec);

    Serial.print("\n misura: ");
    Serial.println(mtl);
    Serial.print("\n steps: ");
    Serial.println(pos);
  
    t1 = millis();
  }

}

void displayGraphics(){
  //prepare bkg and font
  tft.fillScreen(ILI9341_BLACK);
  tft.setFont(&FreeSans9pt7b);

  tft.fillRect(0, 20, 320, 120, ILI9341_BLACK);
    tft.setCursor(0, 100); tft.setFont(&FreeSansBold24pt7b); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(2);
    tft.print(mtl);
  
  //CONTATORE
  tft.setCursor(275, 15);tft.setFont(&FreeSans9pt7b); tft.setTextSize(1);
  tft.println("MTL");

  tft.println("");

  //PREV VALUE

  tft.println("");

  //WEB SERVER IP
  tft.setCursor(10, 210); tft.setFont(&FreeSans9pt7b); tft.setTextSize(0.5); 
  tft.println("DNS: http://contametri-luxpan2.local/");
  tft.setCursor(10, 230); tft.setTextSize(0.5);
  tft.print("IP: ");
  tft.println(WiFi.localIP());

  //WIFI CONNECTED?
  if(WiFi.status() == WL_CONNECTED){
    tft.fillCircle(305, 215, 10, ILI9341_GREEN);
  } else {
    tft.fillCircle(305, 215, 10, ILI9341_RED);
  }


}

void onLoadGraphics(){
    tft.fillScreen(ILI9341_BLACK);
    tft.fillRect(110,70, 100, 100, ILI9341_BLUE);
    tft.fillTriangle(64, 173, 64, 20, 223, 20, ILI9341_BLACK);
    tft.fillRect(110, 70, 48, 48, ILI9341_RED);
    tft.fillRect(115, 75, 13, 38, ILI9341_WHITE);
    tft.fillRect(115, 102, 38, 13, ILI9341_WHITE);

    tft.setCursor(90, 200);
    tft.setFont(&FreeSans9pt7b); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1);
    tft.println("Caricamento...");
}

void reset(){
  digitalWrite(LED_BUILTIN, LOW);
  precMtl = mtl;
  mtl = 0;
  pos = 0;

  tft.fillRect(0, 135, 320, 50, ILI9341_BLACK);
  tft.setCursor(10, 165);
  tft.setFont(&FreeSans9pt7b); tft.setTextSize(1); tft.setTextColor(ILI9341_WHITE);
  tft.print("Valore precedente: ");
  tft.print(precMtl);
  tft.println(" MTL");

  digitalWrite(LED_BUILTIN, HIGH);  
}

void IRAM_ATTR doEncoderA(){
  //funzione che si attiverà quando l'encoder cambierà di stato
  if (digitalRead(encoderPinA) == HIGH){
    //se il pin A dell'encoder risulta alto controllo lo stato di B per verificare se questo sta girando in senso orario o antiorario
    if (digitalRead(encoderPinB) == LOW){
      //se il pin B risulta basso allora gira in senso orario, quindi incrementa il valore di posizione
      pos--;
    } else {
      // b alto quindi antiorario, decremento posizione
      pos++;
    }
  } else {
      //definiamo il comportamento nel caso in cui A sia basso
     if (digitalRead(encoderPinB) == HIGH){
      //se B è alto allora stiamo girando in senso orario, incremento pos
      pos--;
    } else {
      //B basso, antiorario, decremento pos
      pos++;
    }
  }
}

void IRAM_ATTR doEncoderB(){
  //controlliamo ugualmente la linea B dell'encoder
  if (digitalRead(encoderPinB) == HIGH){
    if (digitalRead(encoderPinA) == HIGH){
      pos--;
    } else {
      pos++;
    }
  } else {
     if (digitalRead(encoderPinA) == LOW){
      pos--;
    } else {
      pos++;
    }
  }
}



void webCGI(){
  String metri = String(mtl);
  server.sendHeader("Access-Control-Allow-Origin", "*");
  server.send(200, "text/plain", metri);
}

void webResetData(){
  String metriPrec = String(precMtl);
  server.sendHeader("Access-Control-Allow-Origin", "*");
  server.send(200, "text/plain" ,metriPrec);
}

Grazie mille

Buonasera e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Detto questo, in conformità al punto 13 del succitato regolamento, ti rammento che il cross-posting è proibito (anche tra lingue diverse) e ... tu hai già posto la stessa/simile domanda QUI. Non solo, in quella discussione ti stanno già rispondendo ed è veramente poco carino abbandonare una discussione e chi ti stava aiutando, per venire di qua a porre la stessa/simile domanda (oltre ad essere una grossa perdita di tempo) … :roll_eyes:

Quindi, per rispetto verso chi ha già cominciato ad aiutarti, questa tua discussione duplicata viene chiusa e ti prego di continuare dove avevi cominciato.

Grazie,

Guglielmo