Webbino - Server web "dinamico" per Arduino

Accidenti, primo test primo bug! Correggo ASAP. Se vuoi avere il privilegio di aprire il primo issue o fare la prima pull request... :wink:

Non cambia niente, se non che se la porta è 80 puoi evitare di specificarla nell'URL. Avevo messo 8000 perché sulla DigiX la porta 80 è occupata dall'interfaccia di configurazione e non può essere usata. Cosa geniale :confused:. Però non volevo renderlo il default, era solo un cambiamento temporaneo!

Il risparmio di flash è dovuto alla nuova Link-Time Optimization aggiunta alla toolchain nelle ultime versioni. È davvero notevole, se conti che non ho cambiato niente!

Può capitare :slight_smile: Comunque penso di lasciare porta 8000 perché accedo veramente poche volte in locale (al massimo se devo farlo basta mettere :8000, non è che è complicato :smiley: ), sempre in remoto e quindi la porta interna è impostata per l'ip 192.168.1.51 dal modem nel port mapping e quindi non devo inserirla io ogni volta che accedo. :wink:
Comunque sempre buono il risparmio di flash, meglio così!
Riguardo all'issue o pullrequest... anche io sono un niubbo totale di GitHub :smiley: Ma per un issue non ci vuole niente. :wink: Te lo apro volendo, ma se hai già risolto non c'è motivo.

Che poi nella config avevi scritto così, si vede benissimo che ti sei dimenticato poi di ricambiarla

  • NOTE: Port 80 can not be used with DigiFi
  • NOTE: Currently changing this will have no effect with most cards, FIXME
    */
    #define SERVER_PORT 8000

P.S. Comunque già che c'ero l'ho aperto un piccolo issue :wink:

P.P.S. Nei link dei progetti che usano webbino, nel mio ho aggiornato il codice in allegato con anche un riferimento a questo topic per webbino :wink:

Buongiorno a tutti,
Era tanto che volevo scrivere questo messaggio ma per problemi di tempo, non sono riuscito a scrivere. Dopo avere configurato tutto il webserver webbino e lavorato abbastanza bene sempre in locale. Era arrivato il momento di aprire le porte del router e vedere i dati da remoto.

Qui cominciano i problemi:

inizialmente ero convinto che i problemi derivassero dalla mia linea ADSL. Premetto che tutto il mio sistema arduino è alimentato da fotovoltaico offgrid e si collega al router principale tramite wifi (un access point da esterno prima con un antenna da 5dbi e da ieri con in antenna da 16dbi da quale esce un cavetto ethernet che collego ad arduino) visto che mi viene impossibile passare un cavo Ethernet da casa fino a dopo ho installato arduino.

Bene, pensavo fosse un problema di comunicazione ma non lo è. In quanto verificando il Ping tra il router principale ed arduino è di circa 54ms. Mentre per aprire il web server da remoto ci sta davvero tanto. Si parla di circa 8 secondi per caricare tutta la pagina (sono pochi kb) ed avvolte nemmeno riesce a caricarsi del tutto perché la pagina va in timeout e si chiude.

A questo punto ho dato un occhiata al web server del amico as_needed ed ho notato che anche la sua pagina è davvero lenta a caricare (credo tu l abbia direttamente collegata al router con un cavo Ethernet, guardando le foto foto del progetto o no?)

A questo punto chiedo cosa può essere perché è ingestibile una caricamento pagina così.

Hai provato con un altro sketch tipo webserver presente nell'ide, praticamente pagina non ce ne, però c'è tutta una serie di negoziazioni e messaggi tra server e client che non vedi, ma fa perdere tempo.
In teoria ci dovrebbe stare 4 secondi a te, comunque troppo. Se è così è un problema di rete tuo, verifica, dovrebbe essere praticamente immediato.

Grazie Pablos, mi hai dato un ottimo consiglio. Proverò quanto prima. Sai cosa mi ha fatto pensare che probabilmente non è dovuto al collegamento Wi-Fi il problema? Che quando sono con un pc connesso all access point riesco a navigare molto
Bene, naviga perfettamente come se fossi collegato direttamente al router principale
Che si trova a casa. Un altro indirizzo è stato pure che se con il computer di casa (piano terra) digito indirizzo arduino (terrazza) questo si carica lentamente, non come se fosse da remoto ma quasi. Mentre se digito l indirizzo del acces point (che si trova sempre in terrazza) riesco ad entrare nella configurazione perfettamente. Ciò mi fa pensare che il dati non si perdono nel collegamento wireless perché non riuscirei neppure a collegarmi al acces point. Quindi dovrebbe essere Bell ultimo tratto il problema (access point - arduino) molto probabilmente sul web server Arduino probabilmente perch se provate ad andare sul web server di as_need vedrete che il caricamento per pochi kb di pagina è davvero lento

Io l'ho collegata con un power line al modem tramite cavi ethernet. La mia è lenta per un "problema" che dovrei risolvere con un standalone che per adesso non posso integrare. Praticamente ho un ciclo for che fa perdere del tempo per gestire delle interferenze derivate dall'anemometro senza far sballare i suoi dati. In ogni caso è tipo una decina di kb la mia pagina, poi ci devi contare che le risorse HW di Arduino sono veramente basse... Comunque non conosco il tuo caso, non posso sapere se sono tanti 8 secondi oppure no. Nel mio caso, non sono molti per via di quel problema che ho citato, ma comunque mi bastano, perché non ho bisogno di tanta velocità, se l'avessi è meglio ovvio, però almeno per ora mi accontento.
C'è anche una cosa che mi aveva consigliato pablos per velocizzare il loop che consiste nel non usare la seriale (se hai finito di fare le tue prove) e commentare un if nel main.cpp

P.S. Se ad esempio provassi a inibire la lettura dell'anemometro (l'ho già fatto una volta per vedere) la pagina si caricherebbe in qualche secondo :wink: Almeno la mia sia chiaro

Ci sono due cose di cui tenere conto, per quanto riguarda la lentezza di caricamento:

La prima è interna a Webbino: la pagina viene inviata al "driver" della scheda di rete (la libreria che la gestisce, insomma) un byte alla volta. Ora, se il driver non fa buffering (e credo che nessuno lo faccia), ogni byte viene inviato al client in un pacchetto separato, cosa che causa un overhead enorme, visto che per trasmettere un byte ne viaggeranno almeno un centinaio sulla rete, tra header IP, TCP e ACK di risposta.

Questo è noto ma, per mia esperienza, sulle connessioni cablate non crea un grosso problema, le pagina si caricano comunque in maniera accettabile. Sulle connessioni wireless però è un problema più pesante, vista la maggiore latenza, lentezza e perdita di pacchetti. Per questo nei driver wifi Webbino implementa un buffer, in modo da mitigare il problema.

Ovviamente se il tuo Arduino è collegato via Ethernet ma poi in mezzo c'è un ponte radio, il buffering andrebbe fatto, ma Webbino non può essere a conoscenza di questo. Potrei forse spostare il buffering più ad alto livello e mettere una direttiva di configurazione per forzarne l'utilizzo, che ne pensate? Non dite "abilitalo sempre" perché la RAM è preziosa ;).

Altro problema è la sostituzione dei tag, che viene effettuata "in diretta" mentre la pagina viene inviata al client. Se la funzione che gestisce il tag impiega 5 secondi, ovviamente l'invio della pagina è sospeso per 5 secondi. Lì sta a voi scrivere uno sketch "furbo" che sostituisca i tag il più rapidamente possibile. Ad esempio, io non farei mai leggere i sensori in diretta, li leggerei per conto mio in background ogni tanto (1 minuto, 5 minuti) e salverei i risultati in una variabile, in modo da poter ritornare subito questa variabile al momento della sostituzione del tag.

sei stato chiarissimo sukkopera, cosa mi consigli di fare a questo punto? da dove mi conviene partire?

Chiara la spiegazione Sukko. Dipende sempre da quanta RAM uno già spreca :wink: Io per esempio ne utilizzo il 33% del Mega. Come ho detto va lento a caricarsi per quel ciclo for, mentre invece per quanto riguarda il caricamento completo della pagina penso sia dovuto al buffer :wink:

Beh, sulla Mega la RAM non manca ed effettivamente potrebbe avere senso avere il buffer, ma Webbino vuole anche poter girare su una Uno con un ENC28J60, dove la RAM è praticamente satura.

Credo che farò come ho detto sopra, così salviamo capra e cavoli.

Per l'anemometro, fai come ho detto: non leggerlo al momento della richiesta della pagina, ma fallo a intervalli regolari e restituisci l'ultimo dato letto.

Idem per @tototer: che sensori hai?

Il problema più grosso è proprio il fatto che è l'anemometro a causare questo problema, perché se leggo troppo poco spesso, anche ogni minuto, rischio di perdermi molte raffiche di vento e quindi molti dati non veritieri... per questo volevo implementare l'uso di uno standalone dedicato solo ai sensori (quindi non solo l'anemometro) e poi tutti i dati che arrivano magari a un Arduino, vengono gestiti senza dover far niente perché ci pensa lo standalone, avrebbe solo il compito di leggerli e quindi si alleggerirebbe di molto il lavoro... Purtroppo per adesso non posso implementarlo, ma quando ne farò un'altra di stazione meteo, cercherò di farla la più perfetta possibile.

Come funziona l'anemometro? Non puoi leggerlo via interrupt come descritto qui: Davis Anemometer Arduino Hookup | Code (Part 2 of 3)?

SukkoPera:
Come funziona l'anemometro? Non puoi leggerlo via interrupt come descritto qui: http://cactus.io/hookups/weather/anemometer/davis/hookup-arduino-to-davis-anemometer-wind-speed?

Magari avevo preso quello :slight_smile: Costa tipo 160 euro. Quello là è molto più semplice anche se più costoso è usa un semplice contatto reed per la velocità del vento e un potenziometro per la direzione. Il mio manda dei bit da decodificare e quindi c'è più da lavorare...

https://www.john.geek.nz/2011/07/la-crosse-tx20-anemometer-communication-protocol/

https://www.john.geek.nz/2011/07/disassembling-a-la-crosse-tx20-wind-anemometer/

Secondo me puoi fare due cose:

  1. Usare un ATtiny, o alla peggio una Uno (ne hai già una, giusto?) per fare un convertitore da questo coso a i2c/SPI/seriale (quel che ti torna più comodo). Continui a leggere l'anemometro, smazzi i dati come devi (che ne so, fare la media o altro) e quando ricevi richiesta fornisci i dati aggiornati.

  2. Fare più o meno come dici tu, ma prendendo invece un Raspberry Pi per gestire la parte web. Anche qua puoi usare i2c/SPI/seriale per leggere i dati dall'Arduino che gestisce i sensori.

Però qua siamo OT, se vuoi sviluppare questa idea apri un nuovo thread :).

Eh già, io ero proprio indeciso da queste due idee :slight_smile: ma ero più propenso per la seconda :smiley: per via che con rasp magari potrei mettere anche una bella webcam! Devo approfondire il mondo raspberry però.
Come dici qui non è il caso di continuare, semmai lo farò in un bel nuovo topic :wink:
La prima soluzione comunque è quella che potrei fare temporaneamente anche a breve, perché ho un Arduino uno e potrei gestire questo anemometro a parte..

Allora come sensori ho:

1 sensore temperatura
2 sensore correre (1 tarato per corrente AC ed uno per corrente DC)
1 sensore voltaggio

Così non posso dire granché... Bisogna capire quanto è lenta la loro lettura. Comunque nel tuo caso sicuramente incide molto il ponte radio. Inizia a riallinearti alla versione master di Webbino che puoi installare dal Library Manager, nel frattempo vedrò di fare quanto detto prima per il buffering. Dovrebbe aiutare.

SukkoPera:
, nel frattempo vedrò di fare quanto detto prima per il buffering. Dovrebbe aiutare.

:wink:

As_Needed:
Magari avevo preso quello :slight_smile: Costa tipo 160 euro. Quello là è molto più semplice anche se più costoso è usa un semplice contatto reed per la velocità del vento e un potenziometro per la direzione. Il mio manda dei bit da decodificare e quindi c'è più da lavorare...

Quelli più economici sono proprio quelli a reed. Quelli più costosi invece hanno una circuiteria interna con tanto di MCU per gestire il tutto.
Il tuo, di cui ti lamenti, sembra appartenere proprio a questa categoria.
In ogni caso se ti interessano le raffiche e quindi il monitoraggio continuo devi implementare un qualcosa che si occupi solo di quello. In effetti un'altra MCU sarebbe la soluzione più economica.
In alternativa, visto che usi un dispositivo wifi client, potrebbe essere quello ad ospitare il web server.

Buondì Sukko ...
... eccomi di nuovo qui a fare un po' di prove. Leggo :

Compatibile con molte interfacce di rete:
• ...
• WINC1500 (Wi-Fi): WiFi Shield 101, MKR1000

... ma tu hai provato a compilare, anche se non ce l'hai, per Arduino MKR1000 ? Perché a me, con l'IDE 1.6.12, tira furi veramente parecchi, ovvi, errori !!!

Credo tu abbia trascurato il fatto che stiamo parlando di una scheda NON basata su MCU AVR, ma su ARM ... per cui tutto l'uso di PROGMEM ... va a farsi friggere ... ::slight_smile:

Ho idea che ti conviene togliere la MKR1000 dalla descrizione, almeno finché non sistemi la cosa ... :wink:

Guglielmo