Arduino Forum

International => Italiano => Software => Topic started by: ZioWally on Sep 12, 2013, 08:19 pm

Title: Arduino comandato da Processing via web tramite pc o smartphone Android
Post by: ZioWally on Sep 12, 2013, 08:19 pm
Ciao a tutti!

Leggendo i consigli del forum ho creato un programma in processing che manda dei comandi ad arduino MEGA al quale è demandato il compito di accendere e spegnere dei relè, leggere delle temperature, lo stato delle batterie gruppo di continuità etc.
Si tratta di controllare da remoto una postazione radioamatoriale posta in montagna e facilmente raggiungibile solo tramite internet o via radio e dove sarà installato anche arduino.

In sostanza il programma in processing invia un comando ad arduino che esegue e restituisce una risposta.
E' basato sull'esempio UDPSendReceiveStrings che contiene sia la parte arduino che la parte processing e che ho visto citato più volte sul forum.

Tutto funziona alla grande, purtroppo però solo all'interno della mia rete di pc inserendo l'indirizzo IP numerico a cui è collegato arduino.

All'interno del programma processing, avrei bisogno di sostituire le 4 cifre dell' IP col nome del sito a cui mi collego (es. montagnaxxx.dyndns.org).
Non avendo IP statici, devo fare questo obbligatoriamente, visto che da queste parti gli indirizzi vengono cambiati spesso e volentieri...
Purtroppo non ho trovato esempi o altre discussioni in merito

Per il momento non allego gli sketch, visto che sono lunghi e la parte dove ho difficoltà è esattamente la stessa che trovate nell'esempio sopra citato.
Per semplicità potremmo usare l'esempio per provare ad usare un nome dns.

Mi rivolgo a questo forum in quanto nel forum di processing non si trova praticamente nulla per arduino, mentre qui ho trovato molte soluzioni per processing! :smiley-mr-green:

Se a qualcuno interessa comunque sono ben disposto a caricare gli sketch.

Invio solo una immagine dell'interfaccia grafica che ho creato. Ho voluto usare processing proprio per creare uno strumento facile in modo che lo possano usare anche i radioamatori senza esperienza di microcontrollori.

grazie a tutti
Title: Re: Arduino comandato da Processing via web
Post by: busco on Sep 12, 2013, 10:43 pm


Se a qualcuno interessa comunque sono ben disposto a caricare gli sketch.



Non posso darti una mano perchè non sono pratico di Processing, ma se carichi
gli sketch sarei intressato  a darle un' occhiata perchè avrei intezione di
farmi un'interfaccia per la comunicazione con il PC.


Title: Re: Arduino comandato da Processing via web
Post by: ricdata on Sep 13, 2013, 12:21 pm
Quote
All'interno del programma processing, avrei bisogno di sostituire le 4 cifre dell' IP col nome del sito a cui mi collego (es. montagnaxxx.dyndns.org).

invece di inserire il dns del sito puoi inserire direttamente il suo IP ricavandolo da qui
http://www.visualroute.it/strumenti/dnslookup.asp

inoltre non è sufficente inserire l'indirizzo del servizio ddns, altrimenti appena ti cambia l' IP dinamico ti trovi incapace di raggiungere l'arduino dall'esterno. devi implementare anche la procedura di aggiornamento IP su dyndns.

vedi se questi esempi ti aiutano
http://www.logicaprogrammabile.it/aggiornare-host-no-ip-tramite-arduino-ethernet/ (http://www.logicaprogrammabile.it/aggiornare-host-no-ip-tramite-arduino-ethernet/)
http://www.instructables.com/id/Arduino-DDNS-Dynamic-DNS-by-Open-Electronicsorg/step3/The-Arduino-sketch/ (http://www.instructables.com/id/Arduino-DDNS-Dynamic-DNS-by-Open-Electronicsorg/step3/The-Arduino-sketch/)
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Sep 13, 2013, 06:34 pm
Busco:
i miei sketch non sono ancora molto presentabili e francamente di mio c'è ben poco.
Però ti posso consigliare di avvicinarti a Processing come ho fatto io: se cerchi il "Tutorial Processig" di elettronicain, puoi scaricare le lezioni che per me sono state molto utili e mi hanno permesso di cominciare subito a lavorarci.
Lì ho imparato a clikkare in un punto dello schermo per poter eseguire una funzione, nel mio caso spedisco una stringa ad arduino via UDP utilizzando il medesimo sistema dell'esempio UDPSendReceiveStrings.
La risposta di Arduino mi restituisce le info per aggiornare l'interfaccia grafica cambiando l'immagine del pulsante che da spento diventa acceso o contrario.
Il resto sono solo effetti speciali, vale a dire immagini di pulsanti o vu-meter che si modificano, ma anche questo lo trovi sul tutorial di elettronicain.
Non mi considero bravo col processing, ma se hai bisogno di aiuto contattami pure, spero di esserti utile! :smiley-mr-green:

Ricdata:
Ti ringrazio della risposta, vado subito a leggere e provare.
Il responsabile del sito delle radio mi spiegava che usano dyndns.org proprio per avere una sorta di Ip statico.
Il programma che sto creando poi lo passerò a più persone socie del radio club, quindi se potessi risolvere il problema adattando il solo skecth in processing senza personalizzazioni dei vari pc sarebbe il massimo!
La mia intenzione sarebbe di compilarlo in modo che chiunque con un semplice doppio click lo possa usare senza necessariamente avere installato l'ide di processing.
Se hai altri suggerimenti o consigli sono e saranno sempre ben accetti!!
Title: Re: Arduino comandato da Processing via web
Post by: ricdata on Sep 13, 2013, 07:51 pm
Quote
Il programma che sto creando poi lo passerò a più persone socie del radio club, quindi se potessi risolvere il problema adattando il solo skecth in processing senza personalizzazioni dei vari pc sarebbe il massimo!

il processing lo puoi compilare con l'IP di dyndns senza bisogno che gli altri utenti ci mettano le mani in alcun modo, poichè il server (arduino) a cui si collega è sempre lo stesso.

il problema che ti dicevo è legato al server arduino: siccome le connessioni adsl sono per la maggior parte a IP dinamico, ciò comporta che ad ogni restart del router, o comunque ogni tot tempo l'IP cambia.
dyndns non fa altro che memorizzare del tuo ip collegandolo ad un dns, ma non può sapere se e quando l'ip cambia. per cui c'è bisogno di un programma locale che rileva il cambio di IP e lo invia a dyndns in modo che possa aggiornarlo.

non è detto che debba farlo per forza l'arduino, ci sono alcuni router ad esempio che implementano questa funzione, per cui ti basterà impostarlo nel modo appropriato (ddns + port forwarding). oppure puoi delegare l'operazione ad un pc (collegato alla stessa lan dell'arduino) dove caricherai il programma per aggiornare l'ip
Title: Re: Arduino comandato da Processing via web
Post by: testato on Sep 13, 2013, 08:21 pm
intervento su vari punti:  :)

1) se ho capito il sw creato con processing, compilato in .exe, lo darai a diverse persone, il problema che mi e' venuto in mente e' questo: hai fatto in modo di leggere lo stato di tutte le uscite all'avvio del programma ? ed anche ad ogni tot di tempo in automatico ? perche' se tizio si e' collegato ed ha attivato il pin 1, l'interfaccia che usa caio verra' aggiornata ?

2) hai pensato al discorso che solo 4 persone possono collegarsi contemporaneamente ?

3) sul raggiungimento dell'arduino invece non ci dovrebbe essere nessun problema, devi lavorare sul router. Il DDNS lo gestisci direttamente dal router, nel codice processing dovresti poter scrivere direttamente il nome del sito

4) hai usato una libreria processing per la grafica ? e' molto bella
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Sep 13, 2013, 09:00 pm
Testato:
A queste domande ho cercato anch'io una risposta con il club. Mi hanno confermato che hanno bisogno di una "centralina" da cui accendere o spegnere radio, o altri servizi. Normalmente questo viene fatto direttamente in loco andandoci con un'auto 4X4.
Essendo quindi uno strumento per la piccola manutenzione e il monitoraggio (anche solo capire se le batterie tampone sono a posto oppure se la 220v manca), l'uso sarà occasionale ed esclusivo di chi ne ha le competenze, non dei singoli fruitori dei ponti radio. Non credo ci sia il rischio di un "conflitto ON-OFF :D".
Nel dettaglio ho previsto che processing ogni tot tempo invii un codice di richiesta a cui risponde arduino riportando lo status di tutti i pin utilizzati.
All'accensione parte subito questo codice e arduino aggiorna l'interfaccia sul pc.
L'interfaccia l'ho creata semplicemente inserendo delle immagini jpg per lo sfondo e png per i vari strumenti e bottoni. Il formato pgn può gestire la trasparenza e cosi è comodo creare una barra rossa che sale nel termometro che ha la parte del mercurio trasparente.
Comunque andrò a vedere di che libreria si tratta.

Grande Ricdata:
con i tuoi consigli ed i link mi sono creato anch'io uno spazio su no-ip.com. E' stato facile e posso fare le prove senza disturbare nessuno.

nel programma processing ho poi solo sostituito String ip = "192.168.0.177 " con String ip = "xxxx_xxxx.no-ip.biz",
nel router ho abilitato le 2 porte UDP/TCP necessarie per la comunicazione  tra arduino e processing,

risultato:
arduino riceve i dati da processing e si attiva :smiley-mr-green:, spedisce la risposta che però processing non riesce a ricevere :smiley-red:.
ho dimenticato qualcosa?

Stando all'esempio di UPD, arduino risponde al ip e alla porta da cui riceve ossia Udp.remoteIP(), Udp.remotePort()
e in questo modo, (Testato)  si dovrebbere gestire anche 2 utenti collegati nello stesso momento, è da verificare ma non sarà un problema

grazie ancora ad entrambi
Title: Re: Arduino comandato da Processing via web
Post by: testato on Sep 13, 2013, 09:28 pm


nel router ho abilitato le 2 porte UDP/TCP necessarie per la comunicazione  tra arduino e processing,

risultato:
arduino riceve i dati da processing e si attiva :smiley-mr-green:, spedisce la risposta che però processing non riesce a ricevere :smiley-red:.
ho dimenticato qualcosa?

tu hai messo mano solo allo sketch processing ? anche nello sketch arduino credo ci siano i riferimenti a cui deve rispondere o no ?
Nel codice arduino forse c'e' un riferimento all'IP del pc in locale che usavi, e che invece ora non c'e' piu' perche' arduino dovra' raggiungere a sua volta processing a casa dell'utente.
Se non e' questo allora sara' qualche blocco interno al router, forse devi fare qualche ulteriore port forward
Title: Re: Arduino comandato da Processing via web
Post by: ricdata on Sep 14, 2013, 09:58 am
Quote
nel programma processing ho poi solo sostituito String ip = "192.168.0.177 " con String ip = "xxxx_xxxx.no-ip.biz",

Non potendo vedere gli sketch bisogna andare per tentativi: hai notato che in quel esempio processing riceve la risposta nel monitor seriale e non nell'interfaccia (se non l'hai modificato)?
Title: Re: Arduino comandato da Processing via web
Post by: testato on Sep 14, 2013, 11:15 am
Ma lui dice che in locale funziona tutto, solo accedendo da internet non funziona.
Title: Re: Arduino comandato da Processing via web
Post by: ricdata on Sep 14, 2013, 11:52 am
hai ragione Testato.
allora forse è qui:
Quote
nel router ho abilitato le 2 porte UDP/TCP necessarie per la comunicazione  tra arduino e processing

come hai impostato di preciso il port forward? TCP non credo ti serva (TCP e UDP sono due protocolli diversi), devi instradare la porta 8888 UDP in ingresso/uscita verso l'IP locale di arduino.
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Sep 14, 2013, 02:35 pm
ciao ragazzi,
scusate ma non potevo rispondervi prima.
Vi confermo che il programma funziona perfettamente quando è all'interno della mia rete.
Inserendo in processing l'indirizzo URL al posto del IP numerico, arduino recepisce tutto bene, è poi la risposta di feeback che non arriva.

Per cercare di isolare il problema sono ripartito dall'esempio UDPSendReceiveStrings a cui ho fatto le modifiche per avere accesso da remoto cambiando solo le porte in uso e inserendo l'URL al posto dell'IP.
Nella sua semplicità tutto funziona ed è molto veloce. Il monitor seriale di arduino mi dice che riceve il pacchetto dall' IP corretto ma da una porta 55002 o 55008, mentre io avevo solo settato le porte 6100 e 6200 (scelte a caso). Comunque funziona!
Adesso però devo capire perchè nel mio programmino processing non fa lo stesso.

un piccolo successo c'è stato:
la tramissione di pacchetti UDP via processing accetta anche indirizzi mnemonici e non solo ip numerici

e questo non lo avevo trovato scritto da nessuna parte.
Grazie a tutti e 2!

Ora è solo un problema di programmazione che spero di risolvere presto, naturalmente vi terrò al corrente e se volete vi farò avere la versione definitiva.
Come sempre altri suggerimenti sono molto ben graditi... fin qui è stato un vero piacere..
Title: Re: Arduino comandato da Processing via web
Post by: Bertu65 on Sep 16, 2013, 02:04 pm
Nell'ottica dell'open source, sarebbe carino se tu potessi linkare gli sketch Arduino e processing sia per dare modo ad altri utenti di imparare sia per dare ai piú esperti la possibilitá di contribuire attivamente al progetto.
Io sono anche radioamatore e se potessi esserti utile lo farei volentieri.

Alberto
Title: Re: Arduino comandato da Processing via web
Post by: Bertu65 on Sep 16, 2013, 02:15 pm
Una cosa interessante da aggiungere, considerando che si tratta di monitorare e controllare una stazione remota, é la monitorizzazione delle temperature degli apparati.

Potresti mettere dei sensori ad uscita analogica o onewire posizionati in prossimitá dei finali delle radio e visualizzare le temperature operative al fianco dello stato della radio; questo é utile per assicurare una corretta operativitá della stazione.
Puoi anche memorizzare i valori massimi raggiunti, cosa utile nel caso si utilizzino amplificatori.

Questi dati potrebbero essere visualizzati sia in locale (quando la stazione é utilizzata) che in remoto.

Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Sep 16, 2013, 06:48 pm
Ciao Alberto,

quello che dici è giusto e la mia intenzione è quella di mettere a disposizione ciò che nel mio piccolo riesco a fare.
Mi piaceva però riuscire a postare qualcosa che funzionasse e non limitarmi a dire "questo è lo sketch, aiutatemi vi prego...".
Devo molto a questo forum, mi ha risolto piccoli problemi che però a me sembravano enormi ed ho tuttora grande riconoscenza verso tutti.
Purtroppo però ho poco tempo per dedicarmi a questa mia passione e quindi sto ancora cercando di capire dove ho sbagliato.
Sarò felice di condividere un eventuale successo o per l'ennesima volta chiederò consiglio a chi mi ha già offerto tanta disponibilità.

Tornando al progetto, nel primo post avevo già anticipato che volevo leggere delle temperature, per il momento pensavo a degli LM35 ma anche onewire non sarebbe una brutta idea.
Ti anticipo che mi sono imbattuto in una rivista con un progettino per un dispositivo conta-fulmini, molto utile se sei in alto e pieno d'antenne, ci penseremo in un secondo tempo, dopo aver risolto il problema presente.
Non appena avrò delle nuove, vi farò sapere

Walter
Title: Re: Arduino comandato da Processing via web
Post by: Bertu65 on Sep 16, 2013, 07:39 pm
Analogici o one wire vanno bene ugualmente; ci sono pro e contro per entrambe le soluzioni.

Quello che trovo interessante nel tuo progetto, a parte lo sketch di Arduino che potrei a grandi linee immaginare, é la parte relativa a Processing e la bella interfaccia grafica che hai realizzato. Non molti masticano Processing e credo sia quella la parte che dovresti maggiormente condividere.

Bella anche l'idea del contafulmini ma credo che tu la possa anche implementare attraverso alcuni siti meteo che hanno le mappe dei fulmini in tempo quesi reale.



Title: Re: Arduino comandato da Processing via web
Post by: testato on Sep 16, 2013, 08:18 pm
voglio pure io il contafulmini  :)
mi dici rivista e numero ?
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Sep 16, 2013, 09:49 pm
Sapevo che il contafulmini avrebbe risvegliato la curiosità! :D
Purtroppo la rivista non è mia ma di un socio del club che me l'ha fatta vedere, io ho solo letto velocemente e sembra interessante:
consta in un'antenna autocostruita con un barattolo tipo pelati e una basetta con un pò di componenti. Ad ogni scarica in aria, la basetta genera un impulso.
Se poi ci metto un microfono che rileva il tuono, posso determinare a che distanza si trova il maltempo e nel caso, stacco tutte le attrezzature dal 220v e passo alle batterie tampone, ma anche questa è un'altra storia che voglio portare avanti in futuro...
purtroppo non ricordo che rivista fosse, ma dovrei riuscire a scoprirlo senza grossi problemi, appena so... condivido... e se qualcuno ci vuole già pensare a come interfacciare arduino... ben venga!
inoltre:
Ho risolto il problema della mancata risposta di arduino (con Ip numerico rispondeva, con URL no):
nell'esempio UDPSendReceive trovi scritto in setup():
Ethernet.begin(mac,ip);
mentre io nel mio programma tra le tante modifiche era rimasto:
Ethernet.begin(mac, ip, gateway, subnet);
se lasciate quest'ultima riga (anche se gateway e subnet sono corretti) il programma funziona solo con ip numerico, invece con la prima riga funziona con qualunque indirizzo. Mi sembra di ricordare di aver letto da qualche parte che per il protocollo UDP, gateway e subnet non sono usati.
Il problema quindi era su arduino e non su processing.
Adesso devo solo trovare il tempo di rendere presentabili gli sketch di arduino e processing e pubblicarli, dovete però aver pazienza.
Alberto: ti ringrazio, non mi considero bravo con processing, ho avuto la fortuna di trovare degli esempi che ho potuto adattare facilmente alle mie necessità, anche a te consiglio quello che ho scritto nei primi post, esiste un piccolo corso di processing che aiuta tanto.
...e se posso...aiuto anch'io... :smiley-mr-green:

Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Sep 26, 2013, 06:38 pm
ciao ragazzi, non dimentico le promesse fatte....

intanto mantengo la prima:
il progetto del contafulmini lo trovate su RadioKitElettronica del maggio 2013, scusate se vi ho fatto aspettare tanto per così poco, ma il proprietario della rivista non me la trovava più.
Se me la cercavo in internet facevo prima!
Non credo di poter postare altro in merito, visto che ci saranno dei diritti del editore e del proprietario da rispettare.

per la seconda promessa abbiate ancora un po' di pazienza.. :smiley-red:..non ho più avuto il tempo materiale di verificare gli sketch e di renderli almeno presentabili.
Ho davanti una decina di giorni "de fuego" e poi credo di chiudere definitivamente con la pubblicazione dei file .pde e .ino sul forum :smiley-mr-green:

a presto
Title: Re: Arduino comandato da Processing via web
Post by: Bertu65 on Sep 27, 2013, 01:30 pm
Grazie delle info ZioWally

Per colpa tua  :)  sto mettendo troppa carne al fuoco ma il tempo a disposizione é limitato e quindi dedicarmi anche alla conoscenza di processing la vedo dura anche se mi incuriosisce molto.

Spero di vedere presto i tuoi sketch cosí da capirci un po' di piú.


P.S. la forma é l'ultima cosa, quello che conta é la sostanza


Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Nov 26, 2013, 06:43 pm
:smiley-mr-green:FINALMENTE POSSO CONDIVIDERE! :smiley-mr-green:

Lo so, lo so, avevo promesso che avrei pubblicato l'interno progetto e non mi sono più fatto vivo... :smiley-red:

Non è stata pigrizia, non sono più riuscito ad avere tempo per queste cose e mi secca molto.
Alla fine ho deciso di pubblicare quello che già avevo, mi perdonerete se il programma non è ben scritto e certe funzioni sono più complesse del necessario. Avevo voglia di sperimentare più cose, specialmente in processing, dove purtroppo non ho trovato un granchè. Per cui sicuramente saranno in molti a dire "..ma perchè ha fatto così... in quest'altro modo era più semplice...".

Comunque funziona, nello zip ci sono anche le immagini usate per l'interfaccia e un piccolo file dove cerco di spiegare come funziona e con che logica, e poi ha un interfaccia decisamente più accattivante del banale server di arduino.
Se non è chiaro sapete dove trovarmi.

Vi chiedo solo un favore, migliorate quanto più possibile oppure consigliatemi con degli esempi che possa inserire.
Da autodidatta ho ancora molto da imparare, e questo forum mi ha aiutato molto.. scrivo poche volte, ma vi leggo spesso.

ps: manca la parte del contafulmini, è uno dei prossimi impegni,

grazie ragazzi :smiley-mr-green:
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Nov 27, 2013, 06:13 pm
complimenti.
anche io uso processing per i miei lavoretti, purtroppo non ho ancora aperto lo scatolino con  lo shield wifi e quello con arduino ethernet ..
e come te non ho vanificato Processing con semplici numeri per i valori, ma ho costruito interfacce carine stile tachimetro, e implementato un sistema sinottico con android bluetooth.

il mio camperino con tre gruppi di luci su sei accese, le luci le accendo da touch screen  ma  a video vengono accese con impulso di ritorno
assieme al digitalWrite

(http://i41.tinypic.com/n69p47.jpg)
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Nov 27, 2013, 07:04 pm
complimenti a te! :smiley-mr-green:
io all'interfaccia su smartphone non ci ero ancora arrivato...mi sarebbe piaciuto, ma non ne sono ancora in grado.
Hai qualche link da consigliarmi per andare a documentarmi?
Ecco.... già ho poco tempo...ma queste cose mi attizzano un casino!
il mio sogno segreto sarebbe poter pilotare l'arduino attraverso l'interfaccia processing su android ma sfruttando la rete internet, ....fantascienza?
Ho visto anche il tuo filmatino, bello-bello.

Comunque se posso aiutarti in qualcosa...non so se sono in grado...ma ci proverei...
Title: Re: Arduino comandato da Processing via web
Post by: testato on Nov 27, 2013, 07:09 pm
processing, fino alla versione 1.5 supporta android.
Scrivi un rpogramma e lo carichi direttamente su android
Poi dalla versione 2.0 in poi hanno tolto questa possibilita', almeno momentaneamente, ma la 1.5 e' sempre disponibile al download
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Nov 27, 2013, 07:17 pm
io sono novellino... con la 1.5 non ero ancora nato!
adesso vado subito a scaricarla, avevo fatto alcune ricerche per android, ma una risposta così chiara e semplice mica l'avevo trovata.
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Nov 27, 2013, 08:02 pm
@ testato
superiori a  processing 1.5 non funziona piu "firmata" (sketch di arduino su processing).
io uso processing 2.0.3
android 4.1
e funziona
ovvio che mi tengo stretto questo processing evitando aggiornamenti ]:D
Title: Re: Arduino comandato da Processing via web
Post by: testato on Nov 27, 2013, 09:32 pm
nono, stiamo dicendo cose diverse.
Processing compila per Android, non c'entra nulla firmata.
Il vecchio rpocessing ha la modalita' Android, che crea e carica l'APK sul tablet/cellulare
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Nov 27, 2013, 10:20 pm
avendo imparato da poco ogni volta che rispondo ho un certo timore di scrivere cose sbagliate, chiedo scusa.

credo tu intenda caricare direttamente sul tablet via usb,  lo fa anche la 2.0.3
foto fatta ora


(http://i40.tinypic.com/2zdowm1.png)
Title: Re: Arduino comandato da Processing via web
Post by: testato on Nov 28, 2013, 08:15 am
Grande, hanno rimesdo la funzionalità andriid quindi.
L'ho abbandonato proprio perché con la 2.0, gia dalle beta, avevano dichiarato di non supportare piu questa funzione.

E va bene ?

Capisci che questa cosa non centra con firmata, cioè in quedto modo usi processung per scrivere apk android senza per forza legarle ad un uso arduinico.
Firmata è solo uno sketch per arduino, perché non funziona più ? Saranno piccoli ritocchi da fare
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Nov 28, 2013, 08:59 pm
emh non mi è chiaro "ad uso arduinico".

comunque per quello che devo fare va alla grande, nessun errore.
sia con collegando  android  arduino mega adk  con cavo usb senza pc,  sia con android - arduino bluetooth,
con le loro rispettive librerie.

con lo wifi ci devo ancora arrivare.

Title: Re: Arduino comandato da Processing via web
Post by: camperos on Nov 28, 2013, 09:12 pm
Zio Wally@
nono, tu devi insegnare a me, il tuo sketch con le classi è fantastico e chiaro, io il mio (per ora) non lo posto è disordinato e lungo piu di 2000 righe.

passando su tablet o cell android, la prima cosa da tenere in considerazione è la dimensione dello schermo,
altezza - larghezza, pixel
http://processing.org/reference/displayWidth.html.
ma non basta questo

la seconda, se inizi con processing .x e arduino ide.x, non aggiornare mai!  ]:D ]:D
Title: Re: Arduino comandato da Processing via web
Post by: testato on Nov 28, 2013, 11:03 pm

emh non mi è chiaro "ad uso arduinico".

Intendo dire che processing nasce come sw di rpogrammazione prima che nascesse arduino stesso, Massimo banzi ha copiato da loro l'IDE, ma non c'entra nulla.

Processing e' in primis un linguaggio di rpogrammazione con il quale puoi scrivere un sw da caricare su android per far lampeggiare lo schermo del telefono (sto' facendo u esempio), senza che arduino entri in mezzo.
Se vai sul forum di rpocessing la maggior parte non sa nemmeno cosa sia Arduino  :)

Solo dopo quando e' nato arduino si e' iniziato ad usare processing per scrivere applicazioni che si interfacciano ad arduino,
a questo punto ci sono due modi, uno e' caricare Firmata su Arduino e gestire il tutto via Processing, logicamente in questo caso puoi solo fare cioe' che ti permette firmata.
Oppure ti scrivi sia il fw lato arduino sia il sw lato rpocessing per fare qualcosa, senza firmata.
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Nov 28, 2013, 11:31 pm
ok adesso mi è chiaro :)

Title: Re: Arduino comandato da Processing via web
Post by: fvlgnn on Nov 30, 2013, 06:17 pm
Scusate, ma non andrebbe bene utilizzare una scheda SD Dove al'interno metti un file di testo con all'interno il DNS da utilizzare?
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 01, 2013, 01:52 pm

@ZioWally

non sono riuscito a far funzionare il tuo sketch  nel mio pc.
  Gli sketch di esempio che si trovano in rete (arduino ethernet - processing) via UDP riesco a farli funzionare.


per accedere con android via wifi a detti sketch , basta  caricare lo sketch processing su android
e comandi il tutto da android, ho  provato ora
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Dec 02, 2013, 11:03 pm
Ho fatto una verifica del zip che ho postato e confermo che almeno da me funziona.
Non capisco se proprio non ti parte o se quando lanci processig vedi solo mezza interfaccia senza i pulsanti .
Nel secondo caso io ho sempre trovato questo problema quando non inserivo il corretto indirizzo IP sia in arduino (che lo trovi direttamente nello sketch .ino), sia in processing (che invece lo modifichi editando il file link.txt nella prima riga).
In particolare occhio a quando modifichi il link.txt nella cartella Data. Ho visto che non accetta righe remmate o con commenti, devi lasciarlo semplice e pulito come lo trovi nel mio zip.

Per quanto riguarda la gestione delle classi pulsanti ed altro, non è tutta farina del mio sacco. All'inizio della discussione ho citato le fonti che poi ho adattato alle mie necessità.

Per la faccenda android sono sempre più curioso e devo trovare il tempo di provare, ma funziona solo con android 4.1 o anche con la 2.3.6 gingerbread? Io ho proprio quella...

ps
Verifica anche il mac address della scheda ethernet, ho visto che se non è corretta può non funzionare.
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 03, 2013, 06:48 pm
processing 2.0.3
arduino 1.0.5

ci sono i misteri  :smiley-roll-sweat:
il codice arduino mi da subito errore,
poco male hovisto che è un pin digitale

(http://i39.tinypic.com/2rc0m6q.jpg)


edit:
ho cancellato la parte che si riferivano a prove sbagliate nel tentativo di usare arduino UNO  (P99-ciao ciao)
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Dec 03, 2013, 09:23 pm
ciao,

L'errore che mi segnali è dovuto dal fatto che lo sketch è pensato per arduino MEGA, avevo troppi pin da gestire per cui UNO sarebbe stato insufficiente senza aggiungere qualche "protesi" che mi aumentasse i pin.
Quindi il pin A8 è l'analogico 8 che naturalmente manca in UNO. Se lo compili come Mega/ADK non ti si presenta più l'errore.
il pin A8 prevede un sensore lm35 che ancora non è stato implementato correttamente, io per le mie prove l'ho sostituito con un trimmer da 10k, tanto per verificare il protocollo di trasmissione.

Non capisco però perchè il comando P99 non funzioni e ciao ciao invece si.
Se funziona con una frase deve funzionare anche con un'altra (se tutte le regole if sono coerenti con il comando-frase impostato). Però anche ciao ciao non è male come comando :smiley-mr-green: e da quello che ho provato il protocollo UPD è pensato per trasferire ben più byte di quelli di un semplice saluto...
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 03, 2013, 10:43 pm
Code: [Select]
int PinTemp1 =  A8; 
---
pinMode(PinTemp1, INPUT);


mi ha spiazzato la dichiarazione nel setup.
comunque appena posso collego il MEGA e ti so dire
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 04, 2013, 12:08 am
col MEGA è partito al primo colpo  :smiley-sleep:

c'è la possibilita di far funzionare il tuo programma su arduino UNO?
la domanda sembra banale,  ma ho riprovato a collegare la UNO  cambiando la dichiarazione del pin 8   non funziona.

comunque grazie, sto gia modificando un mio lavoro  ;)
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Dec 04, 2013, 06:41 pm
Come ti dicevo, ho scelto MEGA per avere più pin disponibili,
Se lo vuoi usare con UNO devi ridefinire il pin analogico, magari prendi il pin A8 e lo sostituisci con un altro tra A0 e A5 (quelli disponibili per UNO).
Stessa cosa per i pin digitali, che devono essere ridotti di numero e rinominati.
La mia scelta dei pin è legata ad uno schema di collegamenti con schede relè più comodo e razionale .

La stessa interfaccia processing è esuberante per UNO, se non aumenti i pin tramite un port expander tipo PCF8574 più della metà dei pulsanti è inutilizzabile.
Con la gestione a classi dei pulsanti però è abbastanza comodo togliere e riposizionare pulsanti secondo il tuo gusto e necessità.
Volendo, con meno pin si può alleggerire anche la gestione dei comandi, senza trasformare lo status dei pulsanti in bit e poi in byte da trasmettere. Con un semplice comando diretto tipo "Pin3Acceso" o  "Pin3Spento".

Magari sarebbe bello sviluppare una versione del telecomando per UNO che sfrutta tutti i pin standard disponibili, ma con un'interfaccia più piccola dedicata a display per smartphone android...  :D
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 04, 2013, 07:35 pm
questa sera provo ad adattare l'interfaccia  ad android...
il tuo sketch su android funziona anche con spento processing pc

foto fatta malissimo
(http://i43.tinypic.com/aepcmf.jpg)
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Dec 04, 2013, 09:41 pm
altro che fatta malissimo... foto ottima! :smiley-mr-green:
sono molto contento che funzioni, praticamente sta già parlando con arduino? Quindi tramite scheda ethernet?
se la tua risposta è affermativa, ti nomino co-autore del progetto! :smiley-mr-green:
GRANDE CAMPEROS!
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 04, 2013, 10:37 pm
tramite ethernet e router, senza pc   :)

speravo di riuscire ad adattare il tutto su diversi schermi..
ma c'e' un problema, es:

posizione
Code: [Select]
rect (30,30,100,200);
è la stessa posizione di (piu o meno)
Code: [Select]
rect (width/64 , width/64 ,width/1.2, width/ 9.6);
e non da errore, non impazzire ti spiegherò perche  .

il problema sta nel punto decimale che, quando il numero è basso, se non lo metto la posizione cambia di molto.
l'esempio sopra funziona, ma in:

Code: [Select]
Pulsante0 = new Boton(width/4.5, width/38,  Etichette[0], "P00");
errore:
Code: [Select]
(float, int, String, String) is undefined
se al posto di 4.5 inserisco 4, non da errore ma la posizione cambia

e quindi non è possibile "adattare",
non accetta il float    =( =( =(




Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Dec 04, 2013, 11:15 pm
non ho provato ma sono d'accordo con te.
la soluzione può essere:
a) inserire dei valori già calcolati e impostati da un elenco predefinito
b) evitare che il calcolo "rect (width/64..." etc lo faccia in quel punto. Magari lo facciamo calcolare come float a parte e poi lo assegnamo ad una variabile che prende il posto di width/64.

gli facciamo trovare il punto già pulito in formato int...
questa sera non riesco a provare, ma domani sera spero di riuscirci.
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 05, 2013, 01:33 am
per ora il tutto  sembra andare a buon fine, mettendo  i "float" a   pulsanti spie ecc   i valori visualizzati sembrano ok,
domani sera provo meglio
:)

rimetto passo passo come attivare android
------------
Code: [Select]
caricare sketch Processing su Android

dicembre 2013
spero di non avere saltato qualche passo
provato su un pc portatile [b]vergine[/b]

preparazione per  tablet o cell:
nel tablet si deve spuntare "debug USB", ma l'opzione non è visibile , qui sotto istruzioni per il 4.2 (per altri android cercare in internet)
http://www.thesmarthacks.com/2013/04/enabling-usb-debugging-mode-on-android.html

preparazione PC:
Processing 2.0.3 scaricabile dal sito (altri non so, pare che la 2.1 abbia problemi)

click ,aprire processing
click, tendina con "java"
click, add mode
click, install "android mode"
attendere il download
click, chiudere tutti i processing

click, riaprire processing
click, tendina con java
click, android
errore manca "SDK"
click, NO
siete reindirizzati sul sito download (nel caso non venite indirizzati, https://developer.android.com/sdk/index.html)

click, "use an existing ide"
click, download SDK for Windows (sono circa84 mega)
estrarre il file compresso

installare e segnarsi dove viene installata "SDK manager" = (punto importante!!)

si apre da solo "SDK manager"
click,install x (10?) package (gia spuntati da loro)
click,accept license
30 minuti il download

scaricare ancora:
spuntare "android 2.3.3 (API 10) (4 file, non servono tutti...ma alcuni indispensabili)
click,accept license
20 minuti il download

click, close
click,chiudere "android SDK manager"
click, chiudere tutti i processing se aperti

click, aprire processing
errore manca SDK
click, si
si apre esplora file (chiede dove è la cartella SDK)
cercare cartella SDK (segnata precedentemente) (android SDK contenente dei file e cartelle)
OK
click, chiudere tutti i processing se aperti


click,aprire processing
collegare il tablet o cell con cavetto USB

provare se il tutto è andato a buon fine

ad esempio:

click,file
click,esempi
click,basic
click,array
ci vogliono circa 50 secondi

se dovete comunicare con arduino ricordarsi di spuntare i relativi permessi
Processing --> android --> sketch permission -->
spunta "internet" se si ha ethernet shield
due spunte "bluetooth" per bluetooth
ecc..
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 05, 2013, 01:52 pm
a video pc ,il tuo file lo vedevo così come negli android qui sotto.
ho rapportato pari pari il tutto in modo che qualsiasi (o quasi)  display lo veda  nella stessa dimensione.,
solo nella parte bassa dei video, lo spazio vuoto puo aumentare o diminuire.

ora servono le dimensioni  e posizioni pulsanti piu idonei per questi piccoli schermi , deci di tu

i 2 android.. se clicco il pulsante di un  android, dopo pochi secondi si illumina il pulsante anche sull'altro android  :)
ciao

(http://i40.tinypic.com/vpffo8.jpg)
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Dec 05, 2013, 06:44 pm
Hai fatto un bellissimo lavoro!
Il piccolo tutorial su come installare per android è molto prezioso e lo sto seguendo passo-passo anch'io per vedere se è chiaro e completo.

Bellissima anche l'interfaccia scalabile, per la grandezza dei pulsanti possiamo adottare un sistema simile a quello che hai gia adottato e forse ci avevi già pensato anche tu:
il comando image può avere 4 parametri:
image (nome immagine, coordinata X, coordinata Y, Larghezza X, Altezza Y)
quindi il nostro pulsante che ha dimensioni 70x70 pixel se impostiamo:
image (pulsante, x, y, 35, 35)
verrà disegnato grande la metà.
Con lo stesso sistema possiamo andare a rivedere ogni immagine, per questo che tutte le immagini le ho volute separate e non in uno sfondo che già le contenesse tutte, peserà di più ma è più flessibile.
Se non ci hai già pensato tu, ci sarà da ridimensionare anche il cerchietto rosso che disegna per evidenziare quando sei nell'area clikkabile del pulsante, ma non la vedo come una cosa critica.

Il protocollo UDP mi era piaciuto anche perchè agilmente mi permetteva di far rispondere ad Arduino verso qualsiasi fonte lo avesse interrogato. Per cui ogni volta che un processing interroga arduino, lui risponde esattamente all'indirizzo da cui ha ricevuto il comando, fregandosene da dove viene il comando o in quanti sono a richiederlo.
Ricorda che tutto nasce per darlo in mano a persone (spero poche) che potrebbero accendere o spegnere relay in qualsiasi momento e senza che una sappia delle manovre dell'altra, e importante avere quindi il monitoraggio costante dell'intero pannello in tempo reale.

Grazie ancora, mi sei di grandissimo aiuto! :smiley-mr-green:

Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 05, 2013, 07:46 pm
mi hai dato un sistema gia pronto per gli sviluppi futuri del mio progetto,
prima non capivo nulla del tuo sketch, ma a continuare a leggerlo inizia a diventare chiaro   :)

per le dimensioni disegno, solo cambiando altezza larghezza come dici tu non va bene,
30 pixels in un cell è microscopico, per altri il disegno completo può andare fuori schermo,
il sistema che si deve adottare  è simile a questo, che poi è quello che ho fatto.

il disegno deve pressoche occupare il tuo monitor (quello con cui stai lavorando) in orizzontale, cioè meglio lasciare un piccolo spazio sotto, per monitor o display molto larghi e bassi.

i disegni che farai sul "tuo monitor" saranno uguali se visti su  altri monitor se fai così:

larghezza "tuo monitor" diviso n pixels
il tuo monitor è largo 1920 pixels,
fai una ellipse di 100,100

Code: [Select]
ellipse (coordinata X,  coordinata Y,  100 ,  100); //(coordinata X, coordinata Y, Larghezza X, Altezza Y)

1920/100 = 19.2

Code: [Select]
ellipse (coordinata X,  coordinata Y,  width/19.2 ,  width/19.2); //(coordinata X, coordinata Y, Larghezza X, Altezza Y)
notare che non ho usato "height/x"  l'ellipse su un altro monitor risulterebbe ovalizzata.
comunque in questo modo risulta in scala su altri monitor
lo stesso vale per coordinata X,  coordinata Y //width/x, width/x,

per immagini scaricate, ad esempio 70*70

image (nome immagine, coordinata X, coordinata Y, Larghezza X, Altezza Y)
1- anzichè dare una dimensione precisa fare:

Code: [Select]
anzichè //image (pulsante, x, y, 35, 35)

1920/70 = 27.42
Code: [Select]
pulsante.resize (width 27.42  , width/ 27.42); // altezza,larghezza. (il pulsante si adatta al monitor)
pulsante.loadPixels(); questo serve perchè se no da errore su android



Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 05, 2013, 07:56 pm
comunque se non vuoi rifare il tutto puoi usare nel "draw(), subito sotto
scale (0.5);

scala tutto ma non il mouse, che deve essere fatto a parte
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Dec 05, 2013, 08:30 pm
non si finisce mai di imparare :D
Mi metterò a provare a modificare secondo le tue indicazioni, nella mia testa sembrava più semplice del tipo,
so quanto è grande il display, riscalo le coordinate in funzione di questo e nello stesso modo anche i pulsanti in modo tale che la proporzione tra i pixel del display e quelli del pulsante non cambi. Non avendo ancora fatto delle prove mi sarei sicuramente imbattuto negli errori che tu prontamente mi hai permesso di evitare.

Non so che sistema ti ho fatto trovare pronto, ma sono felice di esserti stato utile. Intanto sto ancora scaricando secondo la tua procedura per android e per il momento è tutto preciso.
Mi piacerebbe avere una copia del tuo sketch con le modifiche per il resize, significherebbe un bel po' di lavoro fatto per poi completarlo con tutti i particolari e i dettagli del caso. Lascio a te però decidere quando sarà più opportuno condividerlo.
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 05, 2013, 08:57 pm
per l'attivazione di android incrociamo le dita  ]:D

la parte ethernet sono azero,
se tutto procede bene si potrebbe  provare in futuro  , non so come,  tu accendi un led a me, io accendo un led a te
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Dec 05, 2013, 09:24 pm
Lo strumento per accendermi un led già ce l'hai e lo stai anche adattando ad android.
Se crei un tuo sito internet utilizzando quello che c'è di gratuito tipo dyndns.org oppure no-ip.com e lo interfacci ad arduino+processing come già abbiamo fatto, a me basta conoscere l'indirizzo a cui puntare e il comando giusto.... ed io nel mio scuro e umido ufficio ti posso spegnere la tua tv con la finale dei mondiali di calcio che ti stai guardando dal tuo camper in chissà quale pineta di chissà quale riviera ]:) INVIDIOSO!...no, no semplice sfogo... :D

Se ti serve capire qualcosa in più di come funzionano questi servizi per ospitare siti gratuiti si fa presto a porre rimedio
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Dec 05, 2013, 10:52 pm
ho finito di installare android for processing, le tue istruzioni sono perfette, ho provato un esempio (array) e funziona.
non ho resistito ed ho caricato il  mio programma, è andata male perchè mi dice che la dimensione dello sfondo e del display devono essere identiche, adesso capisco perfettamente la tua precisione nel gestire questa faccenda.
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 05, 2013, 11:25 pm


su "draw" al posto di sfondo metti
Code: [Select]
background (0);
dovrebbe partire  ;)
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 05, 2013, 11:38 pm
Code: [Select]
void GestioneSpia220V()
  {
    int Stato220 = int (reply1 [9]); // trasforma la stringa in int
    if (Stato220 == 1)
      {
        image(Spia220_ON,width/3.316, width/384);
      }
    else
      {
        if (millis() - Timer220 < Temp220_Blink) image(Spia220_OFF1, width/3.316, width/384); // spia led accesa per il tempo stabilito
        if (millis() - Timer220 > Temp220_Blink*2) Timer220 = millis();
      }
   
  }


Code: [Select]
/*
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

CLASSE Boton(coordinataX, coordinataY, Etichetta)

questa classe permette di definire i vari oggetti Boton, che hanno bisogno dei seguenti campi:
coordinataX = intero, posizione X del pulsante
coordinataY = intero, posizione Y del pulsante
Etichetta = stringa, testo affiancato al pulsante

i metodi della Classe Boton sono i seguenti:

.display() -> attiva la rappresentazione grafica del Pulsante (costituita da due immagini, una acceso, una spento)
.update() [true/false] -> serve a definire lo stato del pulsante, se "true" il pulsante sarà rappresentato attivo (quando richiamato .update)
                          se "false" il pulsante sarà rappresentato spento (quando richiamato il metodo .update)
                         
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
*/


class Boton{
  PImage imagePulsOn;  //definizione dell'immagine del pulsante on, nel programma sarà richiamata led1On
  PImage imagePulsOff; //definizione dell'immagine del pulsante on, nel programma sarà richiamata led1Off
  //dichiarazioni delle variabili funzionali all'esecuzione della classe
  float x;
  float y;
  boolean active = false;
  String BotonEtichetta;
  String ComandoEtichetta;
  int Verso;

  //costruttore
  Boton(float tempX, float tempY, String Etichetta, String Comando)
  { //la Classe Boton necessita di tre campi che devono essere definiti quando si istanzia un nuovo oggetto
                                           //la posizione X, Y ed una stringa che definisce l'etichetta
    x = tempX;  //il campo tempX viene passato alla variabile globale della Classe X
    y = tempY;  //il campo tempY viene passato alla variabile globale della Classe Y
   

    BotonEtichetta = Etichetta; //il campo Etichetta viene passato alla variabile globale della Classe BotonEtichetta
    ComandoEtichetta = Comando; // stessa cosa per il comando da inviare ad arduino
   
    imagePulsOn = loadImage("PulsanteOn.png");    //vengono caricate le immagini .png rappresentative del pulsante acceso e spento
    imagePulsOff = loadImage("PulsanteOff.png");
   
     imagePulsOn.resize (width/27,width/27);
     imagePulsOn.loadPixels();
   
      imagePulsOff.resize (width/27,width/27);
     imagePulsOff.loadPixels();
   
    textSize(width/96); //viene definita dimensione del carattere
    //textAlign(LEFT); //viene definito l'allineamento del testo, a sinistra
                     //questi parametri servono per la rappresentazione dell'etichetta
  }

//METODO update() ---------------------------
  void update(boolean z){ //il metodo si aspetta che sia passato un parametro true/false
    active = z; //il valore del parametro è trasferito alla variabile globale "active", della Classe
  }
//-------------------------------------------


//METODO display() --------------------------
  void display(int Align)
  {
    Verso = Align;
    fill(235, 250, 125); // colore giallo
    if (Verso == 1) // prima serie di pulsanti a Sx
      {
        if (active){      // a seconda del valore della variabile "active" il metodo display() mostra un'immagine diversa del pulsante     
          image(imagePulsOn, x, y);  //immagine del pulsante acceso, se active == true
          //image(TargaInt_ON, x+75, y+30);
        }
        else{                       
          image(imagePulsOff, x, y);  //immagine del pulsante spento, se active == false
          //image(TargaInt_OFF, x+75, y+30);
        }
      textAlign(LEFT);
      text(BotonEtichetta, x+width/21,y+width/35);
       
      strokeWeight(width/960);  //spessore del bordo
      if (Evidenzia(x+width/160, y+width/160, width/48 , width/48 ))
        {  //la funzione Evidenzia restituisce TRUE se il mouse è sopra il rettangolo che rappresenta l'interruttore, altrimenti
        stroke(250, 0, 0); //definizione di una linea di colore rosso
        noFill();
        ellipse(x+width/55, y+width/55, width/38, width/38);  // prima circonferenza MODIFICA PER MIO PRIMO BOTTONE questa tecnica serve ad evideziare il pulsante
        }
      else 
        {
        noStroke(); //nessuna linea
        noFill(); //nessun riempimento
        ellipse(x+width/55, y+width/55, width/38, width/38);  // prima circonferenza MODIFICA PER MIO PRIMO BOTTONE questa tecnica serve ad evideziare il pulsante
        }
      //cambio dello stato del pulsante se tasto mouse premuto
      if ((Evidenzia(x+width/160, y+width/160, width/48, width/48)) && mousePressed)  //se contemporaneamente il mouse è sopra l'area del pulsante ed il tasto sinistro è premuto
        {        //viene cambiato il valore di button in 0 se era 1, oppure in 1 se precedentemente era 0
          delay(Debounce);                                 // questo ciclo di ritardo funziona da debounce del tasto del mouse
          udp.send(ComandoEtichetta, ip, Port_Ard );       // comando che invia il messaggio ad arduino con le informazioni aggiornate
          println(ComandoEtichetta);
         
        }
     }
     
       if (Verso == 2) // prima serie di pulsanti a Sx
      {
        if (active){      // a seconda del valore della variabile "active" il metodo display() mostra un'immagine diversa del pulsante     
          image(imagePulsOn, x, y);  //immagine del pulsante acceso, se active == true
          //image(TargaInt_ON, x-185, y+30);
        }
        else{                       
          image(imagePulsOff, x, y);  //immagine del pulsante spento, se active == false
          //image(TargaInt_OFF, x-185, y+30);
        }
      textAlign(RIGHT);
      text(BotonEtichetta, x-width/36, y+width/36);
 
      strokeWeight(width/960);  //spessore del bordo
      if (Evidenzia(x+width/160, y+width/160, width/48, width/48))
        {  //la funzione Evidenzia restituisce TRUE se il mouse è sopra il rettangolo che rappresenta l'interruttore, altrimenti
        stroke(250, 0, 0); //definizione di una linea di colore rosso
        noFill();
        ellipse(x+width/55, y+width/55, width/38, width/38);  // prima circonferenza MODIFICA PER MIO PRIMO BOTTONE questa tecnica serve ad evideziare il pulsante
        }
      else 
        {
        noStroke(); //nessuna linea
        noFill(); //nessun riempimento
        ellipse(x+width/55, y+width/55, width/38, width/38);  // prima circonferenza MODIFICA PER MIO PRIMO BOTTONE questa tecnica serve ad evideziare il pulsante
        }
      //cambio dello stato del pulsante se tasto mouse premuto
      if ((Evidenzia(x+width/160, y+width/160, width/48, width/48)) && mousePressed)  //se contemporaneamente il mouse è sopra l'area del pulsante ed il tasto sinistro è premuto
        {        //viene cambiato il valore di button in 0 se era 1, oppure in 1 se precedentemente era 0
          delay(Debounce);                           //questo ciclo di ritardo funziona da debounce del tasto del mouse
          udp.send(ComandoEtichetta, ip, Port_Ard ); // the message to send  verificato che arduino lo riceve
          println(ComandoEtichetta);
         
        }
     }

  }
//-----------------------------------------

  boolean Evidenzia(float x, float y, float w, float h)   //funzione Evidenzia, vengono passati i parametri di posizione X e Y, e di larghezza W e altezza H del pulsante
  {
    if (mouseX >= x && mouseX <= x+w &&  mouseY >= y && mouseY <= y+h)
    {
      return true;
    }
    else
    {
      return false;
    }
  }

} // fine class boton
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 05, 2013, 11:42 pm
Code: [Select]
void setup()
{
  smooth(8); // massimo livello di antialiasing (0-2-4-8)
 
  Etichette  = loadStrings("Etichette.txt");
  Link       = loadStrings("Link.txt");
 
  ip         = Link[0];        // indirizzo URL, prima riga del file link.txt
  Port_Proc  = int (Link[1]);  // porta in ascolto, seconda riga del file link.txt
  Port_Ard   = int (Link[2]);  // porta di destinazione verso arduino, terza riga del file link.txt
  Intervallo = int (Link[3]);  // tempo in millis tra una richiesta dati e l'altra
 
  Timer220 = TimerTemp = millis();    // prende il primo valore da cui poi incrementa per il controllo
     
  //settaggi per UDP
  udp = new UDP( this, Port_Proc ); // crea connessione su porta 6100
  udp.log( true );             // stampa l'attività di connessione
  udp.listen( true );          // si mette in ascolto e attende il messaggio in arrivo
  udp.send("P99", ip, Port_Ard ); // invia comando per avere la prima risposta
 
  size(displayWidth,displayHeight);  //dimensione dell'area grafica del programma
  orientation (LANDSCAPE);
 
  fill(0);
  Sfondo       = loadImage ("acciaio_1024_768.png");
  LedSpia_ON   = loadImage ("Led_spia_50_ON.png");
  LedSpia_OFF  = loadImage ("Led_spia_50_OFF.png");
  Vite         = loadImage ("VITE_30.png");
  Spia220_ON   = loadImage ("Led_spia_220_ON.png");
  Spia220_OFF  = loadImage ("Led_spia_220_OFF.png");
  Spia220_OFF1 = loadImage ("Led_spia_220_OFF1.png");
 
  textAlign(CENTER); //viene definito l'allineamen,minimo scala, max scalato del testo, a sinistra
  PFont mono = loadFont("ForgottenFuturist-Bold-42.vlw");
  textFont(mono,width/64);
 
   Volt1 = new Voltmetro(width/7.1 , width/64, Etichette[16]); //istanza dell'oggetto e sua costruzione  x,x,testo,tensione nominale
    Volt2 = new Voltmetro(width/3.178, width/64, Etichette[17]); //istanza dell'oggetto e sua costruzione
 
    Termometro1 = new Termometro (width/4.517 , width/42 , Etichette[18]); // x,y,testo
    Termometro2 = new Termometro (width/3.735 , width/42 , Etichette[19]);
 
  Pulsante0 = new Boton( width/384  , width/38.4 ,  Etichette[0], "P00"); // riga dei pulsanti di sinistra, questo è quello alto, Etichette[0] è la prima riga del file etichette.txt
  Pulsante1 = new Boton(width/384, width/14.22, Etichette[1], "P01"); 
  Pulsante2 = new Boton(width/384, width/8.73, Etichette[2], "P02"); 
  Pulsante3 = new Boton(width/384, width/6.3, Etichette[3], "P03");
  Pulsante4 = new Boton(width/384, width/4.92, Etichette[4], "P04");
  Pulsante5 = new Boton(width/384, width/4.042, Etichette[5], "P05");
  Pulsante6 = new Boton(width/384, width/3.43, Etichette[6], "P06");
  Pulsante7 = new Boton(width/384, width/2.977, Etichette[7], "P07");
 
  Pulsante8  = new Boton(width/2.02 ,  width/38.4 , Etichette[8],  "P08");  // riga dei pulsanti di destra, questo è quello alto
  Pulsante9  = new Boton(width/2.02 , width/14.22, Etichette[9],  "P09"); 
  Pulsante10 = new Boton(width/2.02 , width/8.73, Etichette[10], "P10"); 
  Pulsante11 = new Boton(width/2.02 , width/6.3, Etichette[11], "P11");
  Pulsante12 = new Boton(width/2.02 , width/4.92, Etichette[12], "P12");
  Pulsante13 = new Boton(width/2.02 , width/4.042, Etichette[13], "P13");
  Pulsante14 = new Boton(width/2.02 , width/3.43, Etichette[14], "P14");
  Pulsante15 = new Boton(width/2.02 , width/2.977, Etichette[15], "P15");
 
  Spia0 = new Spia(width/24,  width/24); // x,y
  Spia1 = new Spia(width/24, width/11.64);
  Spia2 = new Spia(width/24, width/7.68);
  Spia3 = new Spia(width/24, width/5.73);
  Spia4 = new Spia(width/24, width/4.57);
  Spia5 = new Spia(width/24, width/3.8);
  Spia6 = new Spia(width/24, width/3.254);
  Spia7 = new Spia(width/24, width/2.8444);
 
  Spia8  = new Spia(width/2.51 , width/24);
  Spia9  = new Spia(width/2.51, width/11.64);
  Spia10 = new Spia(width/2.51, width/7.68);
  Spia11 = new Spia(width/2.51, width/5.73);
  Spia12 = new Spia(width/2.51, width/4.57);
  Spia13 = new Spia(width/2.51, width/3.8);
  Spia14 = new Spia(width/2.51, width/3.254);
  Spia15 = new Spia(width/2.51, width/2.8444);
   
  Sfondo.resize (width,height);
  Sfondo.loadPixels();
 
  LedSpia_ON.resize (width/38,width/38);
  LedSpia_ON.loadPixels();
 
  LedSpia_OFF.resize (width/38,width/38);
  LedSpia_OFF.loadPixels();
 
  Vite.resize (width/38,width/38);
  Vite.loadPixels();
 
  Spia220_ON.resize (width/38,width/38);
  Spia220_ON.loadPixels();
 
  Spia220_OFF.resize (width/38,width/38);
  Spia220_OFF.loadPixels();
 
  Spia220_OFF1.resize (width/38,width/38);
  Spia220_OFF1.loadPixels();

}


Code: [Select]
// ATTENZIONE in mancanza dei dati da arduino, le Spie non vengono visualizzate sul display, nè accese nè spente

class Spia{
 
  PImage TargaInt_ON;
  PImage TargaInt_OFF;
 
  //dichiarazioni delle variabili funzionali all'esecuzione della classe
  float X;
  float Y;
  boolean active = false;
 
 
  //costruttore
  Spia(float tempX, float tempY)
  {                                           
    X = tempX;
    Y = tempY;
    TargaInt_ON =  loadImage ("led_rett_on_180_35.png");
    TargaInt_OFF = loadImage ("led_rett_off_180_35.png");
 
  TargaInt_ON.resize (width/11,width/55);
  TargaInt_ON.loadPixels();

  TargaInt_OFF.resize (width/11,width/55);
  TargaInt_OFF.loadPixels();
}

//METODO update() ---------------------------
  void update(boolean z)
  { //il metodo si aspetta che sia passato un parametro true/false
    active = z; //il valore del parametro è trasferito alla variabile globale "active", della Classe
  }
//-------------------------------------------


//METODO display() --------------------------
  void display()
  {
    if (active) // prima serie di pulsanti a Sx
      { 
       image(TargaInt_ON, X, Y);
      }
    else
      {
       image(TargaInt_OFF, X, Y);
      }
  }
     
} // fine class spia
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 05, 2013, 11:47 pm
Code: [Select]
class Termometro{
 
 //dichiarazioni delle variabili funzionali all'esecuzione della classe
 PImage Termometro1;
 PImage Targa1;
 
 float X;
 float Y;

 float val;                  //definizione della variabile che definisce la rotazione e che varierà tra 0 e 1024
 //float valm;
 String TermometroLable;
 float Altezza1 = -width/77;
 
 //costruttore  
 Termometro(float tempX, float tempY, String lable){ //la Classe Termometro necessita di tre campi che devono essere definiti quando si istanzia un nuovo oggetto
                                             //la posizione X, Y ed una stringa che definisce l'etichetta
   X = tempX; //il campo tempX viene passato alla variabile globale della Classe X
   Y = tempY; //il campo tempY viene passato alla variabile globale della Classe Y
   
   TermometroLable = lable; //il campo lable viene passato alla variabile globale della Classe LedLable
   
   Termometro1 = loadImage ("termometro_35_300.png");
   Targa1      = loadImage ("targa_60_30.png");
   
      Termometro1.resize (width/22,width/6);
 Termometro1.loadPixels();
   
     Targa1.resize (width/32,width/64);
 Targa1.loadPixels();
   
   textAlign(CENTER); //viene definito l'allineamento del testo, a sinistra
                    //questi parametri servono per la rappresentazione dell'etichetta
   }
   
//METODO update() ---------------------------  
 void update(float z){ //il metodo si aspetta che sia passato un parametro tipo numero intero
   val = z; //il valore del parametro è trasferito alla variabile globale "val", della Classe
 }

//METODO display() ---------------------------    
 void display()
   {
     fill(0,0,0);                  //colore di sfondo della barra, nero
     rect(X+width/64, Y+width/8, width/77, -width/8);  // rettangolo di sfondo
     
     Temp = map(val, 0, 255, -25, 50);
     Temp1 = map(Temp, -25, 50, -25, -215); //il valore di ingresso varia 0-->255, la barra ha una dimensione 0-->230
     if (Altezza1 < Temp1) Altezza1 = Altezza1 +1;  // in questo modo l'aggiornamento è progressivo, non a scatti
     if (Altezza1 > Temp1) Altezza1 = Altezza1 -1;
       
     fill(255,0,0);                //colore di riempimento della barra, rosso
     rect(X+width/64, Y+width/8, width/77, Altezza1); // rettangolo che simula il mercurio
     image(Termometro1, X, Y);    //visualizzazione dell'immagine della base del Voltmetro
   
     image(Targa1, X+width/160, Y+width/6.4);
     fill(235, 250, 125); // colore giallo
     textAlign(CENTER);
     text(TermometroLable, X+width/43, Y+width/5.48);
     String Testo = (String.format("%.1f", Temp) + "°");
     text(Testo, X+width/43, Y+width/5.96);
   }
}


Code: [Select]
/*
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

CLASSE Voltmetro(coordinataX, coordinataY, Etichetta)

questa classe permette di definire i vari oggetti Voltmetro, che hanno bisogno dei seguenti campi:
coordinataX = intero, posizione X dell'Voltmetro
coordinataY = intero, posizione Y dell'Voltmetro
Etichetta = stringa, testo etichetta

i metodi della Classe Button sono i seguenti:

.display() -> attiva la rappresentazione grafica dell'inidcatore
.update() [0 - 1024] -> attraverso questo metodo si trasferisce il valore numerico che l'Voltmetro rappresenterà
                       0 = inizio della scala
                       1024 = fondo scala
                         
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
*/


class Voltmetro{
 
 //dichiarazioni delle variabili funzionali all'esecuzione della classe
 PImage gauge; //definizione dell'immagine della base dell'indicatore
 PImage arrow; //definizione dell'immagine della lancetta
 float InsX;
 float InsY;

 int val;                  //definizione della variabile che definisce la rotazione e che varierà tra 0 e 1024
 float valm;
 String VoltmetroLable;
 
 float Tensione;
 String TextTensione;
 
 //costruttore  
 Voltmetro(float tempX, float tempY, String lable)
 { //la Classe Voltmetro necessita di tre campi che devono essere definiti quando si istanzia un nuovo oggetto
                                             // la posizione X, Y ed una stringa che definisce l'etichetta
   InsX = tempX;                             // il campo tempX viene passato alla variabile globale della Classe X
   InsY = tempY;                             // il campo tempY viene passato alla variabile globale della Classe Y
   
   VoltmetroLable = lable; //il campo lable viene passato alla variabile globale della Classe Lable
   
   gauge = loadImage("strumento_150.png");  // caricamento dell'immagine di sfondo del Voltmetro  
   arrow = loadImage("freccia_150.png");    // caricamento dell'immagine che rappresenta l'indice del Voltmetro
   
 gauge.resize (width/13,width/13);
 gauge.loadPixels();
   
 arrow.resize (width/13,width/13);
 arrow.loadPixels();
   
   textAlign(CENTER); //viene definito l'allineamento del testo,
                    //questi parametri servono per la rappresentazione dell'etichetta
 }
   
   
//METODO update() ---------------------------  
 void update(int z)
   {
    //il metodo si aspetta che sia passato un parametro tipo numero intero
     val = z; //il valore del parametro è trasferito alla variabile globale "val", della Classe
   }

//METODO display() ---------------------------    
 void display(int Tens)
   {
       textAlign(CENTER);
       fill(235, 250, 125); // colore giallo
       text(VoltmetroLable, InsX +width/24, InsY +width/11);
       image(gauge, InsX, InsY);    //visualizzazione dell'immagine della base del Voltmetro
       
       pushMatrix();   // richiamando pushMatrix() prima di traslazioni o rotazioni del sistema di riferimento, permette di rimettere
                       //tutto a posto quando viene richiamato popMatrix(), in pratica tra i due comandi possiamo traslare e ruotare il sistema di riferimento
                       //potendo poi rimettere tutto come di default.
                       
       translate(InsX +width/26, InsY +width/26);  //traslazione dell'origine del sistema di riferimento
 
       valm = map(val, 0, 255, -135, +135); //valm è la traduzione di val in un range che va da -135 a +135
       Tensione = map(val, 0, 255, Tens -(Tens/2), Tens +(Tens/2));  // mi serve per leggere il valore di tensione es per 12v
       
       TextTensione =((String.format("%.2f", Tensione)) + "V") ; // per avere solo 2 decimali stampati più la V
               
       text(TextTensione, X, Y+width/38);
       
       rotate(radians(valm));   // rotazione del sistema di riferimento, il valore di valm (espresso in °) viene tradotto in radianti
       image(arrow, -width/26, -width/26);  // nel sistema di riferimento ruotato e traslato viene rappresentata l'immagine della lancetta
                                // la rotazione del sistema di riferimento è legata proporzionalmente alla variabile "val",
                                // la lancetta è rappresentata ruotata proporzionalmente al campo passato attraverso il metodo .update()
       
       // text(Tensione, 0, -20); // se lascio il testo qui, ruota con la freccia, simpatico
                             
       popMatrix();  //dopo aver traslato e ruotato il sistema di riferimento questo viene rimesso nelle condizioni di default
   }
}


Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 05, 2013, 11:47 pm
Code: [Select]
void draw() // versione 3 draw che funziona con 4 invii di 8 bit e carattere di controllo W,204,205,206,207
{
 background(Sfondo);  //sfondo ;

 
 image(Vite, width/384, width/384);
 image(Vite, width/384, width/2.62);
 image(Vite, width/1.94, width/384);
 image(Vite, width/1.94, width/2.62);
 
 
 image(LedSpia_OFF, width/4.86, width/384);
 image(Spia220_OFF, width/3.32, width/384);
 
  Volt1.display(12); //rappresentazione di Volt1, valore in parentesi è la tensione nominale
  Volt2.display(24);
 
  Termometro1.display();
  Termometro2.display();

 if ( millis() - TimerTemp > Intervallo) // con cadenza ogni tot esegue l'elenco
   {
     TimerTemp = millis();
     udp.send("P99", ip, Port_Ard );
     println("P99");
     
   }
 
 //  stampa la verifica "manco mal", poi stampa le 4 parti divise della stringa, poi la conversione binaria della prima stringa
 //  poi solo i caratteri significativi della prima stringa, li lascio tutti anche se non servono, UNA FATICA A CAPIRE COME FARE...
 
  if (Status == 1) // è = 1 solo se la stringa ricevuta inizia con W
 {
   println("MANCO MAL!!");
       
   if (millis() - TempLampLed < TempLedON) image(LedSpia_ON,width/4.86, width/384
   ); // spia led accesa per il tempo stabilito
   
   // estrapolo le informazioni da arduino, la reply1[0] contiene la "W" di controllo ed è gia stata verificata
   println(reply1  [3]);  // Status spie 1 primi 8 pulsanti
   println(reply1  [4]);  // Status spie 2 secondi 8 pulsanti
   GestioneSpie();        // routine spie
       
   println(reply1  [1]);  // mi stampa le singole parti divise della stringa. Questi sono i primi 8 pulsanti
   println(reply1  [2]);  // seconda serie di 8 pulsanti
   GestionePulsanti();    // routine pulsanti
   
   println(reply1  [5]);  // Tensione Batterie 1
   println(reply1  [6]);  // Tensione Batterie 2
   println(reply1  [7]);  // Temperatura sensore 1
   println(reply1  [8]);  // Temperatura sensore 2
   println(reply1  [9]);  // Spia 220v
   GestioneSpia220V();
   
   println(reply1 [10]);  // A disposizione per altri eventuali pin
   
   // gestione Voltmetro
   V1 = Integer.parseInt(reply1 [7]);             // trasforma la stringa in float, che mi serve per il map()
   if (Tensione1 < V1) Tensione1 = Tensione1 +1;  // in questo modo l'aggiornamento è progressivo, non a scatti
   if (Tensione1 > V1) Tensione1 = Tensione1 -1;
   Volt1.update(Tensione1);                       // aggiorno la posizione dell'indicatore ad i
   
   V2 = Integer.parseInt(reply1 [7]);             // trasforma la stringa in float, che mi serve per il map()
   if (Tensione2 < V2) Tensione2 = Tensione2 +1;  // in questo modo l'aggiornamento è progressivo, non a scatti
   if (Tensione2 > V2) Tensione2 = Tensione2 -1;
   Volt2.update(Tensione2);                       // aggiorno la posizione dell'indicatore ad i

   // gestione termometro
   Temp1 = Integer.parseInt(reply1 [7]);          // trasforma la stringa in float, che mi serve per il map()
   Temp2 = Integer.parseInt(reply1 [8]);        // trasforma la stringa in float, che mi serve per il map()
   
   Temp2 = Temp1-60;   // non avendo ancora un valore valido da arduino per Temp2, per test mi invento un valore ricavato da Temp1
   
   Termometro1.update(Temp1);
   Termometro2.update(Temp2);
     
 }
 
} //fine draw
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 05, 2013, 11:52 pm
le tab del tuo sketch modificate  :)
se non vuoi che restino a "vista" le cancello

le altre  tab non postate non le ho modificate.
funziona ma va provato bene, gli "int" sono stati modificati con "float"
;)
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Dec 06, 2013, 08:26 pm
ottimo Camperos!
hai fatto bene a postare i listati, adesso mi metto a fare tutte le verifiche del caso, per vedere che non ci siano bachi.
Quando sarà testato faccio conto di rifare lo zip e riallegarlo al post, e se sei d'accordo inserirò anche la tua guida all'uso con android che è la più chiara che abbia finora trovato, naturalmente sarai citato come autore della pagina, mi sembra ovvio!
Credo che nel soggetto del tread aggiungerò anche ".... tramite android" per valorizzare al massimo il tuo aiuto.

Sono proprio curioso di leggere bene il listato e capire tutte le tue migliorie.
Ultima cosa, dalla tua ultima foto allegata, vedo che lo sfondo rimane sempre molto grande rispetto ai pulsanti.
Non è possibile fare un resize come per i pulsanti?
Oppure, non so se sia possibile, il massimo sarebbe poter zoommare l'immagine per avvicinarla per vedere meglio, ma credo che sia quasi fantascienza, almeno per me. Tu l'hai mai visto o sentito da qualche parte?
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 06, 2013, 09:39 pm
ok per la guida su come  attivare android,
con tutto quello che mi danno, insegnano i tutti partecipanti del forum,
sono ben lietyo di condividere quello che so (poco).
per quanto riguarda lo "zoom"  quello che riesco a trovare è questo:

http://processing.org/examples/zoom.html
come al solito devo minimizzare lo sketch per carpire le parti fulcro dello zoom e poi
si deve provare su android....e se funziona, si deve vedere se non è devastante o troppo impegnativo inserirlo
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 06, 2013, 11:30 pm
fantascienza :
in prima mondiale o quasi  :)

all'inizio vedi solo il background e basta,
fai scorrere il dito solo nella parte estremamente a destra dall'alto verso il basso o viceversa

si deve dichiarare
Code: [Select]
float zoom;
questo nel draw()
Code: [Select]
void draw() // versione 3 draw che funziona con 4 invii di 8 bit e carattere di controllo W,204,205,206,207
{
 background(Sfondo);  //oppure background(0);
 if (mouseY < height && mouseY >0 && mouseX < width && mouseX > width/1.2){
 zoom = map(mouseY/2, 0, width, 0.5, 4.5);
 scale(zoom);
}
else{
scale(zoom);
}


questo modifica la linea del pulsante
Code: [Select]
if (mouseX/ zoom >= x && mouseX/zoom <= x+w &&  mouseY/zoom >= y && mouseY/zoom <= y+h)


edit
prima provalo su pc


se vuoi aggiungere una scala graduata, metti subito sotto il draw()
 
Code: [Select]
slider () ;

e in una nuova tab

Code: [Select]
void slider () {
 if (mouseY < height && mouseY >0 && mouseX < width && mouseX > width/1.1) {
   strokeWeight (width/192);
   stroke (255, 0, 0);
   line (width/1.06, width/38.4, width/1.06, width/1.92);
   for (int i =0; i<10; i++) {
     text (10+i*10, width/1.097, width/27.42+width/19.2*i);
   }
   line ( width/1.097, mouseY, width/1.06, mouseY);
 }
}
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Dec 07, 2013, 12:56 pm
tu sei bravo, dotto'

ancora non  mi è chiaro tutto, e purtroppo nei prossimi 2 giorni non sono neanche a casa per poter provare.
Di certo che se riesce tutto, l'interfaccia android sarà veramente professionale!
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 09, 2013, 07:03 pm
sono riuscito a fare il "pan" o "move" (con dito sulla interfaccia) inserendolo con lo zoom.

comunque finito di muovere o zoommare (?) ci vogliono circa 5 secondi prima di poter cliccare un pulsante.
a mio parere, per android è meglio rifare il disegno ingrandendo i pulsanti o spostarli in modo che lo schermo si riempia
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Dec 11, 2013, 06:19 pm
Ho solo da imparare da te...
Se in effetti il pan ed il zoom rallentano così tanto l'applicazione, si può fare benissimo senza.
Magari con un'ottimizzazione degli oggetti sul display otteniamo un risultato anche migliore.
Io ho fatto delle prove sul mio android 2.3.6, mi carica lo sketch ma i pulsanti non compaiono, come se non ci fosse il collegamento in corso. Lo stesso però lanciato in versione java funziona bene.
Prima non mi ero preoccupato perchè il mio sito no-ip.com non era disponibile, ora invece lo è!
Ho verificato le permissioni ed ho spuntato "internet" secondo tue indicazioni.
Può essere un problema la mia versione android? Con che versione lo hai testato tu?
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 11, 2013, 09:35 pm
android 4.1.2
non so collegandosi ad un sito,
io lo testo con arduino collegato con cavo ethernet al router
lo stesso router wifi - android wifi
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Dec 11, 2013, 10:56 pm
ok, non lo sapevo.
Per me la versione android ha senso se riesco a farla andare anche senza un collegamento wi-fi.
Il bello è poter comandare la centralina tramite una connessione internet pura e semplice, visto che nelle zone dove poi vado ad usarlo è già molto che il telefono prenda e che ci sia internet.

Ho provato e come wifi funziona! :smiley-mr-green:
Il comando non è molto reattivo, forse l'interfaccia è troppo piccola per essere agevole.
Faccio altri tentativi e ti aggiorno.
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 12, 2013, 06:28 pm
:)
2 giorni a capire come aprire le porte al router, poi sito no-ip..poi..poi..
ce l'ho fatta  :)
wifi spento,
cellulare sim con sketch processing  e funziona ,  i pulsanti si vedono e comunicano :)
è questo che non ti funziona?
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Dec 13, 2013, 07:53 pm
scusa se rispondo solo adesso...
adesso funziona anche a me, sia in wifi che via internet :D
Dopo aver verificato tutto per 3 volte, alla fine mi sono accorto che era la connessione internet che faceva i capricci.
Mi sono portato in zona meglio coperta.. e magia!...funziona! anche per il mio vecchio android 2.3.6 gigerbread.

Sul mio cell non è molto reattivo, devo insistere molto per accendere o spegnere un pulsante. Penso sia un problema del telefono che non è il massimo e del display che ancora non è ottimizzato per il display e i pulsanti sono piuttosto piccolini.
Col tuo cell è abbastanza veloce?
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 15, 2013, 08:31 pm
praticamente è istantaneo, o quasi
credo non sia un problema di telefono ma di rete.
Intanto il mio lavoro è quasi terminato, ho iniziato pensando che ciò che volevo doveva funzionare su cell,
quindi è a pagine, va migliorata la grafica, ci vorrebbe un "designer"  :)
ho intenzione di acquistare un router con scheda sim, da installare fisso sul camper sempre acceso, il consumo elettrico rientra nelle possibilità delle batterie e pannelli FV, quello telefonico ci devo ragionare un po su ]:D

quello che ciuccia di piu sono le temperature, 36 byte, al secondo? bho
Title: Re: Arduino comandato da Processing via web
Post by: ZioWally on Dec 16, 2013, 07:47 pm
Ho paura anch'io che sia un problema di connessione. Una volta che l'interfaccia sarà ottimizzata, lo testerò col wifi bypassando eventuali problemi di ricezione.

Per quanto riguarda il consumo in byte, il router spara byte solo su sollecito del programma processing-android, quindi se nessun terminale è collegato non c'è richiesta d'informazioni e quindi nessuna trasmissione.
Arduino trasmette byte solo in risposta ad un'accensione/spegnimento di un pulsante, oppure ogni tot secondi che puoi impostare modificando la riga n°4 (l'ultima) del file link.txt della cartella Data. Di default avevo impostato 2000, quindi 2 sec.
Se lo porti a 20sec ecco che il traffico byte si riduce ad un decimo.

Ti ricordo che il messaggio spedito contiene lo status di tutti i pulsanti e spie, oltre ai valori dei termometri e voltmetri.
Si può ottimizzare splittando le informazioni in 2 pacchetti differenti:
All'accensione dell'interfaccia mi faccio spedire tutte le info in modo di avere la situazione attuale, poi al variare di un pulsante mi faccio spedire la sola situazione pulsanti, e solo con scadenza temporale da me decisa la situazione temperature e voltaggi.
Per risparmiare al massimo, possiamo pensare ad un pulsantino che solo se premuto aggiorna l'interfaccia.
Non credo però che avrai l'interfaccia sempre accesa, o no?

Per quanto riguarda l'interfaccia a pagine se vuoi ti posso aiutare, basta definire lo stile e il lay-out delle varie pagine, ma non vedo grossi problemi a disegnarla.
Magari per questi dettagli mandami un mp, non credo che siano cose che interessano molto al resto del forum, almeno fino a quando non avremo una versione definitiva o quasi.

In più visto che anche tu vuoi fare una postazione fissa permanente, sto pensando di implementare un watchdog hardware per un autoreset in caso di problemi, sto testando in questi giorni un paio di circuitini per capire quale sia meglio

PS
visto che il thread sta diventando sempre più android, cosa ne dici se modifico il titolo come:
Arduino comandato da Processing via web tramite pc o smartphone Android
cosi valorizziamo anche il tuo lavoro!

Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 18, 2013, 07:13 pm
ok, vada per android nel titolo  8)
allora, grazie alle tue indicazioni ora anche il mio progetto è terminato., arduino risponde solo quando chiedo..e se  smetto di chiedere lui si ferma.
è a pagine perchè gia malamente lo avevo fatto così con bluetooth, ora credo sia perfetto con sistema web.
dell'autoreset non ci avevo pensato.
il mio sistema di invio byte non è con unica stringa come il tuo, avrei dovuto rivoluzionare proprio tutto il lavoro di mesi....di tempo libero (poco anche il mio).

se non è un problema, invio una foto dell quantità litri, i tachimetri li ho fatti io  :)
(http://i44.tinypic.com/2n19g7p.jpg)
Title: Re: Arduino comandato da Processing via web
Post by: testato on Dec 18, 2013, 07:58 pm
bello bello, sarebbero che litri sono ? benzina ?
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 18, 2013, 08:34 pm
no no Testato  :)
il mio progetto  si riferisce al mio camper.
claire.. nome sballato per indicare il serbatoio delle acque chiare, quella con cui ci si può lavare8, farsi la doccia, nel mio caso 140 litri
kitchen.. serbatoio acqua di scarico del lavello della cucina contiene max 70 litri
bath.. serbatoio delle acque di scarico del bagno, lavandino, doccia, contiene max 70 litri.
comunque normalmente i camper hanno solo 2 serbatoi, uno per le acque chiare (nuove..potabili, ma è meglio non bere  ]:D),
e uno per le "grige" quelle di scarico,
Title: Re: Arduino comandato da Processing via web
Post by: testato on Dec 18, 2013, 09:14 pm
ed i serbatoi hanno un galleggiante potenziometrico ? li hai connessi agli ingressi analogici di un arduino ?
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 18, 2013, 10:02 pm
il nuovo progetto web e android non è ancora integrato nel camper, appena ho tempo faccio il lavoro.

per quanto riguarda i litri, attualmente i sensori di pressione (MPX)nel camper ci sono e sono collegati ad arduino ed LCD  verde.
come per i  valori elettrici uso un allegro 758 http://forum.arduino.cc/index.php?topic=107724.0
come per le temperature degli NTC da 10K,

per le luci invece devo ancora modificare la parte comando del camper, cambiando sistema dagli attuali classici comandi ad interruttore a pulsanti inserendo relè bistabili,
credo... sia il modo migliore per interfacciare le luci ad arduino

comunque degli MPX non sono contento, nel senso che viaggiando, cambiando quota (montagna), vibrazioni ecc..
a destinazione per misurare valori veritieri devo levare la cannettina che va nel serbatoio e riimmerge di nuovo...
ora sto pensando agli ultrasuoni e mi devo ancora informare bene.
Title: Re: Arduino comandato da Processing via web
Post by: camperos on Dec 18, 2013, 10:05 pm
attualmente collegati tutti i sensori agli ingressi analogici di un arduino MEGA, col LCD.
comunque l'idea è di farmi un camper domotico ma funzionante anche senza domotica  ;) ;)
Title: Re: Arduino comandato da Processing via web
Post by: testato on Dec 20, 2013, 11:35 am
Yes, anche io sostengo fondamentale appoggiarsi ad un impianto, non sostituirlo. Per le attuazioni il classico rele finder con pulsanti e sul micro un normale rele monostabile che simula la pressione di un pulsante.
Ci fai sia luci che prese se vuoi. Se poi vuoi anche rilevare lo stato scegli un finder con due contatti ed uno lo usi come rilevazione.
Mettere in campo eventuali opto pilotati dalla 230v per poi spedire l uscita al micro non ha senso secondo me, ma l ho visto fare speesso
Title: Re: Arduino comandato da Processing via web tramite pc o smartphone Android
Post by: ZioWally on Dec 20, 2013, 08:31 pm
ciao Camperos - Testato,

Molto bella la tua interfaccia, non ho capito però il fatto che sia a pagine, come la gestisci?

Intanto ho provato anch'io a farne una versione che abbia la funzione pan cercando di bypassare la riduzione in scala come mi hai insegnato.
Ho trovato il comando PGrapichs() che è l'ideale per fare questo, sono riuscito ad adattare l'originale 1024x768 in 800x480 e posso fare pan (per il momento solo con i tasti freccia) e mi sembra abbastanza veloce....
Tu avevi fatto delle prove ma il risultato dicevi che era molto lento, cosa avevi usato?

ps
titolo aggiornato  8)
Title: Re: Arduino comandato da Processing via web tramite pc o smartphone Android
Post by: camperos on Dec 20, 2013, 09:45 pm
PGrapichs che è PGrapichs?  :smiley-yell:
non lo ho ancora usato ..
ti posto il mio pan e zoom, ma non credo sia nelle specifiche di Processing  :smiley-red: :smiley-red:
provalo, vai a DX per lo zoom, clicca e muovi la figura e a dimostrazione che funziona passa sui quadrati.

Code: [Select]
float zoom =1;
float panX;
float panY;
int stato;
void setup() {
  size (1200, 600);
}
void draw()
{
  background(0);  //sfondo ;
  noFill();
  fill (255, 0, 0);
  strokeWeight (4);
  stroke (255, 0, 0);
  ////////bar
  line (1150, 10, 1150, 590);
  for (int i =0; i<10; i++) {
    text (10+i*10, 1100, 70+60 *i);
  }
  text ("Click &", 1100, 30);
  text ("ZOOM", 1100, 50);
  ////////////////  scale
  if (mouseY < height && mouseY >0 && mouseX < width && mouseX > 1100) {
    line ( 1100, mouseY, 1150, mouseY);
  }
  if (mouseY < height && mouseY >0 && mouseX < width && mouseX > 1100 && mousePressed ) {
    zoom = map(mouseY, 0, width, 0.5, 5.5);
    scale(zoom);
  }
  else {
    scale(zoom);
  }
  ///////////move
  if (  mouseX /zoom-panX >50  && mouseX /zoom-panX < 90 && mouseY /zoom-panY>50 && mouseY /zoom-panY< 90 && mousePressed) {
    stato =1;
  }
  if (mouseY < width   && mouseY >0 && mouseX < width/1.2  && mouseX  >0  && mousePressed && stato ==1 ) { 
    panX =  map(mouseX/zoom -75, 0, width, 0, width  ); 
    panY =  map(mouseY/zoom -75, 0, width, 0, width); 
    translate (panX, panY);
  }
  else {
    translate (panX, panY);
    stato =0;
  }
  //Mio sketch qui xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx!!!!!!!!!!!!!!!!
  text ("click", 120, 120);
  text ("click", 70, 65);
  text ("& move", 60, 105);
  noFill();
  if (mouseX/zoom - panX >20 && mouseX/zoom - panX <40 && mouseY/zoom - panY >20 && mouseY/zoom - panY< 40) {// /zoom - pan
    fill (0, 255, 0);
  }
  strokeWeight (1);
  rect (20, 20, 20, 20);
  noFill();
  if (mouseX/zoom - panX >120 && mouseX/zoom - panX <140 && mouseY/zoom - panY >20 && mouseY/zoom - panY< 40) {
    fill (0, 255, 0);
  }
  rect (120, 20, 20, 20);
  noFill();
  if (mouseX/zoom - panX >20 && mouseX/zoom - panX <40 && mouseY/zoom - panY >120 && mouseY/zoom - panY< 140) {
    fill (0, 255, 0);
  }
  rect (20, 120, 20, 20);
  noFill();
  if (mouseX/zoom - panX >120 && mouseX/zoom - panX <140 && mouseY/zoom - panY >120 && mouseY/zoom - panY< 140 && mousePressed) {
    fill (0, 255, 0);
  }
  rect (120, 120, 20, 20);
  noFill();
  ellipse (80, 80, 25, 25);
}

 
Title: Re: Arduino comandato da Processing via web tramite pc o smartphone Android
Post by: camperos on Dec 20, 2013, 10:01 pm
@Testato
ho visto ci sono dei rele a 2 bobine, una start e uno relase.
devo collegarne 6 ad arduino, meglio rele passo passo a 1 bobina?
sono indeciso se prenderlia 5 volt e collegarli direttamente al MEGA (oltre c'è solo lo shield ethernet) o a 12 Ve cercare uno schema da Pighixx ( il camper in generale è a 12Volt), al massimo ho 10W di faretti LED a singolo rele.
Title: Re: Arduino comandato da Processing via web tramite pc o smartphone Android
Post by: camperos on Dec 20, 2013, 10:44 pm
@Zio Wally
qui ora mi saltano addosso, uso questo sistema perchè così se lo devo controllare tra un po di tempo riesco a ricordarmi qualcosa  :smiley-roll-blue:
esempio Tasto Litri...
da Processing funziona solo la schermata litri,
invio una "c" ogni 2 secondi

Code: [Select]
void litri() {
 if ((time+2000)<millis()) {
   udp.send( "c", ip, Port_Ard );
   time = millis();
//resto del codice
}
}


ad arduino arriva la "c" e mette in moto "litres"

Code: [Select]
void  rice(){  
 int packetSize = Udp.parsePacket();
 if(packetSize )
 {
   Udp.read(packetBuffer,UDP_TX_PACKET_MAX_SIZE);
   ss = packetBuffer;
   if (ss == "a") camper();
   if (ss == "b") temperature();
   if (ss == "c") litres();
   if (ss == "d") multifunzione();
}
//ecc..
}

arduino manda i valori a Processing, 2 byte per avere tutta l'escursione della misura

Code: [Select]
void litres(){
 Udp.beginPacket( Udp.remoteIP(),  Udp.remotePort());

 bagnoo = analogRead (A13);
 cucinaa = analogRead (A14);
 chiare = analogRead (A15);

 Udp.write (lowByte (bagnoo));
 Udp.write (highByte (bagnoo));

 Udp.write (lowByte (cucinaa));
 Udp.write (highByte (cucinaa));

 Udp.write (lowByte (chiare));
 Udp.write (highByte (chiare));

 Udp.endPacket();
}


Processing riceve e incolla i 2 Byte

Code: [Select]
 
void receive( byte[] data ) {       // <-- default handler
  //void receive( byte[] data, String ip, int port ) {  // <-- extended handler
if (state ==0) {

   litribagno   = (data[0] & 0xff) |  ((data[1] ) << 8);
   litricucina = (data[2] & 0xff) |  ((data[3] ) << 8);
   litrichiare = (data[4] & 0xff) |  ((data[5] ) << 8);
 }


litribagno, la variabile di una lancetta, poi mappata

un po macchinoso ma funziona    :)


Title: Re: Arduino comandato da Processing via web tramite pc o smartphone Android
Post by: testato on Dec 21, 2013, 12:40 am
Come fai con i rele a due bobine ad usare poi i pulsanti presenti nel camper ? Dovresti usarli attaccandoli al micro, ma allora viene meno il concetto di appoggiarsi all impianto e non di mettersi in parallelo.
L'unica soluzione per state in parallelo e quindi poter senza problemi smontare il micro per aggiornamenti o guasti, senza intaccare il funzionsmento è di appoghiarsi su relè esterni passo passo, con un ulteriore tele lato micro che fa da pulsanye
Title: Re: Arduino comandato da Processing via web tramite pc o smartphone Android
Post by: camperos on Dec 21, 2013, 06:32 am
gia, ho detto una cavolata non ci avevo pensato..
poi tra l'altroessendo un camper a rischio di incendio, nonostante i soli 10 w di assorbimento dei led conviene mettere un rele di u7na certa dimensione.....indipendente da arduino
quindi devo, sul rele luci camper avere un contatto libero per indicare ad arduino lo stato del rele
e su arduino dei micro rele che agiscono come  pulsante (ad impulso, quindi non vanno mai tutti assieme) del camper,
eviiterei se possibile circuiti elettronici aggiuntivi
Title: Re: Arduino comandato da Processing via web tramite pc o smartphone Android
Post by: camperos on Jan 09, 2014, 01:03 pm
ho finito i miei collaudi anche via sim
quindi non solo android via wifi ma anche via cell.

calcolando, ammettendo che  i tuoi byte sono 30 ogni 2 secondi e,
nel mio caso ogni 6 byte ogni 2 secondi, sono...

andando 24 ore su 24,
sono circa 69.000.000 (69 milioni) di byte, calcolando che un contratto sim dati danno circa
2 gigabyte (2.000.000.000) 2 miliardi di byte al mese...
c'è spazio per fare altre cose  :smiley-mr-green:
spero di non aver sbagliato i conti .

Title: Re: Arduino comandato da Processing via web
Post by: camperos on Feb 14, 2014, 01:03 pm

per ora il tutto  sembra andare a buon fine, mettendo  i "float" a   pulsanti spie ecc   i valori visualizzati sembrano ok,
domani sera provo meglio
:)

rimetto passo passo come attivare android
------------
Code: [Select]
caricare sketch Processing su Android

dicembre 2013
spero di non avere saltato qualche passo
provato su un pc portatile [b]vergine[/b]

preparazione per  tablet o cell:
nel tablet si deve spuntare "debug USB", ma l'opzione non è visibile , qui sotto istruzioni per il 4.2 (per altri android cercare in internet)
http://www.thesmarthacks.com/2013/04/enabling-usb-debugging-mode-on-android.html

preparazione PC:
Processing 2.0.3 scaricabile dal sito (altri non so, pare che la 2.1 abbia problemi)

click ,aprire processing
click, tendina con "java"
click, add mode
click, install "android mode"
attendere il download
click, chiudere tutti i processing

click, riaprire processing
click, tendina con java
click, android
errore manca "SDK"
click, NO
siete reindirizzati sul sito download (nel caso non venite indirizzati, https://developer.android.com/sdk/index.html)

click, "use an existing ide"
click, download SDK for Windows (sono circa84 mega)
estrarre il file compresso

installare e segnarsi dove viene installata "SDK manager" = (punto importante!!)

si apre da solo "SDK manager"
click,install x (10?) package (gia spuntati da loro)
click,accept license
30 minuti il download

scaricare ancora:
spuntare "android 2.3.3 (API 10) (4 file, non servono tutti...ma alcuni indispensabili)
click,accept license
20 minuti il download

click, close
click,chiudere "android SDK manager"
click, chiudere tutti i processing se aperti

click, aprire processing
errore manca SDK
click, si
si apre esplora file (chiede dove è la cartella SDK)
cercare cartella SDK (segnata precedentemente) (android SDK contenente dei file e cartelle)
OK
click, chiudere tutti i processing se aperti


click,aprire processing
collegare il tablet o cell con cavetto USB

provare se il tutto è andato a buon fine

ad esempio:

click,file
click,esempi
click,basic
click,array
ci vogliono circa 50 secondi

se dovete comunicare con arduino ricordarsi di spuntare i relativi permessi
Processing --> android --> sketch permission -->
spunta "internet" se si ha ethernet shield
due spunte "bluetooth" per bluetooth
ecc..


non lo consiglio, ma comunque per chi vuole provare con Processing 2.1.1
Code: [Select]
ho provato con Processing 2.1.1 e con
Arduino 1.5.5r2
su un nuovo hardDisk per non intaccare qualcosa in Processing 2.0.3.

ebbene, senza far altro oltre quello descritto sopra, per farli funzionare con android si deve aggiungere il percorso "javac" nella Path di windows.
nel mio caso, windows 8:
-click destro nell' angolo in basso sx dello schermo (start)
-click "pannello di controllo"
-click "sistema"
-click -impostazione di sistema avanzate (a sinistra)
-click "avanzate"
-click "variabili d'ambiente"
in "variabili di sistema" fare scorrere fino a trovare  "Path"
due click su "path"
senza cancellare nulla  ]:D  andare in fondo alla stringa e aggiungere:
nel mio caso....
;C:\Program Files\Java\jdk1.7.0_25\bin\
praticamente inserire il vostro percorso dove si trova "javac" che quasi sicuramente è diverso dal mio.
click "ok"
click "ok"
click "ok"

a me funziona, devo comunque collaudare bene.

fonte:utente calsign
http://forum.processing.org/two/discussion/2928/has-anybody-had-success-with-procesing-2-0-3-and-android-