Wifi con HLK-RM04

         El módulo HLK-RM04 nos permite añadir conexión Wifi a nuestro Arduino por tan solo unos 10€. Ello nos posibilita el control inalambrico en un entorno de bastantes metros y sin cables, bien a través de nuestra red local o (si configuramos el Router y tenemos IP fija) via Internet desde cualquier parte con un ordenador o un móvil. ¡¡Guai!!.
         El módulo mide 3x4 cm y solo necesita dos hilos para funcionar ya que se comunica vía serie con el Arduino. No hay una atentica comunicación Wifi, solo es serie, pero es más que suficiente para recibir datos o enviar comandos a cualquiera de los pines del Arduino. Se le puede poner una antena externa para mejorar el alcance y también hay una placa (shield) para usarlo con conexión por cable .

         Estas son las especificaciones y página de configuración:
          Para configurar nuestro HLK-RM04 hay que seguir unos pasos.
-Conectarle alimentación de 5v. Patilla 1 al  pin 5v del Arduino y patilla 2 al negativo del Arduino.
-Con un portátil buscarlo en redes wifi disponibles. Aparece como Hi-Link-xxxx. Conectar con clave 12345678.
-Abrir su página de configuración en la dirección 192.168.16.254/Serial2Net.asp  y hacer log-in: admin/admin
-Hay que poner WIFI(CLIENT)-SERIAL, el nombre SSID de vuestra WIFI, vuestra clave y el tipo de encriptación que usa.
-Prefiero elegir IP STATICA. Poner una libre y gateway de vuestro router.
-He bajado la velocidad del serial a 57600, pero se puede poner el que se prefiera.
-Aplicar cambios y ya se puede (dejar pasar 1 minuto) acceder a esta misma página desde vuestra RED poniendo la nueva IP.

          Si algo falla y no podemos contactar desde nuestra RED local ni por wifi con el portátil, podemos reinicializar el módulo poniendo a masa el pin 10 durante mas de 6 segundos.

          Hay otra página de configuración mucho más completa en 192.168.16.254/home.asp, pero no se necesita para nuestro tema.

          Si todo esta bien y "vemos" el módulo desde nuestra RED local, ya podemos conectar el
Pin 20 (Rx) al Pin 1(Tx) del Arduino
Pin 21 (Tx) al Pin 0 (Rx) del Arduino

          Y así tendremos disponible la comunicación serie HLK-RM04-Arduino y viceversa.

          Ahora vemos unos ejemplos de enviar y recibir. Recordar que como el Arduino uno solo tiene un puerto serie, para cargar los programas hay que desconectar temporalmente al menos el pin Rx del Arduino.









hfghfgjhfgjhfgjhfg
//Se envian a una página WEB los valores analógicos y datos de sensor DHT22

#include "DHT.h"
#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);

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

void loop() {
  boolean has_request = false;
  int h = dht.readHumidity(); int t = dht.readTemperature();
  if (Serial.available()) {
    while(Serial.available()) {char c = Serial.read();}
    has_request = true;
  }
  if (has_request) {
    Serial.println("HTTP/1.1 200 OK");
    Serial.println("Content-Type: text/html");
    Serial.println("Connection: close"); 
    Serial.println("Refresh: 5");  // refresca la página cada 5 sec
   
    String sr = "<!DOCTYPE HTML>\n";
    sr += "<html&lt;\n";
    // valores de cada pin analógico
    for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
      int sensorReading = analogRead(analogChannel);
      sr += "Valor analogico ";
      sr += analogChannel;
      sr += " es ";
      sr += sensorReading;
      sr += "<br />\n";     
    }
    sr += "Humedad: ";
    sr += h;
    sr += (" %\t");
    sr += "<br />\n";
    sr += "Temperatura: ";
    sr += t;
    sr += (" &#186C ");
    sr += "<br />\n";
    sr += "</html>";
    Serial.print("Content-Length: ");
    Serial.print(sr.length());
    Serial.print("\r\n\r\n");
    Serial.print(sr);
    has_request = false;
  }
}
         Al ejecutar el programa podemos ver los valores en los pines analógicos y datos de temperatura y humedad de un sensor DHT22. Los veremos en el navegador poniendo la IP que habiamos asignado al módulo y el puerto 8080. Por ejemplo, en mi caso 192.168.1.120:8080. Desde fuera de casa cambiando a mi IP fija.
          Ahora enviamos comandos al Arduino por medio de nuestro ordenador o móvil y simplemente poniendo la dirección IP del módulo, el puerto y un número para cada acción. Ejemplo

http://192.168.1.120:8080/blink?f=1  Enciende el LED 13, activa un relé o cualquier otra acción
http://192.168.1.120:8080/blink?f=2  Pone a nivel bajo el pin 13 (apaga el LED)
//Enviar comandos al Arduino via WIFI
//Actuar con http://192.168.1.120:8080/blink?f=1
//O con http://MyIPexterna:8080/blink?f=1
//Joaquin paredes. www.jopapa.me 2014

void setup() {    
  Serial.begin(57600); 
  pinMode(13, OUTPUT); //Rele 1
  pinMode(12, OUTPUT);  //Rele 2
}

int f = 0;
void loop() {
  boolean has_request = false;
  String in = "";
  if (Serial.available()) {
    in = "";
    while (true) {  // should add time out here
      while (Serial.available() == false) {}
      in += (char)(Serial.read());
      if (in.endsWith("\r\n\r\n")) {
        has_request = true;  break;
      }
    }  
  }
  if (has_request) {
    int i1 = in.indexOf("GET /blink?f="), i2;
    if (i1 != -1) {
      i2 = in.indexOf(" ", i1+13);
      f = in.substring(i1+13, i2).toInt();
    }
    Serial.println("HTTP/1.1 200 OK\nContent-Type: text/html\nConnection: close");
    String sr = "<!DOCTYPE HTML                           >\n";  //¡¡NO QUITAR ESPACIOS EN BLANCO!!
 
    Serial.print("Content-Length: ");
    Serial.print(sr.length());
    Serial.print("\r\n\r\n");
    if (f==1) { Serial.println("Comando 1. Activado Rele 1"); }
    if (f==2) { Serial.println("Comando 2. Desactivado Rele 1"); } 
    if (f==3) { Serial.println("Comando 3. Activado Rele 2"); }
    if (f==4) { Serial.println("Comando 4. Desactivado Rele 2"); }   
    Serial.print(sr);
    has_request = false;
   
  }

switch (f){
  case 1:
   digitalWrite(13, HIGH);
   break;
  case 2:
   digitalWrite(13, LOW);
   break;
  case 3:
   digitalWrite(12, HIGH);
   break;
  case 4:
   digitalWrite(12, LOW);
   break;
   f=0;  

 
}

         Resumiendo, si juntamos este módulo y usamos un Arduino mini, por unos 13€ tenemos control vía WEB en cualquier punto de la casa, tanto de recogida de datos como mandar acciones.

         Todo ello desde ordenador o desde el móvil y tanto desde nuestra RED local como desde Internet.















Menu