# [Aporte] Tarjeta comandada desde TCP/IP UDP Modulo ESP8266



## miborbolla (Ene 30, 2015)

*Introduccion*

Apenas hace unos días, vagando por la internet, encontré el modulo ESP8266 el cual tiene como principal característica el brindar toda una interface ethernet WIFI (TCP/IP ) que puede ser configurada desde su puerto TTL serie (rs-232) por medio de comandos de atención (AT) de una manera increíblemente sencilla. Pero ademas me sorprendió el precio, que ronda los 120 pesos mexicanos (mas o menos 8 dolares americanos)  se consigue muy fácilmente y en abundancia; con todo esto compre varias y aquí estoy para aportar una sencilla aplicación del dichoso modulo.

​
*Objetivo*

El siguiente aporte tiene como finalidad demostrar la factibilidad de utilizar el modulo WIFI ESP8266 desde una red TCP/IP por medio del protocolo UDP.  El modulo ESP8266 sera comandado por un microcontrolador 16f628 de 8 bits, que a su ves hará la función de actuar sobre 6 leds (Relevadores)  y enviar el estado de 8 entradas digitales de regreso al origen por el mismo protocolo UDP.

*Hardware*

En la siguiente figura se anexa el diagrama general;  para montar el circuito, yo utilice una plaqueta perforada universal, cabe destacar que el único cuidado relevante es que el modulo ESP8266 funciona con 3.3 volts lo cual se soluciona con un simple regulador clásico LM7833 y aunque por muchos sitios recomiendan que en el caso de que nuestro microcontrolador se alimente con un voltaje de 5 volts se deberán adecuar las señales TX y RX del puerto serie por medio de circuitos especiales para no dañar el modulo ESP8266. Con el simple hecho de interfacear estas señales con una resistencia de 100 ohms entre microcontrolador y modulo es suficiente (tal como lo muestro en el diagrama). Esto lo digo con certidumbre en base a que vengo realizando ya muchas pruebas con diferentes microcontroladores con esta forma y a lo obtenido del datasheet del propio modulo que dice al calce:

_All digital IO pins are protected from over-voltage with a snap-back circuit connected between the pad and ground. The snap back voltage is typically about 6V, and the holding voltage is 5.8V. This provides protection from over-voltages and ESD. The output devices are also protected from reversed voltages with diodes_

​
Por otro lado en la foto de mi montaje se aprecian unos relevadores que no vienen ilustrados en el diagrama anterior, sin embargo cabe mencionar que estos relevadores están manejados por un ULN2003 y considero no requiere mas explicación ya que no es el contexto del objetivo del presente aporte, por ultimo podran apreciar dos reguladores de 5 volts y 3 volts; derivado de que yo alimento mi tarjeta con 12 volts (para poder accionar mis relevadores) Razón por lo que fue necesario anexar también mi regulador de 5 volts para alimentar el 16f628.
Aquí dejo foto de la tarjeta terminada.

​
Como nota final, debo asegurar que el diagrama como tal se muestra, funciona al 100%.

Software en el microcontrolador

Vamos a continuar explicando de manera general que el modulo ESP8266 una ves energizado tiene a disponibilidad por medio de su interface serie, todo un conjunto de comandos de configuración e información que se accesan por medio de comandos AT y que nos regresa un OK si se completo con éxito el comando o si se presento un ERROR en la ejecución de estos comandos AT. 

El puerto serie del modulo ESP8266 por default viene configurado a 9600 baudios; al menos todos los que he comprado en México. Sin embargo debo advertir que se dice por el internet que algunos vienen pre-configurados a 115200 baudios, con lo cual deben confirmar este dato y tomar las acciones correspondientes ya sea para modificar el programa que a continuación compartiré o en su defecto configurar su modulo a 9600 baudios tal como yo tengo los míos; para este efecto existe el comando AT+CIOBAUD:9600 para re-configurar el modulo.

Yo recomiendo muy encarecidamente antes de afrontar este proyecto, que se practique con el modulo ESP8266 por medio de un convertidor USB-SERIE TTL y algún programa de “Terminal serial” para poderse familiar con los comandos AT. Hay muchos sitios por internet en el que se toca este tema en particular.

Otro punto que debo establecer aquí, es el hecho que aunque por la mayoría de los sitios de internet se  menciona el aprovechamiento del modulo ESP8266 como WEB server; no es mi caso, ya que mi enfoque es en aprovechar las virtudes de poder transportar por medio del protocolo UDP la información entre un equipo cualquiera de una red y un microcontrolador conectado a esta misma red y poder tomar acciones en base a este intercambio de información.

Con respecto al protocolo UDP aprovechare la liga con la información de la WIKIPEDIA, por lo que no tiene caso dar una explicación mas alla que es un transportador de información muy elemental pero muy aprovechable para lo que ocupa cualquier aficionado a la electrónica, domotica, robotica, etc. Y que el modulo ESP8266 nos acerca mucho a aventurarnos al “Internet de las cosas” que tanto viene aflorando últimamente.

Ya para entrar en materia con respecto al programa utilizado en el microcontrolador 16f628; dejo sin mas el listado de este, el cual fue escrito en  lenguaje “BASIC” del IDE Proton de mecanique, compilado en la version 3.5.2.7. 

Listado de programa aquí


```
'****************************************************************
'*  Name    : UDP_DEMO.BAS                                      *
'*  Author  : Miguel Angel Borbolla Bonomi                      *
'*  Notice  : Demostarcion del modulo ESP8266                   *
'*          : Utilizando protocolo UDP bajo TCP/ip              *
'*  Date    : 28/01/2015                                        *
'*  Version : 1.0                                               *
'*  Notes   : La forma mas "Burda" de utilzar el modulo ESP8266 *
'*          :  en una  LAN WI-FI                                *
'****************************************************************



Device = 16F628 ' Avisamos al compilador que microcontrolador utilizaremos

Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF, CP_OFF, MCLRE_OFF, DATA_CP_OFF  ' configuramos fusibles microcontrolador

Xtal = 4' seteamos el reloj interno a 4 MHZ 
Declare Hserial_Baud = 9600 ' Seleccionamos velocidad en baudios (aqui podria ser otra configuracion ya que hay modulos a 115200 bps)
Declare Hserial_RCSTA = %10010000 ' Habilitamos la recepcion Continua en el puerto serie
Declare Hserial_TXSTA = $24 ' Habilitamos el modo de transmicion Asincrona del puerto serie

Declare Hserial_Clear = On ' Limpiamos el buffer antes de recibir datos


All_Digital = On 'Configuramos que todas las salidas sean Digitales 
TRISA = %11111111 ' Configuramos el puerto A como entradas
TRISB = %00000010 ' Configuramos el puerto B Como salidas con excepcion del Bit 1 pues sera utilizado como TX del puerto serie

Symbol LED1 PORTB.0 'Creamos alias del puertoB con su respectivo nombre por comodidad al programar
Symbol LED2 PORTB.3
Symbol LED3 PORTB.4
Symbol LED4 PORTB.5
Symbol LED5 PORTB.6
Symbol LED6 PORTB.7

Dim DATOEN As Byte  'Declaramos la Variable DATOEN que sera donde se almacenaran los datos provenientes del puerto serie.
PORTB=0 ' Llevamos a ceros el puerto B "Apagamos todos los leds"

DelayMS 2000 'Hacemos una pausa para que el modulo ESP8266 ser inicialize

'============= Hacemos Una secuencia de encendido/apagado de leds para visualizar que la tarjeta esta "viva" ==================
High LED1
DelayMS 100
Low LED1
High LED2
DelayMS 100
Low LED2
High LED3
DelayMS 100
Low LED3
High LED4
DelayMS 100
Low LED4
High LED5
DelayMS 100
Low LED5
High LED6
DelayMS 100
Low LED6


High LED6
DelayMS 100
Low LED6
High LED5
DelayMS 100
Low LED5
High LED4
DelayMS 100
Low LED4
High LED3
DelayMS 100
Low LED3
High LED2
DelayMS 100
Low LED2
High LED1
DelayMS 100
Low LED1

'====================== Fin de secuencia =============================================



'======================== Inicializamos el modulo ESP8266 por medio de comandos AT Via el puerto serie ===================

HSerOut ["AT", 10,13]'Enviamos comando de Atencion "AT" para verificar comunicacion con modulo ESP8266

HSerIn [Wait ("OK"), DATOEN]' Esperamos agradecimiento "OK" del modulo 

HSerOut ["AT+CWMODE=3", 10,13]'Enviamos comando para colocar el modulo ESP8266 en modo "BOTH"

HSerIn [Wait ("OK"), DATOEN]' Esperamos agradecimiento "OK" del modulo 

HSerOut ["AT+CWJAP=",34,"ARRIS-C852",34,",",34,"5AB924B90DF3AF8F",34, 10,13]'Solicitamos Conectarse a red WIFI SSID="ARRIS-C852" y Clave wep "5AB924B90DF3AF8F"

HSerIn [Wait ("OK"), DATOEN]' Esperamos agradecimiento "OK" del modulo

HSerOut ["AT+CIPMUX=0", 10,13]'Enviamos comando para configurar el modulo ESP8266 en modo de conexion simple.

HSerIn [Wait ("OK"), DATOEN]' Esperamos agradecimiento "OK" del modulo

HSerOut ["AT+CIPSTART=",34,"UDP",34,",",34,"192.168.0.2",34,",","7777",",","7777",10,13]'Establecemos conexion UDP con la ip 192.168.0.2 y puertos 7777

HSerIn [Wait ("OK"), DATOEN]' Esperamos agradecimiento "OK" del modulo

HSerOut ["AT+CIPMODE=1", 10,13]'Establecemos el modo de Datos transparente (lo que reciba y envie el puerto serie pasara via UDP con equipo remoto)

HSerIn [Wait ("OK"), DATOEN]' Esperamos agradecimiento "OK" del modulo

HSerOut ["AT+CIPSEND", 10,13]' Comenzamos inicio de transmicion y recepcion de datos

'HSerIn [Wait (">"), DATOEN]' Esperamos el caracter ">" el cual indica que el modulo esta listo para comunicaciones.


'------------A partir de aqui el modulo ya esta inicializado y listo para enviar y recibr datos como cualquier puerto serie.

'============= Hacemos Una segunda para "avisarnos" que nuestra tarjeta esta lista y en linea ==================
High LED1
DelayMS 100
Low LED1
High LED2
DelayMS 100
Low LED2
High LED3
DelayMS 100
Low LED3
High LED4
DelayMS 100
Low LED4
High LED5
DelayMS 100
Low LED5
High LED6
DelayMS 100
Low LED6


High LED6
DelayMS 100
Low LED6
High LED5
DelayMS 100
Low LED5
High LED4
DelayMS 100
Low LED4
High LED3
DelayMS 100
Low LED3
High LED2
DelayMS 100
Low LED2
High LED1
DelayMS 100
Low LED1

'====================== Fin de secuencia de Aviso =============================================


inicio: ' Aqui Comienza el Bucle que comanda los datos recibidos y envio del estado en el puerto A


HSerIn 500, nada,[Dec DATOEN]   'esperamos datos desde el puerto serie y los almacenamos en variable DATOEN, si en 500 ms no hay nada brinca a etiqueta nada

If DATOEN=0 Then PORTB=0
If DATOEN=10 Then Low LED1
If DATOEN=20 Then Low LED2
If DATOEN=30 Then Low LED3
If DATOEN=40 Then Low LED4
If DATOEN=50 Then Low LED5
If DATOEN=60 Then Low LED6
If DATOEN=11 Then High LED1
If DATOEN=21 Then High LED2
If DATOEN=31 Then High LED3
If DATOEN=41 Then High LED4                              
If DATOEN=51 Then High LED5
If DATOEN=61 Then High LED6
If DATOEN=99 Then PORTB=255 

HSerOut ["Comando=",Dec DATOEN, 10,13] 'se envia la confirmacion del comando recibido

GoTo inicio

nada: 

HSerOut ["PortA=",Dec PORTA, 10,13] 'Se envia el estado del puerto A en decimal
GoTo inicio
```



Considero que el programa como tal, viene debidamente comentado por lo que considero no requiere una explicación mas allá de decir que la comunicación entre el microcontrolador 16f628 y el modulo ESP8266 es por medio del puerto serial a 9600 baudios, el Puerto B del 16f628 se utiliza como salidas (para manejar los leds), el Puerto A del mismo se utiliza como entradas (donde esta conectado el microswitch de 8 ) y que por medio de comandos AT se configura el modulo ESP8266 de tal suerte que al anexarse a la red inalambrica WiFi y obtener su IP, se deja abierta la comunicación UDP por el puerto 7777 y finalmente se deja abierto el transporte del puerto UDP hacia el pin RX del ESP8266 y desde el pin TX del ESP8266 hacia el puerto UDP.

*¡Hemos creado un Tunel UDP<>RS232 entre la red Wi-Fi y nuestro microcontrolador 16f628!*

Por ultimo simplemente se pone el microntrolador a la “escucha” de comandos para prender o apagar LEDS (relevadores en mi tarjeta) y enviar el estado de los pines del puerto A al destinatario en la red.

Software en la Computadora

Ahora me ocupa explicar como accesar o comandar desde un equipo conectado a la misma red a la que anexamos nuestra tarjeta por medio del protocolo UDP desde TCP/IP, para este fin existe una infinidad de software utilitario para poder enviar y recibir paquetes UDP tanto en Windows, Linux, Android, Machintosh, Ipad y otros sistemas operativos que seria larga la lista de ellos, solo basta dar una buscada por la red y encontraremos varias alternativas.

Recomiendo que se practique enviar y recibir mensajes entre dos computadoras o entre computadora y un teléfono, tableta, etc, para poder familiarizarse con el tema UDP. En el caso de Windows recomiendo el “Hercules Setup Utility” ya que es un software bastante completo y gratis, para android hay uno que se llama “UDP Tester” con el que ya se puede manipular la tarjeta que ocupa este aporte. 

Sin embargo yo escribí un programa lo en Visual Basic .net con la finalidad de también aportar la facilidad a quien se aventure a montar la tarjeta, probar y en verdad cerrar el circulo del conocimiento que deseo verter aquí; dejo a continuación el listado de este programa que se puede compilar en Visual basic 2010.

​

```
Imports System.Net
Imports System.Text.Encoding


Public Class UDPDEMO
    Dim puerto As Integer = 7777 'Puerto UDP que sera utilizado; modificar aqui si se prefiere otro diferente al 7777
    Dim publisher As New Sockets.UdpClient(0)
    Dim subscriber As New Sockets.UdpClient(puerto)


    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        publisher.Connect(DireccionIP.Text, puerto)
        Dim sendbytes() As Byte = ASCII.GetBytes(Envio.Text + Chr(10) + Chr(13))
        publisher.Send(sendbytes, sendbytes.Length)
    End Sub




    Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
        DireccionIP.Text = "192.168.0.5" 'Direccion IP del Host de destino
        subscriber.Client.ReceiveTimeout = 100
        subscriber.Client.Blocking = False
    End Sub

    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        Try
            Dim ep As IPEndPoint = New IPEndPoint(IPAddress.Any, 0)
            Dim rcvbytes() As Byte = subscriber.Receive(ep)
            Recibo.Text = ASCII.GetString(rcvbytes)
        Catch ex As Exception
        End Try
    End Sub

    Private Sub TBTo_TextChanged(sender As System.Object, e As System.EventArgs) Handles DireccionIP.TextChanged
        
    End Sub

    Private Sub Label1_Click(sender As System.Object, e As System.EventArgs) Handles Label1.Click

    End Sub
End Class
```


Obviamente se pueden usar otros lenguajes como Phyton, Java, Processing, C, C++, etc, etc.

Por ultimo dejo el Video de la tarjeta funcionando con el programa que escribi en Visual Basic .net que espero sea lo suficientemente explicativo por si mismo, ya que de presentador soy pesimo, asi que disculpen la austeridad del mismo.

https://plus.google.com/u/0/105335396337664792597/posts/YvcwJseYZPd?pid=6110075813635573442&oid=105335396337664792597








Gracias, espero sea de su agrado y Saludos.


----------



## Fogonazo (Ene 30, 2015)

*! Gracias por el aporte ¡*


----------



## Daniel Meza (Ene 30, 2015)

vaya, excelente módulo... precisamente estaba trabajando con un módulo wi-fi de Microchip, un tal MRB0*** pero me es muy complicado, maneja muchos términos desconocidos para mi y no he podido entablar comunicación con nada.

Me interesa el modulito este, pero me queda la duda ¿en que parte de México lo conseguiste? y luego ese precio!


----------



## miborbolla (Ene 30, 2015)

Daniel Meza dijo:


> Me interesa el modulito este, pero me queda la duda ¿en que parte de México lo conseguiste? y luego ese precio!



No se donde residas, el lugar mas sencillo es por Internet via ML, y donde yo los he comprado cuando voy al distrito federal;es en una tienda ubicada en la colonia Lindavista atrás de lo que fue el cine Futurama en la avenida IPN.

Saludos


----------



## Daniel Meza (Ene 31, 2015)

Excelente, creo saber de que negocio comentas. Soy del Estado de México y me queda cerca;  me daré una vuelta un día de estos, el modulo me ha interesado para unos cuantos proyectitos que tengo en mente


----------



## miborbolla (Ene 31, 2015)

De manera complementaria, me compromete anexar que el programa ejecutable en Visual Basic que deje anexado, requiere de tener instalado el Netframework 4.0 para su funcionamiento y que independientemente de tener montada la tarjeta; con este programa se puede conseguir comunicación entre dos computadoras corriendo el programa en cada una de las respectivas computadoras y estableciendo en mi programa la dirección IP de destino ( la de la otra maquina) y así comprobar la debida comunicación.

Por el hecho de que seguramente tenemos instalados programas antivirus que toman "control" del firewall, el puerto udp "7777" utilizado en este proyecto pudiera estar cerrado, con lo que recomiendo encarecidamente verificar que su firewall tenga abierto el puerto UDP 7777 o en su defecto "inhabilitar" el firewall de manera temporal o dar apertura en este; el acceso al puerto UPD 7777.

Definitivamente es importante esta acotación, pues en su momento yo mismo tuve incertidumbre en el funcionamiento de mi programa y aquellas utilitarias que probé para enviar datos a través de UDP.

Teniendo esto en cuenta, espero poder dar mas apertura, para tener exito en el funcionamiento de este sencillo programa que deje compartido.

Saludos.


----------



## EINNER C (Mar 20, 2015)

Buen día,

Agradezco a miborbolla por sus excelentes aportes, y en base a ello quisiera realizar algunas consultas.

Estoy trabajando con un modulo 3G y GPS (sim5320 de simcom) y un pic 18f26j50, he logrado realizar varias cosas con este modulo como enviar sms, realizar llamadas, enviar datos a un servidor creado con un programa llamado hercules, entre otras cosas, ahora estoy realizando un proyecto para lo cual ya llevo algunas cosas adelantadas pero tengo aun muchas dudas,

El proyecto consiste en adquirir la información de dos equipos de medición (Densidad y Flujo), con los cuales ya me he logrado comunicar y traer todo esa info por medio del puerto serial mediante una app realizada en vb.net, la idea seria ahora realizar esa adquisición a distancia por medio del modulo 3G, tanto como enviar y recibir esos mismos datos pero ahora no usando el puerto serie si no algun tipo de protocolo de Internet, quisas hacer la app de vb.net como un servidor y que se comunique con el cliente que seria el modulo 3G, o algún otro protocolo, la verdad he trabajado bastante con micros y con ello no tengo muchos problemas, pero no he hecho mucho con aplicaciones o protocolos de Internet, y la verdad tengo muchos vacíos, quisiera si es posible me plantearan como podría comunicarme con el modulo a través de Internet para realizar esa comunicación en tiempo real, les agradezco de antemano su colaboración. También tengo un modulo WIFI con el que no he trabajado.

NOTA: tengo bastantes proyectos sobres micros PIC de Microchip y ubn manual que realizae hace poco sobre Micros PSOC de Cypress Semiconductor, cualquier info que requieran sobre ella estoy atento.

Cordialmente,

Einner Cruz


----------



## miborbolla (Mar 20, 2015)

Hola EINNER, desafortunadamente no tengo acceso a un modulo GSM como el que comentas como para saber que prestaciones TCP/ip tenga, lo cual supongo dependerá del servicio "contratado" por el chip SIM que coloques en el modulo GSM.

Y en el caso de que te brinde servicio de Internet (tcp/ip) no sabria como vincularlo con la red local y así poder comenzar con un simple PING desde una de mis computadoras locales con el modulo, en teoría (por los comandos AT de tu modulo sim5320) puedes obtener una IP, y después ya poder mandar "mensages" UDP o TCP, el asunto como lo veo yo, es que seguramente obtendrás una IP de tu proveedor de internet; el que te da tu SIM, pero esa ip estará en la NUBE de internet y habría que lograr colocar en tu red local un servicio (servidor) que este escuchando las peticiones que entren a tu red desde internet.

Para este fin, lo que yo he logrado es lo siguiente:

Me he montado en un equipo con windows 7, el web server iis del propio sistema operativo, junto con las herramientas de "tcpip simple" y ademas en el router/modem de mi proveedor realice el "port fordwaring" de los numero de puertos udp/tcp que pienso utilizar o escuchar. Una ves logrado esto con el programa que deje aquí arriba anexado anteriormente desde una computadora conectada a internet de mi vecino, inicie a enviar mensages UDP ; pude recibirlos y enviarlos satisfactoriamente con lo que logre el cometido de poder tener un "ambiente" de pruebas para lo que estoy haciendo.

Es oportuno aclarar que las IP´s de envió y recepción corresponden a las IP´s que mi proveedor de internet me entrega.

En mi caso particular con el modulo ESP8266 he logrado enviar información desde diferentes lugares vía internet, yo arme 7 tarjetas como las del Aporte de este tema y he podido recibir la informacion de cada una de ellas, pero no he logrado comandar las tarjetas de manera remota a menos que haga lo mismo que en mi laboratorio (hacer el port fordwaring en cada modem donde este conectado el modulo ESP8266).

En conclusión, veo que el modulo GSM sim5320 tiene la capacidad de hacerlo, solo habrá que ver lo que comento de inicio y ver si tu servicio proporcionado por el SIM conectado al modulo, tiene los servicios de internet disponibles.

Quizas en un comienzo, como yo, te valga hacer los primeros pasos de descubrimiento con un modulo como el ESP8266 o aquel que comentas que tienes.

Espero no haber sido enredoso en la explicación, así que perdonaras el intento.

Dejo un cordial saludo.


----------



## EINNER C (Mar 21, 2015)

Buen día,

Gracias por tu respuesta, es de gran ayuda, lo que comenta de realizar port forwarding en el router y realizar así la comunicación ya lo he logrado, he configurado el modulo como un cliente y en el PC con la aplicación hercules he creado un servidor, y he logrado enviar la info del modulo al PC y viceversa, pero quisiera recibir esos datos no en el servidor creado en hercules sino en una aplicación hecha en vb.net para así graficar y controlar dicha información, otro punto es el tema del portforwarding, no me gusta ya que tengo que hacerlo en cualquier moden al que me conecte, no se si haya otra forma mas directa, muchas gracias


----------



## miborbolla (Mar 21, 2015)

Hola:

Bueno, pues justamente el programa que viene listado en mi aporte que se llama UDPDEMO te puede servir como base para desarrollar tu propia aplicación, obviamente mi programa es para escuchar el protocolo UDP, si buscas recibir paquetes TCP, entonces requieres otro tipo de instrucciones de Visual Basic .net.

Buscando por la red, encontraras varios ejemplos, pero notaras que son muy parecido todos, ya que el NETFRAMEWORK es en el caso de windows quien hace el "transporte" de los paquetes TCP/IP.

Aqui un Ejemplo en VB.net de tantos que hay por ahi

Y aquí lo mismo pero desde Python

Obviamente se pueden usar otras plataformas como Python, incluso montarte tu servidor en Linux si lo prefieres. Así que lo que ocupa, es ver como programar por el lado de la PC para enviar y recibir paquetes TCP/IP ya sea por UDP o TCP.

Yo por el momento sigo utilizando el protocolo UDP, ya que facilita mucho la comunicación y por tanto la programación, y en muy pocas lineas se puede obtener bastante.

Sobre el asunto del port fordwaring, pues es un mal necesario que no se puede evitar y es el "padre nuestro" de todos los que con redes trabajamos y por eso es que yo tengo montado una pc a manera de servidor (laboratorio) para desarrollar y probar ahí todo esto del "Internet de las cosas"

Saludos


----------



## digito (Mar 22, 2015)

Hola  miborbolla, este me parece un aporte realmente fantastico, muy agradecido y saludos.


----------



## analogico (Mar 22, 2015)

miborbolla dijo:


> Hola:
> Sobre el asunto del port fordwaring, pues es un mal necesario que no se puede evitar y es el "padre nuestro" de todos los que con redes trabajamos y por eso es que yo tengo montado una pc a manera de servidor (laboratorio) para desarrollar y probar ahí todo esto del "Internet de las cosas"
> 
> Saludos



para evitar el port forwading  en el lado cliente no usar udp    tienen que cambiar el protocolo a tcp  solo es mas complicado mucho mas


----------



## Dr. Zoidberg (Mar 22, 2015)

analogico dijo:


> para evitar el port forwading  en el lado cliente no usar udp    tienen que cambiar el protocolo a tcp  solo es mas complicado mucho mas



El port forwarding es INEVITABLE, sin importar el protocolo usado, siempre que tengas un router de pormedio entre una IP de internet y un rango de IPs privadas de tu red interna.
La unica posibilidad de evitarlo es que tengas un modem en modo bridge y una unica PC conectada a el... lo que por supuesto, es un desperdicio de recursos.


----------



## analogico (Mar 22, 2015)

Dr. Zoidberg dijo:


> El port forwarding es INEVITABLE, sin importar el protocolo usado, siempre que tengas un router de pormedio entre una IP de internet y un rango de IPs privadas de tu red interna.
> La unica posibilidad de evitarlo es que tengas un modem en modo bridge y una unica PC conectada a el... lo que por supuesto, es un desperdicio de recursos.



hay mas posibilidades pero para  no alargar 
-----
por eso dije en el lado cliente
asi como esta el invento si lo usan en 5 lugares tienen que configurar  6 routers
el del servidor mas los 5 clientes 

si lo hacen con tcp solo tienen que configurar el router del server
pero la programacion se hace mas dificil

--
agrego 
con unas modificaciones tambien sirve de aporte para controlar reles desde usb
sobre todo ahora que no hay puertos paralelos


----------



## JRVEGACOV (Abr 15, 2015)

Excelente aporte!


----------



## pacio (Abr 16, 2015)

Muchas gracias por el espectacular aporte!
hace rato quiero comprarme el modulito, pero por el tema del protocolo tcp/ip y udp no me sentia seguro, ahora ya tengo el pie inicial para meterle mano! 
muy bien explicado, y aunque no use protton con lo comentado que está el codigo seguramente lo pueda realizar en ccs sin ningun problema (o casi ninguno espero) muchas gracias! 

Saludos
PACIO!


----------



## Moyano Jonathan (Abr 17, 2015)

Excelente aplicación, no lo había visto antes. Yo por mi lado estuve probando varias cosas con Arduino y el módulo ESP8266, entre ellas un servidor/cliente TCP local. Un WebClient para IoT y un Webserver. Como programa de pruebas uso el TCP test tool y el UDP test tool, en el caso del teléfono utilizo el software de NextPrototypes software para poder realizar las pruebas. En cuanto tenga algo más documentado lo voy a empezar a subir.


----------



## uagav (Ago 26, 2015)

mi aporte es la libreria para la construccion del pcb en proteus. compartanla.




el archivo a descargar lo puse en este tema:
https://www.forosdeelectronica.com/f24/aporte-modulo-wifi-esp8266-127306/


----------



## energyxxi (Oct 2, 2015)

Hola,
Comentar que estoy tanteando un proyecto similar, comunico el móvil con un microcontrolador con TCP-IP ya sea por wifi o 3g. De momento tengo que pasar a través de un ordenador y reconducir el puerto del modem hacia el puerto serial de este, donde está conectado el pic, pero eso lo superaré cuando me llegue el chip chino, de momento no necesito ir a la versión wifi.
Es bastante curioso, programar una aplicación (o ya existente en android) y de momento lo que ha de hacer lo hace, enviar mensajes a una pantalla o recibir. También obtener la temperatura de varios DS18b20 conectados por one-wire en un móvil, a ver en cualquier parte del mundo.
Hecho en ensamblador y con pic16f84A (más apretado más optimizado)
Yo veo un campo enorme en esto. Cuando reuna la información del proyecto la paso, y si alguien quiere preguntar algo, para eso estamos.



El chip chino es un TCP-Ip conversor a puerto serial. En mi caso el Usr-T, de la misma casa.
El programa de redireccionamiento de puertos es el Piracom.
Sino hay puerto serie disponible, usar cable ftd-usb.
El protocolo one-wire es de Maxim, en ensamblador un dolor de cabeza leer todos los db18b20 que hagan falta.
En android usar cualquier Tcp-ip client.
El proyecto de llevarse en ensamblador es algo complejo, pero muy factible.
_(Que pena no poder invertir en los proyectos lo necesario, muchos se quedaron en el cajón del olvido)_


----------



## josmaroal (Ene 14, 2016)

Hola amigo miborbolla esto esta fabuloso ¡FELICITACIONES Y GRACIAS!, hace dos meses vengo buscando en la web ejemplos para iniciarme en el tema del ESP8266, y ninguno me dio frutos, creo con tu proyecto sale. Sera que manejo solo VB6 y Mikrobasic.
Bueno, espero no molestarte con algunas preguntas, aunque ya tiempo que presentaste tu proyecto, me puedas ayudar.
Recibe mis saludos desde Peru.


----------



## ingeniero18 (Feb 15, 2016)

Cómo andan? Me pasaron un módulo wifi ESP8266 ESP-12 para implementarlo con un pic, pero al buscar en la web todo lo que encuentro de este módulo está relacionado con Arduino, lo cual no manejo y tampoco tengo tiempo para ponerme de cero teniendo una gran base de pics. 
Mi consulta principal es la siguiente: ¿Existen librerías para usar el módulo con compilador CCS? Ya que es el que mejor manejo?

Muchas gracias!!!

Fernando


----------



## miborbolla (Feb 16, 2016)

Fernando: No existe una librería como tal para CCS del modulo ESP8266, ya que este modulo cuenta con una serie de Comandos AT con los que puedes hacer prácticamente todo, si revisas este post, encontraras especificado todo lo necesario, incluso el aporte esta basado en un PIC.

Lo que si esta disponible (y sigue en desarrollo) son diferentes formas de aprovechar el modulo ESP8266 con otros Firmwares que se le pueden cargar a este modulo inclusive se puede lograr aprovechar con el IDE de desarrollo de Arduino y lenguaje con sus respectivas restricciones/beneficios, de los firmwares que yo se que existen son:


El basado en comandos AT (como generalmente viene al comprarlo)

Lua NodeMCU (lenguaje de programación basado en Scripts)

Espruino (basado en Java Script)

Sming (framework de desarrollo en el propio modulo)

MMISCOOL'S BASIC INTERPRETER (Interprete de lenguaje basic)

Si tu visitas el sitio de ESP8266 podrás ver las diferentes opciones que existen, ya que el modulo como tal es un microcontrolador con suficiente capacidad y desempeño como para poderlo aprovechar sin la dependencia de microcontroladores extras, solo es tener la paciencia de estudiarlo.

Yo actualmente sigo utilizandolo con comandos AT (gobernado por un pic) y solo he explorado el IDE de Arduino.


Saludos y hasta pronto


----------



## ingeniero18 (Feb 16, 2016)

miborbolla dijo:


> Fernando: No existe una librería como tal para CCS del modulo ESP8266, ya que este modulo cuenta con una serie de Comandos AT con los que puedes hacer prácticamente todo, si revisas este post, encontraras especificado todo lo necesario, incluso el aporte esta basado en un PIC.
> 
> Lo que si esta disponible (y sigue en desarrollo) son diferentes formas de aprovechar el modulo ESP8266 con otros Firmwares que se le pueden cargar a este modulo inclusive se puede lograr aprovechar con el IDE de desarrollo de Arduino y lenguaje con sus respectivas restricciones/beneficios, de los firmwares que yo se que existen son:
> 
> ...



La mejor respuesta esperable... MUCHAS GRACIAS Miborbolla!!!!


----------



## Likaios (Feb 24, 2016)

Hola, buenas tardes, me encuentro realizando un proyecto para la universidad, y tu aporte me a servio de mucho, pero tengo un problema al intentar mandar información del PIC a VB, no consigo hacerlo, pruebo tu programa y funciona, pero el que yo eh realizado no lo hace, podrias ayudarme???
este es mi porgrama


```
Imports System.Net
Imports System.Text.Encoding

Public Class Form1

    Dim puerto As Integer = 7777 'Puerto UDP que sera utilizado; modificar aqui si se prefiere otro diferente al 7777 
    Dim publisher As New Sockets.UdpClient(0)
    Dim subscriber As New Sockets.UdpClient(puerto)



    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        publisher.Connect(DireccionIP.Text, puerto)
        Dim sendbytes() As Byte = ASCII.GetBytes(Envio.Text + Chr(10) + Chr(13))
        publisher.Send(sendbytes, sendbytes.Length)
    End Sub

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        DireccionIP.Text = "192.168.43.39" 'Direccion IP del Host de destino 
        subscriber.Client.ReceiveTimeout = 100
        subscriber.Client.Blocking = False
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Try
            Dim ep As IPEndPoint = New IPEndPoint(IPAddress.Any, 0)
            Dim rcvbytes() As Byte = subscriber.Receive(ep)
            Recibo.Text = ASCII.GetString(rcvbytes)
        Catch ex As Exception
        End Try
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        publisher.Connect(DireccionIP.Text, puerto)
        Dim sendbytes() As Byte = ASCII.GetBytes("1" + Chr(10) + Chr(13))
        publisher.Send(sendbytes, sendbytes.Length)
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        publisher.Connect(DireccionIP.Text, puerto)
        Dim sendbytes() As Byte = ASCII.GetBytes("4" + Chr(10) + Chr(13))
        publisher.Send(sendbytes, sendbytes.Length)
    End Sub

    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        publisher.Connect(DireccionIP.Text, puerto)
        Dim sendbytes() As Byte = ASCII.GetBytes("2" + Chr(10) + Chr(13))
        publisher.Send(sendbytes, sendbytes.Length)
    End Sub

    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        publisher.Connect(DireccionIP.Text, puerto)
        Dim sendbytes() As Byte = ASCII.GetBytes("3" + Chr(10) + Chr(13))
        publisher.Send(sendbytes, sendbytes.Length)
    End Sub
End Class
```


----------



## miborbolla (Feb 25, 2016)

Hola, dejo anexado todo el proyecto en visual basic con la finalidad de poder despejar las dudas que pudiesen surgir ya que es entendible que aunque deje el listado en la aportación; es mejor tener todo el proyecto y así poder ver de manera meticulosa cada una de las propiedades de cada uno de los elementos que componen a la aplicación.

Saludos


----------



## Likaios (Feb 25, 2016)

Muchas gracias por la ayuda =)

Eh descubierto mi error, no tenia activado Timer 1, gracias


----------



## miborbolla (Jul 22, 2016)

Saludos a todos los del foro, en esta ocasión me ocupa el intentar seguir enriqueciendo el aporte original del Tema iniciado por mí. Para tal fin vamos a seguir trabajando con el Modulo Esp8266 y el protocolo de comunicación TCP/IP UDP pero con la variante de programar el Modulo ESP8266 desde el IDE Arduino; anexándole a este ambiente de desarrollo, el “CORE” del ESP8266 con el Gestor de tarjetas que viene anexado en el propio IDE Arduino, para lo cual necesitaremos lo siguiente:

-----Hardware----

Módulo ESP8266
Modulo UBS-RS232 TTL (CP2102 o similar)
78L03 (regulador 3.3 volts)
Electrolítico de 220 uF/16 volts
Resistencia de 330 ohms
Dos Resistencias de 10 kohms
Micro Boton (servirá como “reset”)
Jumper (servirá para configurar el modulo en modo programación)
Cables Varios

-----Software----

IDE desarrollo Arduino (la última versión)
Arduino Core para ESP8266 (seguir instrucciones mas adelante)
UDPDEMO (se encuentra anexado en el primer post de este Tema)

Preparando el Hardware

Armar el montaje de la siguiente figura para poder dejar preparado todo el hardware necesario y poder pasar a revisar lo que concierne al software







Preparando el software

Descargar La última versión del IDE Arduino de su sitio oficial e instalarla con los parámetros por omisión que trae la propia instalación del producto.

Una vez Instalada procedemos a abrir la El IDE de Arduino y ya estando en ella, accesamos al menú de Archivo y luego a preferencias; configuramos el parámetro mostrado en la siguiente figura en el círculo rojo con el siguiente parámetro y damos Aceptar:

http://arduino.esp8266.com/stable/package_esp8266com_index.json






Ahora nos toca ir a descargar el Core para ESP8266, para tal efecto en el menú del IDE Arduino vamos a Herramientas>Placa>gestor de Placas, como se muestra en la siguiente figura:






Ya estando en esta opción, nos compete descargar el CORE para ESP8266, tecleando en la barra de “búsqueda” esp8266, con lo que nos mostrara lo que nos interesa y procedemos a instalarla (ver la siguiente Figura); como es un servicio WEB, no omito comentar que este paso requiere estar conectado a internet y que el proceso puede tardar tanto como ancho de banda esté disponible.






Una vez instalado el CORE ESP8266, notaremos que ya se han añadido una buena cantidad de placas ESP8266 como lo muestra la siguiente Figura:






Con todo este proceso damos por terminada la preparación de todo lo necesario para poder compilar el primer programa y cargarlo a nuestro módulo ESP8266 lo cual nos ocupara en el siguiente paso que consiste en conectar nuestro circuito a la computadora en un puerto USB y esperamos a que se carguen los drivers y verificamos que puerto Serial dejo anexado el sistema por medio del “Administrador de dispositivos” tal como lo muestra la siguiente Figura:






Una vez que verificamos que todo está debidamente reconocido, regresamos al IDE Arduino cargamos el programa "BLINK para esp8266" y una vez en pantalla:






Procedemos a colocar el Jumper en nuestro circuito y presionamos el botón de reset para que así el módulo ESP8266 entre en modo de Programación y esté listo para recibir el programa BLINK una vez compilado por el IDE Arduino; para tal efecto simplemente Oprimimos “como es habitual en Arduino”  el Boton de subir con lo que se compilara el programa, a su vez lo cargara en el módulo ESP8266 y por último se ejecutara el programa:








Si todo ha salido bien; veremos Titilar el pequeño led que viene implementado en el módulo.

Y con esto tenemos Instalado y probado todo lo necesario para poder programar desde el IDE Arduino nuestro Modulo ESP8266 sin depender de un microcontrolador ya que todo corre en el propio microcontrolador embebido, así que lo que resta es estudiar y comprender todas las características que nos ofrece el modulo desde este ambiente.

En mi caso sigo enfrascado en aprovechar el modulo en su modalidad de comunicación TCP/IP UDP ya que debido a las características de su procesador no considero apto delegarle tareas como WEB server o cosas demasiado sofisticadas tal como lo he planteado en el aporte con el que inicie el Tema de este aporte… Y regresando al tema que nos ocupa, me resta dejar el listado del siguiente programa para cargar en el módulo ESP8266 que no hace otra cosa que Fungir como un Servidor del protocolo UDP (puerto 7777) en la dirección IP obtenida por medio del servicio DHCP del router al que se conecte, como siempre he intentado comentar la mayoría de las líneas para su mejor comprensión.


```
// Demostracion del Modulo ESP8266 para Escuchar/enviar mensages por un puerto UDP

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

WiFiUDP port;

char packetBuffer[255]; //variable que contendra los mensages recibidos desde la red
unsigned int localPort = 7777; //Puerto UDP para recibir/mandar mensages
String comando; //Variable donde sera almacenado el comando recibido en el mensage

void setup() {
  
  pinMode(LED_BUILTIN, OUTPUT); //en algunos ESP8266 el led integrado en el Modulo es usado para otro proposito (TX/RX) y simplemente no se aprecia la operacion del mismo cuando esta conectado a un router
  
  Serial.begin(115200); //Inicializamos el puerto serie del modulo ESP8266
  
  WiFi.begin("PELICULAS", "B215809010"); //nos conectamos al router con el SSID y password correspondientes
  port.begin(localPort); //inicamos la escucha del puerto udp
  Serial.println("");

int intentos=0;
  while (WiFi.status() != WL_CONNECTED) { //Mientras no se logre la conexion seguiremos intentando
    delay(500);
    Serial.print(".");
    intentos++;
    if (intentos > 30){
      break;
    }
  }

Serial.println("");
Serial.print("Escuchando puerto UDP en IP:"); //Mostarmos la IP asignada por el router al ESP8266
Serial.println(WiFi.localIP());
  }

void loop() {
  
  int packetSize = port.parsePacket(); //variable local que es utilizada para saber el tamaño del mensage UDP
   
   //Serial.println(packetSize); //esta linea sirve como depuracion
  
  
  if (packetSize) {// si existe un paquete de datos UDP pendiente iniciamos proceso General
    int len = port.read(packetBuffer, 255);
    if (len > 0) packetBuffer[len-1] = 0;
    
    //Serial.println(packetBuffer); //esta linea sirve como depuracion 
    
// una ves recibido el buffer mandamos un mensage de agradecimiento al remitente y el comando recibido
    port.beginPacket(port.remoteIP(),localPort);
    port.write("mensage:");
    port.write(packetBuffer);
    port.endPacket();

    comando=""; // limpiamos el contenido del string.
    
  for (int i=0;i<=packetSize;i++)// concatenamos el contenido del buffer en el string comando para su posterior procesamiento
    {
      //Serial.println(packetBuffer[i],DEC);// este comando solo sirve para depuracion para ver el contenido del buufer en decimal
     comando.concat(packetBuffer[i]);
    } // fin del for

Serial.println(comando); //mostramos el "comando" recibido

  // procesamos el comando recibido por medio de IF´s o como mejor paresca al programador
if (comando=="comando1\n") {

      Serial.println("se Ejecuto correctamente el primer comando");
    
    for (int i=0;i<=10;i++){
      digitalWrite(LED_BUILTIN, HIGH); //en algunos ESP8266 el led integrado en el Modulo es usado para otro proposito (TX/RX) y simplemente no se aprecia la operacion del mismo  cuando esta conectado a un router
        delay(10);
      digitalWrite(LED_BUILTIN, LOW);
      delay(10);
    }
      }

if (comando=="comando2\n") {
    
      Serial.println("Se Ejecuto correctamente el segundo comando");
    
    for (int i=0;i<=5;i++){
      digitalWrite(LED_BUILTIN, HIGH);
        delay(10);
      digitalWrite(LED_BUILTIN, LOW);
      delay(10);
    }
  }  
// fin del proceso de los  comandos recibidos
  
  }//final del if principal
 
 // delay(500);      
} //final de loop
```


Como se podrá apreciar, de manera global, el programa hace las siguientes tareas:

•	Inicializar el modulo
•	Conectarse a un router con un SSID y su respectiva clave de seguridad
•	Especificar que estará en escucha del protocolo UDP en la IP asignada
•	En caso de llegar un mensaje UDP almacenarlo en un buffer
•	Avisar al remitente que se recibió el mensaje y regresarlo como agradecimiento.
•	Procesar el buffer recibido con la finalidad de obtener un posible comando
•	Ejecutar el comando en caso de haberlo encontrado
•	Volver a la escucha del puerto UDP

Para probar el correcto funcionamiento del programa utilice como herramienta el programa UDPDEMO que deje también anexado en el primer Tema de este aporte y en la siguiente figura se puede apreciar que se cumple con el propósito principal de todo este largo escrito.






En el caso de la Figura anterior el Modulo ESP8266 utilizado recibió la IP 192.168.0.11 como se muestra en el “Monitor Serie” del IDE Arduino, misma que en mi programa UDPDEMO fue utilizada como dirección de destino y al escribir el “comando2” este se ejecutó como es debido.

Así que sin más explicación de mi parte, no me queda más que dejarles un cordial saludo esperando no haber causado demasiadas dudas en cuyo caso intentare despejar en la medida de mis posibilidades.

¡Hasta Pronto!


----------



## miborbolla (Sep 14, 2016)

Guardar datos desde módulo ESP8266 en MySQL.

En esta ocasión es mi intención dejar documentado en el foro la manera como vengo resolviendo la necesidad de guardar datos en una base de datos MySQL desde un módulo ESP8266 el cual está programado desde el IDE de desarrollo Arduino con el CORE ESP8266 insertado en el ambiente.

Para tal fin es necesario tener un entorno o servidor el cual tenga disponibles los siguientes servicios ya sean de manera local (intranet) o en un hosting abierto (WWW):

•	WEB Server
•	MySQL Server
•	PHP 5.6
•	PhpMyAdmin

El entorno puede ser Microsoft (IIS), Linux (Apache) o cualquier combinación que se quiera (WAMPSERVER por ejemplo), en realidad lo importante es tener la disponibilidad de los servicios, en mi caso particular he probado estos  tres entornos que comento para asegurar compatibilidad y he comprobado que en los tres funciona igual de bien.




Ahora me corresponde indicar que la parte neurálgica del entorno será un programa en PHP que se encarga de interactuar con el servidor MySQL para poder escribir los datos, en la base de datos Mysql, que reciba desde nuestro(s) módulo(s) ESP8266 vía una petición al servidor WEB. Para tal efecto debemos comenzar por preparar nuestro entorno con los siguientes elementos:

•	Base de datos en el servidor MySQL 
•	Programa PHP
•	Programa Arduino compilado y cargado en el módulo ESP8266


Comenzamos por la base de datos, ver figura anexa,  en el servidor Mysql  llevara el nombre de “iot” y la tabla se llamara “esp8266” ; la tabla lleva 4 campos que son:

•	direccion
•	salida
•	entrada
•	fecha



Toda la creación de la base datos y tabla fue realizada desde la herramienta phpMyadmin la cual facilita enormemente esta tarea.

Como segundo punto, se creó el siguiente programa “escribe.php” que se encarga de interactuar, como ya se dijo, entre las peticiones al servidor WEB y el servidor Mysql y se encuentra alojado dentro de la carpeta IOT del servidor web.




Y este es el listado del mismo:


```
<?php

error_reporting(0); // SE DESACTIVAN LOS ERRORES con la finalidad de que si se producen no se informe al peticionario


$db = new mysqli('localhost', 'root', 'yxhjkcnm', 'iot');// nos conectamos al servidor mysql como usuario "root" contraseña "yxhjkcnm" e indicamos la base de datos "iot"


if($db->connect_errno > 0){ // verificamos si se logro la conexion de manera exitosa
    die('Imposible conectar [' . $db->connect_error . ']');
}
$direccionip = $_SERVER['REMOTE_ADDR']; //TOMAMOS LA IP DEL CLIENTE


$salida = $_GET['salida'];// se toman las variables desde el entorno de la URL (escribe.php?entrada=999&salida=000)
$entrada = $_GET['entrada'];

if ($salida==NULL) { //si desde el entorno no vienen precisada las variables entonces de inicializan en 0
	$salida=0;
}

if ($entrada==NULL) {
	$entrada=0;
}

	$sql = "SELECT * FROM `esp8266`";// seleccionamos la tabla y mandamos los parametros sql para escribir en ella
	$sql = "INSERT INTO esp8266 (direccion, salida, entrada, fecha ) VALUES('$direccionip', '$salida', '$entrada', CURRENT_TIMESTAMP )";

if(!$resultado = $db->query($sql)){ // preguntamos si se ejecutaron los comandos sql
    die('Ocurrio un error ejecutando el query [' . $db->error . ']');
}

echo "Tu IP es:$direccionip  DatoEntrada=$entrada DatoSalida=$salida"; //se imprimen los datos a manera de agradecimiento.
//echo "Dato de salida=$salida<br />";
//echo "Dato de entrada=$entrada<br />";




$db->close();// se cierra la conexion al servidor Mysql
?>
```



Por ultimo nos queda programar el  módulo ESP8266 con el siguiente programa desde el entorno Arduino:



```
/*
 *  Con este programa prototipo
 *  se  puede invocar un programa PHP hospedado en un servidor web apache 
 *  enviandole las variables como parametros
 *  en este programa en particular se estara enviando las variables:
 *  salida y entrada como parametro de la requisicion URL al Servidor
 */

#include <ESP8266WiFi.h>

const char* ssid     = "PELICULAS"; //Nombre de la antena del router 
const char* password = "xyz123yxz";//Contraseña del router
const char* host = "192.168.0.8";// Servidor Apache que contiene programa PHP
int salida=0;
int entrada=0;

void setup() {
  Serial.begin(115200);
  delay(10);

  // Comenzamos por conectarnos al Router que dara servicio de Internet

  Serial.println();
  Serial.println();
  Serial.print("Conectandose a ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");

  Serial.println("Direccion IP Local: ");
  Serial.println(WiFi.localIP());
}



void loop() {
  delay(500);
  

 entrada++;
 salida++;
if (entrada>=256){
  entrada=0;
}

if (salida>=256){
  salida=0;
}



  Serial.print("Intentando conexion ");
  Serial.println(host);
  
  // utilizamos la clase WiFiClient para crear conexiones TCP
  WiFiClient client;
  const int httpPort = 80;//utilizamos el puerto 80 por default de la mayoria de los servidores web
  if (!client.connect(host, httpPort)) {
    Serial.println("conexion fallida");
    return;
  }
  
  // Ahora creamos la requisicion URL (Programa PHP que sera solicitado con sus respectivas Variables
  String url = "/iot/escribe.php?entrada="+String(entrada,DEC)+"&salida="+String(salida,DEC);
  
  Serial.print("Solicitud URL: ");
  Serial.println(url);
  
  // Hacemos la Solicitud  con los parametros necesarios al Servidor como si fuera una peticion desde un navegador
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (client.available() == 0) {// una ves realizada la peticion esperamos por respuesta del servidor web
    if (millis() - timeout > 5000) {// si no hay respuesta por parte del servidor  detenemos la conexion
      Serial.println(">>> No hubo respuesta del host !");
      client.stop();
      return;
    }
  }
  
  // mientras exista una conexion con el servidor WEB procedemos a leer las lineas de replica y las mandamos al puerto serial 
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  
  Serial.println();
  Serial.println();
  Serial.println("Conexion finalizada");
  Serial.println();
}
```



Con todo el entorno preparado solo nos resta comenzar a hacer pruebas de que todo esté funcionando de manera adecuada, es importante tomar en cuenta que deben adecuarse las líneas de programación en cada uno de los programas aquí mencionados con los parámetros locales de cada quien como son:

•	Nombre o dirección IP del servidor WEB, MySQL, PHP
•	SSID y contraseña del router inalámbrico
•	Usuario y password del usuario en el servidor Mysql

En cada programa, me he tomado el detenimiento de dejar comentadas las líneas referentes a estos parámetros y deberán ser contemplados para que todo funcione de manera armoniosa, no omito también destacar que cada uno de los programas tienen comentarios casi línea a línea para saber que se está haciendo y así facilitar el entendimiento de estos a todos los compañeros foristas.

Por ultimo me corresponde indicar que la interacción real entre el módulo ESP8266  y el programa PHP es gracias a que se pueden mandar parámetros o variables dentro de una petición URL, las cuales el programa PHP obtiene y utiliza, en este caso, para dejarlas dentro de la tabla MySQL; lo que quiero decir es que una vez montados los servicios WEB+PHP+Mysql y el programa “escribe.php” alojado de manera adecuada y se invoca desde la barra de direcciones de cualquier navegador, lograre escribir en la tabla “esp8266” los valores de 999 y 000 

//192.168.0.8/iot/escribe.php?entrada=999&salida=000

Una vez que se entiende lo anterior, solo me resta decir que desde el programa en arduino la línea que dice:

String url = "/iot/escribe.php?entrada="+String(entrada,DEC)+"&salida="+String(salida,DEC);

Es la que invoca al programa “escribe.php” con los parámetros que se quieran.

En este programa ejemplo solo se escriben las variables, entradas y salida desde 0 al 255 con incrementos de uno en uno de manera reiterativa, con la finalidad de hacer un test exhausto a la base de datos y así verificar que no hay pérdida de datos. Este mismo programa lo he montado hasta en 10 módulos ESP8266 (que son con los que cuento) los cuales he colocado en diferentes lugares, no solo de mi taller sino que gracias a que tengo disponible un servicio WWW, los he montado en casas de amigos y familiares con muy buenos resultados, cada módulo lo identifico por la IP de origen y la hora (del servidor) en que fue recibida y que guarda el programa PHP, lo cual es sobreentendida la utilidad de esto.

Sin más, dejo mis más cordiales saludos.


----------



## maxmadin (Oct 6, 2016)

Que tal tengo un ESP8266, integrado en el módulo NodeMCU v1.0.

El problema es que no tengo el controlador del dispositivo, en el administrado de dispositivos me dice que no están instalado los controladores del dispositivo (código 28)y en el ide de arduino no me deja asignarle un puerto

instale estos drivers  para windows de est link https://github.com/nodemcu/nodemcu-devkit/tree/master/Drivers
el  modulo si funciona ya que lo he probado en una laptop de un compañero, pero mi compu no lo lee agradecería mucho su ayuda, lo que se me ocurre es que no intale bien los drivers pero cualquier sugerencia se agradece


----------



## miborbolla (Oct 7, 2016)

maxmadin dijo:


> Que tal tengo un ESP8266, integrado en el módulo NodeMCU v1.0.
> 
> El problema es que no tengo el controlador del dispositivo, en el administrado de dispositivos me dice que no están instalado los controladores del dispositivo (código 28)y en el ide de arduino no me deja asignarle un puerto
> 
> ...



En el caso de contar con windows 8 y 10, automáticamente instala los drivers desde internet,  comentas que en en la laptop de tu compañero funciona OK ¿que hizo tu compañero o tu para que funcionara?

En el administrador de dispositivos de windows (de donde obtuviste la información del código 28) esta la pestaña de "detalles" y luego en propiedades puedes obtener el ID de hardward; con ese dato buscar en san GOOGLE y de ahí tendrás la pauta de saber que tipo de puerto USB-Serial tiene tu modulo y conseguir el driver correspondiente.

Saludos


----------



## ZeroVB (Oct 31, 2016)

Buenas.

Primero que nada, muchísimas gracias por el aporte me está sirviendo mucho para aprender.

Te quería hacer una consulta, hice toda la conexión PIC 16F628A -> ESP8266 pero resulta que en cuanto manda el primer comando AT no recibe nunca el "OK", me estoy volviendo loco.

Ya probé de todo. Lo ultimo que hice fue poner el ESP8266 en 9600 bauds porque antes lo tenia en 115200 aunque no debería haber diferencia siempre y cuando lo cambie en el código. Algún consejo o ayuda de que puede estar pasando? El Cristal que usas es de 4Mhz?

Gracias!

Saludos.


----------



## Juan Franco (Oct 31, 2016)

Hola ZeroVB, te comento que me paso lo mismo y probe ya todo lo que hiciste, el error lo encontre en este codigo que esta invertido: va 13 ,10 en lugar de 10,13 , hace la prueba con los primeros comandos y te vas a dar cuenta, hace un parpadeo de leds entre cada linea. Espero que te sirva.

 HSerOut ["AT", 13,10]'Enviamos comando de Atencion "AT" para verificar comunicacion con modulo ESP8266
 ' anule HSerOut ["AT",10, 13]'Enviamos comando de Atencion "AT" para verificar comunicacion con modulo ESP8266

HSerIn [Wait ("OK"), DATOEN]' Esperamos agradecimiento "OK" del modulo 
HSerOut ["AT+CWMODE=3",13,10]'Enviamos comando para colocar el modulo ESP8266 en modo "BOTH"
HSerIn [Wait ("OK"), DATOEN]' Esperamos agradecimiento "OK" del modulo


----------



## ZeroVB (Oct 31, 2016)

Juan Franco dijo:


> Hola ZeroVB, te comento que me paso lo mismo y probe ya todo lo que hiciste, el error lo encontre en este codigo que esta invertido: va 13 ,10 en lugar de 10,13 , hace la prueba con los primeros comandos y te vas a dar cuenta, hace un parpadeo de leds entre cada linea. Espero que te sirva.
> 
> HSerOut ["AT", 13,10]'Enviamos comando de Atencion "AT" para verificar comunicacion con modulo ESP8266
> ' anule HSerOut ["AT",10, 13]'Enviamos comando de Atencion "AT" para verificar comunicacion con modulo ESP8266
> ...



Buenas.

Muchas gracias por la respuesta!

Lo acabo de hacer y ahora veo que el ESP8266 hace un parpadeo en el led azul indicando pero no me pasa por el HSerIn "OK".

De que manera tenés conectado el modulo wifi?

Yo así sin el GPIO0 a masa y sin todo el tema ese del switch, solo el CH_PD a Vcc y bueno, con el RX al TX del Pic y el TX al TX mediante una resistencia de 100ohm como está en el circuito.






Saludos.


----------



## Juan Franco (Nov 1, 2016)

Hola, te tiene que hacer la secuencia de leds al final de este comando
HSerOut ["AT+CIPSEND", 13,10]' Comenzamos inicio de transmicion y recepcion de datos
si hace la secuencia de led es que programo correctamente el esp8266.
La forma de conexion es segun el esquema si.
Te recomiendo que hagas un parpadeo de leds entre cada instruccion para saber si esta pasando a la siguiente.


----------



## ZeroVB (Nov 1, 2016)

Juan Franco dijo:


> Hola, te tiene que hacer la secuencia de leds al final de este comando
> HSerOut ["AT+CIPSEND", 13,10]' Comenzamos inicio de transmicion y recepcion de datos
> si hace la secuencia de led es que programo correctamente el esp8266.
> La forma de conexion es segun el esquema si.
> Te recomiendo que hagas un parpadeo de leds entre cada instruccion para saber si esta pasando a la siguiente.



Lo que hice fue poner una parpadeo de LED en estas lineas:

HSerOut ["AT", 13,10]

Hight LED1
DelayMS 1000
Low LED1

HSerIn [Wait ("OK"), DATOEN]
HSerOut ["AT+CWMODE=3", 13,10]

Hight LED1
DelayMS 1000
Low LED1

HSerIn [Wait ("OK"), DATOEN]

Por el primer "AT" pasa pero no llega al segundo, es como que se quedara esperando el Wait que nunca llega, supongo que será porque no lo está leyendo bien, pero la verdad que no encuentro cual es el problema.


----------



## Juan Franco (Nov 1, 2016)

No estas recibiendo la respuesta del esp8266 o esta mal la velocidad y devuelve cualquier cosa menos ok, yo lo puse a los 2 a 9600 baudios, mas tarde te paso fotos de como lo conecte.


----------



## ZeroVB (Nov 1, 2016)

Juan Franco dijo:


> No estas recibiendo la respuesta del esp8266 o esta mal la velocidad y devuelve cualquier cosa menos ok, yo lo puse a los 2 a 9600 baudios, mas tarde te paso fotos de como lo conecte.



Como tenés conectados los pines del ESP8266?

Otra cosa que estuve viendo son los firmwares del ESP8266, se necesita alguno en particular?

Gracias!


----------



## Juan Franco (Nov 2, 2016)

Con el firmware que viene ya funciona con comandos AT, te adjunto fotos, yo use con un par de resistencias en rx y tx de 220 ohm, si tenes dudas podes invertir para provar esos dos cables nomas, no vas a quemar nada, eso si no inviertas la corriente de negativo y positivo porque quemas el esp8266.


----------



## Juan Franco (Nov 2, 2016)

adjunto fotos del mensaje anterior, no pude subir antes


----------



## ZeroVB (Nov 2, 2016)

Juan Franco dijo:


> adjunto fotos del mensaje anterior, no pude subir antes



Lo que no veo en la foto es el Cristal Oscilador, lo tenes conectado? Tengo todo igual, en el ESP8266 tenes conectado Vcc, Ground, RX, TX y CH_PD a Vcc no?

Saludos!


----------



## Juan Franco (Nov 2, 2016)

No us cristal, uso oscilador interno a 4Mhz, y a 9600 baudios el serial, las conexiones son tal cual el ejemplo y forma de conectar el esp8266, y ch_pd a vcc sino no prende.
Podes ver como tomar en la pc en el puerto serial lo que devuelve el esp8266, yo hice eso para saber que estaba pasando, y entonces ver si te devuelve ok despues de cada instruccion, solo anula la instrucción HSerIn  despues de cada instruccion.
Saludos


----------



## ZeroVB (Nov 10, 2016)

Juan Franco dijo:


> No us cristal, uso oscilador interno a 4Mhz, y a 9600 baudios el serial, las conexiones son tal cual el ejemplo y forma de conectar el esp8266, y ch_pd a vcc sino no prende.
> Podes ver como tomar en la pc en el puerto serial lo que devuelve el esp8266, yo hice eso para saber que estaba pasando, y entonces ver si te devuelve ok despues de cada instruccion, solo anula la instrucción HSerIn  despues de cada instruccion.
> Saludos



Buenas.

Hice eso, saqué el cristal y puse el oscilador interno a 4Mhz, puse en un loop con 1 segundo de delay y mandé "AT" todo el tiempo, después mandé el TX del PIC al RX del ESP8266 y del TX del ESP8266 al USB para ver si podía recibir el "OK" en la PC, pero nada. Lo que me extraña es que tampoco prende la luz azul cuando le mando la instrucción AT. estoy prendiendo luces cada vez que pasa por "AT" y pasa bien, pero es como si al ESP8266 no le llegara nada, está configurado en 9600, lo probé con el USB y es así.

Ya no estoy seguro que más probar, se les ocurre alguna idea?

Gracias!

Saludos.


----------



## Juan Franco (Nov 11, 2016)

Hola ZeroVB, prova una conexion serial con la pc directamente y la placa wifi, para enviarle comandos AT y ver  te devuelve, practica con eso primero, yo use una placa arduino usando sus conexiones seriales, pero podes usar el adaptador que tenes a serial directamente., Saludos


----------



## miborbolla (Nov 11, 2016)

Hola ZeroVB, como te ha sugerido Juan Franco, yo comenzaría por probar tu comunicación con tu interface USB-Serial puenteando TX con RX para lograr un eco y desde la PC con un programa como el Hyperterminal ver que todo lo que mandas o tecleas desde la pc lo veas replicado en la terminal.

Si logras el eco, entonces prueba cambiar la velocidad (baudios) y ver que todo se comporte correctamente, una vez que ya tienes logrado esto, entonces ya puedes pasar a conectar tu modulo ESP8266 y ver si ya te responden los comandos AT.

Saludos


----------

