Webbino - Server web "dinamico" per Arduino

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

.... ah, altra cosa ... ora che si fa tutto da "Library Manager" (ottima idea :)) devo dire che è veramente scomodo (... specie pensando a principianti), dover andare a modificare il file "webbino_config.h" nella cartella delle librerie. Non solo, se ho un programma per una certa scheda di rete ed uno per un altra, ogni volta devo compilare l'uno, modificare la libreria, compilare l'altro, e così via :confused:

Mi sembra molto più corretto che questo file venga si dato all'utente, magari in una cartella separata dalla "src" così di sicuro, se non lo prende, NON lo trovi e vai in errore, che se lo copia nella cartella del suo programma in modo che sia "locale" per ciascun programma e che la configurazione di un'applicazione con una scheda di rete NON coinvolga quella di un'altra con un'altra scheda di rete :wink:

Che ne pensi ?

Guglielmo

Io faccio sempre così se vado a modificare una qualsiasi libreria, la metto nella cartella dello sketch.
Certo, con alcune librerie, tipo la ethernet, è un po' scocciante, ti trascini dietro parecchi files.

zoomx:
Io faccio sempre così se vado a modificare una qualsiasi libreria, la metto nella cartella dello sketch.
Certo, con alcune librerie, tipo la ethernet, è un po' scocciante, ti trascini dietro parecchi files.

Ma qui NON serve tutta la libreria ...
... basta il file di configurazione personalizzato per ogni singolo programma che faccio :wink:

Guglielmo

zoomx:
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.

Si ma quello con il reed paghi la marca e la struttura dell anemometro che è fatta meglio :wink: Se il mio costa 40 euro e quello 160 (anche se è fatto così semplice) non ci si può fare niente. In ogni caso la lettura di un reed è sempre più semplice. Mi fermo qua perché non voglio andare OT :wink:

gpb01:
... 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:

Erm, veramente sì, ho provato, è l'unica cosa che potevo fare, non avendo la scheda. Credo di averlo anche scritto nel post in cui presentavo la novità. In effetti il supporto PROGMEM non dovrebbe essere attivo con la MKR, essendo così condizionato:

#if defined (ARDUINO_ARCH_AVR) || defined (ESP8266)
	#define ENABLE_FLASH_STRINGS
#endif

Potresti provare ad ABILITARLO, rimuovendo l'#ifdef? Se ci sono dei buoni header di compatibilità potrebbe sistemarsi da solo.

Comunque questo mi fa venire in mente che dopo il supporto MKR1000 ho aggiunto quello ESP, magari ho distrutto qualcosa con questo lavoro.

Per quanto riguarda l'altra idea, sì, in effetti può avere senso, ma sei sicuro che funzioni? Se la libreria viene compilata a parte non credo che si vada a prendere il config dallo sketch.

SukkoPera:
Potresti provare ad ABILITARLO, rimuovendo l'#ifdef? Se ci sono dei buoni header di compatibilità potrebbe sistemarsi da solo.

Provo e ti faccio sapere ...

SukkoPera:
Per quanto riguarda l'altra idea, sì, in effetti può avere senso, ma sei sicuro che funzioni? Se la libreria viene compilata a parte non credo che si vada a prendere il config dallo sketch.

... occhio, è OVVIO che l'utente debba fare in testa al programma: #include "webbino_config.h" (nota i " " al posto del < >, quindi files locali) che deve trovarsi nella cartella del suo programma e dovrebbe creare le varie #define PRIMA dell'inclusione della libreria.
Così credo dovrebbe funzionare (da verificare) ::slight_smile:

Guglielmo

Nulla Sukko, come la metti la metti, io ottengo sempre :

n file included from /Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/HTTPRequestParser.h:24:0,
                 from /Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/WebClient.h:24,
                 from /Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/NetworkInterface.h:25,
                 from /Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/WebServer.h:24,
                 from /Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/Webbino.h:21,
                 from /var/folders/td/xjbgg2n97rl9wsy40_rsj90h0000gn/T/arduino_modified_sketch_554611/LedControl.ino:20:
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/webbino_debug.h:48:2: warning: #warning Flash strings disabled [-Wcpp]
 #warning Flash strings disabled
  ^
In file included from /Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/packages/arduino/hardware/samd/1.6.8/cores/arduino/Arduino.h:36:0,
                 from /var/folders/td/xjbgg2n97rl9wsy40_rsj90h0000gn/T/arduino_build_509135/sketch/LedControl.ino.cpp:1:
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/WebServer.h: In member function 'const char* Page::getName() const':
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/packages/arduino/hardware/samd/1.6.8/cores/arduino/avr/pgmspace.h:106:49: error: 'const void*' is not a pointer-to-object type
 #define pgm_read_ptr(addr) (*(const void *)(addr))
                                                 ^
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/WebServer.h:51:35: note: in expansion of macro 'pgm_read_ptr'
   return reinterpret_cast<PGM_P> (pgm_read_ptr (&(this -> name)));
                                   ^
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/WebServer.h: In member function 'void (* Page::getFunction() const)(HTTPRequestParser&)':
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/packages/arduino/hardware/samd/1.6.8/cores/arduino/avr/pgmspace.h:106:49: error: 'const void*' is not a pointer-to-object type
 #define pgm_read_ptr(addr) (*(const void *)(addr))
                                                 ^
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/WebServer.h:55:42: note: in expansion of macro 'pgm_read_ptr'
   return reinterpret_cast<PageFunction> (pgm_read_ptr (&(this -> function)));
                                          ^
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/WebServer.h: In member function 'const char* Page::getContent() const':
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/packages/arduino/hardware/samd/1.6.8/cores/arduino/avr/pgmspace.h:106:49: error: 'const void*' is not a pointer-to-object type
 #define pgm_read_ptr(addr) (*(const void *)(addr))
                                                 ^
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/WebServer.h:59:35: note: in expansion of macro 'pgm_read_ptr'
   return reinterpret_cast<PGM_P> (pgm_read_ptr (&(this -> content)));
                                   ^
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/WebServer.h: In member function 'const char* ReplacementTag::getName() const':
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/packages/arduino/hardware/samd/1.6.8/cores/arduino/avr/pgmspace.h:106:49: error: 'const void*' is not a pointer-to-object type
 #define pgm_read_ptr(addr) (*(const void *)(addr))
                                                 ^
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/WebServer.h:117:35: note: in expansion of macro 'pgm_read_ptr'
   return reinterpret_cast<PGM_P> (pgm_read_ptr (&(this -> name)));
                                   ^
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/WebServer.h: In member function 'PString& (* ReplacementTag::getFunction() const)(void*)':
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/packages/arduino/hardware/samd/1.6.8/cores/arduino/avr/pgmspace.h:106:49: error: 'const void*' is not a pointer-to-object type
 #define pgm_read_ptr(addr) (*(const void *)(addr))
                                                 ^
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/WebServer.h:121:43: note: in expansion of macro 'pgm_read_ptr'
   return reinterpret_cast<TagEvaluateFn> (pgm_read_ptr (&(this -> function)));
                                           ^
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/WebServer.h: In member function 'void* ReplacementTag::getData() const':
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/packages/arduino/hardware/samd/1.6.8/cores/arduino/avr/pgmspace.h:106:49: error: 'const void*' is not a pointer-to-object type
 #define pgm_read_ptr(addr) (*(const void *)(addr))
                                                 ^
/Applications/Arduino/Arduino 1.6.12 Portable.app/Contents/Java/portable/sketchbook/libraries/Webbino/src/WebbinoCore/WebServer.h:125:56: note: in expansion of macro 'pgm_read_ptr'
   return reinterpret_cast<void *> (const_cast<void *> (pgm_read_ptr (&(this -> data))));

Guglielmo

Buongiorno Sukkopera, nello specifico sono:

1 NTC 10k 1% (temperatura)
2 ACS712 20A (corrente)
1 H120 (voltaggio)

Cosa devo fare? Aspetto l introduzione del buffer da parte tua?

@gpb01: se però dice Flash strings disabled non le hai mica abilitate :). Se lasci il #define togliendo l'#if dovrebbe abilitarle. Appena riesco ci guardo comunque.

@tototer: ok, mi sa che devi aspettare ;).

SukkoPera:
@gpb01: se però dice Flash strings disabled non le hai mica abilitate :). Se lasci il #define togliendo l'#if dovrebbe abilitarle. Appena riesco ci guardo comunque.

Come detto ... ho fatto ENTRAMBE le prove.
Quella è la prova disabilitate ... se le abilito ... mi sembra che la lista sia ancora più lunga :smiley: :smiley: :smiley:

Guglielmo