Invio dati a mysql

Buongiorno,

lo sketch di seguito raccoglie dati da diversi sensori e li manda ad un db mysql. Inoltre controlla se ad un dato indirizzo esiste una versione più aggiornata di se stesso ed in caso scarica e si aggiorna.
Non sono un esperto quindi tutto il codice è stato scritto partendo da esempi, studiando e provando.
Funziona tutto! e funziona bene.

Il problema è che dopo tot tempo il database non riceve più dati. E non capisco dove sia il problema.
Forse se il db non risponde subito crea problemi?
Chiedo aiuto a voi esperti:
(manca la parte dove ci sono le pass wifi e db)

Hardware:

MKR WIFI 1010
MKR CONNECTOR CARRIER
MKR ENV SHIELD
GROVE - GAS SENSOR (O2)
GROVE - AIR QUALITY SENSOR V1.3

(non riesco a postare tutto in un singolo messaggio per limite di caratteri)

// Librerie wifi
#include <SPI.h>
#include <WiFiNINA.h>

// librerie mysql
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

// Librerie per MKR ENV SHIELD (sensori)
#include <Arduino_MKRENV.h>

// Librerie per aggiornamento software da remoto
#include <ArduinoOTA.h>
#include <ArduinoHttpClient.h>

// Librerie monitor
#include <Wire.h>
#include <SeeedGrayOLED.h>
#include <avr/pgmspace.h>

// Libreria Air Quality sensor 1.3
#include "Air_Quality_Sensor.h"
// Dove è collegato il sensore?
AirQualitySensor sensor(A1);

// Gas Sensor voltaggio
const float VRefer = 3.3;
// Dove è collegato il sensore?
const int pinAdc   = A0;

// Inclusione del file contenente le password wifi e OTA
#include "arduino_secrets.h"
char ssid[] = SECRET_SSID;
char pass[] = SECRET_PASS;
char user[] = SECRET_USR;
char password[] = SECRET_PAS;

// Stato iniziale del modulo wifi
int status = WL_IDLE_STATUS;

// Versione Sketch attuale
const short VERSION = 3;
#define Serial SerialUSB

// Contruzione MAC address
byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

// Dichiarazione variabili
float temperature = 0;
float humidity = 0;
float pressure = 0;
float UVA = 0;
float UVB = 0;
float UVIndex = 0;
float Vout = 0;
float Conc = 0;
float Vals = 0;
String macAddress;

// Costruzione query
char INSERT_DATA[] = "INSERT INTO test_arduino.sensors_data (sensor, temp, hum, pressure, uva, uvb, uvindex, O2, conce, vala, aria) VALUES ('%s', %s, %s, %s, %s, %s, %s, %s, %s, %s, '%s')";
char query[256];

// Connessione al DB
WiFiClient client;
MySQL_Connection conn((Client *)&client);

// Void per aggiornamento da remoto dello Sketch
#include "arduino_upgrade.h"

// Apre la porta seriale, velocità di trasferimento 9600 bps
void setup() {
  Serial.begin(9600);

  // Inizializzo il monitor
  Wire.begin();
  SeeedGrayOled.init(SH1107G);
  SeeedGrayOled.clearDisplay();
  SeeedGrayOled.setNormalDisplay();
  SeeedGrayOled.setVerticalMode();

  // Controllo presenza modulo wifi
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("WiFi non attivo!");
    while (true);
  }

  // Controllo versione firmware modulo wifi
  String fv = WiFi.firmwareVersion();
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
    Serial.println("Aggiornare il firmware");
  }

  // Inizializzazione della connsessione wifi e DB
  while (status != WL_CONNECTED) {
    Serial.print("In connessione a: ");
    Serial.println(ssid);
    status = WiFi.begin(ssid, pass);

    // Controlo presenza modulo Shield
    if (!ENV.begin()) {
      Serial.println("MKR ENV shield non inizializzato!");
      while (1);
    }
  }

  // Conferma avvenuta connsessione e stampa dei dettagli
  Serial.print("Sei connesso!");
  printCurrentNet();
  printWifiData();
  macAddress = getMACAddress();

  // Stampo versione attuale
  Serial.print("Versione installata del software: ");
  Serial.println(VERSION);

  // Attivo il sensore air 1.3
  Serial.println("Attivazione dei sensori");
  delay(5000);

  if (sensor.init()) {
    Serial.println("Sensori attivi.");
  }
  else {
    Serial.println("Errore attivazione sensori!");
  }

  // Connessione al DB
  delay(2000);
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(1000);
  }
  else
    Serial.println("Connessione al DB fallita.");
}

void loop(void) {
  // Vado a prelevare i dati dallo Shield
  float temperature = ENV.readTemperature();
  float humidity = ENV.readHumidity();
  float pressure = ENV.readPressure();
  float UVA = ENV.readUVA();
  float UVB = ENV.readUVB();
  float UVIndex = ENV.readUVIndex();

  // Crea le viariabili per il Gas Sensor
  Vout = readO2Vout();
  Conc = readConcentration();

  // Vado a scrivere sul monitor
  SeeedGrayOled.setTextXY(0, 0); //set Cursor to ith line, 0th column
  SeeedGrayOled.putString("Versione Soft:");
  SeeedGrayOled.putNumber(VERSION);
  SeeedGrayOled.setTextXY(2, 0); //set Cursor to ith line, 0th column
  SeeedGrayOled.putString("Tem:          ");
  SeeedGrayOled.putNumber(temperature);
  SeeedGrayOled.setTextXY(3, 0);
  SeeedGrayOled.putString("Umi:          ");
  SeeedGrayOled.putNumber(humidity);
  SeeedGrayOled.setTextXY(4, 0);
  SeeedGrayOled.putString("Pre:          ");
  SeeedGrayOled.putNumber(pressure);
  SeeedGrayOled.setTextXY(5, 0);
  SeeedGrayOled.putString("UVA:          ");
  SeeedGrayOled.putNumber(UVA);
  SeeedGrayOled.setTextXY(6, 0);
  SeeedGrayOled.putString("UVB:          ");
  SeeedGrayOled.putNumber(UVB);
  SeeedGrayOled.setTextXY(7, 0);
  SeeedGrayOled.putString("UVI:          ");
  SeeedGrayOled.putNumber(UVIndex);
  SeeedGrayOled.setTextXY(9, 0);
  SeeedGrayOled.putString("02:           ");
  SeeedGrayOled.putNumber(Vout);
  SeeedGrayOled.setTextXY(10, 0);
  SeeedGrayOled.putString("CON:          ");
  SeeedGrayOled.putNumber(Conc);

  int quality = sensor.slope();
  Vals = sensor.getValue();

  SeeedGrayOled.setTextXY(12, 0);
  SeeedGrayOled.putString("S Val:        ");
  SeeedGrayOled.putNumber(Vals);

  String aria;

  if (quality == AirQualitySensor::FORCE_SIGNAL) {
    SeeedGrayOled.setTextXY(14, 0);
    SeeedGrayOled.putString("Forte inquinamento");
    aria = "Forte inquinamento!";
  }
  else if (quality == AirQualitySensor::HIGH_POLLUTION) {
    SeeedGrayOled.setTextXY(14, 0);
    SeeedGrayOled.putString("Inquinamento");
    aria = "Inquinamento!";
  }
  else if (quality == AirQualitySensor::LOW_POLLUTION) {
    SeeedGrayOled.setTextXY(14, 0);
    SeeedGrayOled.putString("Basso inquinamento");
    aria = "Basso inquinamento!";
  }
  else if (quality == AirQualitySensor::FRESH_AIR) {
    SeeedGrayOled.setTextXY(14, 0);
    SeeedGrayOled.putString("Aria fresca");
    aria = "Aria fresca";
  }

  // Avvio controllo aggiornamenti
  handleSketchDownload();

  // Inserisco i dti del DB
  sprintf(query, INSERT_DATA, String(macAddress).c_str(), String(temperature).c_str(), String(humidity).c_str(), String(pressure).c_str(), String(UVA).c_str(), String(UVB).c_str(), String(UVIndex).c_str(), String(Vout).c_str(), String(Conc).c_str(), String(Vals).c_str(), aria.c_str());

  // Eliminare i commenti nella riga seguente per vedere a monitor la query
  // Serial.println(query);

  // Preparazione alla scrittura a monitor dei dati letti dai sensori ed inseriti nel DB
  Serial.println("Scrittura dati...");

  // Apre un cursore sul DB
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  cur_mem->execute(query);
  delete cur_mem;
  delay(1000);
}

// Costruzione dati sensore GAS
float readO2Vout()
{
  long sum = 0;
  for (int i = 0; i < 32; i++)
  {
    sum += analogRead(pinAdc);
  }

  sum >>= 5;

  float MeasuredVout = sum * (VRefer / 1023.0);
  return MeasuredVout;
}

float readConcentration()
{
  float MeasuredVout = readO2Vout();
  float Concentration = MeasuredVout * 0.21 / 2.0;
  float Concentration_Percentage = Concentration * 100;
  return Concentration_Percentage;
}

// Stampa dei dati di connessione: IP e MAC
void printWifiData() {
  IPAddress ip = WiFi.localIP();
  Serial.print("Indirizzo IP: ");
  Serial.println(ip);
  byte mac[6];
  WiFi.macAddress(mac);
  Serial.print("Indirizzo MAC: ");
  Serial.println(bytesToMACAddress(mac));
}

// Stampa dei dati di connessione: SSID, BSSID, RSSI e Criptazione
void printCurrentNet() {
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  byte bssid[6];
  WiFi.BSSID(bssid);
  Serial.print("BSSID: ");
  Serial.println(bytesToMACAddress(bssid));

  long rssi = WiFi.RSSI();
  Serial.print("Potenza del segnale (RSSI):");
  Serial.println(rssi);

  byte encryption = WiFi.encryptionType();
  Serial.print("Tipo di crittografia:");
  Serial.println(encryption, HEX);
  Serial.println();
}

// Costruzione del MAC Address
String getMACAddress()  {
  byte mac[6];
  WiFi.macAddress(mac);

  return bytesToMACAddress(mac);
}

String bytesToMACAddress(byte mac[]) {
  String m = "";

  for (int i = 5; i >= 0; i--) {
    m = m + byeToHex(mac[i]);
    if (i > 0) {
      m = m + ":";
    }
  }

  return m;
}

String byeToHex(byte b) {
  if (b < 16) {
    return "0" + String(b, HEX);
  }

  return String(b, HEX);
}

>FrankLevis: Attenzione ... REGOLAMENTO, punto 16.12, ... ho bloccato il tuo account duplicato FrankMan e ti prego per il futuro di evitare la creazione di altri account. Grazie.

Guglielmo

Parte relativa all’aggiornamento dello Sketch:

void handleSketchDownload() {

  const char* SERVER = "192.168.103.179";
  const unsigned short SERVER_PORT = 8080;
  const char* PATH = "/update-v%d.bin";
  const unsigned long CHECK_INTERVAL = 1000 * 60;
  static unsigned long previousMillis;
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis < CHECK_INTERVAL)  {
    return;
  }
  previousMillis = currentMillis;

  WiFiClient transport;
  HttpClient client(transport, SERVER, SERVER_PORT);

  char buff[32];
  snprintf(buff, sizeof(buff), PATH, VERSION + 1);

  Serial.print("Controllo aggiornamenti ");
  Serial.println(buff);

  client.get(buff);

  int statusCode = client.responseStatusCode();
  Serial.print("Codice di stato: ");
  Serial.println(statusCode);
  if (statusCode != 200) {
    client.stop();
    return;
  }

  int length = client.contentLength();
  if (length == HttpClient::kNoContentLengthHeader) {
    client.stop();
    Serial.println("Header errato lato server. Non è possibile continuare con l'aggiornamento.");
    return;
  }
  Serial.print("Dimensioni del file ");
  Serial.print(length);
  Serial.println(" bytes");

  if (!InternalStorage.open(length)) {
    client.stop();
    Serial.println("Spazzio non sufficente per scaricare l'aggiornamento. Non è possibile continuare. ");
    return;
  }
  byte b;

  client.setTimeout(1000);

  while (length > 0) {
    if (!client.readBytes(&b, 1))
      break;
    InternalStorage.write(b);
    length--;
  }
  InternalStorage.close();
  client.stop();

  if (length > 0) {
    Serial.print("Download in timeout a ");
    Serial.print(length);
    Serial.println(" bytes. Non è possibile continuare con l'aggiornamento..");
    return;
  }

  Serial.println("Sketch aggiornato,riavvio.");
  Serial.flush();
  InternalStorage.apply();
}

Ok, grazie. Assolutamente.

gpb01:
>FrankLevis: Attenzione ... REGOLAMENTO, punto 16.12, ... ho bloccato il tuo account duplicato FrankMan e ti prego per il futuro di evitare la creazione di altri account. Grazie.

Guglielmo