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.
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);
}
}