PrettyPrint

domenica 14 febbraio 2010

LM35+LCD+web+MySQL - 4) Fetcher

Il primo script è fetcher, incaricato di aprire la porta seriale, inviare un carattere convenuto ('s' nel nostro caso) leggere la temperatura che gli invia Arduino e stamparla.

-----------------------------------------------------------------------------------------------------------

Prima di tutto, bisogna aggiungere l'utente sotto il quale gira il demone http predefinito (Apache), al gruppo dialout; diversamente, dalla pagina web non sarà possibile accedere ad Arduino.

Infatti solo gli utenti di questo gruppo hanno il diritto di accedere alle periferiche.
Nel caso di Ubuntu l'utente di Apache è www-data , quindi da shell si lancierà:

$ sudo usermod -a -G dialout www-data


Una volta modificato, riavviare Apache:

$ sudo /etc/init.d/apache2 restart


Le modifiche così apportate saranno applicate definitivamente.

-----------------------------------------------------------------------------------------------------------

Agli inizi avevo provato con phpSerial (una libreria in PHP per la gestione della seriale), ma ho avuto molti malfunzionamenti spesso subdoli che mi hanno portato a sostituirla in favore di Device::Serial Port (http://search.cpan.org/dist/Device-SerialPort/) una libreria Perl per la gestione della seriale davvero efficiente e facile da impiegare.

La cosa senz'altro più interessante di questa libreria è che consente di disabilitare la linea DTR e quindi di prevenire l'autoreset di Arduino 10000 ogni qualvolta si invia un dato sulla seriale.

Per installare Device::Serial Port da Ubuntu/Debian:

$ sudo apt-get install libdevice-serialport-perl


Essendo gli altri script in PHP si è usata una funzione wrapper PHP ( fetchTemp() ) che fa semplicemente il lavoro di richiamare da sistema lo script fetcher.pl e riporlo in una variabile a disposizione degli altri script in PHP.

Ecco i due script:


FETCHER.PL



#!/usr/bin/perl -w

#########################################################################################################
#
# Motivazione: preleva e stampa a video il valore di temperatura acquisito da Arduino.
#
# Autore : Francesco Parisi (fparisi at tiscali dot it) , (fparisi at gmail dot com)
#
# Richiede : Device::SerialPort <http://search.cpan.org/~cook/Device-SerialPort-1.04/SerialPort.pm>
#
# Su Ubuntu: $ sudo apt-get install libdevice-serialport-perl
#
#########################################################################################################


use strict;
use Device::SerialPort;

my $portName = "/dev/ttyUSB0"; # identificativo seriale/USB usata
my $bps = "9600"; # velocità in bps
my $car = 's'; # carattere convenuto per la richiesta dati


# Costruttore (apre la porta e impegna le risorse hw)

my $port = Device::SerialPort->new( $portName )
|| die "Impossibile aprire $portName !\n";


# Configurazione trasmissione

$port->databits(8) || die "Impostazione databits fallita";
$port->baudrate($bps) || die "Impostazione baudrate fallita";
$port->parity("none") || die "Impostazione parity fallita";
$port->stopbits(1) || die "Impostazione stopbits fallita";
$port->dtr_active(0) || die "Impostazione dtr fallita"; # disabilita linea DTR (previene autoreset di Arduino)
sleep(1); # attendi 1s

# Invia carattere convenuto per la richiesta della temperatura

$port->lookclear; # svuota buffer
$port->write($car); # invia carattere convenuto


# Legge dato da seriale (in pooling)

my $gotit = ""; # dato letto

until ("" ne $gotit) {
$gotit = $port->lookfor; # poll until data ready
die "Aborted without match\n" unless (defined $gotit);
}


# Distruttore (chiude la porta e rilascia le risorse hw)

$port->close || warn "Chiusura porta non riuscita!\n";

# Stampa il dato letto

printf "%.1f\n", $gotit;





Lo script wrapper in PHP, FETCHER.PHP:


<?

/*************************************************************************************************
*
* Motivazione: funzione "wrapper" per lo script Perl di fetch della temperatura da Arduino
*
* Autore : Francesco Parisi (fparisi at tiscali dot it) , (fparisi at gmail dot com)
*
*
*************************************************************************************************/

function fetchTemp()
{
$perlCmd = '/usr/bin/perl'; // il comando Perl completo del suo path
$path = '/home/frank/public_html/'; // path allo script Perl (completo di '/' finale)
$script = 'fetcher.pl'; // nome script Perl

$temperature = exec ( $perlCmd . ' ' . $path.$script );
return $temperature;
}
?>




Codice evidenziato generato con Generator: GNU source-highlight 3.1
by Lorenzo Bettini http://www.lorenzobettini.it http://www.gnu.org/software/src-highlite

Nessun commento:

Posta un commento

Posta un commento