Mala lectura puerto USB ARUDINO vía PHP

Iniciado por Hurdano, 31 Mayo 2015, 00:49 AM

0 Miembros y 1 Visitante están viendo este tema.

Hurdano

Hola gentica.

Os vengo a comentar que estoy trasteando con arduino y raspberry pi, y bueno, el caso es que tengo creado un archivo index.php con un código para que se conecte al puerto serial de arduino e imprima los datos.

La conexión es correcta, lo que los datos no salen bien, es decir, tengo que refrescar la página muchas veces para que salga correctamente: Humedad 35.00% Temperatura: 28 *C (por poneros un ejemplo)
Y lo que sale otras veces es nada, o a mitad, etc.

Alguien sabe como podría leer correctamente estas cadenas de caracteres y que PHP las mostrara bien?He pensado quizás haciendo con un array, pero claro, el código de arduino también es muy especial, y no estoy seguro de si funcionará si pongo los datos que recoge por separado.

Si alguien alguna vez ha hecho algo, o sabe de algún método por favor que me lo diga. Llevo bastante rato buscando por internet, probando diferentes "soluciones" si se pueden llamar así, pero no me sirven ninguna.

Un saludo.

EDITO: JUU enserio no sabe nadie? joer, pero esque nose como hacer que PHP muestre la lectura entera que recibe del puerto serial conectado a Arduino, llevo días intentando solucionarlo, por favor si alguien le ha pasado lo mismo o tiene idea de como hacerlo que porfavor me diga alguna manera. Un saludo.

engel lex

algo de codigo para ver si no es que estás metiendo la pata en algo D:
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Hurdano

Perdona la tardanza, pero el material no disponía del material por estar en otro lguar de residencia. El código que tengo es este:

Arduino
Código (csharp) [Seleccionar]
#include <DHT.h>

// Sketch de prueba para sensores DHT humedad / temperatura
// Libreria para Sensores DHT

#define DHTPIN 7     // Pin del Arduino al cual esta conectado el pin 7 del sensor

#define DHTTYPE DHT11   // DHT 11


// Inicializa el sensor
DHT dht(DHTPIN, DHTTYPE);

// Configura Arduino
void setup() {
  Serial.begin(9600);
  Serial.println("HurdesGeek\n\nPrueba de sensor DHT11!");

  dht.begin();
}

void loop() {
  // Espera dos segundos para realizar la primera medición.
  delay(2000);

  // El sensor muestrea la temperatura cada 2 segundos}
 
  // Obtiene la Humedad
  float h = dht.readHumidity();
  // Obtiene la Temperatura en Celsius
  float t = dht.readTemperature();
 
  // Control de errores, valida que se obtuvieron valores para los datos medidos
  if (isnan(h) || isnan(t)) {
    Serial.println("Falla al leer el sensor DHT11");
    return;
  }

  Serial.print("Humedad: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperatura: ");
  Serial.print(t);
  Serial.println(" *C ");
}









El de PHP
Código (php) [Seleccionar]
<?php
$h 
'h'
$portAddress "/dev/ttyACM0";


echo (
"<h1>Temperatura y humedad</h1>");


echo (
"<p>Conectando...");

$port fopen($portAddress'w+');

if (!
$port)

{ echo 
"<br /> No se puede conectar con el puerto $portAddress";

}

else

{ echo 
"<br />Conectado con exito al puerto $portAddress";

}

echo (
"</p>");

fwrite($port'h','t');


echo 
fgets($port);


?>



La verdad es que me lío mucho con el tema de Arduino, y nose que cosas se pueden y no hacer con PHP con el código de Arduino. Si les llamo por variables por seperado podría resultar? Nose la verdad. Espero sus respuestas un saludo.

Regexp

#3
Cita de: Hurdano en 31 Mayo 2015, 00:49 AM
Hola gentica.

Os vengo a comentar que estoy trasteando con arduino y raspberry pi, y bueno, el caso es que tengo creado un archivo index.php con un código para que se conecte al puerto serial de arduino e imprima los datos.

La conexión es correcta, lo que los datos no salen bien, es decir, tengo que refrescar la página muchas veces para que salga correctamente: Humedad 35.00% Temperatura: 28 *C (por poneros un ejemplo)
Y lo que sale otras veces es nada, o a mitad, etc.

Alguien sabe como podría leer correctamente estas cadenas de caracteres y que PHP las mostrara bien?He pensado quizás haciendo con un array, pero claro, el código de arduino también es muy especial, y no estoy seguro de si funcionará si pongo los datos que recoge por separado.

Si alguien alguna vez ha hecho algo, o sabe de algún método por favor que me lo diga. Llevo bastante rato buscando por internet, probando diferentes "soluciones" si se pueden llamar así, pero no me sirven ninguna.

Un saludo.

EDITO: JUU enserio no sabe nadie? joer, pero esque nose como hacer que PHP muestre la lectura entera que recibe del puerto serial conectado a Arduino, llevo días intentando solucionarlo, por favor si alguien le ha pasado lo mismo o tiene idea de como hacerlo que porfavor me diga alguna manera. Un saludo.

No tengo mucha experiencia con arduino, no en este sentido. Pero mirando tu código es posible que te sea útil cambiar fgets por file_get_contents() para leer el "archivo" completo en lugar de una sola línea, sino, hacer un ciclo.. Dado que arduino seguirá imprimiendo en un loop infinito ¿no?

Espero te sea de ayuda, sino, un amigo en la universidad hizo algo por el estilo, también para una raspberry pi, pero en lugar de PHP usó python, lo que hace es twittear la temperatura, cada vez que llega a un punto crítico. Tiene el repositorio en github.


Edit

Quizá para resolver este problema te sirva que arduino lea, si existe determinada entrada (o si simplemente existe), imprima las últimas mediciones de temperatura. De manera que el PHP, le diga al arduino que imprima la última medición y le de un tiempo estipulado para hacer esto último. :rolleyes:

Acá encontré algo que puede ser útil, para usar fgets y fwrite. http://stackoverflow.com/questions/13114275/php-serial-port-data-return-from-arduino

Saludos
No todo el que deambula está perdido

engel lex

efectivamente como dice Regexp esto está mal...

por qué?
porque el protocolo http es un protocolo que abre, envía una cantidad de datos conocida y cierra. Debido a esto php solo envía datos al finalizar el script... así como el script se mantenga, el navegador esperará los datos y el script puede que termine porque se excedió su tiempo maximo de ejecución o porque el buffer de salida lleno el espacio de ram asignado... en ese caso enviará lo que tiene y un error...

a demás tienes un error en el uso de fwrite (sin contar que lo usas para nada)....

como puedes hacerlo?
por pasos, explico:

en el arduino debes leer en el serial lo que le enviará el php...

es decir... dejas lo que está fuera del setup y loop igual

Código (cpp) [Seleccionar]

float humedad;
float temperatura;
int recibido;

void setup() {
 Serial.begin(9600);
 dht.begin();
}

void loop() {

//variable con el dato recibido
 recibido = 0;//0 = no se recibió nada

//si hay info, leemos
 if (Serial.available() > 0) {recibido = Serial.read();}

 /*
   establecemos una tabla de valores para recibido para simplificar el proceso
   1 = leer datos desde el sensor
   2 = enviar datos por serial
 */

 if(recibido==1){
   humedad = dht.readHumidity();
   temperatura = dht.readTemperature();
   if (isnan(humedad ) || isnan(temperatura)) {  
     Serial.println("error");
   }else{
     Serial.println("leido");
   }
 }

 if(recibido==2){
   Serial.print(humedad);
   Serial.print(";");//uso esto como separador
   Serial.print(temperatura );
   Serial.print(";");//uso esto como separador
   Serial.println("fin");
 }
}


ya tenemos la estructura, coloco las variables como globales para que no haya problema en el loop y para volver a leerlas (el valor viejo) de ser necesario

el php, asumiendo que te funcione bie (nunca lo he probado con arduino)

Código (php) [Seleccionar]
<?php
$leer_sensor 
1;
$recibir_datos 2;
$portAddress "/dev/ttyACM0";
 
$port fopen($portAddress'w+');
 
if (!
$port){ 
  echo 
"<br /> No se puede conectar con el puerto $portAddress";
}else{ 
  echo 
"<br />Conectado con exito al puerto $portAddress";
}
echo (
"</p>");

//le digo al arduino que lea
fwrite($port$leer_sensor);

//si responde "leido" todo está bien, uso trim ara eliminar espacios y saltos de linea
if(trim(fgets($port))=="leido"){
  
//el sensor fue leido correctamente

  //le digo al arduino que me envie los datos
  
fwrite($port$recibir_datos);
  
//recibo los datos
  
$datos trim(fgets($port));

  
//separo los datos por ";" como fue planeado y queda separeado en 3 partes
  
$datos=explode(";",$datos);

  
//si la tercera parte es "fin" todo fue bien
  
if($datos[2]=="fin"){
    
//muestro al usuario
    
echo "la humedad es de $datos[0]%";
    echo 
"la temperatura es de $datos[1]°C"
  }else{
   
//si no dijo "fin" algo fue mal
    
echo "error";
  }
}else{
  
//si no dijo "leido" no leyó bien los datos
  
echo "error de lectura"
}
 
?>


podrás entender que por la naturaleza de lo explicado arriba este php tendrá que se llamado cada vez para mostrar los datos... esto lo haces por medio de ajax con javascript
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Hurdano

Genial, gracias chicos por vuestras respuestas. NO me había fijado y comprendido las cosas de ese modo, este fin de semana que puedo estar en el lugar donde lo tengo seguiré vuestras indicaciones. Muchas gracias de verdad.