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
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)
<?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
//si responde "leido" todo está bien, uso trim ara eliminar espacios y saltos de linea
//el sensor fue leido correctamente
//le digo al arduino que me envie los datos
fwrite($port, $recibir_datos); //recibo los datos
//separo los datos por ";" como fue planeado y queda separeado en 3 partes
//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