LEOSER WEB


 

postheadericon ARDUINO

Controllo Arduino con PHP - DESCRIZIONE Di PROGRAMMI (last: 31/10/2012)
SONO INDIETRO.DEVO AGGIORNARLO!

Mi auguro che possiate trovare questa applicazione utile.
E' tutto OPENSOURCE. Una sola preghiera: se apportate modifiche o (facile!) migliorie o la usate per qualche vostro progetto, mettete le cose a disposizione di tutti.

DESCRIZIONE Di PROGRAMMI
Senza entrare nella descrizione riga per riga dei sorgenti ecco un breve cenno delle principali funzioni svolte:

arduino_ajax.php
E" il punto di ingresso dell'applicazione (lo potete anche rinominare in index.php)
Si occupa di:
1) Creare tutti gli array di sessione
2) Aprire la comunicazione con la porta
3) Elencare le funzioni dell"estensione (poi si tira via)
4) Lanciare il pannello html (panel_ajax.php) Gli array creati, bidimensionali, sono:

Per i digitali:

																	$_SESSION['val_digital_pin']=array(
																	'valore'=>array(),
																	'default_type'=>array(),
																	'current_type'=>array(),
																	'last'=>array(),
																	'stato'=>array()
																	);
																

valore=valore corrente del pin
default_type=tipo del pin (per i digitali d)
current_type = tipo corrente del pin (d=digitale p=pwm se possono)
last= data/ora ultima operazione sul pin
stato=abilitato/disabilitato (0=enabled -1=disabled)

Simile quello per gli analogici con qualche piccola aggiunta:

																$_SESSION['val_analog_pin']=array(
																'valore'=>array(),
																'default_type'=>array(),
																'current_type'=>array(),
																'map'=>array(),
																'constrain'=>array(),
																'vref'=>array(),
																'last'=>array(),
																'stato'=>array(),
																);
															

valore=valore corrente del pin
default_type=tipo del pin (per gli analogici a)
current_type = tipo corrente del pin (a=analogico d=digitale)
last= data/ora ultima operazione sul pin
stato=abilitato/disabilitato (0=enabled -1=disabled)
map=valori del map nel formato xx:xx:xx:xx
constrain= valori del constrain nel formato xx:xx
vref=valore del riferimento tensione
L'array dei controlli, con un controllo di prova gia inserito, e' questo:

																##  SURVEY CON UNA PROVA 
																$_SESSION['survey']=array(
																'command'=>array('if#a#3#>#50#d#9#1#1#1#0'),
																'control_d_a'=>array('a'),
																'control_pin'=>array('3'),
																'control_operator'=>array('>'),
																'control_value'=>array(50),
																'action_d_a'=>array('d'),
																'action_pin'=>array('9'),
																'action_set_pin'=>array('1'),
																'action_value'=>array('1'),
																're_action_set_pin'=>array('1'),
																're_action_value'=>array('0'),
																'flag_action'=>array(' '),
																'elapse'=>array(10),
																'last'=>array(0),
																'human'=>array('Analog 3>50>> Digital 9 HIGH else LOW'),
																);
															
Vi lascio i valore della colonna in modo che sia piu' semplice l'associazione;

'command'=>array('if#a#3#>#50#d#9#1#1#1#0')=codifica del comando da passare a survey.php
'control_d_a'=>array('a')=tipo pin del controllo
'control_pin'=>array('3')numero pin del controllo
'control_operator'=>array('>')=operatore tra il valore che verra' letto sul pin di controllo ed il valore control_value
'control_value'=>array(50)=valore da confrontare con il valore letto sul pin di controllo
'action_d_a'=>array('d')=tipo pin dell'azione
'action_pin'=>array('9')=numero pin dell'azione
'action_set_pin'=>array('1')=set del pin dell'azione (output/input) in condizione vera
'action_value'=>array('1')=valore da inviare al pin dell'azione in condizione vera
're_action_set_pin'=>array('1')=set del pin dell'azione (output/input) in condizione falsa
're_action_value'=>array('0')=valore da inviare al pin dell'azione in condizione falsa
'flag_action'=>array(' ')=flag di azione eseguita (evita che vengano ripetutamente inviati i valori di set o reset)
'elapse'=>array(10)=tempo di sampling del controllo
'last'=>array(0)=timestamp ultima esecuzione
'human'=>array('Analog 3>50>> Digital 9 HIGH else LOW')=lettura umana del command


panel_ajax.php
E" la pagina html dell'applicazione
Le varie parti sono gia' state illustrate sopra.Da un punto di vista funzionale da qui vengono richiamati il write_slider.php (che si occupa di creare gli sliders di controllo e gestrine il funzionamento) e viene caricato il jquery_survey.php (vedi sotto). All'inizio e' presente uno script importante che , in jquery/ajax, manda a include_send.php(vi ricordate che avevo scritto che questo programma era chiamato sia da ajax che da php).
Riporto la parte saliente:

																	$.ajax({
																	type: "POST",
																	url: "include_send.php",
																	data: "data="+opt+"&delay="+delay+"&log="+log,
																	async: false,
																	success: function(msg){
																	------------------------------
																	ALTRE ISTRUZIONI
																	------------------------------
																

Lo script si occupa inoltre di portare nella pagina i valori di ritorno da Arduino
In fondo sono presenti alcuni piccoli script di servizio e uno un po' piu' importante, questo:

																	function update_array(string)
																	{
																	$.ajax({
																	type: "POST",
																	url: "update_array.php",
																	data: string,
																	async: false,
																	success: function(msg){
																	------------------------------
																	ALTRE ISTRUZIONI
																	------------------------------
																	}
																	})
																	}
																
Come si puo' intuire da qui parte il jquery/ajax per tenere aggiornati gli array di sessione dopo ogni operazione sui pin.


jquery_survey.php
Script jquery/ajax per la run/stop del demonetto e le gestione dei controlli (inserimento/modifica/cancellazione). I controlli vengono scanditi ogni 5 secondi (ho usato questo valore perche' mi sembra accettabile per uso amatoriale/hobbystico); riporto il pezzo di codice che fa questa cosa;

																	var Id = null,refreshId = null,interval=5000;
																	Id=setInterval(function() {
																	data=($('#log_survey').is(':checked'))? 's' : 'n';
																	refreshId=$.ajax({
																	type: "POST",
																	url: "survey.php",
																	async: false,
																	data : "log="+data ,
																	success: function(msg) {
																	------------------------------
																	ALTRE ISTRUZIONI
------------------------------ }, interval);

Funziona piu' che egregiamente e, come si vede, passa i dati(sono i parametri del controllo) a survey.php che li instradera' verso Arduino, dopo averli esplosi (ricordate tutti quei caratteri "#" nei pacchetti)tramite include.send.php.


survey.php
Lavora in stretto collegamento con jquery_survey.php.Chiamato ogni 5 secondi, scandisce il survey array, prepara i comandi da mandare ad arduino e , sulla base della risposta e dei valori impostati nel controllo, attiva o meno l'azione contenuta.
Ad esempio, se prendiamo il comando di prova inserito nell'array (lo riporto di seguito per comodita';


if#a#3#>#50#d#9#1#1#1#0 10 Analog 3>50 >> Digital 9 HIGH else LOW
viene richiesto che ogni 10 secondi venga prelevato il valore sul pin analogico 3 e di effettuare il controllo se sia maggiore (>) di 50.(nella stringa di comando il controllo e' rappresentato dalla sottostringa #a#3#>#50#).
Se questa condizione e" VERA allora imposta il pin digitale 9 ad HIGH (esempio un led che si accende) altrimenti lo imposta a LOW (0-spento).(nella stringa di comando l'azione e' rappresentato dalla sottostringa #d#9#1#1#1#0.
In sintesi #d#9#1#1# rappresenta l"azione da effettuare se la condizione e" VERA, #d#9#1#0# quella per condizione FALSA

il funzionamento e' questo:
1) ogni 5 sec survey.php viene chiamato dalla jqyery/ajax
2) inizia un loop per ogni elemento dell array_survey (chiamiamolo A)
3) testa se il tempo di sampling e' trascorso dall'ultima lettura con time() - A[last]> A[elapse]
4) se vero prepara il pacchetto di richiesta lettura per arduino e ne attende la risposta
- confronta il valore ricevuto con quello impostato in A[control_value] e li mette in relazione con A[control_operator]
- se il confronto e' vero imposta il messaggio di allarme, aggiorna gli array survey e dei pin e esegue l'azione contenuta in A.
- torna a jquey_survey.php la stringa con i parametri necessari alla visualizzazione sul pannello della condizione di errore.
5) se il tempo non e' ancora trascorso passa al successivo elemento di A oppure, se l'elemento e' vuoto, esce
6) se il tempo e' trascorso ma il confronto e' falso aggiorna gli array dei pin A[control_pin] con il valore letto e passa al successivo elemento di A oppure, se l'elemento e' vuoto, esce
In effetti fa un po' piu' di cose ma il succo e' questo.Ed e' anche chiaro che con una cosa cosi' non e' che si stia facendo realtime!Pero', come ripeto, per uso hobbistico, didattico e anche per qualche applicazione penso che vada piu' che bene.


include_send.php
E' il programma che si occupa esclusivamente di mandare comandi ad arduino e riceverne la risposta.
Ricalca un po survey.php ma e' molto piu' leggero e deve fare molte meno operazioni.
E' impostato come singola funzione ed e' chiamato sia da jquery/AJAX che da php.
Il funzionamento e' questo:
1) riceve il pacchetto dat trasmettere (o via post da ajax o come parametro da php)
2) costruisce il pacchetto da inviare ad arduino; per gli analogici va a vedere se ci sono impostazione map, constrain e vref da mandare e le incorpora
3) manda il pacchetto e attende la risposta
4) prepara la stringa di ritorno in funzione dell'operazione richiesta; (con una set arriva solo il return code , con una read arriva return code e valore letto)
5) aggiorna gli array di sessione con i valori ricevuti
6) ritorna la stringa a chi l'ha chiamato


dump.php
E' una semplice pagina in autorefresh ogni 10 sec che mostra lo stato degli array di sessione; in effetti, e' un monitor di quello che sta accandendo e potrebbe essere la pagina di default per un collegamento al server da remoto giusto per tenere sotto controllo "se l'allarme e' scattato!).
Ricalca un po survey.php ma e' molto piu' leggero e deve fare molte meno operazioni.
E' impostato come singola funzione ed e' chiamato sia da jquery/AJAX che da php.
Il funzionamento e' questo:
1) Semplice loop fra gli elelmenti degli array di sessione
2) meta tag con refreh 10 sec;


write_slider.php
E' il gestore di tutti gli slider presenti nella pagina, dalla loro generazione, all'aggiornamento di alcuni valori degli array dei pin.
E' un file php che costruisce gli slider!
A seconda della loro funzione sono:
1) Slider di stato, per Abilitare/Disabilitare il pin.Ad ogni conclusione del suo movimento(stop: function) viene chiamato il programma update_array.php che si occupa di riportare l'informazione dello stato del pin nell'array e, se la posizione e' in disabilitato, viene inibita ogni azione sul pin.
2) Slider di tipo, per impostare la tipologia del pin.La tipologia puo essere : Digitali: d-p(p in caso di pin anche pwm) o d ; Analogici: a-d (come d si comporta esattamente come un digitale)
3) Slider di send, per inviare ai digitali i valori HIGH o LOW
4) Slider di pwm, per i digitali in pwm, la selezione del "tipo" pwm fa sparire lo slider di send e ne fa comparire uno verticale con scala 0-255.
Riporto un pezzo di codice di uno slider di stato, la parte saliente della trasmissione ajax a update_array:

																	---------------------------------
																	ALTRO CODICE
																	---------------------------------
																	$(function() {
																	$( "#slider_stato_d'.$x.'" ).slider({
																	value:0,
																	min: 0,
																	max: 1,
																	stop: function( event, ui ) {
																	$( "#tipo_d'.$x.'" ).val(  ui.value );
																	switch (ui.value)
																	---------------------------------
																	ALTRO CODICE
																	---------------------------------
																	/* INVIO AJAX PER AGGIORNAMENTO ARRAY */
																	$.ajax({
																	type: "POST",
																	url: "update_array.php",
																	data: "data=d;'.$x.';"+ui.value+"&mode=t",
																	async: false,
																	success: function(msg){
																	---------------------------------
																	ALTRO CODICE
																	---------------------------------
																

Il funzionamento e' questo:
1) Lo slider viene mosso;si attende l'evento di stop
2) Il valore della posizione e' (ui.value); lo slider in questione (stato) puo' assumere solo 2 valori (0=Enabled 1=Disabled)
3) Si preparano i dati per la post (nel nostro caso si tratta di un digitale); il valore e delimitato con ";" (data=d;'.$x.';"+ui.value) dove $x e' una variabile php valorizzata al momento dell'inclusione del programma.(**)
4) Si mandano a update_array,php che provvede ad aggiornare, in questo caso, lo stato del pin nell'array di sessione dei pin digitali con il valore 0 oppure 1.

(**) come ho scritto all'inizio, anche se il file e' un javascript, viene incluso come un php; con l'inclusione tutte le variabili php vengono valorizzate e, con echo, i vari pezzi di codice javascript vengono scritti nella pagina.In questo modo,con due cicli for (uno di 13 e uno di 5) mi preparo in un colpo solo tutti gli slider con i nomi, id, controlli, ecc.ecc.Complessivamente gli slider nella pagina sono circa 60.



IN COSTRUZIONE!........mandatemi senza problemi commenti, pareri e informazioni a :leowork2000[at]gmail.com

TOP