Noticias:

Grupo en telegram, del foro de meteorología fácil: https://t.me/meteorologiafacil

Para mas detalles, puedes visitar el siguiente tema http://www.meteorologiafacil.com.ar/foros/index.php?topic=1608.0

Espero que les sea de mucha utilidad.

Menú Principal

Mis pasos con el módulo ESP8266

Iniciado por David Met, Junio 06, 2015, 10:58:43 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Ricber

Entonces la pagina va grabada en la memoria interna del esp8266.

David Met

Si, y eso lo hace mucho más rápido. :\
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Ricber

Eso es Perfecto, también ahorras mucho circuito y código.

David Met

Antes de continuar, tengo que hacer una salvedad. Desde el primer paso hasta hoy, hice algunos cambios en mi vida informática. A mi notebook la particioné y le agregué Ubuntu y mantuve windows. Desde ahora voy a trabajar en linux, pero la interface será la misma. Seguiré trabajando con el monitor serie de arduino. Así que todo seguirá igual. Solo van a notar que en la parte superior izquierda, no aparece más el COM10, sino otra leyenda; y las tipografía son diferentes, pero aquel que quiera seguirme con windows, podrá hacerlo sin ningún problema.

Continuación del primer paso.

Lo siguiente que vamos a realizar, es crear un pequeño servidor web. Para ello enviaremos estos dos comando:

AT+CIPMUX=1
AT+CIPSERVER=1,80

El primero es para configurar conexiones múltiples y el segundo habilita el servidor y abre el puerto 80 de la sesión. En ambos casos, nos debe responder con un OK.
NOTA: Para habilitar el servidor, es necesario habilitar las conexiones múltiples, sino al enviar AT+CIPSERVER=1,80 nos dará error.


Una vez enviado los comando; podremos ingresar al servidor. Para ello deberán dirigirse hacia un navegador (ya sea de PC o teléfono; lo importante es que estén en la misma red) y tipear la IP que le asignó el router al ESP8266. En el navegador no se verá nada; pero en la terminal serie, veremos algo así:


Como puede observar, cuando un navegador se conecta a un servidor, éste le envía ciertos datos al servidor. Por ejemplo, que navegador y su versión estamos utilizando; que lenguaje de navegador tiene; que SO estamos usando; la IP, ect. Son datos que nos pueden ser útil o no.

Como verán, cuando alguien se conectar al servidor, al final de los datos de nuestro navegador, veremos la palabra Link. Esto nos dice que estamos conectado; y por cada refresco o petición que hace el navegador, nos responderá con un Link. Por otra parte, si se corta la conexión, el servidor ESP8266 nos enviará Unlink, indicando que la conexión se ha terminado.

Por ahora, lo más importante es que presten atención al principio de toda la información que nos da el servidor. Nuestro servidor (ESP8266) empieza con la línea +IPD

+IPD,0,368:GET / HTTP/1.1

En este caso, nos dice que la conexión es echa con la sesión 0; que a continuación recibiremos 368 caracteres; para luego informarnos de todo lo demás antes mencionado.

¿Qué pasa si pido con dos navegadores en forma simultánea? Veremos:


Simplemente genial. Hasta informa que tipo de celular estoy utilizando. LG-E465g
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Ricber

Excelente, ya compre un modulo asi que estas pruebas tuyas me vienen
como anillo al dedo. ok! :\

David Met

Tengo problemas con JAL nuevamente a la hora de hacer un puerto serie virtual por USB. Agrego una función y la PC no me lo reconoce print_string(serial_hw_data,dato) Estoy viendo dos cosas.

a) encontrar el error de porqué no me lo reconoce.
b) pasarme a C18.

Pero me parece que terminaré en el plan b.
Yo se que teniendo el servidor funcionando, no tiene sentido tener una conexión USB con la PC, pero lo necesito para saber como me está enviando los datos; ya que no logro enviar nada a un navegador.

Veremos que pasa.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Ricber

Cambiar de lenguaje de programación no es nada practico, si es solo para
hacer algunas pruebas tal vez podrías usar la puerta serie y un adaptador
rs232 a usb.

David Met

Si, tienes mucha razón.
De todas maneras, logré hacerlo andar, pero no del todo bien. Mi idea es saber como acepta un comando enviado desde el PIC (vah, es igual desde la terminal, pero como las terminales incluyen, al final, algunos datos como retorno de carro y nueva línea, necesitaba verlo por mi mismo).

Ahora subo los avances.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

Segundo paso. Servidor básico.

El objetivo de este paso, es lograr que el PIC 18F4550 configure, sin intervención nuestra, al ESP8266 como servidor web. Para ello, debe enviar diferentes comandos y de la forma correcta.
Primero podré el programa completo, y luego explicaré las partes más importantes:

-- ------------------------------------------------------------------------------------------------
-- Servidor web básico
-- ------------------------------------------------------------------------------------------------

-- ------------------------------------------------------------------------------------------------
-- Creado Leo Persi
--
-- Iniciado el 19 de Julio de 2.015
--
-- ------------------------------------------------------------------------------------------------
-- TÍTULO: Servidor web básico con adaptador Serie - USB.
-- VERSIÓN: 1.0.
-- AUTOR: Leo D. Persi
-- PROGRAMA PARA PIC: Leo D. Persi.
-- PROGRAMA PARA PC:
-- FECHA: 20 de julio de de 2.015.
--
-- DESCRIPCIÓN:
-- ------------
-- Configura al módulo ESP8266 en forma de servidor. Además, genera una conexión Serie virtual en la PC.
--
-- ------------------------------------------------------------------------------------------------
--
-- Este programa ha sido generado por jallib.py
-- Plataforma Entrenadora Felixls.
--
-- ------------------------------------------------------------------------------------------------
-- INICIO DEL PROGRAMA.
-- --------------------
include 18f4550 -- Incluímos la librería para controlar nuestro PIC.

-- Aunque el cristal externo es 20 MHz, la configuración es tal que el reloj de la CPU
-- se deriva de reloj PLL 96 Mhz (div2),
-- por lo tanto, establecer la frecuencia de destino para 48 MHz
pragma target clock       48_000_000


-- FUSIBLES:
-- ---------
pragma target PLLDIV        P5          -- divide by 5 - 20MHZ_INPUT
pragma target CPUDIV        P1          -- [primary oscillator src: /1][96 mhz pll src: /2]
pragma target USBDIV        P2          -- CLOCK_SRC_FROM_96MHZ_PLL_2
pragma target OSC           HS_PLL
pragma target FCMEN         DISABLED
pragma target IESO          DISABLED
pragma target PWRTE         DISABLED    -- power up timer
pragma target VREGEN        ENABLED     -- USB voltage regulator
pragma target VOLTAGE       MINIMUM     -- brown out voltage
pragma target BROWNOUT      DISABLED    -- no brownout detection
pragma target WDTPS         P32K        -- watch dog saler setting
pragma target WDT           CONTROL     -- watchdog software controlled
pragma target CCP2MUX       pin_C1      -- CCP2 on pin C1
pragma target PBADEN        DIGITAL     -- digital input port<0..4>
pragma target LPT1OSC       LOW_POWER   -- low power timer 1
pragma target MCLR          EXTERNAL    -- master reset on RE3
pragma target STVR          DISABLED    -- reset on stack over/under flow
pragma target LVP           DISABLED    -- no low-voltage programming
pragma target XINST         ENABLED     -- extended instruction set
pragma target DEBUG         DISABLED    -- background debugging
pragma target CP0           DISABLED    -- code block 0 not protected
pragma target CP1           DISABLED    -- code block 1 not protected
pragma target CP2           DISABLED    -- code block 2 not protected
pragma target CP3           DISABLED    -- code block 3 not protected
pragma target CPB           DISABLED    -- bootblock code not write protected
pragma target CPD           DISABLED    -- eeprom code not write protected
pragma target WRT0          DISABLED    -- table writeblock 0 not protected
pragma target WRT1          DISABLED    -- table write block 1 not protected
pragma target WRT2          DISABLED    -- table write block 2 not protected
pragma target WRT3          DISABLED    -- table write block 3 not protected
pragma target WRTB          DISABLED    -- bootblock not write protected
pragma target WRTD          DISABLED    -- eeprom not write protected
pragma target WRTC          DISABLED    -- config not write protected
pragma target EBTR0         DISABLED    -- table read block 0 not protected
pragma target EBTR1         DISABLED    -- table read block 1 not protected
pragma target EBTR2         DISABLED    -- table read block 2 not protected
pragma target EBTR3         DISABLED    -- table read block 3 not protected
pragma target EBTRB         DISABLED    -- boot block not protected

WDTCON_SWDTEN = OFF                     -- disable watchdog

-- ------------------------------------------------------------------------------------------------
-- CONFIGURACIÓN GENERAL DEL PIC:
-- ------------------------------
include usb_serial -- Incluimos la librería.
usb_serial_init() -- Iniciamos el puerto.
-- ------------------------------------------------------------------------------------------------
-- INCLUIMOS LIBRERÍAS:
-- --------------------
-- ---------------------------
-- Incluimos la librería serie
-- ---------------------------
const bit usart_hw_serial = TRUE -- Modo asincrono
const serial_hw_baudrate = 9600 -- Conexión a 9.600 baudios.
include serial_hardware -- Incluimos la librería.
serial_hw_init() -- Iniciamos el puerto.
-- ---------------------------
include print -- Incluimos la librería Print.
include delay

-- ------------------------------------------------------------------------------------------------
-- VARIABLES:
-- -----------
var byte ch -- Recupera el valor recibido por USB
var byte char -- Recupera el valor recibido por el puerto serie.

-- ------------------------------------------------------------------------------------------------
-- CADENAS VARIAS:
-- ---------------
-- CONFIGURACIÓN ESP8266
-- ---------------------
const byte modo[] = "AT+CWMODE=3\r\n"
const byte mulconex[] = "AT+CIPMUX=1\r\n"
const byte servidor[] = "AT+CIPSERVER=1,80\r\n"
const byte unirse[] =  "AT+CWJAP=\"nombreRED\",\"Contraseña\"\r\n"

-- ------------------------------------------------------------------------------------------------
-- MENU PRINCIPAL.
-- ---------------
delay_1ms(500)
usb_serial_flush()
delay_1ms(500)
print_string(serial_hw_data,modo)
delay_1ms(500)
print_string(serial_hw_data,mulconex)
delay_1ms(500)
print_string(serial_hw_data,servidor)
delay_1ms(500)
print_string(serial_hw_data,unirse)

forever loop
usb_serial_flush()

    if usb_serial_read(ch) then -- Si hay datos recibidos por el USB, lo copio
serial_hw_data = ch -- Y pego en el puerto Serie RS232
end if
if (serial_hw_read(char)) then -- Si hay datos recibidos por el puerto serie RS232 lo copio
usb_serial_data = char -- y pego en el puerto USB
end if

end loop


Es poco lo que se ha modificado.
Lo primero que hice es crear varias cadenas con la configuración necesaria para el ESP8266. Las cadenas son sencillas:

const byte modo[] = "AT+CWMODE=3\r\n"
const byte mulconex[] = "AT+CIPMUX=1\r\n"
const byte servidor[] = "AT+CIPSERVER=1,80\r\n"
const byte unirse[] =  "AT+CWJAP=\"nombreRED\",\"Contraseña\"\r\n"


Hay que tener en cuenta dos cosas muy importante:

1)\r\n
  Esto, es interpretado por JALv2 y envía el valor correcto en ASCII para enviar retorno de carro; y nueva línea. Es necesario que sea establecido en ese órden

2) Para poder enviar las comillas, se debe anteponer la contra barra \ De ahí la rara configuración de la cadena unirse[]

Esto es necesario llamarlas una cola vez, por lo que se debe excluir del bucle principal del programa. Le he dado una demora, para que se configure el ESP8266 antes de enviarle el otro comando. No es la forma correcta, ya que deberíamos chequear si nos envía un OK, ERROR. En todo caso, se debería actuar en la forma correcta. No lo he podido hacer así, porque me consume ciclos, y la PC no me reconoce al PIC; por lo que lo dejaremos para más adelante, cuando no utilicemos al PIC como adaptador USB-SERIAL

Cuando conecté todo y el PIC empezó a enviar datos, también recibía datos; y esto hizo que la PC (en UBUNTU) tarde en reconocer al PIC. No obstante, una vez terminado todo el proceso, la PC lo reconocío.
Lo primero que hice fue enviar el comando AT+CIFSR para saber que IP tengo. Al principio me envió un OK ¿? pero al enviarlo por segunda vez, me respondió en forma correcta:


Acto seguido, entré a un navegador y accedí a la dirección del ESP8266 y por el monitor serie, recibí la información correcta:


Lo importante es que ya sabemos como el PIC debe enviar los comandos para configurar al módulo. Paso siguiente, será armar una web muy básica para que muestre un dato una vez que se ingresa con un navegador. Y en un tercer paso, será hacer lo mismo pero sin la particularidad de que el PIC sea un adpatador SERIE - USB. Esto nos permitirá un mejor programa (y que además, es inútil tenerlo para esto)
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

Lamentablemente, no logro hacer andar la web.
He decidido no hacer una página web en el pic y que al mismo tiempo sea un adaptador USB-SERIAL. Veré si logro hacerlo funcionar.

Lo que voy a hacer, es cargar el primer programa, pedirle al ESP8266 que me informe su MAC, y desde el router, fijarle una IP; así siempre sabré a que dirección conectarme.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

David Met

Y sigo.
Por alguna razón que no entiendo, el ESP8266 no me informa que MAC tiene. Probé con con estos comandos pero nada. Siempre me responde con un ERROR:

AT+CIPSTAMAC?

AT+CIPSTAMAC? = mac

donde mac es un string que equivale a la MAC del dispositivo.
Intenté asignárselo yo, pero tampoco me funcionó.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Ricber

Hola David

Estuve mirando algunos tutoriales y encontré que ese comando que estas probando
no funciona bien si el firmware es 00160901

Note:
This command doesn't seem to work on firmware 00160901

Con AT+GMR  deberías ver la version del firmware tal vez sea ese el problema.

David Met

Gracias por el dato.
Lo voy a chequear. ok!
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.