Untegrazione Arduino - PHP - REST

Ciao a tutti,

Avrei la necessità di un vostro aiuto per un’applicazione che sto cercando di sviluppare.
Anzitutto vi spiego le mie esigenze: ho creato una webapp in PHP che presenta una serie di pulsanti i quali rappresentano dei led sul mio Arduino (un domani potranno essere elettrovalvole, interruttori o altro ancora…). Alla pressione di un pulsante sull’app devo chiamare Arduino passandogli il codice dell’interruttore premuto. A questo punto, Arduino dovrà interpretare il codice ed effettuare lo switch del led corrispondente, dopodichè dovrà chiamare un servizio REST che si occuperà di aggiornare un DB con lo stato degli interruttori che mi tiene aggiornata la webapp.
Fin qui non ho avuto problemi, le cose che mi mancano sono:

  1. Come dev’essere strutturata la chiamata ad Arduino? Adesso per fare delle prove richiamo banalmente un’altra pagina PHP che mi simula l’arduino (la scheda me la porterà Babbo Natale)
  2. Quali comandi mi servono lato Arduino per ricevere la request, e come se ne può fare il parsing per ottenere il codice passato?
  3. Il mio REST accetta chiamate formattate come segue:
http://urldominio.provider.it/endPointREST/nomeFunzione/param1/param2

costruire la stringa su Arduino non è un problema, ma come faccio ad effettuare realmente la chiamata?

Grazie a tutti
Max

Ciao! Non sono un esperto in "internet con arduino" ma penso che dovrai studiarti la libreria ethernet

https://www.arduino.cc/en/Reference/Ethernet

Arduino è molto limitato sia come server, sia come client, quello che può fare è trasmettere e ricevere una stringa, quindi la tua comunicazione si deve basare sull'invio e ricezione di stringhe che poi andremo ad interpretare.

Quando dalla tua applicazione vuoi comunicare con arduino, arduino deve fungere da server, e trovi l'esempio nel link.

Quando arduino deve comunicare con un altro sito web, arduino deve fungere da client e trovi l'esempio del link.

In pratica per i tuoi scopi devi prendere gli esempi server web e client web, e creare un unico programma di arduino che faccia sia da server che da client.

Ripeto non sono esperto di arduino e internet, ma arduino è un piccolo microcontrollore e non un server o personal computer, quindi quando si parla di server e client con arduino è qualcosa di molto limitato.

Quello che vuoi fare tu “applicazioni web che comunicano con arduino” è complicato

Ma per comandare arduino tramite web la cosa potrebbe essere molto più semplice se si fa tutto lato arduino senza programmazione lato web.

Ecco un esempio:

http://ismanettoneblog.altervista.org/blog/lezione-14-come-accendere-lampada-remoto-arduino/

Ciao torn,

anzitutto grazie per le risposte.

...ma arduino è un piccolo microcontrollore e non un server o personal computer, quindi quando si parla di server e client con arduino è qualcosa di molto limitato

Si, è nata proprio da questa consapevolezza l'idea di sviluppare tutto "on web" e lasciare ad Arduino solo il compito di prendere una stringa, parsarla, eseguire un comando e una chiamata.

Cmq appena avrò un po' di tempo studierò bene la libreria che mi hai segnalato e anche la lezione segnalata.

Una domanda, qualcuno sa se esiste un emulatore per Arduino? Come anticipato non ho il controller con me, ma anche per una forma di protezione dagli errori potrebbe essere comodo fare i test su un emulatore (che invece di bruciarsi si limita ad andare in errore) per poi replicarli sul controller fisico...

Non conosco emulatori! Comunque per la comunicazione internet arduino ha bisogno della scheda ethernet
e non credo che ci sia un emulazione di arduino+ethernet !
Quindi non ti basta solo arduino ma dovrai avere anche la scheda ethernet

torn24:
Quindi non ti basta solo arduino ma dovrai avere anche la scheda ethernet

In pratica occorre QUESTA scheda qui da mettere sopra Arduino.

… anche se, personalmente, preferisco QUESTA di SeeedStudio che porta fuori il connettore ICSP :wink:

Guglielmo

Esiste questo ad esempio, benché vi siano utenti attivi sul forum che lo usano e ne consiglialo l'uso molti altri (me compreso) lo sconsiglio, innanzitutto non riesci a simulare il reale comportamento su molte cose (Es. connettività di rete che serve a te) e su altre ha dei bachi che portano a funzionamenti strani (Es. millis viene interpretato in modo diverso risetto al reale).
A livello unicamente software non puoi far nulla che danneggi Arduino, solo collegando male periferiche o pin ra loro, guarda questa guida e non fare quello che leggerai e meglio ancora documentati a fondo prima di collegare qualcosa, leggi datasheet dei componenti, cerca guide e conferme prima di prima di procedere e difficilmente avrai problemi.
Permettimi di dirti che il sistema che hai pensato si presta facilmente a fornire informazioni errate, basta un errore di connessioen che ti ritroverai il database disallineato rispetto al reale stato delle periferiche.
Visto che tabnto vuoi contattare Arduino per inviare il comando prevedi anche che la tua webapp invece di interagire con il database interroghi Arduino per sapere i vari stati delle periferiche e a quel punto usarei il dato "sicuro ed aggiornato" per mostrare a video i vari stati. A quel punto se vorrai lo inserirai nel database a scopo statistico ma non per scopi "decisionali".
E visto che dovrai iniziare da zero alcuni consigli che all'inizio di faranno dannare ma alla lunga ti salveranno il progetto:
MAI, MAI, MAI usare la classe String su Arduino (la troverai impiegata su molti tutorial su internet e anche negli esempi dell'IDE) soprattutto abbinata alla comunicazione di rete alla lunga (e cerca sul forum) di causerà problemi e blocchi improvvisi
Abituati sin dall'inizio a NON usare delay ma impara subito l'uso di millis(), ti eviterai di dover stravolgere il programma in seguito e nei casi in cui dovrai usare delay la logica del programma non varierà di una virgola

Esiste anche QUESTO che è decisamente megilo, ma è a pagamento (circa 20 AU$) … però:

  • Steps through the program line by line. If a new line is selected, the program will continue from that point.
  • Performs digitalWrite, digitalRead and PinMode for pins 0-53
  • analogRead for pins 0-16 and analogWrite for digital pins 0-53
  • Emulates Serial, LCD output, Ethernet, Servo, SD card, EEPROM, SoftSerial,SPI, Wire
  • If,while,for,switch, do whileloop functionality
  • Subroutines (multi-level) with arguments
  • View variables in real-time
  • Step Into, Step Over, Step Out of or Run mode
  • Ability to edit sketch or open in Arduino IDE
  • Tabs for separate files in the sketch
  • Context-sensitive help
  • 2 and 4 line LCD support only with improvised CGRAM
  • 2 dimensional arrays (without initialisation)
  • BreakPoint now with a conditional option
  • load custom libraries automatically after setting the Library Directory
  • Change the font, size and style of the Simulator
  • Advanced watch for easy variable viewing
  • Minimize mode for demo/training
  • Limited support for custom libraries
  • Limited support for pointer and structures

Certo, è e rimane comunque un “emulatore” con tutti i limiti del caso … ::slight_smile:

Come ti hanno detto, non so se valga la pena di usare un emulatore o se, facendo essenzialmente attenzione ai collegamenti, usare direttamente il vero hardware :slight_smile:

Guglielmo

Ancora grazie per le risposte.

Come anticipato, l'emulatore lo utilizzerei in questa fase embrionale, nella quale non ho ancora a disposizione una scheda fisica.

Effettivamente solo via sw non posso fare danni, o almeno nulla che con un semplice riavvio non si possa risolvere.

Tinkercard non mi ispira... sembra più un giocattolino che un qualcosa che possa davvero fare una discreta emulazione, mentre quello di Virtronics sembra (preciso "sembra") fatto meglio, è a pagamento, ma la versione FREE scaricabile in pagina è utilizzabile per 45gg e come scritto:

(Note: After 45days of use or 200 sketches (shown on startup in lower StatusBar) there is a delay timer on loading a sketch and code limit of 150 lines)

Santa Claus dovrebbe arrivare prima... :smiley:

Interessante inoltre la riflessione di fabpolli, in effetti se Arduino non dovesse riuscire a contattare il DB per qualsiasi motivo, l'app avrebbe una situazione diversa da quella reale, tipo se spegnessi un'elettrovalvola di irrigazione in balcone, rischierei di ritrovarmi col condominio allagato anche se a me dovesse risultare chiusa... :smiley: :smiley: :smiley:
Vero anche che se il problema fosse legato alla rete non risolverei comunque, in quanto non riuscirebbe a comunicare con l'app, di conseguenza dovrei trovare un sistema di emergenza tipo

if (!connessoAllaRete){
chiudiTutteLeValvole();
spegniTutteLeLuci();
ecc...
}

Dite che nelle lib della Ethernet c'è qualcosa del genere?

Ti ho detto che avere applicazioni web che comunicano con arduino, è più complicato ma anche meno sicuro! Infatti come gli esempi di lasciare un rubinetto aperto...

Leggo dalla tua presentazione che sei uno sviluppatore web, forse è una deviazione professionale quello che vuoi fare.
Se invece usassimo tutto il codice web su arduino, sarebbe un sistema più sicuro oltre che molto più semplice, io ho una pagina html dove invio comandi ad arduino "è un po come avere pulsanti a distanza" arduino mi risponde con una pagina html, per cui in base alla pagina html che mi invia arduino io so l'esito del comando.
Ripeto è una cosa semplice ma più affidabile, e quindi più sicura.
Comunque per la tua deviazione professionale dubito che cambierai idea :wink: :slight_smile:

Secondo me stai affrontado il problema dal punto di vista errato, Arduino NON è un server web sempre connesso e comunque occorre sempre prevedere lato microcontrollore dei sistemi di sicurezza indipendenti dall'utente ovvero apri un elettrovalvola che riempie una vasca che se non intervieni allaga tutto? Bene il modo corretto di procedere non è verificare la connettività e nel caso chiudere tutto ma usare un galleggiate e Arduino sa che se ha aperto l'elettrovalvola dovrà verificare se il galleggiate ha raggiunto il livello allora dovrà chiudere l'elettrovalvola, inoltre ci dovrà essere un "fine corsa" che se il galleggiante supera il livello prestabilito massimo interrompa l'alimentazione alla pompa via hardware in questo modo se la MCU si blocca comunque non allaghi tutto. E' solo un esempio i sistemi si sicurezza vanno implementati in base a cosa si sta comandando ovviamente ma è per rendere l'idea.
Altro esempio metti che comandi le luci (suppongo tu stia pensando all'acquario a questo punto) e si interrompe la connessione cosa fai lasci i pesci al buio, senz'acqua e senza cibo? Direi che non è bello :slight_smile:

Secondo me devi proprio cambiare punto di vista, ovvero Arduino gestisce in locale tutto ciò che serve, luci, acqaa ecc. e SE interrogato invia il suo stato "luci, pompe, ecc." inoltre accetterà comandi da remoto che interpreterà ed eseguirà se ci sono le condizioni (innutile forzare da remoto la pompa se l'acuqa è già sufficiente).
Lato web lo devi vedere come dashboard di controllo e al limite operativa dove per ogni comando impartito subito dopo invia richiesta dello stato e si aggiorna

@torn: purtroppo per lavoro sono spesso costretto a cambiare idea, anche quando è palese che l'idea che ti propongono è una c@22@7@... :smiley:

Qui so di non sapere, quello che posso fare è proporre delle mie riflessioni e imparare dalle vostre risposte. Ovviamente sono abituato a riflettere nel modo sbagliato per come lavora un microcontrollore, ma non è detto che non riesca ad imparare, no?!? :wink:

@fabpolli:

Secondo me devi proprio cambiare punto di vista...

si, sembra abbastanza evidente... purtroppo (per fortuna) il mio lavoro mi ha portato a sviluppare principalmente interfacce di controllo remoto, quindi credo sia normale che io ragioni in questo modo.

Spero continuiate ad avere la pazienza di supportarmi (e sopportarmi)

Ah... l'idea dell'HTML installato direttamente su Arduino non è affatto una soluzione da scartare, alla fine, come dici tu, il controllo (e la sicurezza) si autogestiscono, ma in ogni caso da remoto posso intervenire manualmente sui controlli con dei link che scatenano determinate azioni...

Come già detto non è il mio modo di lavorare, ma in questa diversa ottica è molto conveniente, alla fine posso fare le stesse cose, anche trasformarla in una web application per cellulare e gestirmela da remoto...

in questo modo se riesco a connettermi posso fare quello che voglio, ne non dovessi riuscire Arduino si autogestisce...

Per la cronaca non è un acquario, ma mi serve per innaffiare le piante in balcone quando non sono a casa. So che ci sono milioni di esempi, ma se copiassi gli altri non imparerei niente, no?!?

Quella del html non è un idea mia :slight_smile: Sono esempi che ho visto in rete, il secondo link che ti ho proposto
è appunto un esempio.
Nell'esempio la pagina inviata da arduino era composto da un solo bottone, l'immagine del bottone la recuperava da un sito online tramite src. Però nulla vieta di inviare una pagina html con tutti i pulsanti necessari.

A parte la memoria limitata di ardunio che pone dei limiti, ti potresti sbizzarrire con html ma anche con css

generalecaster: Senza stare ad impazzire, per ciò che vuoi fare tu, c'è già una libreria bella che fatta, gira anche su ESP8266 (dove hai più memoria e una migliore gestione della rete) è manteunta e supportata da un utente attivo del forum (Sukkopera) e la trovi QUI.

L'unica pecca è che c'è poca documentazione, ma ci sono svariati esempi ... studiando quelli (es. quello che accende e spegne un LED da pagina WEB) dovresti capire ... :slight_smile:

Guglielmo

Se non hai già ordinato la scheda (Arduino Uno) ti consiglio di meditare l'acquisto direttamente della MEGA, l'ethernet shield la puoi usare su entrambe le schede ma la UNO di verrà stretta in poco pochissimo tempo visto il progetto per cui la vuoi impiegare.

generalecaster:
Per la cronaca non è un acquario, ma mi serve per innaffiare le piante in balcone quando non sono a casa. So che ci sono milioni di esempi, ma se copiassi gli altri non imparerei niente, no?!?

E' il bello di fare le cose per divertimento e non per lavoro, poter reinventare la ruota per imparare senza copiaincollare le cose degli altri senza capirci un tubo vuoto, spesso si vedono progetti che non vanno avanti seppur la modifica è banale ma se hai fatto copia incolla manco quello riesci a fare. Però bisogna semrpe tenere a mente di non disdegnare librerie e progetti già pronti da usare e comprendere.

P.S = Preceeduto da Guglielmo :slight_smile:

Perfetto... per ora ringrazio di cuore tutti, a questo punto mi metto a studiare, mi sembra la cosa più sensata.
Appena prenderò Arduino con tutti gli ammenicoli necessari e riuscirò a farlo vi pubblicherò i risultati...

Grazie ancora