Problema comunicazione seriale e php

Ciao a tutti. In questo periodo mi sto interessando riguardo l’arduino e le sue funzionalità.Ma iniziano già i problemi:
da arduino ricavo un valore della temperatura in C° grazie al componente Lm351DZ, ora vorrei inviarlo tramite porta seriale al mio pc. Ma con php non riesco. utilizzando il seguente codice,il php riceva un valore vuoto e assegna a extByte zero :

<?php
echo "Apertura
";
$fp = fopen ("COM3:", "r");
if (!$fp)
  {
  echo "Not open
";
  }
 else
  {
  echo "Open
";
  $extByte=fscanf($fp,"%d");
  echo ("Voltaggio:".$extByte."
");
  echo ("lunghezza:".strlen($extByte)."
");
  fclose($fp);
  }
 ?>

edit by mod: per favore includi il codice usando gli appositi tag

Temperatura.ino (359 Bytes)

Per curiosità ... hai un WEB server installato sul tuo PC e vuoi far girare pagine PHP che recuperano dati da seriale ?

Perché altrimenti ... non capisco l'uso di PHP ... :roll_eyes:

Guglielmo

Ah si scusa.Utilizziamo Easy php.

Quindi WEB server local e PHP ... ok.

Puoi mettere il codice del programma che hai scritto su Arduino per comunicare (... mi raccomando, racchiuso tra i tag CODE che, in fase di edit, ti inserisce il bottone # ... terzultimo della seconda fila) ?

Guglielmo

Il codice arduino è allegato al primo post, questo dovrebbe comunicare con il php da seriale senza l’utilizzo della ethernet shield

void setup() {
}
 
void loop() {
  float somma=0;
  int sensorValue=0; 
for (int x=0;x<10;x++)
    {
    sensorValue = analogRead(A3); 
    somma = somma + sensorValue;
    }
  somma = somma/10;
  float temp =0;
  temp= (somma*500)/1023;
  int extByte= (int)(temp*10);
  Serial.begin(9600);
  Serial.println(extByte);
  Serial.end();
  delay(1000);
}

A parte il fatto che no capisco lo scopo di aprire e chiudere in continuazione la seriale, per cui ... metti il Serial.begin(9600) nel setup() ed elimina quel Serial.end() poi ... mi viene un dubbio ...

... come hai collegato Arduino alla seriale del tuo PC ???

Guglielmo

grazie per i suggerimenti, comunque lo ho collegato tramite usb

Ok , fatte le modifiche dimmi come va ... perché così invii dei dati sulla seriale ogni secondo quindi ... dall'altra parte qualche cosa dovresti ricevere.

Ricordati però una cosa ... NON stai inviando un INT (quindi 2 bytes), ma stai inviando una stringa di caratteri che lo rappresentano !

Mi spiego, se extByte valesse 0x55AA ovvero il numero 21930, tu sulla linea seriale NON riceveresti i due caratteri 0x55 e 0xAA, ma i caratteri ASCII "21930" più il CR ... tienine conto !

Guglielmo

Grazie per le dritte. Ma il problema è che non ricevo proprio niente su php. O meglio crea la connessione, ma facendo echo non stampa il valore e come lunghezza da zero…
comunque il nostro range di valori va da 0 a 30 … sapresti come potremmo fare a visualizzarli senza dover tenere conto dei caratteri ascii?

Se i vostri valori vanno da 0 a 30 allora potere risparmiare memoria dichiarando extByte di tipo byte e poi ...

... se guardi la classe Serial (che ti consiglio di studiare con attenzione) vedrai che c'è il metodo Serial.write() che serve proprio ad inviare i dati in binario.

Guglielmo

Ho seguito il tuo consiglio ma da php continuo a leggere un valore nullo di lunghezza zero.

PHP:

<?php
echo "Apertura
";
$fp = fopen ("COM3:", "r");
if (!$fp)
  {
  echo "Not open
";
  }
 else
  {
  echo "Open
";
  echo(strlen(fread($fp,1)));     // STAMPA 0
  echo (fread($fp,1));     // NON STAMPA NULLA
  }
 ?>

ARDUINO

float somma;
int sensorValue;
float temp;
byte extByte;
void setup() {
  Serial.begin(9600);
}
 
void loop() {
  somma=0;
  sensorValue=0; 
for (int x=0;x<10;x++)
    {
    sensorValue = analogRead(A3); 
    somma = somma + sensorValue;
    }
  somma = somma/10;
  temp =0;
  temp= (somma*500)/1023;
  extByte=(byte)(temp/10);
  
  int lung=Serial.write(extByte);     //UTILIZZO  SERIAL.WRITE
  Serial.println(lung);               //LUNGHEZZA DI UN BYTE
  delay(1000);
}

Mi sono permesso di sistemare e rendere un po’ più leggibile la parte Arduino (… ti consiglio di usare, nell IDE, Tools → Auto Format) :

float somma;
int sensorValue;
float temp;
byte extByte;


void setup() {
   delay(1000);
   Serial.begin(9600);
}


void loop() {
   somma=0;
   sensorValue=0; 
   for (int x=0; x<10; x++)
   {
      sensorValue = analogRead(A3); 
      somma = somma + sensorValue;
   }
   somma = somma/10;
   temp =0;
   temp= (somma*500)/1023;
   extByte=(byte)(temp/10);
   Serial.write(extByte);     //UTILIZZO  SERIAL.WRITE
   delay(1000);
}
  1. quando usi la porta seriale, nel setup metti sempre un delay() iniziale. E’ un abitudine che, in alcuni casi, ti eviterà problemi con il bootloader di Arduino.

  2. inutile salvare “lung” e stamparlo … la Serial.write() di UN byte ritornerà sempre e solo 1 … memoria e tempo perso :wink:

Così come è la parte Arduino non dovrebbe dare alcun problema e, ad intervalli di 1 secondo, dovrebbe trasmettere un BYTE sulla porta seriale. la cosa la dovresti verificare notando il lampeggio del LED TX.

Il problema è sicuramente nella parte PHP …
… non sono un esperto, ma credo che il motivo del mal funzionamento sia che stai usando delle chiamate che si aspettano un carattere di fine trasmissione … prova ad usare la “fgetc” che legge solo un carattere e lo ritorna :wink:

Guglielmo

Una cosa che mi viene in mente e che può succedere di scordare, è quella di avviare EsayPhP come Amministratore, altrimenti l'OS non ti dovrebbe dare i privilegi per leggere le porte COM ( che comunque su Windows danno alcuni problemi ).

Ciao :slight_smile: