Interpretar dato recuperado de MySQL

Hola qué tal, tengo un problema con mi código, no realiza la función que quiero que haga: controlar el encendido/apagado de 2 LEDs de forma remota.
Les comento a grandes rasgos cómo estoy logrando esto: tengo una aplicación que diseñé en Android Studio para poder controlar el encendido y apagado de dos LEDs desde cualquier lugar donde me encuentre, usando como intermediario una base de datos MySQL que tengo alojada en el hosting 000webhost. Resumiendo, es una aplicación de IoT. El proceso es el siguiente:
En la app tengo un activity con 4 botones: dos para ON/OFF de un led y dos para ON/OFF del otro, al pulsar alguno de estos botones manda un caracter a una tabla (sus columnas son: id, valor y tiempo) en el hosting (si apreto el 1° boton manda un 1, si apreto el 2° manda un 2, y así), esta parte ya la tengo lista.
Luego el arduino se encarga de recuperar el valor más reciente ingresado a esta tabla para así poder controlar el ON/OFF de estos 2 LEDs, ésta es la parte que me falta, en el monitor serial veo que logro obtener el caracter de la base de datos pero al pulsar los botones de la app aún no hace nada. He estado probando con el código de ejemplo WebClientRepeating, adaptándolo a mi caso pero aún no logro lo que deseo.
Éste es el código que estoy usando:

#include <SPI.h>
#include <Ethernet.h>

char valor;
char ledPin5 = 5;
char ledPin6 = 6;
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

EthernetClient client;

char server[] = "creaycontrola.000webhostapp.com";

unsigned long lastConnectionTime = 0;             // last time you connected to the server, in milliseconds
const unsigned long postingInterval = 10L * 1000L; // delay between updates, in milliseconds
// the "L" is needed to use long type numbers

void setup() {
  pinMode(ledPin5,OUTPUT);
  pinMode(ledPin6,OUTPUT);
  // start serial port:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // give the ethernet module time to boot up:
  delay(1000);
  Ethernet.begin(mac);
  // print the Ethernet board/shield's IP address:
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // if there's incoming data from the net connection.
  // send it out the serial port.  This is for debugging
  // purposes only:
  if (client.available()) {
    char c = client.read();
    Serial.write(c);
    if (Serial.available()>0){
    valor = Serial.read();
    if (valor=='1'){
      digitalWrite(ledPin5,HIGH);
      }
    else if (valor=='2'){
      digitalWrite(ledPin5,LOW);
      }
    else if (valor=='3'){
      digitalWrite(ledPin6,HIGH);
      }
    else if (valor=='4'){
      digitalWrite(ledPin6,LOW);
      }
    }
  }

  // if ten seconds have passed since your last connection,
  // then connect again and send data:
  if (millis() - lastConnectionTime > postingInterval) {
    httpRequest();
  }

}

// this method makes a HTTP connection to the server:
void httpRequest() {
  // close any connection before send a new request.
  // This will free the socket on the WiFi shield
  client.stop();

  // if there's a successful connection:
  if (client.connect(server, 80)) {
    Serial.println("connecting...");
    // send the HTTP GET request:
    client.println("GET /pruebaz.php HTTP/1.0");
    client.println("Host: creaycontrola.000webhostapp.com");
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();

    // note the time that the connection was made:
    lastConnectionTime = millis();
  } else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
  }
}

Y esto obtengo en el monitor serial luego de pulsar el tercer botón:

My IP address: 192.168.1.14
connecting...
HTTP/1.1 200 OK
Date: Fri, 03 Aug 2018 00:37:19 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
Server: awex
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Request-ID: afc7fabddc65a7f50c0bcefefab98b5f

3

Estoy usando Arduino Uno, un Ethernet Shield W5100 y como se ve en el código, para recuperar el caracter uso un archivo php que por las dudas también lo pongo (cubro las credenciales por razones obvias):

<?PHP
$conexion = mysqli_connect("xxxxxxxx","xxxxxxxx","xxxxxxxxx","xxxxxxxx");

$consulta = "SELECT valor FROM botones WHERE tiempo=(SELECT max(tiempo) FROM botones)";
$resultado = mysqli_query($conexion,$consulta);
if (mysqli_num_rows($resultado)>0) {
	$row = mysqli_fetch_assoc($resultado);
	echo "" .$row["valor"]. "";
}
?>

Gracias de antemano por sus prontas respuestas.

Como se llama el archivo PHP y donde esta ?

Que respuesta da tu navagador a la URL: http://creaycontrola.000webhostapp.com

el archivo se llama pruebaz.php, lo hice en el editor Sublime Text 3 y lo subí al hosting gratuito www.000webhost.com.
Al ejecutar http://creaycontrola.000webhostapp.com/pruebaz.php en el navegador me muestra el valor más reciente de la tabla "botones", columna "valor": ahora mismo al ejecutarse, mostrara el valor "2",sin las comillas, porque el último botón que presioné fue el segundo; al contrario que el "3" que me devuelve cuando presioné el tercer botón de mi app y que se aprecia también en la respuesta del monitor serial que puse más arriba.
Si ejecuto http://creaycontrola.000webhostapp.com me muestra el listado de todos los archivos php que tengo subidos en este servidor.

Una consulta… el valor que envías desde la APP de android, es un INT o un String?, porque al ser números del 0 al 3 imagino que sea un INT, por lo que deberías de quitar las comillas de los if´s

if (valor==1){
      digitalWrite(ledPin5,HIGH);
      }

También comentarte que para ver si entra dentro de los if´s, yo suelo imprimir algo en pantalla tipo:

if (valor==1){
      digitalWrite(ledPin5,HIGH);
      Serial.print("Dentro del if número 1 ");
      }

Así voy controlando donde entra y donde no… para ir descartando

Decirte que me está gustando tu proyecto, yo he hecho algo similar pero por bluetooth “con lo cual necesito estar cerca” pero usar una base de datos SQL me parece buena idea…

Hola, gracias por el interés. Es un string el valor que envío desde la app, lo de imprimir en pantalla ese comentario es buena idea, lo agregaré, gracias. Sí, yo también al comienzo cuando buscaba información relacionada a este tema encontraba que la mayoría lo hacía con Bluetooth pero como yo quiero lograr este control desde cualquier lugar, no solo en una red local, descarté esa opción.
Bueno yo sigo haciendo mis pruebas y me indicaron que se veía redundante lo siguiente porque leía lo recibido, lo escribía y lo leía de nuevo:

if (client.available()) {
    char c = client.read();
    Serial.write(c);
    if (Serial.available()>0){
    valor = Serial.read();
    if (valor=='1'){
      digitalWrite(ledPin5,HIGH);
      }

Así que lo cambié por esto:

if (client.available()) {
    char c = client.read();
    if (c=='1'){
      digitalWrite(ledPin5,HIGH);
      }

Y conseguí respuesta de los leds al pulsar los botones de la app de acuerdo a lo planeado, sin embargo, esto vino acompañado de una respuesta extraña de los leds, su respuesta cambia de forma indefinida durante cada loop:
Cuando pulso el primer boton (para encender el primer LED en pin digital 5): se enciende el primer LED (todo bien hasta ahí) pero en el siguiente loop a veces se enciende también el segundo led (en el pin digital 6), a veces se apaga, a veces solo blinkea y a veces se mantiene apagado como se espera, además a veces se apaga el primer LED también.
Lo mismo pasa al presionar cada uno de los otros 3 botones: responde como se espera al comienzo pero en el siguiente loop comienza el comportamiento impredecible de ambos leds.
También cuando pasa de un loop al siguiente, hay un blink muy rápido en ambos leds.
Bueno supongo que conseguí la respuesta de los leds pero aún no como yo quiero.
¿Crees que voy por buen camino o lo intento de otra forma?

Hola

Lo que deseas hacer, lo puedes lograr siguiendo el camino que estás siguiendo. Pero ya te habrás dado cuenta que siempre tendrás un retraso, entre el envío del comando y el encendido del led.

Si te fijas bien, el arduino no está permanentemente atento a recibir órdenes. Lo que hace es conectarse al servidor web, hace una consulta GET, recibe la consulta, y luego se desconecta del servidor web. Pasan uno o varios segundos y vuelve a hacer lo mismo.

Hay otros caminos para hacer lo mismo que tú quieres hacer. Te animo a que visites estas dos páginas donde explican que es el protocolo MQTT:

Primeros pasos con MQTT y Configurando Arduino y MQTT

El autor de esas páginas propone como solución, la instalación en tu propio ordenador, del servidor (=broker) mqtt. Pero existen brokers mqtt gratuitos.

Saludos

Sí, es verdad tenía un pequeño delay en el tiempo de respuesta del LED, lo bajé de 1000 a 400 cambiando

const unsigned long postingInterval = 10L * 1000L;

por

const unsigned long postingInterval = 10L * 400L;

y ya veo un tiempo más "real" de respuesta
Gracias por la sugerencia del protocolo MQTT, le daré un vistazo, aunque como tengo algo relativamente avanzado de esta forma preferiría seguirla hasta conseguir la respuesta correcta del LED, aunque aún no consigo sortear este problema de su respuesta impredecible y los parpadeos rápidos en cada ciclo ¿Alguna idea?

Creo que tu error consiste en que no estás separando la cabecera de la respuesta http del servidor web.

La cabecera termina con una línea en blanco. Luego viene el valor que te interesa. Tendrías que ir leyendo caracter a caracter de la respuesta del servidor, hasta encontrar dos retorno de carro seguidos.

Revisa tu primer post. De aquello que te aparecía por el terminal serial, lo único que tienes que seleccionar es el último caracter.

Bueno debo aclarar que no conozco mucho de php así q para esto por ahora empecé haciendo scripts que solo cumplan su función, nada más, ya que son las primeras pruebas, te agradezco por mencionar lo de la validación, aunque no sé aun cómo hacerla, buscaré info sobre eso. Si puedes mencionarme cómo hacerla te lo agradecería bastante