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