Hola, lo prometido es deuda.
Ya tengo algo decente que mostrar.
Aunque sea un código muy básico, es fundamental comprender como funciona para conseguir mejorarlo y hacer aplicaciones interesantes.
Encontré este ejemplo, lo estudie a fondo, me he permitido el derecho de traducir los comentarios.
#include <SPI.h>
#include <WiFi.h>
char ssid[] = "nombredetured"; // Nombre red
char pass[] = "tucontraseña"; // Contraseña
int keyIndex = 0; // solo para wep
char server_IP[] = "www.google.com";
unsigned long test_flag=0;
int i=0;
int status = WL_IDLE_STATUS;
WiFiClient client_IP;
WiFiServer server(80);
void setup() {
Serial.begin(9600);
pinMode(9, OUTPUT);
// Comprueba la presencia de la wifi shield
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi shield no presente");
while(true); // no continua
}
// Conectando a la red wifi:
while ( status != WL_CONNECTED) {
Serial.print("Conectado a la red llamada: ");
Serial.println(ssid); // Imprime en pantalla el nombre de red (SSID);
// Conectado a red WPA/WPA2. Cambia esta linea si estas conectando a conexion wep:
status = WiFi.begin(ssid, pass);
// espera 10 segundos para conectarse:
delay(10000);
}
server.begin(); // empieza la conexion en el puerto 80
printWifiStatus(); // estas conectado, imprime en pantalla tu conexion
}
void loop() {
if(Serial.available() > 0){
byte inChar;
inChar = Serial.read();
if(inChar == 'a'){
Serial.println("\nStarting connection to dnsdynamic...");
// si tienes conexion, reporta via serial:
if (client_IP.connect(server_IP, 80)) {
Serial.println("conectado al servidor");
client_IP.println("GET / HTTP/1.1");
client_IP.println("Host:www.google.com");
client_IP.println("conexion: cerrada");
client_IP.println();
}
else {
Serial.println("fallo de conexion");
Serial.println();
}
int b = client_IP.available();
while(client_IP.connected() && !client_IP.available()) delay(1); //espera los datos
while (client_IP.connected() || client_IP.available()) { //conexion de datos disponible
char c = client_IP.read();
Serial.print(c);
//Serial.println(b,DEC);
}
Serial.println();
Serial.println("desconectando.");
Serial.println("==================");
Serial.println();
client_IP.flush();
client_IP.stop();
}
}
client_IP.flush();
WiFiClient client = server.available(); // escuchando clientes entrantes
//test_flag=test_flag+1;
//Serial.println(test_flag,DEC);
if (client) { // si tienes un cliente,
Serial.println("nuevo cliente"); // imprime un dato por puerto serie
String currentLine = ""; // hacer una cadena para almacenar los datos entrantes desde el cliente
while (client.connected()) { // bucle mientras el cliente está conectado
if (client.available()) { // si hay bytes a leer desde el cliente,
char c = client.read(); // lee un byte entonces
Serial.write(c); // imprimir en el monitor serie
if (c == '\n') { // si el byte es un carácter de nueva línea
// si la línea actual está en blanco, tienes dos caracteres de nueva línea en una fila.
// Que es el final de la petición HTTP del cliente, por lo que enviar una respuesta:
if (currentLine.length() == 0) {
// HTTP encabezados siempre comienzan con un código de respuesta (por ejemplo, HTTP / 1.1 200 OK)
// Y un tipo de contenido para que el cliente sabe lo que viene, y luego una línea en blanco:
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();
// el contenido de la respuesta HTTP sigue al encabezado:
client.print("Click <a href=\"/H\">aqui</a> para encender el led del pin 9 on<br>");
client.print("Click <a href=\"/L\">aqui</a> para apagar el led del pin 9 off<br>");
// La respuesta HTTP termina con otra línea en blanco:
client.println();
// romper el bucle while:
break;
}
else { // Si recibió una nueva línea, currentline luego despejado:
currentLine = "";
}
}
else if (c != '\r') { // si tienes otra cosa que un carácter de retorno de carro,
currentLine += c; // añadirlo a la final de la línea actual
}
// Compruebe si la solicitud del cliente era "GET / H" o "GET / L":
if (currentLine.endsWith("GET /H")) {
digitalWrite(9, HIGH); // GET / H Enciende el LED
}
if (currentLine.endsWith("GET /L")) {
digitalWrite(9, LOW); // GET /L apaga el led
}
}
}
// cierra la conexion:
client.stop();
Serial.println("client disonnected");
}
}
void printWifiStatus() {
// imprimir el SSID de la red a la que está conectado a:
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
// imprime la direccion ip de tu wifi shield:
IPAddress ip = WiFi.localIP();
Serial.print("Direccion IP: ");
Serial.println(ip);
// imprimir la intensidad de señal recibida:
long rssi = WiFi.RSSI();
Serial.print("Intensidad de la señal (RSSI):");
Serial.print(rssi);
Serial.println(" dBm");
// Imprimir dónde ir en un navegador:
Serial.print("Para ver esta página en acción, abra un navegador http://");
Serial.println(ip);
}
Este ejemplo simplemente enciende y apaga un led desde el navegador.
Lo he probado en el pc, la tablet y el movil siempre por wifi. Tengo que averiguar como hacerlo sin estar conectado via wifi.
Su funcionamiento es sencillo, detecta la conexión wifi, espera 10 segundo y muestra datos de la conexión como la intensidad de la señal y la dirección ip que hay que poner en el navegador. Aparecerán dos lineas una para encender y la otra para apagar el led.
Espero que este ejemplo le sirva a alguien.
Cualquier duda, pregunten y ayudare en lo posible.