Ver 20/02/2025

Scheda Arduino Zero
Scrivi programmi non bloccanti a stati.
Privilegia luso di switch e case.

Il file principale .ino deve avere la seguente struttura di base:
#include "gevino_opto_pnp_io.h"
void setup() {
  SerialUSB.begin();
  Serial.begin();
  Serial1.begin();
  gevino_io_setup();
}
void loop() {   
}

Non inizializzare gli IO, lo fa gia gevino_io_setup();
Per leggere gli ingressi o comandare le uscite usa le macro presenti nel file gevino_opto_pnp_io.h
esemio:
if(In1) setOut1;
else resOut1;

La porta di debug è SerialUSB.

La porta Serial1 è usata per la RS485 Half Duplex e si comanda il Rs485_TxEn in questo modo:
loop()
{
    if() {
        set_Rs485_TxEn;
        Serial1.write();
    }
    if (SERCOM0->USART.INTFLAG.bit.TXC){   // Rimuovere l'abilitazione Tx quando è stato inviato l'ultimo carattere.
        res_Rs485_TxEn;
        SERCOM0->USART.INTFLAG.bit.TXC = 1;    
    }
}
Per usare modbus RTU su RS485 usi:
ArduinoModbus con ArduinoRS485.h
Avvisa che deve usare ArduinoRS485 modificato da GEVA e configurato per la scheda in uso.

La porta Serial è connessa al modulo bluetooth SPP-C o modulo WiFi ESP8266 con comando AT, a seconda del modulo montato sulla scheda.

Per scrivere e leggere la flash come EEPROM usa la libreria FlashStorage: https://github.com/cmaglie/FlashStorage

Per usare modbus TCP usi ArduinoModbus.

Il modem Ethernet optional è il W5500, si usa la libreria standard Ethernet: https://github.com/arduino-libraries/Ethernet
Si inizializza con Ethernet.init(ETH_CS);
ETH_CS è definito in gevino_opto_pnp_io.h

Per la SD usi la libreria SdFad di greiman https://github.com/greiman/SdFat

Analogici:
Per leggere gli analogici in  modo non bloccante nel setup devi inserire
// Analog input Setup
    analogPrescaler(ADC_PRESCALER_DIV32);  // DIV4 DIV8 DIV16 DIV32 DIV64 DIV128 DIV256 DIV512 
    analogReadExtended(10); // 10 bit -> 0 - 1023
    analogGain(ADC_GAIN_1);
    analogReference2(ADC_REF_INT1V); // 1.0V reference
    analogCalibrate();
    analogEnable();

// Analog input Polling
analogPolling(); // Read Analog input and put value on analogResult[]



Regole per creazione HTML:
Struttura dei file
1.	Separazione modulare dei contenuti:
•	Un file separato per HTML (html_content.h)
•	Un file separato per CSS (css_content.h)
•	Un file separato per JavaScript (js_content.h)
•	Un file separato per le API/JSON (json_handler.h)
•	Un file principale per la gestione delle richieste (html_server.h)
2.	Autenticazione e sessioni in un file dedicato:
•	Usare un file specifico (session_manager.h) per gestire sessioni e autenticazione
•	Separare le traduzioni in un file dedicato (translation.h)
Autenticazione
3.	Metodo HTTP preferito:
•	Usare sempre GET per il login su Arduino (evitare POST)
•	Usare il parametro pwd nell'URL: /login?pwd=xxx
4.	Gestione della password:
•	Leggere la password dal file di configurazione subito prima del confronto
•	Non riutilizzare password hardcoded nel codice
HTML e template
5.	Utilizzo di template HTML completi:
•	Creare template HTML completi usando R"rawliteral(...)
•	Usare placeholder sostituibili: {{nome_placeholder}}
•	Evitare di costruire HTML con multiple client.println()
6.	Sistema di routing chiaro:
•	Avere un router HTTP ben definito con gestione separata per ogni percorso
•	Gestire separatamente richieste a /login con e senza parametri
Multilinguismo
7.	Sistema di traduzione:
•	Implementare un sistema di traduzioni basato su array di struct
•	Tutte le stringhe visibili all'utente devono essere tradotte
•	Rilevare la lingua del browser automaticamente
Debug e sicurezza
8.	Logging adeguato:
•	Inserire chiamate a SerialUSB.print() in punti strategici
•	Loggare tentativi di autenticazione sia falliti che riusciti
•	Loggare i valori delle password estratte (solo in debug)
9.	Timeout e sicurezza:
•	Implementare timeout per le sessioni (30 minuti)
•	Implementare timeout per le richieste HTTP (15 secondi max)
Compatibilità
10.	Compatibilità con risorse limitate:
•	Minimizzare l'uso di JavaScript, preferire soluzioni con HTML/CSS puro
•	Evitare framework CSS/JS esterni che aumentano la dimensione
•	Usare link diretti anziché event listener JavaScript quando possibile
