Comunicación Esp8266 - Arduino Uno




Presentación


El presente proyecto se origina en una inquietud planteada por el usuario SrDeLasTinieblas en el canal Arduino de Telegram sobre la posibilidad de enviar informacion desde una placa Esp8266 a una placa Arduino Uno.

En este proyecto se desarrolla una forma genérica de enviar datos entre ambas placas para ello se instalo un servidor web en la placa Esp8266 que permite recibir mensajes enviados desde la placa Arduino Uno, como asi tambien enviar mensajes hacia dicha placa.

En la placa Arduino Uno los mensajes de envian y se reciben desde el Monitor Serie del IDE de Arduino.

A continuación podemos ver en un video como funciona el envio de mensajes entre las placas.


Espere a que cargue el video


Materiales


Placa Esp8266

Placa Arduino Uno

Adaptador USB Esp8266


Circuito




Código


El codigo esta desarrollado con la IDE de arduino y se divide en dos archivos, uno que se sube a la placa Esp8266 y el otro para la placa Arduino UNO.


esp8266.ino




  #include <ESP8266WebServer.h>

  //---------------------------------------------------------------
  ESP8266WebServer servidor(80);
  
  //-------------------VARIABLES GLOBALES--------------------------
  IPAddress IP(192,168,0,101);
  IPAddress puerta(192,168,0,1);
  IPAddress mascara(255,255,255,0);
  
  const char *red = "XXXXXXXXXX";
  const char *clave = "xxxxxxxxxxx";
  
  String XML, mensaje; 
  
  unsigned long t_anterior = 0;
  
  //--------CODIGO HTML y JavaScript-------------
  String pagina = "<!DOCTYPE html>"
  "<html>"
  "<head>"
  "<meta charset='utf-8' />"
  "<title>Servidor Arduino Uno</title>"
  "<script type='text/javascript'>"
  "function loadDoc(){"
  "  var xhttp = new XMLHttpRequest();"
  "  xhttp.onreadystatechange = function() {"
  "    if (this.readyState == 4 && this.status == 200) {"
  "      funcion(this);"
  "    }"
  "  };"
  "  xhttp.open('GET','xml',true);"
  "  xhttp.send();"
  "  setTimeout('loadDoc()',500);"
  "}"
  "function funcion(xml){"
  "  var i;"
  "  var xmlDoc = xml.responseXML;"
  "  var dato ='';"
  "  dato = xmlDoc.getElementsByTagName('mensa')[0].childNodes[0].nodeValue;"
  "  document.getElementById('mensaje').innerHTML = dato;"
  "}"
  "</script>"
  "</head>"
  "<body bgcolor='#70706F' onload='loadDoc()'>"
  "<h1 style='color:#3AAA35;'><center> Servidor  </center></h1>"
  "<hr/><hr>"
  "<center>"
  "<a>Mensaje recibido: </a>"
  "<br>"
  "<a id='mensaje'></a>"
  "<br>"
  "<form action='/' method='post'>"
  "<h4>Escribir mensaje: </h4>"
  "<input type='text' name='mensaname' id='mensaid'>"
  "<input type='submit' value='ENVIAR'>"
  "</form>"
  "<br>"
  "</center>"
  "</body>"
  "</html>";
  
  void construirXML(){
    XML="";
    XML+="<mensa>";
    XML+=mensaje;
    XML+="</mensa>";
  }
  
  void maneja_pagina(){
      
    Serial.println(servidor.arg(0)+ "\n");
      
    servidor.send(200,"text/html",pagina);
  }
  
  void maneja_XML(){
    construirXML();
    servidor.send(200,"text/xml",XML);
  }
  
  //---------------------------SETUP-------------------------------
  void setup() {
  
      Serial.begin(115200);
      delay(1500);
      Serial.println(F("Inicia Sistema"));
        //Iniciar Navegador
      Serial.print(F("Connectar a "));Serial.println(red);
      WiFi.config(IP, puerta, mascara);
      WiFi.begin(red, clave);
        // Coneccion a red Wifi.
      while (WiFi.status() != WL_CONNECTED)
      {
          delay(500);Serial.print(F("."));
      }
      Serial.println();
      Serial.println(F("Navegador iniciado"));
      Serial.print(F("Direccion IP: "));
      Serial.println(WiFi.localIP());
      
      
  
    servidor.on("/",maneja_pagina);
    servidor.on("/xml",maneja_XML);
    servidor.begin();
  }
  
  //--------------------------LOOP--------------------------------
  void loop() {
    if(Serial.available() != 0){
      mensaje = Serial.readStringUntil('\n');
      //Serial.println(mensaje);
    }
  
    unsigned long t_actual = millis();
    if (t_actual - t_anterior >= 1000) { //envia la mensaje cada 1 segundos
      t_anterior = t_actual;
    }
    
  
  
    servidor.handleClient();
  }
  

uno.ino




  #include <SoftwareSerial.h>
    // software serial #1: RX = pin digital 10, TX = pin digital 11
    SoftwareSerial pto_esp8266(10, 11);
    
    
    void setup() {
      // Abre las comunicaciones serie y espera a que se abra el puerto:
      Serial.begin(115200);
      while (!Serial) {
          
      }
      Serial.println("Conectado");  
    
      // inicial el puerto software serial 
      pto_esp8266.begin(115200);
     
    }
    
    void loop() {
      while (Serial.available() > 0) {
        char rec = Serial.read();
        pto_esp8266.write(rec);
      }
      
      while (pto_esp8266.available() > 0) {
        char rec = pto_esp8266.read();
        Serial.write(rec);
      }
    
    }


Cerrar