Está en la página 1de 23

Laboratorio 4

Implementacin de IoT usando esp8266

El mdulo ESP8266 incluye un pequeo procesador interno que


podramos programar para funcionar de modo autnomo y que
incluso dispone de un par de puerto GPIO (General Purpose Input
Output) para su uso como activador de algo, pero esto e una historia
para otro da.

Las hojas de normas del mdulo WIFI ESP8266 especifica que


debe ser alimentado a 3,3 Voltios y no recomienda conectarle 5V
directamente so pena de quemarlo.

Menos claro est el hecho de que RXD y TXD deban ser a 3,3 V.
He visto varias notas por Internet recomendando montar un divisor de
tensin en cada pin para evitar problemas, pero yo los he conectado
directamente a Arduino sin problemas (Me compr dos, por si acaso,
son muy baratos).

Segn la versin de firmware que incluya el modulo, el pin RST


debe o no ser conectado a tensin (3,3V) para poder activar el uso del
mdulo. El que yo he recibido, desde luego no se activa sin l, pero he
ledo que hay versiones ms antiguas que no lo necesitan.

Function cables: Red cable:VCC; Black cable: GND; Green cable: TXD; White cable: RXD

Channel Frequency
According IEEE802.11bgn standard, RF transceiver supports the following
channels:

Channel

Freq.

Channel

Freq.

2412

2447

2417

2452

2422

10

2457

2427

11

2462

2432

12

2467

2437

13

2472

2442

14

2484

Esp8266.com

Para descargar el sdk ultimo de esp8266 debe accesarse a esta


pagina:
http://espressif.com/new-sdk-release/

En este caso se usa esta versin para aplicaciones IoT:


Download here:

Al marcar descargar se desplaza a la siguiente posicin de


pantalla:

la

Este sdk se comunica con el chip mediante comandos AT

Si se desea utilizar el dispositivo con arduino IDE se realizara el


procedimiento que se detalla en la siguiente pgina:

Una vez conectado el circuito, no olvidar que todas las tierras deben
estar en punto comn, el cdigo de prueba ser:

El dispositivo usara un led con resistencia de 470 ohmios conectada


en el GPIO2 compilando y cargando el programa en la placa, con lo
que el cdigo blink se activara.

Arduino con esp8266

En esta parte, se usara Arduino para comunicarse con la tarjeta


esp8266, de acuerdo al diagrama siguiente:

Una vez implementado dicho circuito, debe considerarse lo siguiente:

a. La fuente de 3.3 v debe ser externa para la alimentacin del


chip.
b. Los puntos GND deben estar conectados en un sitio comn.
#include <SoftwareSerial.h>
SoftwareSerial BT1(3, 2); // RX | TX

void setup()
{ Serial.begin(9600);
BT1.begin(9600);
}

void loop()
{ String B= "." ;
if (BT1.available())
{ char c = BT1.read() ;
Serial.print(c);
}
if (Serial.available())
{ char c = Serial.read();
BT1.print(c);
}
}

Cuando se ejecuta y carga el programa, se abre lla consola serial y se


muestra lo siguiente:

A veces es necesario recargar la fuente al esp8266 para que recin


pueda comunicarse.
Una vez que esta conectar podemos usar los comandos AT, probando
AT <enter>

Importante: coloque la opcin AMBOS NL&CR , para que los comandos


funcionen.

El modo del dispositivo es 2.


AT+CWMODE=3
Se cambia al modo 3, con lo cual podemos activar algunas
operaciones.
AT+CWLAP
Muestra las diferentes redes wifi disponibles en el rea:

Para conectarse a una red se utilizara la siguiente manera:


AT+CWJAP="<ssid>","<clave>"

Si se conecta devuelve la siguiente respuesta..


OK

Para conocer la direccin asignada al esp8266 se ingresa:


AT+CIFSR

Si queremos crear un pequeo servidor wweb , en la consola debe


cargarse los siguientes comandos:
AT+CIPMUX=1

OK
AT+CIPSERVER=1,80

OK

Y luego al abrirse un navegador se tipea la direccin IP y los menajes


que salgan por el navegador se visualizaran en consola

Supongamos que simulamos el envio de datos de esta manera:


http://192.168.0.10/p1=20,p2=34,p3=45

Los parmetros enviados se muestran en consola.


A manera de documentacin, los comandos AT que se usan con
esp8266 son los siguientes:
AT te responde OK
AT+GMR ->te muestra la version del firmware
AT+CWMODE=1 ->modo de la estacion
AT-CWLAP -->lista los accespoint wifi
AT+CWJAP="nodo","contrasea" -->join to acces point se conecta al
AP DHCP
AT+CIFSR ->nos muestra la ip dhcp del AP
AT+CIPMUX=1 ->cant de conexiones multiples :) soporta 5
AT+CIPSTART="TCP","ip",80 --> protocolo(tcp/udp) - ip - puerto
AT+CIPSEND=50 -->envia un paquete de longitud 50
AT+CIPCLOSE -->finaliza la coneccion
Versiones de librerias para arduino usando lo comandos AT hay varias
se pueden clonar desde github y probralas y usar la que mas les
guste pero la verdad que todas van a ser bastante lentas por los
comandos AT la otra opcion es descargarle otro frimware o
actualizarlo por alguna falla o tener la ultima version.
Comandos

cuidadosamente no debe haber espacios entre el " y una

direccin IP o puerto
Com
man
ds

Des
crip
tion

T
y
p
e

Set/Exe
cute

restart
AT+RS
basi
the
T
c
module

AT+CW wifi
MODE mode

wifi

Inqu
iry

test

AT+ CWJAP
AT+
=<ssid>,<
CWJAP?
pwd >

AT+CW list the


LAP
AP

AT+CWLAP

AT+CW quit the


wifi
QAP
AP

set the
AT+
parame
wifi
CWSAP ters of
AP

Example
s

AT+CWMO
AT+CW AT+CWM 1= Sta, 2=
DE=<mode
MODE? ODE=?
AP, 3=both
>

AT+CW join the


wifi
JAP
AP

wifi

Paramet
ers

AT+CWQAP -

AT+
CWSAP=
AT+
<ssid>,<p CWSAP
wd>,<chl>, ?
<ecn>

ssid = ssid,
pwd = wifi
password

AT+CWQ
AP=?

Connect to
your router:

ssid, pwd,
AT+CWJAP=
chl =
"YOURSSID",
channel, ecn
"helloworld";
= encryption
and check if
connected:
AT+CWJAP?

get the
AT+
connec TCP/ AT+
CIPSTA
tion
IP
CIPSTATUS
TUS
status

AT+CIP set up TCP/ 1)single


START TCP or IP
connection
UDP
(+CIPMUX=
connec
0)
tion
AT+CIPSTA

AT+CIPST id = 0-4,
ART=?
type =
TCP/UDP,
addr = IP
address,

Connect to
another TCP
server, set
multiple
connection

Com
man
ds

Des
crip
tion

T
y
p
e

Set/Exe
cute

Inqu
iry

test

RT=
<type>,<a
ddr>,<port
>; 2)
multiple
connection
(+CIPMUX=
1)
AT+CIPSTA
RT=
<id><type
>,<addr>,
<port>

1)single
connection(
+CIPMUX=
0)
AT+CIPSEN
D=<length
>; 2)
TCP/
multiple
IP
connection
(+CIPMUX=
1)
AT+CIPSEN
D=
<id>,<leng
th>

AT+CIPSE
ND=?

close
AT+CIPCLO
TCP or
AT+CIP
TCP/ SE=<id> or
UDP
CLOSE
IP
AT+CIPCLO
connec
SE
tion

AT+CIPCL
OSE=?

AT+CIF Get IP TCP/


AT+CIFSR
SR
address IP

AT+
CIFSR=?

AT+CIP send
SEND
data

set
AT+
AT+
mutiple TCP/
CIPMUX=<
CIPMUX connec IP
mode>
tion

AT+
CIPMUX
?

Paramet
ers

Example
s

port= port

first:
AT+CIPMUX
=1; connect:
AT+CIPSTAR
T=4,"TCP","
X1.X2.X3.X4
",9999

send data:
AT+CIPSEND
=4,15 and
then enter
the data

0 for single
connection 1
for mutiple
connection

Com
man
ds

Des
crip
tion

AT+
set as
CIPSER
server
VER

+IPD

T
y
p
e

Set/Exe
cute

AT+
CIPSERVER
TCP/
=
IP
<mode>[,<
port> ]

Inqu
iry

test

Paramet
ers

Example
s

turn on as a
TCP server:
mode 0 to
AT+CIPSERV
close server
ER=1,8888,
mode, mode
check the
1 to open;
self server IP
port = port
address:
AT+CIFSR=?

receive
d data

II. Aplicacin IoT usando Thingspeak


En esta prctica, se va leer el valor de un potencimetro, simulando
un sensor y su valor ser publicado en Thingspeak.
Inicialmente, se conectar los pines CH_PD y Vcc juntos, como parte
de ese procedimiento.

De esa manera, el conexionado ser de la siguiente forma,


consderando siempre que la alimentacin ser de 3.3 v

A este circuito debe agregarse el colocar un potencimetro de 10K,


cuya salida central se conecte a A0, y los extremos Vcc((3.3v) y GND.
Con esto el cdigo a usar ser:
#include <SoftwareSerial.h>

int ledPin=13;
int sensor_pin = A0;
float muestra =0;
float bat_volt=0;

String apiKey="PONER SU API KEY";


// connect 2 to TX of Serial USB
// connect 3 to RX of serial USB

SoftwareSerial ser(2,3);

void setup() {
// put your setup code here, to run once:
pinMode(ledPin,OUTPUT);
Serial.begin(9600);
ser.begin(9600);
ser.println("AT+RST");
}

void loop() {
// put your main code here, to run repeatedly:

// blink LED on board


digitalWrite(ledPin, HIGH);
delay(200);
digitalWrite(ledPin, LOW);

voltage();
esp_8266();

}
void voltage()
{
muestra=0;
for(int i=0;i<150;i++)
{
muestra+=analogRead(sensor_pin);
sensor
delay(2);

//read the value from the

}
muestra=muestra/150;
bat_volt = muestra*(4.76/1024)*(12/2); // R1+R2/R2 // R1=10k and
R2=2k

}
void esp_8266()
{
// convert to string
char buf[32];
String strVolt = dtostrf( bat_volt, 4, 1, buf);

Serial.print(strVolt);
Serial.println(" V");
// TCP connection
String cmd = "AT+CIPSTART=\"TCP\",\"";
cmd += "184.106.153.149"; // api.thingspeak.com
cmd += "\",80";
ser.println(cmd);

if(ser.find("Error")){
Serial.println("AT+CIPSTART error");
return;
}

// prepare GET string


String getStr = "GET /update?api_key=";
getStr += apiKey;
getStr +="&field1=";
getStr += String(strVolt);
getStr += "\r\n\r\n";

// send data length


cmd = "AT+CIPSEND=";
cmd += String(getStr.length());
ser.println(cmd);

if(ser.find(">")){
ser.print(getStr);
}
else{
ser.println("AT+CIPCLOSE");
// alert user
Serial.println("AT+CIPCLOSE");
}

// thingspeak needs 15 sec delay between updates


delay(16000);
}

También podría gustarte