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.