Travamento em Estação meteorológica com ARDUINO MEGA+SIM808+MYSQL

Olá a todos,
estou realizando um projeto de construção de um estação meteorológica com um arduino mega, com os seguintes componentes: pluviometro de báscula, anenômetro, biruta, sensores BME280 e Sht20. Além disso ele também envia os dados para um banco de dados MYSQL através do módulo SIM808 a cada 10 minutos. O meu código ta rodando tranquilamente o problema é que depois de umas 15 horas rodando ele simplesmente trava e para de enviar os dados para o banco do dados. Se vou até o arduino e dou o reset ele volta a enviar os dados, porém este não é o ideal porque o projeto está instalado em um lugar longe e não compensa ir lá a cada 15 horas pra destravar. Vocês sabem como solucionar este poblema? Sou novo no mundo do arduino então sei que meu código não esta perfeito porém está funcionando. Estava querendo deixar o código um pouco mais dinâmico ou adicionar algo como um watchdog para reiniciar toda a vez que o programa travar

segue o código:

#include <SoftwareSerial.h>
#include "DFRobot_SHT20.h"
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)


#define TINY_GSM_MODEM_SIM808


#include <TinyGsmClient.h>



SoftwareSerial gprsSerial(10, 11);


Adafruit_BME280 bme; // I2C

// Constants definitions anem.
const float pi = 3.14159265;           // Numero pi
int period = 5000;               // Tempo de medida(miliseconds) 5000
int radius = 147;      // Raio do anemometro(mm)


// Variable definitions ANENOMETRO

unsigned int counter = 0; // magnet counter for sensor
unsigned int RPM = 0;          // Revolutions per minute
float speedwind = 0;         // Wind speed (Km/h)

//Const def Pluviômetro

#define INTERRUPT_INPUT 3
 
volatile int pulse_counter_ISR;
int pulse_counter;


// Const def biruta

int pin=0;  // A0 entrada do biruta *
float valor =0;
int Winddir =0;



DFRobot_SHT20    sht20;


void setup(){   


Serial.begin(4800);
 gprsSerial.begin(4800);
  

  gprsSerial.flush();
  Serial.flush();

  // attach or detach from GPRS service 
  gprsSerial.println("AT+CGATT?");
  delay(100);
  toSerial();

    // bearer settings
  gprsSerial.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");
  delay(2000);
  toSerial();

  // bearer settings
  gprsSerial.println("AT+SAPBR=3,1,\"APN\",\"taif\"");
  delay(2000);
  toSerial();

  // bearer settings
  gprsSerial.println("AT+SAPBR=0,1");
  delay(2000);
  gprsSerial.println("AT+SAPBR=1,1");
  delay(2000);
  toSerial();
   


    //pluviometro
  digitalWrite(INTERRUPT_INPUT, HIGH); // activate internal pull-up, so normally input is HIGH
  attachInterrupt(INTERRUPT_INPUT - 2, interrupt_handler, FALLING); // count on FALLING edge

  //bme280
      
    bool status;
    status = bme.begin();  

    

  // Anemômetro 
  pinMode(2, INPUT);  // Entrada anemometro *
  digitalWrite(2, HIGH);  //internall pull-up active

  //sensorsolo

    sht20.initSHT20();                                  // Init SHT20 Sensor

    

}



// Calculo da velocidade wind  *************
void windvelocity(){
  speedwind = 0;
  counter = 0;  
  attachInterrupt(0, addcount, RISING);
  unsigned long millis();       
  long startTime = millis();
  while(millis() < startTime + period) {
  }
    
}


void RPMcalc(){
  RPM=((counter)*60)/(period/1000);  // Calculate revolutions per minute (RPM)
}


void SpeedWind(){
  speedwind = (((4 * pi * radius * RPM)/60) / 1000);  // Calculate wind speed on khm/
 
}

void addcount(){
  counter++;
} 

// Fim calculo veloc wind  



void loop()
{  
  
  
// PLUVIOMETRO

    noInterrupts(); // disable interrupts
    pulse_counter=pulse_counter_ISR; // copy volatile variable into normal variable
    pulse_counter_ISR=0; // reset ISR counter
    interrupts(); // enable interrupts

// Ler anemometro

 windvelocity();
 RPMcalc();
 SpeedWind();

// Ler biruta 
String Direc; 
valor = analogRead(pin)* (5.0 / 1023.0); 

if (valor <= 0.58) {
Winddir = 315;
Direc= "SUDESTE ----> NOROESTE";
}
else if (valor <= 0.65) { 
Winddir = 270;
Direc= "LESTE ----> OESTE";
}
else if (valor <= 0.75) { 
Winddir = 225;
Direc ="NORDESTE ----> SUDOESTE";
}
else if (valor <= 0.9) {
Winddir = 180;
Direc= "NORTE ----> SUL"; 
}
else if (valor <= 1.1) { 
Winddir = 135;
Direc= "NOROESTE ----> SUDESTE";
}
else if (valor <= 1.3) { 
Winddir = 90;
Direc= "OESTE ----> LESTE";
}
else if (valor <= 1.7) {  
Winddir = 45;
Direc= "SUDOESTE ----> NORDESTE";
}
else {  
Winddir = 000;
Direc = "SUL ----> NORTE";
}

float humd = sht20.readHumidity();                  // Read Humidity
float temp = sht20.readTemperature();               // Read Temperature


// initialize http service
   gprsSerial.println("AT+HTTPINIT");
   delay(2000); 
   toSerial();

// set http param value
   gprsSerial.print("AT+HTTPPARA=\"URL\",\"MEUSERVIDOR//write_data.php?data1=");
   gprsSerial.print(getBME('C'));

   gprsSerial.print("&data2=");
   gprsSerial.print(getBME('K'));

   gprsSerial.print("&data3=");
   gprsSerial.print(getBME('H'));

   gprsSerial.print("&data4=");
   gprsSerial.print(getBME('P'));

   gprsSerial.print("&data5=");
   gprsSerial.print(getBME('A'));

   gprsSerial.print("&data6=");
   gprsSerial.print(speedwind);

   gprsSerial.print("&data7=");
   gprsSerial.print(Direc);

   gprsSerial.print("&data8=");
   gprsSerial.print(temp);

   gprsSerial.print("&data9=");
   gprsSerial.print(humd);

   gprsSerial.print("&data10=");
   gprsSerial.print(pulse_counter*0.25);

   gprsSerial.println("\"");
   delay(2000);
   toSerial();

   // set http action type 0 = GET, 1 = POST, 2 = HEAD
   gprsSerial.println("AT+HTTPACTION=0");
   delay(6000);
   toSerial();

   // read server response
   gprsSerial.println("AT+HTTPREAD"); 
   delay(1000);
   toSerial();

   gprsSerial.println("");
   gprsSerial.println("AT+HTTPTERM");
   toSerial();
   delay(300);

   gprsSerial.println("");
   delay(600000);

   
 
   
}

void toSerial()
{
  while(gprsSerial.available()!=0)
  {
    Serial.write(gprsSerial.read());
  }
}

float getBME(char type)
{
   // Robojax.com BME280 Code
  float value;
    float temp = bme.readTemperature();// read temperature
    float pressure = bme.readPressure() / 100.0F; // read pressure
    float rel_hum = bme.readHumidity();// read humidity
    float alt =bme.readAltitude(SEALEVELPRESSURE_HPA);// read altitude
   if(type =='F')
   {
    value = temp *9/5 + 32;//convert to Fahrenheit 
   }else if(type =='K')
   {
    value = temp + 273.15;//convert to Kelvin
   }else if(type =='H')
   {
    value = rel_hum;//return relative humidity
   }else if(type =='P')
   {
    value = pressure;//return pressure
   }else if(type =='A')
   {
    value = alt;//return approximate altitude
   }else{
    value = temp;// return Celsius
   }
   return value;
}//getBME

void interrupt_handler()
{
  pulse_counter_ISR = pulse_counter_ISR + 1;
}

 void printDegree()
{
   // Robojax.com Code
    Serial.print("\xC2"); 
    Serial.print("\xB0");  
}

CÓDIGO PHP NO SERVIDOR

<?php
    // Prepare variables for database connection
   $servername = "myserver";
$database = "mydb";
$username = "myuser";
$password = "mypsw";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $database);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
    // Prepare the SQL statement
    $sql = "INSERT INTO Dados_Estacao(TempC,TempK,UR,Pressao,Altitude,VV,Direc,Temp_solo,Umidade_solo,Precip) VALUES ('".$_GET["data1"]."','".$_GET["data2"]."','".$_GET["data3"]."','".$_GET["data4"]."','".$_GET["data5"]."','".$_GET["data6"]."','".$_GET["data7"]."','".$_GET["data8"]."','".$_GET["data9"]."','".$_GET["data10"]."')";

if ($conn->query($sql) === TRUE) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "
" . $conn->error;
}

Boas,
Isso pode significar que alguma parte do teu código pode estar a alocar memoria que depois nao liberta e vai crescendo exponencialmente ate que estoura.
Vê isto:

Podes sempre tentar verificar a memoria disponível ao longo do dia ou de x em x minutos e eventualmente enviares também para o mysql essa variável, de forma a que possas monitorizar depois na base dados.