TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: groundman en 31 de Diciembre de 2015, 19:26:04

Título: Esp8266 & LUA
Publicado por: groundman en 31 de Diciembre de 2015, 19:26:04
hola a todos.en algun tema del foro. ya comente que no me iba a meter a aprender LUA.ya que mi tiempo es limitado.pero la posibilidad
de controlar dispositivos sin añadir gastos como integrar un miscrocontrolador,me ha vencido.ya que es algo muy tentador.

por eso abrire este tema para poner mis experiencias con el ESP8266 y su programacion con LUA.

para empezar voy a poner unos enlaces muy importantes para trabajar con este.

la API:
https://github.com/nodemcu/nodemcu-firmware/wiki/nodemcu_api_en#fileread
http://www.nodemcu.com/docs/index/

y el manual de referencia:
http://www.lua.org/manual/5.1/es/manual.html

el ESP8266Flasher para programar la flash.para win32/64

https://github.com/nodemcu/nodemcu-flasher

la flash con la que programaremos el ESP8266.en mi caso he usado la nodemcu_float_0.9.6-dev_20150704.bin

https://github.com/nodemcu/nodemcu-firmware/releases


el programa Esplorer.que es una herramienta para programar nuestro ESP8266.

http://www.akirasan.net/esplorer-ide-de-programacion-para-esp8266/


y el programa hercules para hacer conexiones por la red.

http://www.hw-group.com/products/hercules/index_en.html






no voy a explicar como se usan estos programas porque hay informacion en internet y en youtube.asi que pondre diferentes configuraciones
para el uso de las diferentes funciones de la API del ESP8266.

tambien explicare diferentes cosas muy importantes y sencillas que si no las realizamos,nos va a doler bastante la cabeza.

una de ellas es que cada vez que programemos el ESP con el Esplorer.es que cerraremos la conexion y resetearemos el ESP.yo lo que
hago es sacar el conversor USB-TTL del ordenador y luego lo conecto de nuevo.

otra cosa es que el archivo que carguemos en el Esp.sera nombrado como    init.lua



bueno.lo primero que voy a hcer es implentar un servidor en nuestro ESP8266. y este es el codigo:

Código: [Seleccionar]
wifi.setmode(wifi.STATION)        --modo estacion
 wifi.sta.config("SSID","clave")    --nombre del punto de acceso wi-fi de nuestro router.y la clave
 wifi.sta.setip({ip="192.168.1.5",netmask="255.255.255.0",gateway="192.168.1.1"})   --configura IP fija
 wifi.sta.connect()         --conectar
 
 print("ESP8266 mode is: " .. wifi.getmode())           --indica el modo wi-fi.(estacion en este caso)
 print("The module MAC address is: " .. wifi.ap.getmac())   --indica la mac de nuestro dispositivo
 print("Config done, IP is "..wifi.sta.getip())         --indica la IP que nos ha asignado el router.

 srv=net.createServer(net.TCP,60)                  --crea el servidor.y si no hay trafico,cierra conexion pasados 60s
 srv:listen(80,function(conn)                    --estar a la escucha en el puerto 80.
    conn:on("receive",function(conn,payload)            --evento de recepcion y carga el valor leido en payload
    print(payload)                      --envia al puerto serie lo que se recive desde el cliente
    conn:send("HOLA MUNDO")                      --envia al cliente. HOLA MUNDO.
   
   
    end)
end)


como veis las lineas estan comentadas para indicar su funcion.

las lineas que empiezan con el comando wifi son las que configuran el servidor.la primera selecciona el modo STA.la segunda ingresa
el nombre de la wi-fi del punto de acceso de nuestro router.y la clave
la siguiente asigna una IP fija para nuestro servidor.si no pusieramos esta linea. se nos asignaria automaticamente.pero como es aleatoria,
no sabriamos cual es si no la consultamos.
y posteriormente conectamos.

las lineas print es para consultar diferentes comandos.y son enviados por el puerto serie.

las lineas srv son para la creacion de la comunicacion del servidor con el cliente.
la primera crea el servidor con un limite maximo de conexion sin tarfico de 60segundos.
la siguiente configura al servidor para escuchar por el puerto 80
siguiente para cargar en la variable payload lo que se reciva por el puerto 80.
print es para sacar el dato por la usart.
y send es para responder al cliente con los datos que queramos.en este caso HOLA MUNDO.


para comunicarnos con este programa usaremos el Hercules.con este formato:

(http://dc738.4shared.com/img/GphhhwFiba/151fa19a760/erculesServer) (http://www.4shared.com/photo/GphhhwFiba/erculesServer.html)

si quisieramos acceder desde un navegador como el crome,opera,firefox,iexplorer etc...

pondriamos 192.168.1.5 en la barra de busqueda y el servidor nos responderia con HOLA MUNDO.pero la linea conn:send("HOLA MUNDO")
hay que cambiarla por: conn:send("<h1> HOLA MUNDO.</h1>")   ya que el navegador funciona con codigo HTML.
Título: Re:Esp8266 & LUA
Publicado por: juaperser1 en 31 de Diciembre de 2015, 20:10:06
Impresionante y detallada explicación groudman ((:-)) ((:-))

Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 31 de Diciembre de 2015, 20:26:22
 Excelente explicación! Hace meses que quiero hacer lo que estas haciendo y no he tenido tiempo. Así que quedo atento a los avances y a ver si me pudo poner a probar lo que vas compartiendo.

Saludos!
Título: Re:Esp8266 & LUA
Publicado por: groundman en 31 de Diciembre de 2015, 20:44:24
encantado de ser de ayuda.a pocos minutos pasados del año 2016. :-/

espero que sigamos avanzando en la tecnologia del futuro.y que este año nos entren mas jugueticos de estos y mas
a nuestro alcance.economicamente hablando.
Título: Re:Esp8266 & LUA
Publicado por: groundman en 31 de Diciembre de 2015, 20:45:59

En este ejemplo encenderemos un led conectado al pin GPIO2 del Esp8266-1 que en el codigo esta asignado con el valor 4.
pin que segun la segunda linea es configurado como salida.

tal y como veis en el codigo.hay un par de condicionales que activan/desactivan el led segun se reciva ledon/r  o ledoff/r
desde el cliente del Hercules.podemos usar otra combinacion de caracteres para los condicionales.yo he usado /r porque
es un return que usaremos en la siguiente practica.que trabajaremos con la usart del modulo.

Código: [Seleccionar]

pin=4                           --asignamos valor 4 para la variable pin
gpio.mode(pin, gpio.OUTPUT)     --configuramos el pin 4 como salida.



wifi.setmode(wifi.STATION)        --modo estacion
 wifi.sta.config("SSID","clave")    --nombre del punto de acceso wi-fi de nuestro router.y la clave
 wifi.sta.setip({ip="192.168.1.5",netmask="255.255.255.0",gateway="192.168.1.1"})   --configura IP fija
 wifi.sta.connect()         --conectar
 print("ESP8266 mode is: " .. wifi.getmode())           --indica el modo wi-fi.(estacion en este caso)
 print("The module MAC address is: " .. wifi.ap.getmac())   --indica la mac de nuestro dispositivo
 print("Config done, IP is "..wifi.sta.getip())         --indica la IP que nos ha asignado el router.

 srv=net.createServer(net.TCP,60)                  --crea el servidor.y si no hay trafico,cierra conexion pasados 60s
 srv:listen(80,function(conn)                   --estar a la escucha en el puerto 80.
    conn:on("receive",function(conn,payload)            --evento de recepcion y carga el valor leido en payload
    print(payload)                      --envia al puerto serie lo que se recive desde el cliente

    --activacion de la salida D1 del ESP8266-1
    if payload=="ledon\r" then              --secuencia para encender led
         gpio.write(pin, gpio.HIGH)         --encender led
          conn:send("Led On")               --envia al cliente.mensage
          print("evento on")
         
        elseif payload=="ledoff\r" then     --secuencia para apagar led
         gpio.write(pin, gpio.LOW)          --apagar led
         conn:send("Led Off")               --envia al cliente.mensage
         print("evento off")
       
         end
   
       
    end)
end)

aqui un video de su funcionamiento:

Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 31 de Diciembre de 2015, 20:57:18
Una consulta, sabes si hay driver para manejar una uSD en lua?

Saludos!
Título: Re:Esp8266 & LUA
Publicado por: groundman en 31 de Diciembre de 2015, 21:19:01
si te refieres a controlar una sd con el Esp8266.en el SDK viene como se usa el SPI.asi que una targeta SD se deberia poder
leer/escribir.

una libreria no se si abra.aunque me extraña que no hayan ya practicado con eso.


ahh.aqui un enlace:



y aqui la libreria:

https://github.com/MetalPhreak/ESP8266_SPI_Driver
Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 31 de Diciembre de 2015, 21:38:54
Jajaj, estas en el futuro! Acá en argentina faltan unas horas para año nuevo!

Bueno, eso de la micro sd era lo que estaba esperando! Si ya hay soporte voy a arrancar con este modulo.

Pusiste algo del conexionado del modulo con la pc? Lo hace con un USB a ttl, no? Hay que tener cuidado con niveles de tensión o funciona a 5v?

Saludos y buen año!
Título: Re:Esp8266 & LUA
Publicado por: groundman en 31 de Diciembre de 2015, 21:51:37
bueno te comentare algo desde el año 2016.ya que es verdad que tu estas en el 2015.y a lo mejor tengo los datos un poco
mas actualizados. :D

te dire que yo uso un conversor USB-TTL de esos baratos.y tiene un puente que conmuta a 5 o 3.3v
lo conecto directamente al modulo.a 3.3v y no me hace falta alimentarlo externamente.

pero eso es con este modulo ESP8266-1
para usar una microSD te recomiendo el ESP8266-12E o superior.ya que no varia mucho el precio.ademas que el ESP8266-1
no sirve por no tener suficientes pins.

el que lo puedas alimentar directamente desde el puerto USB depende de tu PC.todos los puertos USB tienen su propia
intensidad.
Título: Re:Esp8266 & LUA
Publicado por: groundman en 02 de Enero de 2016, 20:04:58

ahora practicaremos con la uart:

Código: [Seleccionar]
recepcion="null"

wifi.setmode(wifi.STATION)        --modo estacion
 wifi.sta.config("SSID","clave")    --nombre del punto de acceso wi-fi de nuestro router.y la clave
 wifi.sta.setip({ip="192.168.1.5",netmask="255.255.255.0",gateway="192.168.1.1"})   --configura IP fija
 wifi.sta.connect()         --conectar
 print("ESP8266 mode is: " .. wifi.getmode())           --indica el modo wi-fi.(estacion en este caso)
 print("The module MAC address is: " .. wifi.ap.getmac())   --indica la mac de nuestro dispositivo
 print("Config done, IP is "..wifi.sta.getip())         --indica la IP que nos ha asignado el router.

 srv=net.createServer(net.TCP,60)                  --crea el servidor.y si no hay trafico,cierra conexion pasados 60s
 srv:listen(80,function(conn)                   --estar a la escucha en el puerto 80.
    conn:on("receive",function(conn,payload)            --evento de recepcion y carga el valor leido en payload
    print(payload)                      --envia al puerto serie lo que se recive desde el cliente

   
   
    end)
end)

   
--configura uart
    uart.setup(0,9600,8,0,1)
    print ("uart.setup(0,9600,8,0,1) finished")
    print ("waiting for serial data....")



--recepcion de la usart
 uart.on("data","\r",function(data)
     
        print(data)    --imprime el dato recivido por la usart
        recepcion=data
       
        if data=="quit\r" then              --palabra para salir del modo usart
          uart.on("data")
        end       
       
    end, 1)-- valor 0 no entra en modo interprete.pero acepta binarios
           -- valor 1 pude entrar en modo interprete


la uart es un poco liosa de manejar.ya que el interprete tambien la usa para mandarnos mensages.aunque el modo interprete puede
dasactivarse tal como se indica en las dos ultimas lineas del codigo.lo malo es que una vez desactivado no podremos mandar comandos
como por ejemplo "Format" para poder borra la eeprom.pero con una condicional que configuremos,como por ejemplo quit\r
cuando se reciba esta trama.saldremos del modo usart y podremos mandar el comando format.

si no pudieramos entrar en el modo interprete.siempre nos queda la opcion de flashear el Esp8266.para eso hay que poner GPIO0 a cero.
y siempre que tengamos algun tipo de problema resetear el modulo.tambien antes y despues del flasheo.





si seleccionamos el valor 0 de la ultima linea.ya no podremos enviar comandos.pero podremos recivir datos desde el cliente
y mandarlos a la uart.y tambien podremos enviar datos al cliente mediante la uart.solo que los datos recibidos de la uart
se almacenan en una variable.que seran enviados en la proxima recepcion de datos del cliente.ademas no recibiremos datos que
nos podrian interferir desde el interprete.

como dije antes.tendremos que enviar quit\r para salir del modo uart y entrar en el modo interprete.asi que mandaremos desde
el terminal serie de Hercules quit\r en formato hexagesimal este valor:71 75 69 74 0d

mas que nada por el ultimo caracter que no podemos enviarlo en formato ascii porque es un caracter especial.

esto lo enviaremos un par de veces para asegurarnos que se deshabilita la uart.para saber si se ha entrado en el modo interprete.
le daremos al boton FS info del ESplorer.y reciviremos algo asi como:

Total : 504761 bytes
Used  : 2259 bytes
Remain: 502502 bytes

si seleccionamos el valor 1 de la ultima linea.tambien funcionara la uart.pero nos entrara memsajes del interprete que podria molestarnos.





Tambien hay otro punto a describir respecto a la uart.se trata de la norma de recepcion de datos.
nosotros hemos usado el caracter \r para determinar el final de la trama a recibir desde la uart.pero tambien hay otra forma.
y es indicar la cantidad de datos a recivir.

seria cambiar la linea esta:  uart.on("data","\r",function(data)  por esta:  uart.on("data",10,function(data)

esto nos viene bien a la hora de recibir tramas con un tamaño determinado.pero si no tenemos un orden sobre la cantidad de bytes a recibir.
los datos no llegarian ordenados.

ya que los datos recividos por la uart se almacenan en un buffer.si ha este buffer le mandamos mas bytes de los que les hemos indicado
los que sobran se quedaran a la espera para ser sumados a los que se reciban la siguiente vez.y si son menos,se restan.

este seria el codigo:

Código: [Seleccionar]
recepcion="null"

wifi.setmode(wifi.STATION)        --modo estacion
 wifi.sta.config("SSID","clave")    --nombre del punto de acceso wi-fi de nuestro router.y la clave
 wifi.sta.setip({ip="192.168.1.5",netmask="255.255.255.0",gateway="192.168.1.1"})   --configura IP fija
 wifi.sta.connect()         --conectar
 print("ESP8266 mode is: " .. wifi.getmode())           --indica el modo wi-fi.(estacion en este caso)
 print("The module MAC address is: " .. wifi.ap.getmac())   --indica la mac de nuestro dispositivo
 print("Config done, IP is "..wifi.sta.getip())         --indica la IP que nos ha asignado el router.

 srv=net.createServer(net.TCP,60)                  --crea el servidor.y si no hay trafico,cierra conexion pasados 60s
 srv:listen(80,function(conn)                   --estar a la escucha en el puerto 80.
    conn:on("receive",function(conn,payload)            --evento de recepcion y carga el valor leido en payload
    print(payload)                      --envia al puerto serie lo que se recive desde el cliente

    tmr.delay(1000000) -- 1 segundos de retardo
    conn:send(recepcion)               --envia al cliente.datos recibidos de la uart
   
    end)
end)

   
--configura uart
    uart.setup(0,9600,8,0,1)
    print ("uart.setup(0,9600,8,0,1) finished")
    print ("waiting for serial data....")



--recepcion de la usart
 uart.on("data",10,
      function(data)
     
        print(data)    --imprime el dato recivido por la usart
        recepcion=data
       
        if data=="quit123456" then              --palabra para salir del modo usart
          uart.on("data")
        end       
       
    end, 0)-- valor 0 no entra en modo interprete.pero acepta binarios
           -- valor 1 pude entrar en modo interprete

aqui se espera que se recivan 10 bytes.y para salir del modo usart habria que mandar quit123456 = 71 75 69 74 31 32 33 34 35 36 en hexagesimal
pero solo funcionara si anteriormente no nos hemos equivocado con el envio de los 10 bytes.



Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 02 de Enero de 2016, 22:03:05
Interesante. Ahora en un rato si mis niños me dejan me voy a poner con un modulito a probar...

Te puedo pedir un favor, groundman, podrías poner pegar el código entre estas etiquetas:

["code=c"]
["/code"]

sin las comillas. De ese modo tu código quedará así:

Código: C
  1. recepcion="null"
  2.  
  3. wifi.setmode(wifi.STATION)        --modo estacion
  4.  wifi.sta.config("SSID","clave")    --nombre del punto de acceso wi-fi de nuestro router.y la clave
  5.  wifi.sta.setip({ip="192.168.1.5",netmask="255.255.255.0",gateway="192.168.1.1"})   --configura IP fija
  6.  wifi.sta.connect()         --conectar
  7.  print("ESP8266 mode is: " .. wifi.getmode())           --indica el modo wi-fi.(estacion en este caso)
  8.  print("The module MAC address is: " .. wifi.ap.getmac())   --indica la mac de nuestro dispositivo
  9.  print("Config done, IP is "..wifi.sta.getip())         --indica la IP que nos ha asignado el router.
  10.  
  11.  srv=net.createServer(net.TCP,60)                  --crea el servidor.y si no hay trafico,cierra conexion pasados 60s
  12.  srv:listen(80,function(conn)                   --estar a la escucha en el puerto 80.
  13.     conn:on("receive",function(conn,payload)            --evento de recepcion y carga el valor leido en payload
  14.     print(payload)                      --envia al puerto serie lo que se recive desde el cliente
  15.  
  16.    
  17.    
  18.     end)
  19. end)
  20.  
  21.    
  22. --configura uart
  23.     uart.setup(0,9600,8,0,1)
  24.     print ("uart.setup(0,9600,8,0,1) finished")
  25.     print ("waiting for serial data....")
  26.  
  27.  
  28.  
  29. --recepcion de la usart
  30.  uart.on("data","\r",function(data)
  31.      
  32.         print(data)                     --imprime el dato recivido por la usart
  33.         recepcion=data
  34.        
  35.         if data=="quit\r" then              --palabra para salir del modo usart
  36.           uart.on("data")
  37.         end        
  38.        
  39.     end, 1)-- valor 0 no entra en modo interprete.pero acepta binarios
  40.            -- valor 1 pude entrar en modo interprete
  41.  

como ves es mucho más legible y seguramente si has hecho tabulaciones para los comentarios te los respetará.

Saludos!
Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 03 de Enero de 2016, 00:56:55
Bueno, me puse a probar.

Primero rengué un poquito para conseguir un USB-TTL que funcione con 3.3V y pueda entregar la corriente adecuada. Por lo que leí el CP2102 no tiene suficiente corriente. Entonces agarre un conversor en base al FT232BL, armé un regulador de 3.3V con un LM317 y le mandé esa tencion al VCIO del FTDI para que funcione a 3.3V la interfaz.

Luego arranqué con las pruebas de este post de planeta99999:
http://www.todopic.com.ar/foros/index.php?topic=43690.msg361977#msg361977

decir que anduvo casi de una. Mi módulo está configurado a 9600... aquí una pantalla de los comandos:

 - Tienes que ingresar para ver archivos adjuntos -

Hay algunas diferencias en los resultados que devuelve el ESP, pero seguro se debe al firmware que trae.

Bien, ahora a flashear.
Conecto GPIO0 a GND, desenchufo y enchufo el USB y sigo las instrucciones de acá:
http://www.xess.com/blog/esp8266-reflash/

luego de un minuto mas o menos tengo:
 - Tienes que ingresar para ver archivos adjuntos -

voy al terminal y reinicio el módulo y obtengo:
 - Tienes que ingresar para ver archivos adjuntos -

como ven ahora arranca con el nuevo firmware y ya no reconoce los comandos AT.

Ahora quedaría probar los scripts de groundman.

Copio el primero, lo guardo en el ESP y lo reseteo. Me voy al mozilla yyyyyyy:

 - Tienes que ingresar para ver archivos adjuntos -

 :-/ :-/ :-/ :-/

El modulito ya recive scripts de LUA!!!!

mañana sigo jugando con los ejemplos de groundman.

saludos!
Título: Re:Esp8266 & LUA
Publicado por: Carl47D en 03 de Enero de 2016, 02:32:44
Gracias por la ayuda groundman, tengo ganas de usar los modulos desde hace tiempo, recien lei que estan trabajando para soportar Micropython en este modulo, pero se ve que LUA esta muy avanzado.

Creen que actualizar el firmware de otro micro (con bootloader por UART o cualquier otro periferico conectado a estos modulos ESP) via internet sea seguro?
Que implicaciones o tecnicas deberia tomar en cuenta para asegurarme que no se 'roben' mi binario?
Es un tema nuevo para mi y no se por donde tendría que iniciar, he leido en internet que lo han logrado hacer con Arduinos haha

Saludos
Título: Re:Esp8266 & LUA
Publicado por: Snaut en 03 de Enero de 2016, 08:30:44
Gracias por esta información tan buena que nos estás dando groundman, sin duda también probaré la programación del esp con LUA.

Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 03 de Enero de 2016, 12:05:32
Me gustaría agregar un ejemplo intermedio para probar el GPIO, sin configurar el web server. Simplemente un toggle del LED en un GPIO.
El ejemplo fue tomado desde aquí:
http://esp8266.co.uk/recipes/blink-demo/

y el código es este:

Código: C
  1. -- Config
  2. local pin = 4            --> GPIO2
  3. local value = gpio.LOW
  4. local duration = 1000    --> 1 second
  5.  
  6.  
  7. -- Function toggles LED state
  8. function toggleLED ()
  9.     if value == gpio.LOW then
  10.         value = gpio.HIGH
  11.     else
  12.         value = gpio.LOW
  13.     end
  14.  
  15.     gpio.write(pin, value)
  16. end
  17.  
  18. -- Initialise the pin
  19. gpio.mode(pin, gpio.OUTPUT)
  20. gpio.write(pin, value)
  21.  
  22. -- Create an interval
  23. tmr.alarm(0, duration, 1, toggleLED)
  24.  

con este código podemos probar que el led que queremos encender funcione correctamente y descartar problemas de software si algo no funciona.

Saludos!
Título: Re:Esp8266 & LUA
Publicado por: groundman en 03 de Enero de 2016, 12:42:32
hola elgarbe.ya te puse el codigo como me decias.no habia caido en eso.pero como tu lo pusistes no se puede copiar y pegar sin los numeros
de linea.cosa que es un estorbo.si se pudiera poner del estilo que tu indicas pero sin numeros.quedaria genial.

ahora.las primeras pruebas que hizistes es con el firmware que trae por defecto estos modulos.como tu ya sabes.y que ya estube
practicando aqui: http://www.todopic.com.ar/foros/index.php?topic=45498.0

lo malo del firmware original es que esta muy limitado.y no se puede usar el modulo de forma autonoma.
lo de alimentar el modulo.por el momento a mi el Esp8266-1 con el usb de mi portatil tiene de sobra.otra cosa seria el Esp8266-12
que pude que consuma mas corriente.aunque quizas dependa de las salidas que controlemos.



hola Carl47D.yo por el momento no uso la actulizacion por internet.en la version original se que se puede.pero con LUA no tengo ni idea.
y de todas formas actualizarias el firmware.no el codigo que quieras implementar.o almenos es lo que creo.

si implementas algun tipo de bootloader.y lo actualizas por internet.pues como todas las cosas en internet.tendrias que hacerlo con una
conexion segura.pero por el momento no he llegado a la parte de los bootloader ni se si LUA lo implementa.


Snaut.como siempre dispuesto a ayudar en lo que pueda.por ahora mi intencion es convertir al Esp8266-1 en un sistema de transmision
de datos como si de un modulo Bluetooth se tratase.
haber si hoy lo consigo.y continuo con las practicas para el aprendizage de las diferentes funciones que tiene integradas.
Título: Re:Esp8266 & LUA
Publicado por: KILLERJC en 03 de Enero de 2016, 12:44:32
Citar
.pero como tu lo pusistes no se puede copiar y pegar sin los numeros
de linea.cosa que es un estorbo.si se pudiera poner del estilo que tu indicas pero sin numeros

Cuando copias y pegas dentro de los tags code, los numeros no molestan.
Y te digo por que siempre copio y pego algun que otro codigo al bloc de notas para editarlo y luego volverlo a poner.
Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 03 de Enero de 2016, 13:14:32
Ahora el mismo ejemplo de groundman para hacer un led on / led off, pero usando el navegador. El ejemplo fue tomado de acá:
http://randomnerdtutorials.com/esp8266-web-server/

el código es este:

Código: C
  1. wifi.setmode(wifi.STATION)
  2. wifi.sta.config("YOUR_NETWORK_NAME","YOUR_NETWORK_PASSWORD")
  3. wifi.sta.setip({ip="192.168.1.5",netmask="255.255.255.0",gateway="192.168.1.1"})   --configura IP fija
  4. led1 = 3
  5. led2 = 4
  6. gpio.mode(led1, gpio.OUTPUT)
  7. gpio.mode(led2, gpio.OUTPUT)
  8. srv=net.createServer(net.TCP)
  9. srv:listen(80,function(conn)
  10.     conn:on("receive", function(client,request)
  11.         local buf = "";
  12.         local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
  13.         if(method == nil)then
  14.             _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
  15.         end
  16.         local _GET = {}
  17.         if (vars ~= nil)then
  18.             for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
  19.                 _GET[k] = v
  20.             end
  21.         end
  22.         buf = buf.."<h1> ESP8266 Web Server</h1>";
  23.         buf = buf.."<p>GPIO0 <a href=\"?pin=ON1\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF1\"><button>OFF</button></a></p>";
  24.         buf = buf.."<p>GPIO2 <a href=\"?pin=ON2\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF2\"><button>OFF</button></a></p>";
  25.         local _on,_off = "",""
  26.         if(_GET.pin == "ON1")then
  27.               gpio.write(led1, gpio.HIGH);
  28.         elseif(_GET.pin == "OFF1")then
  29.               gpio.write(led1, gpio.LOW);
  30.         elseif(_GET.pin == "ON2")then
  31.               gpio.write(led2, gpio.HIGH);
  32.         elseif(_GET.pin == "OFF2")then
  33.               gpio.write(led2, gpio.LOW);
  34.         end
  35.         client:send(buf);
  36.         client:close();
  37.         collectgarbage();
  38.     end)
  39. end)
  40.  

cambié la opcion de ip dinámica por IP fijada por mí.

El funcionamiento:


saludos!
Título: Re:Esp8266 & LUA
Publicado por: groundman en 03 de Enero de 2016, 14:55:55
valla.vas avanzando. la verdad es que lo mejor es usar una IP fija.en una practica que he hecho he configurado el modulo con
la IP 192.168.1.5  y he puesto una condicional para que mediante un cliente pueda cambiarla a otra IP.la idea es crear una red en el hogar
pero cambiando todas las IP de cada uno de los modulos sin tener que programarlos uno a uno.

este es parte del codigo:
 
Código: [Seleccionar]
        staticIp=string.gsub (payload, "ip=","" )    --busqueda y reemplazo
        out=string.match(payload,"ip=")            --comprueba si coincide el patron
        if out~=nil then wifi.sta.setip({ip=staticIp}) end  --imprime resultado
lo que hace es buscar la cabecera "ip=" y cojer los datos que hay detras de esta combinacion.en este caso la IP

pero me falta almacenar el dato de la IP en la memoria y tambien la restauracion de esta cuando se inicia el modulo.
Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 03 de Enero de 2016, 15:08:47
Me pareció muy interesante el ejemplo anterior y empecé a estudiar un poco el funcionamiento.
El firmware que le flasheamos es un intérprete de lua y microphyton.  En este ejemplo se ve el poder de phyton para manejar cadenas. Veamos que hace cada línea. He modificado un poco el código para poder capturar y mostrar las transferencias http que se suceden:

Código: C
  1. wifi.setmode(wifi.STATION)
  2. wifi.sta.config("elgarbe","1234567890123")
  3. wifi.sta.setip({ip="192.168.1.5",netmask="255.255.255.0",gateway="192.168.1.1"})   --configura IP fija
  4. led1 = 3
  5. led2 = 4
  6. gpio.mode(led1, gpio.OUTPUT)
  7. gpio.mode(led2, gpio.OUTPUT)
  8. srv=net.createServer(net.TCP)
  9. srv:listen(80,function(conn)
  10.     conn:on("receive", function(client,request)
  11.         print("Request: " .. request)
  12.         local buf = "";
  13.         local a, b, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
  14.         if (a ~= nil)then
  15.             print("Start: " .. a)
  16.         end
  17.         if (b ~= nil)then
  18.             print("End: " .. b)
  19.         end
  20.        
  21.         if (method ~= nil)then
  22.             print("Method: " .. method)
  23.         end
  24.         if (path ~= nil)then
  25.             print("Path: " .. path)
  26.         end
  27.         if (vars ~= nil)then
  28.             print("Vars: " .. vars)
  29.         end
  30.         if(method == nil)then
  31.             _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
  32.         end
  33.         local _GET = {}
  34.         if (vars ~= nil)then
  35.             for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
  36.                 _GET[k] = v
  37.             end
  38.         end
  39.         buf = buf.."<h1> ESP8266 Web Server</h1>";
  40.         buf = buf.."<p>GPIO0 <a href=\"?pin=ON1\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF1\"><button>OFF</button></a></p>";
  41.         buf = buf.."<p>GPIO2 <a href=\"?pin=ON2\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF2\"><button>OFF</button></a></p>";
  42.         local _on,_off = "",""
  43.         if(_GET.pin == "ON1")then
  44.               gpio.write(led1, gpio.HIGH);
  45.         elseif(_GET.pin == "OFF1")then
  46.               gpio.write(led1, gpio.LOW);
  47.         elseif(_GET.pin == "ON2")then
  48.               gpio.write(led2, gpio.HIGH);
  49.         elseif(_GET.pin == "OFF2")then
  50.               gpio.write(led2, gpio.LOW);
  51.         end
  52.         client:send(buf);
  53.         client:close();
  54.         collectgarbage();
  55.     end)
  56. end)
  57.  

Las primeras líneas son típicas, configurar el nodo como estacion y lo conectan al router que elijamos, finalmente nos damos una ip fija:

Código: C
  1. wifi.setmode(wifi.STATION)
  2. wifi.sta.config("elgarbe","1234567890123")
  3. wifi.sta.setip({ip="192.168.1.5",netmask="255.255.255.0",gateway="192.168.1.1"})   --configura IP fija
  4.  

Luego viene la inicializacion del hardware:
Código: C
  1. led1 = 3
  2. led2 = 4
  3. gpio.mode(led1, gpio.OUTPUT)
  4. gpio.mode(led2, gpio.OUTPUT)
  5.  

porque el gpio0 es igual a 3 y el gpio2 es igual a 4 es algo que estoy averiguando.

Luego viene la creacion del webserver escuchando en el puerto 80 y la funcion a llamar cuando se recive el evento on receive
Código: C
  1. srv=net.createServer(net.TCP)
  2. srv:listen(80,function(conn)
  3.     conn:on("receive", function(client,request)
  4.  

dentro de "request" tenemos la informacion que envía el navegador web que quiere conectarse
Si ejecutáramos el código hasta ahí tendríamos lo siguiente:

 - Tienes que ingresar para ver archivos adjuntos -

como se ve, la primer línea del reques es: GET / HTTP/1.1

cuando en el navegador pasamos algún argumento en la direccion, como por ejemplo http://192.168.1.5/?pin=OFF2 esa cadena adicion aparecerá en esa línea.
Agreguemos más codigo:

Código: C
  1.     conn:on("receive", function(client,request)
  2.         print("Request: " .. request)
  3.         local buf = "";
  4.         local a, b, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
  5.         if (a ~= nil)then
  6.             print("Start: " .. a)
  7.         end
  8.         if (b ~= nil)then
  9.             print("End: " .. b)
  10.         end
  11.        
  12.         if (method ~= nil)then
  13.             print("Method: " .. method)
  14.         end
  15.         if (path ~= nil)then
  16.             print("Path: " .. path)
  17.         end
  18.         if (vars ~= nil)then
  19.             print("Vars: " .. vars)
  20.         end
  21.     end)
  22.  
Aquí aparece el phyton, que debería haver estudiado antes!!!!.
Cada instruccion (string.find por ejemplo) la podemos encontrar en el manual que puso groundman al principio.
En este caso la instruccion  local a, b, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
declara 5 variables locales. a y b almacenan el comienzo y el final del string buscado ("([A-Z]+) (.+)?(.+) HTTP") en la cadena request.
Luego method, path y vars almacenan el texto encontrado según el pattern ("([A-Z]+) (.+)?(.+) HTTP"). Cada variable almacena lo que está en paréntesis.
Entonces method almacenará la cadena que concuerde con el pattern [A-Z]+ esto es, tantos caracteres como haya mientras que estén dentro del entorno A-Z
Luego se buscará un espacio en blanco
luego se buscará un caracter cualquiera (.) y tantos como haya (+) y se almacenará en path. Aquí estimo que la cantidad de caracteres se corta al hayar el próximo del pattern general, en este caso el ?
Luego el signo de pregunta
Luego se busca cualquier caracter y tantos como haya hasta encotrar el resto del pttern " HTTP" y se almacena en vars.
Etonces el código anterior con la siguiente direccion del navegador: http://192.168.1.5/?pin=OFF2 devuelve:

 - Tienes que ingresar para ver archivos adjuntos -

como vemos el resutado es:
Código: HTML5
  1. > Request: GET /?pin=OFF2 HTTP/1.1
  2. Host: 192.168.1.5
  3. User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:43.0) Gecko/20100101 Firefox/43.0
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  5. Accept-Language: es-AR,es;q=0.8,en-US;q=0.5,en;q=0.3
  6. Accept-Encoding: gzip, deflate
  7. Connection: keep-alive
  8.  
  9.  
  10. Start: 1
  11. End: 19
  12. Method: GET
  13. Path: /
  14. Vars: pin=OFF2
  15.  

Como ven se almacena en cada variable la parte del GET que nos interesa. Lo importante acá es vars que nos da el comando a ejecutar.

Luego, como start y end (a y b) no nos interesa lo podemos reemplazar por "_":

Código: C
  1. wifi.setmode(wifi.STATION)
  2. wifi.sta.config("elgarbe","1234567890123")
  3. wifi.sta.setip({ip="192.168.1.5",netmask="255.255.255.0",gateway="192.168.1.1"})   --configura IP fija
  4. led1 = 3
  5. led2 = 4
  6. gpio.mode(led1, gpio.OUTPUT)
  7. gpio.mode(led2, gpio.OUTPUT)
  8. srv=net.createServer(net.TCP)
  9. srv:listen(80,function(conn)
  10.     conn:on("receive", function(client,request)
  11.         print("Request: " .. request)
  12.         local buf = "";
  13.         local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
  14.        
  15.         if (method ~= nil)then
  16.             print("Method: " .. method)
  17.         end
  18.         if (path ~= nil)then
  19.             print("Path: " .. path)
  20.         end
  21.         if (vars ~= nil)then
  22.             print("Vars: " .. vars)
  23.         end
  24.     end)
  25. end)
  26.  

Hasta ahora en el explorador no aparece nada al escrivir la direccion. Agreguemos ahora código para la interfaz:

Código: C
  1. wifi.setmode(wifi.STATION)
  2. wifi.sta.config("elgarbe","1234567890123")
  3. wifi.sta.setip({ip="192.168.1.5",netmask="255.255.255.0",gateway="192.168.1.1"})   --configura IP fija
  4. led1 = 3
  5. led2 = 4
  6. gpio.mode(led1, gpio.OUTPUT)
  7. gpio.mode(led2, gpio.OUTPUT)
  8. srv=net.createServer(net.TCP)
  9. srv:listen(80,function(conn)
  10.     conn:on("receive", function(client,request)
  11.         print("Request: " .. request)
  12.         local buf = "";
  13.         local a, b, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
  14.         if (a ~= nil)then
  15.             print("Start: " .. a)
  16.         end
  17.         if (b ~= nil)then
  18.             print("End: " .. b)
  19.         end
  20.        
  21.         if (method ~= nil)then
  22.             print("Method: " .. method)
  23.         end
  24.         if (path ~= nil)then
  25.             print("Path: " .. path)
  26.         end
  27.         if (vars ~= nil)then
  28.             print("Vars: " .. vars)
  29.         end
  30.  
  31.         buf = buf.."<h1> ESP8266 Web Server</h1>";
  32.         buf = buf.."<p>GPIO0 <a href=\"?pin=ON1\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF1\"><button>OFF</button></a></p>";
  33.         buf = buf.."<p>GPIO2 <a href=\"?pin=ON2\"><button>ON</button></a>&nbsp;<a href=\"?pin=OFF2\"><button>OFF</button></a></p>";
  34.  
  35.         client:send(buf);
  36.         client:close();
  37.         collectgarbage();
  38.     end)
  39. end)
  40.  

Con ese código ya tenemos la página web que nos permitirá enviar los comandos con 4 botones de comando.

Ahora veamos el código que determina el comando (ON OFF) y el pin (1 o 2).

Código: C
  1.         if(method == nil)then
  2.             _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
  3.         end
  4.         local _GET = {}
  5.         if (vars ~= nil)then
  6.             for k, v in string.gmatch(vars, "(%w+)=(%w+)&*") do
  7.                 _GET[k] = v
  8.                 print("k: " .. k .. "\nv: " .. v)
  9.             end
  10.         end
  11.  

En estas líneas no entiendo bien la funcion del primer if.
Luego si vars no es nulo (o sea, si hemos agregado algun GET en la direccion del explorador) hacemos un for buscando en vars el pattern que esta entre paréntesis. vars contiene, por ejemplo pin=ON2. El patern está dividido por el signo "=" y lo que se busca de un lado y del otro es %w (todos los caracteres alfanuméricos) y el + es tantos como haya. Entonces al ejecutar el código con ese agregado obtenemos al precionar ON del LED 2:

Código: HTML5
  1. Request: GET /?pin=ON2 HTTP/1.1
  2. Host: 192.168.1.5
  3. User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:43.0) Gecko/20100101 Firefox/43.0
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  5. Accept-Language: es-AR,es;q=0.8,en-US;q=0.5,en;q=0.3
  6. Accept-Encoding: gzip, deflate
  7. Referer: http://192.168.1.5/
  8. Connection: keep-alive
  9.  
  10.  
  11. Method: GET
  12. Path: /
  13. Vars: pin=ON2
  14. k: pin
  15. v: ON2
  16.  

Entonces se ha separado pin de comando. La variable _GET es tipo array y la instruccion _GET[k] = v hace que GET[pin] tome el valor de v (ON2)

Finalmente, el código que toma el array GET y actua sobre los led:

Código: C
  1.         local _on,_off = "",""
  2.         if(_GET.pin == "ON1")then
  3.               gpio.write(led1, gpio.HIGH);
  4.         elseif(_GET.pin == "OFF1")then
  5.               gpio.write(led1, gpio.LOW);
  6.         elseif(_GET.pin == "ON2")then
  7.               gpio.write(led2, gpio.HIGH);
  8.         elseif(_GET.pin == "OFF2")then
  9.               gpio.write(led2, gpio.LOW);
  10.         end
  11.  

aquí no se bien para que sirve         local _on,_off = "",""

Bueno, hemos podido explicar el primer ejemplo, el cual puede ser base de cualquier otro proyecto que espere comndos para actuar en cuestion.

Saludos!
Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 03 de Enero de 2016, 15:14:18
valla.vas avanzando. la verdad es que lo mejor es usar una IP fija.en una practica que he hecho he configurado el modulo con
la IP 192.168.1.5  y he puesto una condicional para que mediante un cliente pueda cambiarla a otra IP.la idea es crear una red en el hogar
pero cambiando todas las IP de cada uno de los modulos sin tener que programarlos uno a uno.

este es parte del codigo:
 
Código: [Seleccionar]
        staticIp=string.gsub (payload, "ip=","" )    --busqueda y reemplazo
        out=string.match(payload,"ip=")            --comprueba si coincide el patron
        if out~=nil then wifi.sta.setip({ip=staticIp}) end  --imprime resultado
lo que hace es buscar la cabecera "ip=" y cojer los datos que hay detras de esta combinacion.en este caso la IP

pero me falta almacenar el dato de la IP en la memoria y tambien la restauracion de esta cuando se inicia el modulo.

lo de la ip fija es para poder identificar cada módulo en particular, no? habría que ver si no se puede implementar un pequeño DNS privado para los módulos así podes usar IP dinámica...

sds.
Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 03 de Enero de 2016, 15:28:21
Acá esta el mapeo del GPIO
http://esp8266.co.uk/tutorials/introduction-to-the-gpio-api/

y una forma interesante de crear la tabla de pines:
https://gist.github.com/paulcuth/f646f220a617a5fe43a1

saludos!
Título: Re:Esp8266 & LUA
Publicado por: groundman en 03 de Enero de 2016, 15:32:54
ufff. un servidor de nombres.supongo que eso habria que configurarlo en el router.que es al que estan conectados
todos los modulos.no estoy muy familiarizado con las DNS. el router asignaria una IP dinamica a cada modulo
y este responde con el nombre que le tengamos asignado.

seria mejor para nosotros porque es mas comodo recordar un nombre que un numero.habria que estudiarlo.
haber si termino con la uart.y le hechamos un vistazo.
Título: Re:Esp8266 & LUA
Publicado por: groundman en 03 de Enero de 2016, 16:47:58

jo.estoy negro.no se como borrar el buffer de entrada de la uart.queria enviar datos hexagesimales.y por eso no puedo usar el metodo
de fin de trama con el caracter \r = 0x0d   ya que podria cortarme la trama.

y el sistema de indicar el numero de bytes a enviar es un problema.ya que las tramas que quiero enviar no tienen una longitud definida.
y si se envia un byte de mas o de menos.se lia el follon.

se me ha ocurrido la idea de poner un timer que borre el buffer de recepcion despues de un tiempo determinado.y asi estar a la espera
de recibir otra trama.
Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 03 de Enero de 2016, 17:26:22
Un ejemplo para manejar el GPIO con webserver y hacer PWM extraido de acá:
http://www.esp8266.com/viewtopic.php?f=19&t=990
Hice algunas modificaciones para debugear y ver como funciona:

Código: C
  1. wifi.setmode(wifi.STATION)
  2. wifi.sta.config("elgarbe","1234567890123")
  3. outpin=4 -- Select right IO index !! Here is settings for GPIO2 (Lua build 20141219)
  4.  
  5. srv=net.createServer(net.TCP)
  6. srv:listen(80,function(conn)
  7.     conn:on("receive",function(conn,payload)
  8.         --next row is for debugging output only
  9.         --print(payload)
  10.    
  11.         function ctrlpower()
  12.             pwm.close(outpin)
  13.             gpio.mode(outpin,gpio.OUTPUT)
  14.             dotaz=string.sub(payload,kdesi[2]+1,#payload)
  15.             if dotaz=="ON"  then
  16.                 gpio.write(outpin,gpio.HIGH)
  17.                 return
  18.             end
  19.             if dotaz=="OFF" then
  20.                 gpio.write(outpin,gpio.LOW)
  21.                 return
  22.             end
  23.             if dotaz=="FLC" then
  24.                 pwm.setup(outpin,2,512)
  25.                 pwm.start(outpin)
  26.                 return
  27.             end
  28.             pwm.setup(outpin,1000,dotaz*10)
  29.             pwm.start(outpin)
  30.         end
  31.         --parse position POST value from header
  32.         kdesi={string.find(payload,"pwmi=")}
  33.         --If POST value exist, set LED power
  34.         if kdesi[2]~=nil then
  35.             print("\nPayload: "..payload)
  36.             print("\nkdesi: "..kdesi[1].." "..kdesi[2])
  37.             ctrlpower()
  38.         end
  39.    
  40.         conn:send('HTTP/1.1 200 OK\n\n')
  41.         conn:send('<!DOCTYPE HTML>\n')
  42.         conn:send('<html>\n')
  43.         conn:send('<head><meta  content="text/html; charset=utf-8">\n')
  44.         conn:send('<title>ESP8266</title></head>\n')
  45.         conn:send('<body><h1>Sample GPIO output control</h1>\n')
  46.         conn:send('<h3>For Lua NodeMcu 0.9.2 build 20141219 only !!!</h3>\n')
  47.         conn:send('<h3>Tested with IE 11. and Chrome 39.</h3>\n')
  48.         conn:send('<IMG SRC="http://esp8266.fancon.cz/common/led.gif" WIDTH="150" HEIGHT="101" BORDER="1"><br><br>\n')
  49.         conn:send('<form action="" method="POST">\n')
  50.         conn:send('<input type="submit" name="pwmi" value="OFF">\n')
  51.         conn:send('<input type="submit" name="pwmi" value="10">\n')
  52.         conn:send('<input type="submit" name="pwmi" value="20">\n')
  53.         conn:send('<input type="submit" name="pwmi" value="30">\n')
  54.         conn:send('<input type="submit" name="pwmi" value="40">\n')
  55.         conn:send('<input type="submit" name="pwmi" value="50">\n')
  56.         conn:send('<input type="submit" name="pwmi" value="60">\n')
  57.         conn:send('<input type="submit" name="pwmi" value="70">\n')
  58.         conn:send('<input type="submit" name="pwmi" value="80">\n')
  59.         conn:send('<input type="submit" name="pwmi" value="90">\n')
  60.         conn:send('<input type="submit" name="pwmi" value="ON"> % of power<br><br>\n')
  61.         conn:send('<input type="submit" name="pwmi" value="FLC"> HW blinker</form>\n')
  62.         conn:send('</body></html>\n')
  63.     conn:on("sent",function(conn) conn:close() end)
  64.     end)
  65. end)
  66.  

Esta muy interesante tanto el uso del PWM como el uso de los form input y el método POST. Para ver bien esto habría que estudiar un poco HTML...

El módulo PWM se usa segú este manual:
http://www.eluaproject.net/doc/master/en_refman_gen_pwm.html

Aquí, cada pulsador hace un POST con la variable pwmi seguido de un valor que puede ser, On OFF, FCL o el valor deseado para el duty cicle del PWM. La funcion ctrlpower() se encarga de obtener la cadena del POST y actuar en cuestion. Pero antes hay que verificar que el pedido es un POST y para ello esta esta parte de código:
Código: C
  1.         --parse position POST value from header
  2.         kdesi={string.find(payload,"pwmi=")}
  3.         --If POST value exist, set LED power
  4.         if kdesi[2]~=nil then
  5.             print("\nPayload: "..payload)
  6.             print("\nkdesi: "..kdesi[1].." "..kdesi[2])
  7.             ctrlpower()
  8.         end
  9.  
aquí almacenamos en kdesi (2 valores) el comienzo y el final de la cadena "pwmi=" si es que existe en payload.
Cuando ejecutamos el código y apretamos OFF obtenemos lo siguiente:

Código: HTML5
  1. Payload: POST / HTTP/1.1
  2. Host: 192.168.1.32
  3. User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:43.0) Gecko/20100101 Firefox/43.0
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  5. Accept-Language: es-AR,es;q=0.8,en-US;q=0.5,en;q=0.3
  6. Accept-Encoding: gzip, deflate
  7. Referer: http://192.168.1.32/
  8. Connection: keep-alive
  9. Content-Type: application/x-www-form-urlencoded
  10. Content-Length: 8
  11.  
  12. pwmi=OFF
  13.  
  14. kdesi: 401 405
  15.  

como vemos pwmi= está al final del payload. Insisto, esto debe estar explicado en el standar HTML. Dentro de payload, pwmi= arranca en el caracter 401 y termina en el caracter 405.

Si se ha encontrado esa cadena entonces se llama a la funcion que controla el power (ctrlpower()).

En ella tenemos esta línea: dotaz=string.sub(payload,kdesi[2]+1,#payload)
Esto devuelve una sub string, tomando payload como cadena base, arrancando desde el final de la cadena pwmi= y con una longitud igual a la longitud de payload. Con ese comando se asegura de leer los caracteres que van desde el = hasta el final del payload y que corresponden a la accion a arealizar.
Finalmnete en funcion de dicha cadena hace PWM o no, apaga o enciende el LED o hace un PWM a 2 Hz para que parezca que el led parpadea.

El resultado:
 

La verdad que usar el módulo como viene, sin conectar ningún micro y sin comandos AT es una genialidad. Lastima que tengo modulos muy báscios, el esp-02 y el esp-01 con poco pines disponibles... a ver si me condigo uno 12!!!! también estuve viendo estos módulos:

http://www.aliexpress.com/item/V3-Wireless-module-NodeMcu-4M-bytes-Lua-WIFI-Internet-of-Things-development-board-based-ESP8266-for/32469517132.html
y esta base:
www.aliexpress.com/item/NodeMcu-base-ESP8266-testing-DIY-Breadboard/32549681298.html
estarían geniales para experimentar!

saludos
Título: Re:Esp8266 & LUA
Publicado por: groundman en 03 de Enero de 2016, 18:11:13

no te preocupes.pronto llegara el ESP32.y quizas con un precion apetecible.

respecto a las pruebas que estoy realizando con la uart.me he dado cuenta de que ni caracter de control \r ni numero de bytes a recibir.
ya que si especificamos un numero minimo de bytes a recibir,no se producira el evento de recepcion hasta que no se llene el buffer.

asi que la opcion esta en recibir los datos de byte en byte.ire creando un string caracter a caracter dentro de un tiempo predeterminado.


PD: es magnifica la informacion que estas poniendo.haber si llenamos esto de ejemplos y tener un sitio donde referirse.
Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 03 de Enero de 2016, 20:10:35

no te preocupes.pronto llegara el ESP32.y quizas con un precion apetecible.

respecto a las pruebas que estoy realizando con la uart.me he dado cuenta de que ni caracter de control \r ni numero de bytes a recibir.
ya que si especificamos un numero minimo de bytes a recibir,no se producira el evento de recepcion hasta que no se llene el buffer.

asi que la opcion esta en recibir los datos de byte en byte.ire creando un string caracter a caracter dentro de un tiempo predeterminado.


PD: es magnifica la informacion que estas poniendo.haber si llenamos esto de ejemplos y tener un sitio donde referirse.

justamente estaba pensando en eso antes de salir y ahora veo que ya lo pusiste vos. Recibir byte por byte he ir armando el string y chequeando el fin de resepcion. Muchos parseadores de GPS hacen eso. Como no sabes cuantos bytes trae cada línea, porque es variable, se lee byte por byte y se va parseando, chequeando los encabezados de cada parte del mensaje y luego los datos.

si, mi idea es ir probando los distintos periféricos de ejemplos que hay dando vuelta y tratar de explicarlos. A ver si convertimos a este post como un post de referencia de ejemplos de códigos que pueden servir como base de proyectos.

Saludos!
Título: Re:Esp8266 & LUA
Publicado por: groundman en 03 de Enero de 2016, 21:07:30


pues ya lo he hecho.queria hacer como cuando se transmite con un modulo bluetooth.sin tener que indicar caracter de fin de linea
ni cantidad de bytes a enviar.me ha costado un monton de pruebas.ya que estoy empezando con esto.

aqui lo tienes:
Código: [Seleccionar]
trama=""

wifi.setmode(wifi.STATION)        --modo estacion
 wifi.sta.config("SSID","clave")    --nombre del punto de acceso wi-fi de nuestro router.y la clave
 wifi.sta.setip({ip="192.168.1.5",netmask="255.255.255.0",gateway="192.168.1.1"})   --configura IP fija
 wifi.sta.connect()         --conectar
 print("ESP8266 mode is: " .. wifi.getmode())               --indica el modo wi-fi.(estacion en este caso)
 print("The module MAC address is: " .. wifi.ap.getmac())   --indica la mac de nuestro dispositivo
 print("Config done, IP is "..wifi.sta.getip())             --indica la IP que nos ha asignado el router.

 srv=net.createServer(net.TCP,60)                           --crea el servidor.y si no hay trafico,cierra conexion pasados 60s
 srv:listen(80,function(conn)                               --estar a la escucha en el puerto 80.
    conn:on("receive",function(conn,payload)                --evento de recepcion y carga el valor leido en payload
    print(payload)                                          --envia al puerto serie lo que se recive desde el cliente

    tmr.delay(1000000)                                      -- 1 segundo de retardo
    conn:send(trama)                                        --envia al cliente.datos recibidos de la uart
    trama=""                                                --borra la trama
    end)
end)

   
--configura uart
    uart.setup(0,9600,8,0,1)
    print ("uart.setup(0,9600,8,0,1) finished")
    print ("waiting for serial data....")

--recepcion de la usart
 uart.on("data",1,                                          --recepcion de caracter en caracter
      function(data)
     
        trama=trama..data--recepcion                        --concatenar strings

          --esta rutina solo es para modo debug.ya que al trabajar con valores hexagesimales no podemos prescindir de ningun
          --valor entre 0x00 y oxff
         
          --if data=="-" then                               --palabra para salir del modo usart
          --print ("salida....")
          --uart.on("data")
          --end       
       
    end, 0)-- valor 0 no entra en modo interprete.pero acepta binarios
           -- valor 1 pude entrar en modo interprete



al final fue mas facil de lo que pensaba.en el codigo si fueramos a enviar una trama muy larga.quizas hubiera que aumentar el
tiempo de retardo del delay.aunque creo que un segundo es tiempo de sobra ya que lo maximo que envia son 255 bytes.y a una velocidad
de 9600bps son 1200 bytes/s
Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 04 de Enero de 2016, 21:20:35
Trabajando con el I2C

El driver del I2C (http://www.nodemcu.com/docs/i2c-module/) es muy util en estos módulos devido a su reducida cantidad de pines. Podemos conectar prácticamente cualquier dispositivo I2C a los dos pines libres (GPIO0, GPIO2) de todos los módulos.
Antes que nada quería mostrar una info que encontré sobre las consideraciones que hay que tener al conectar dispositivos en los GPIO 0 y 2 ya que esos pines determinan, en el arranque, como bootea el ESP:
http://www.forward.com.au/pfod/ESP8266/GPIOpins/ESP8266_01_pin_magic.html

En mi caso, estoy probando el I2C con un sensor de temperatura, el LM92 de TI (http://www.ti.com/lit/ds/symlink/lm92.pdf)
Para utilizarlo tenía ya diseñada una plaquita para montarlo y con un conector IDC10 poder conectarlo a distintos circuitos:

 - Tienes que ingresar para ver archivos adjuntos -

la calidad de la foto es un desastre!

Bueno, una vez hechas las conexiones, tenemos un simple script (tomado de aquí: http://www.esp8266.com/viewtopic.php?f=19&t=1049), el cual escanea los pines y direcciones en busqueda de un dispositivo conectado al bus.
Al correrlo obtengo:

 - Tienes que ingresar para ver archivos adjuntos -

O sea que encontró my sensor conectado a los pines con index 3 y 4 (gpio 0 y 2) y en la direccion 0x48.

El script en cuestion es este:

Código: C
  1. -- Based on work by sancho and zeroday among many other open source authors
  2. -- This code is public domain, attribution to gareth@l0l.org.uk appreciated.
  3.  
  4. id=0  -- need this to identify (software) IC2 bus?
  5. gpio_pin= {4,3,0,1,2} -- this array maps internal IO references to GPIO numbers
  6.  
  7. -- user defined function: see if device responds with ACK to i2c start
  8. function find_dev(i2c_id, dev_addr)
  9.      i2c.start(i2c_id)
  10.      c=i2c.address(i2c_id, dev_addr ,i2c.TRANSMITTER)
  11.      i2c.stop(i2c_id)
  12.      return c
  13. end
  14.  
  15. print("Scanning all pins for I2C Bus device")
  16. for scl=1,7 do
  17.      for sda=1,7 do
  18.           tmr.wdclr() -- call this to pat the (watch)dog!
  19.           if sda~=scl then -- if the pins are the same then skip this round
  20.                i2c.setup(id,sda,scl,i2c.SLOW) -- initialize i2c with our id and current pins in slow mode :-)
  21.                for i=0,127 do -- TODO - skip invalid addresses
  22.                     if find_dev(id, i)==true then
  23.                     print("Device is wired: SDA to GPIO - IO index "..sda)
  24.                     print("Device is wired: SCL to GPIO - IO index "..scl)
  25.                     print("Device found at address 0x"..string.format("%02X",i))
  26.                     end
  27.                end
  28.           end
  29.      end
  30. end

bien, sabiendo que el ESP se comunica con el sensor de temperatura podemos realizar un driver para leer la temperatura.

Pero antes analicemos como funciona este script.

al principio vemos la definicion de una funcion "find_dev", al cual se le pasa como parámetro el Id del bus (0 en este caso) y la direccion que queremos verificar. La funcion pone una condicion de START en el bus, luego pone la direccion en el bus con el modo correcto, en este caso TRANSMIT. Si hay algún dispositivo en esa direccion pondrá un ACK en el bus y la funcion adress la detectará. Finalmente pone un STOP en el bus y devuelve True or False de acuerdo a si hubo ACK.

Luego vienen los lazos for que permitirán recorrer todas las combinaciones de pines posibles para cada señal. Se inicializa el i2c con la combinacion de pines proporcionadas por los for y para cada combinacion se recorren las direcciones 0 a 127. Si se encuentra dispositivo en esa combinacion de pines, se imprime dichos indices y la direccion en cuestion, en formato hexadecimal. Simple!

En la proxima veremos si puedo hacer andar el sensor.

Saludos!
Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 04 de Enero de 2016, 23:32:48
Con este módulo las cosas son tan simples que es de no creer!!!
Me puse a buscar algún driver para el LM92 y..... el mismo nodeMCU trae un driver!!!
https://github.com/nodemcu/nodemcu-firmware/tree/master/lua_modules/lm92

debo confesar que me ha costado un poquito al principio el tema de compilar el módulo para luego usar la sentenci node.require.

El tema, según entendí es mas o menos así: Cada vez que en el ESplorer cargamos un .lua este va a parar a la flash del usuario en el ESP. pero cada script que cargamos no borra los anteriores, excepto que tenga el mismo nombre. Eso por un lado. Por otro lado, como los módulos en formato script ocupan mucho espacio, se pueden compilar en la flash y obtener un archivo .lc, el cual podemos utilizar luego como si de librerías en el ESP se tratara.

Entonces, en el caso del LM92 lo que tenemos que hacer es, primero cargar el lm92.lua a la flash. Pero antes de hacer eso, primero voy a formatear la flash para que no quede ningun script. Eso lo hacemos con el botón Format que está bien a la derecha y arriba en la pantalla. Luego cargo en la flash el lm92.lua y presiono el botón reload debajo de Format. El resultado:

 - Tienes que ingresar para ver archivos adjuntos -

Bien, como vemos tenemos solo el lm92.lua en la flash. Este script es un módulo con funciones, como un driver del dispositivo. Para utilizarlo debemos compilarlo (una sola vez) y luego llamarlo con require. Entonces hago un script llamado Read_Temp.lua con este código (tomado del README del lm92.lua en nodemcu):

Código: C
  1. node.compile("lm92.lua")
  2. LM92 = require("lm92")
  3. gpio0 = 3
  4. gpio2 = 4
  5. sda = gpio0
  6. scl = gpio2
  7. addr = 0x48
  8. LM92.init(sda, scl,addr)
  9.  
  10. t = LM92.getTemperature()
  11. print("Got temperature: "..t.." C")
  12.  

La primera ves que lo ejecuto dejo sin comentar la primer instruccion, la que compila. Lo cargo al ESP y lo ejecuto. Al finalizar preciono el botón Reload para ver los nuevos files en la flash:

 - Tienes que ingresar para ver archivos adjuntos -

Como pueden ver el lm92.lc es mucho mas chico que el lm92.lua. Tambien vemos que nos arroja la temperatura!!!! (el modulo esta en la salida de aire de la notebook, por eso esa temperatura tan alta).
Ahora borro el lm92.lua de la flash, comento la primer línea, la que compila el lm92.lua, vuelvo a cargar el Read_Temp.lua y vuelvo a correr el programa:

 - Tienes que ingresar para ver archivos adjuntos -

Como ven, desapareció el lm92.lua de la flash y el programa sigue corriendo ya que utiliza el lm92.lc

Como ven en cuestion de un par de horas podemos tener nuestro ESP usando sensores de forma muy simple.
Ahora lo que quedaría por hacer es un webserver que muestre la temperatura en el navegador web.

Saludos!

Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 06 de Enero de 2016, 17:34:28
Hoy he decidido aportar mi granito de arena a nodeMCU y he escrito unas mejoras al driver del LM92.
Ahora estoy esperando que acepten mis agregados:

 - Tienes que ingresar para ver archivos adjuntos -

Saludos!
Título: Re:Esp8266 & LUA
Publicado por: groundman en 27 de Enero de 2016, 11:52:30
bueno.pues despues de un tiempo.he vuelto a las andadas con este mdulo.he tardado porque los reyes magos me han traido un nuevo
portatil.y estaba habituandome a este windows 8.1  el viejo hera un vista.y varian vastante.crei que seria inconpatible con
la mayoria de programas que uso para la electronica.pero parece que me equivocaba.por ahora me va de perlas.

y tambien estaba liado con la forma en que lua almacena datos en un archivo.para que cuando apaguemos el modulo.estos datos
no se pierdan.

el siguiente codigo es una continuacion del anterior.solo que no implemento la uart hasta que no haga las pruebas en un circuito
real.


Código: [Seleccionar]
wifi.setmode(wifi.STATION)        --modo estacion
 wifi.sta.config("SSID","clave")    --nombre del punto de acceso wi-fi de nuestro router.y la clave

 file.open("ip.lua","r")                                    --abre el archivo en formato lectura
 ipMem=file.read()                                          --introduce el contenido "IP" en la variable ipMem
 file.close()                                               --cierra el archivo
 
 wifi.sta.setip({ip=ipMem,netmask="255.255.255.0",gateway="192.168.1.1"})   --configura IP fija.donde ipMem es la ip almacenada en un archivo.
 wifi.sta.connect()                                         --conectar con el cliente
 
 print("ESP8266 mode is: " .. wifi.getmode())               --indica el modo wi-fi.(estacion en este caso)
 print("The module MAC address is: " .. wifi.ap.getmac())   --indica la mac de nuestro dispositivo
 print("Config done, IP is "..wifi.sta.getip())             --indica la IP que nos ha asignado el router.


 srv=net.createServer(net.TCP,60)                           --crea el servidor.y si no hay trafico,cierra conexion pasados 60s
 srv:listen(80,function(conn)                               --estar a la escucha en el puerto 80.
    conn:on("receive",function(conn,payload)                --evento de recepcion y carga el valor leido en payload
    print(payload)                                          --envia al puerto serie lo que se recive desde el cliente

        staticIp=string.gsub (payload, "ip=","" )           --busqueda y reemplazo
        out=string.match(payload,"ip=")                     --comprueba si coincide el patron ip=
        if out~=nil then saveIp()                           --si coincide,introduce la ip nueva. ejm.. mandar ip=192.168.1.10
        end                                                 --y el modulo se configurara con esta ip

   
    end)
end)

 function saveIp ()     --funcion para el salvado de la ip
      wifi.sta.setip({ip=staticIp})                          --configura ip estatica
     file.open("ip.lua","r+")                               --abre  arcchivo
     file.write(staticIp)                                   --guarda valor de IP
     file.close()                                           --cierra archivo
 end


con este codigo.se establece un enlace con nuestro router.y con un cliente podemos realizar una conexion TCP por el puerto 80.
la parte destacable es el uso del modulo file.que nos permite el almacenamiento de la IP conque configuramos el modulo.

cuando encendemos el modulo.automaticamente el esp8266 es configurado con la IP 192.168.1.5
esta debe de ser cambiada por otra que no este en uso.de lo contrario no se produciria la conecxion.

si se realizara la conecxion.podriamos cambiar la ip por defecto "192.168.1.5" por otra que tubieramos libre.hay que tener
cuidado en no duplicar IPs.ya que al no tener implementado un servidor de DNS.habria conflictos entre ordenadores y tros dispositivos
de nuestra red.

el comando para configurar la IP es por ejemplo:  ip=192.168.1.10    para configurar nuestro modulo con la ip 192.168.1.10
Título: Re:Esp8266 & LUA
Publicado por: groundman en 27 de Enero de 2016, 19:29:26

queria explicar el funcionamiento del modulo File. que he usado en el ejemplo anterior.
aqui la API: http://www.nodemcu.com/docs/file-module/

para poder manipular un archivo desde lua.lo primero que hay que hacer es crearlo y cargarlo en el ESP8266.
el archivo que he creado en este caso es   ip.lua

y en este he ingresado los caracteres 192.168.1.5   cuando lo cargo en el ESP.este me manda un error.que me indica que el numero
es incorrecto.y esto es porque no se pude poner punto decimal.mi intencion es poner un string.pero aunque lo ponga entre comillas
me sigue tirando otro error.asi que lo pongo sin comillas y por lo menos me funciona.

para poder modificar el contenido del archivo.primero hay que gestionarlo asi:

file.open(nombre,modo)   --nombre de nuestro archivo y el modo.
var=file.read()       --introducimos en la variable el contenido del archivo abierto
file.close()       --cerramos el archivo.

Los modos los pongo aqui abajo.

"r": modo de lectura (por defecto)
"w": modo de escritura
"a": Modo de anexar
"r +": modo de actualización, se conserva todos los datos anteriores
"w +": modo de actualización, todos los datos anteriores se borran
"a +": append modo de actualización, se conserva los datos anteriores, la escritura sólo se permite al final del archivo

Estos son los diferentes comandos para el uso del modulo File:

file.remove()
file.open()
file.close()
file.readline()
file.writeline()
file.read()
file.write()
file.flush()
file.seek()
file.list()
file.format()
file.rename()
file.fsinfo()

En el enlace anterior se describe como funcionan los diferentes comandos.
Título: Re:Esp8266 & LUA
Publicado por: AKENAFAB en 18 de Agosto de 2016, 14:52:33
Wow  ((:-))

Que interante, he empezado a practicar con estos modulitos ,sus aportes han sido de mucha ayuda.  :-/ ,muchas gracias!

En mi pc el ESPlorer se ve mal :/ pasas el el puntero del mouse y aparece fragmentos de pantalla de la misma app,todo un revoltijo,por ahora uso el LUaloader. -.-

Saludos!
Título: Re:Esp8266 & LUA
Publicado por: groundman en 23 de Agosto de 2016, 15:36:33
me alegra que te sea util.yo he tenido que dejarlo aparcado un tiempo porque estoy con la camara OV7670.y me esta doliendo la cabeza con el.
mi hermano esta liado con lua.y ha estad practicando con un protocolo de comunicacion llamado mosquitto.o algo asi.por lo que me ha contado es la caña.

haber si pronto me pongo con ello.saludos.
Título: Re:Esp8266 & LUA
Publicado por: kmiz en 23 de Noviembre de 2016, 19:56:14
Hola, soy nuevo en el foro.
He entrado atraido por este post sobre el 8266.
Yo ando cacharreando con un nodemcu hace algun tiempo.
Tengo problemas para comprender como se interpretan los patrones para los strings.
Veo el manual de lua y veo algun ejemplo, pero no consigo entender como funciona ese apartado.
Cuando tenga un rato pondre algun fragmento de codigo, como por ejemplo para utilizar websockets y asi mantener una conexion permanente en el navegador.
Saludos a todos.
Título: Re:Esp8266 & LUA
Publicado por: groundman en 25 de Noviembre de 2016, 11:10:14
hola kmiz.ya hace casi un año que tuve que dejar lo del ESP8266 y no estoy al dia.asi que no te sere de mucha ayuda.pero expon tu problema y haber si me acuerdo de algo.

a que te refieres con los patrones para los strings? te refieres al envio de tramas por la usart?
Título: Re:Esp8266 & LUA
Publicado por: kmiz en 25 de Noviembre de 2016, 22:08:38
Gracias por responder.
Con "Patron" me refiero en :
Código: [Seleccionar]
local _, _, method, path, vars = string.find(request, "([A-Z]+) (.+)?(.+) HTTP");
        if(method == nil)then
            _, _, method, path = string.find(request, "([A-Z]+) (.+) HTTP");
        end

La parte: ([A-Z]+) (.+)?(.+) HTTP") y la parte ([A-Z]+) (.+) HTTP")

Por mas que miro el tutorial de lua no consigo entender el funcionamiento
Título: Re:Esp8266 & LUA
Publicado por: KILLERJC en 26 de Noviembre de 2016, 02:45:34
Busca por internet "Regular Expresion" o "Regex"

Ahi vas a tener la informacion de que es eso. ( No es especifico de LUA nomas, sino que varios lenguajes mas lo usan )
Tenes tambien de forma online algunas paginas que si vos pones el criterio ( patron, o lo que estes buscando) y pones el texto que te llega, se ilumina donde realmente coincide con eso
Título: Re:Esp8266 & LUA
Publicado por: groundman en 26 de Noviembre de 2016, 14:38:02
ufff  :(. parecia que despues de todo este tiempo me acordaria.lo siento pero por ahora estoy en blanco.

pero en el manual: http://www.lua.org/manual/5.1/es/manual.html

esta esto:

string.find (s, patrón [, inicio [, básica]])

Busca la primera aparición de patrón en el string s. Si la encuentra, find devuelve los índices de s donde comienza y acaba la aparación; en caso contrario retorna nil. Un tercer argumento numérico opcional inicio especifica dónde comenzar la búsqueda; su valor por defecto es 1 y puede ser negativo. Un valor true como cuarto argumento opcional básica desactiva las utilidades de detección de patrones, realizando entonces la función una operación de "búsqueda básica de substring", sin caracteres "mágicos" en el patrón. Téngase en cuenta que si se proporciona el argumento básica también debe proporcionarse el argumento inicio.

Si el patrón tiene capturas entonces en una detección con éxito se devuelven los valores capturados, después de los dos índices.



lo que hace es buscar un patron determinado de una cadena string.yo creo que busca una determinada secuencia.
de una respuesta por parte del servidor.

no puedo aclarate nada mas.aunque esto ya lo practique.y no es muy dificil.

creo recordar que cuando recivia la trama del servidor.esta incluia los caracteres HTTP.y lo que se hacia hera
cargar en la variable esta cadena.solo por tener esta secuencia HTTP.no se si me explico.pero si no vuelvo
a practicar no puedo acordarme.
Título: Re:Esp8266 & LUA
Publicado por: KILLERJC en 26 de Noviembre de 2016, 15:32:32
Bueno.. Usualmente cuando uno hace un pedido a una pagina puede ir como GET o POST.

Ejemplo... al abrir la pagina de inicio de este foro. Mi navegador envia una solicitud GET al servidor:

Citar
GET /foros/index.php?userid=30 HTTP/1.1
Host: www.todopic.com.ar
Connection: keep-alive
Cache-Control: max-age=0
***** Aca hay mas *********

Otro caso seria:

Citar
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
userid=30&name2=value2

El servidor entonces tiene que actuar. Si fue GET los parametros van a ir en la URL, si es POST los parametros van a ir por la cabecera que envíe, esto se puede observar en los ejemplos anteriores.
De esa forma el ESP que estaria funcionando como servidor debe saber exactamente que es lo que le pide el cliente.

Ahora esa expresion regular esta buscando algo que concuerde con lo expresado:

([A-Z]+) (.+)?(.+) HTTP

Tenemos:

([A-Z]+)
Que separaria el primer grupo ( los grupos estan separados en parentesis), que son todas letras mayusculas de la A a la Z y que pueden ocurrir una o varias veces ( por eso el + )

Luego le sigue un espacio, ( caracter 32 de la tabla ASCII )

Luego tenemos el otro grupo
(.+)
Esto nos dice que puede ser cualquier letra ( el punto dice eso) y que se puede repetir muchas veces

Seguimos con un "?", que creo que aca necesita en realidad un caracter de escapees decir deberia ser \?
Eso seguido de otro grupo (.+) el cual puede ser cualquier cosa

Y terminado con " HTTP", es decir el espacio y las letras HTTP.

---------

Ahora miremos el ejemplo del GET y que puse en negrita antes

GET /foros/index.php?userid=30 HTTP/1.1

Si yo lo hago pasar por una expresion regular del estilo : ([A-Z]+) (.+)\?(.+) HTTP

Primero que coincide, por lo cual ya me indica que existe la cabecera, ademas los grupos me quedarian:

Código: [Seleccionar]
Grupo1 : "GET"
Grupo2 : "/foros/index.php"
Grupo3: "userid=30"

Entonces obtuve: El metodo, que es el GET , la pagina que se intenta acceder y los parametros a usar.

En el otro caso que es el de :

([A-Z]+) (.+) HTTP

Seria ideal para un POST, ya que como dijimos estos no poseen los parametros EN la direccion URL, y es por eso que esta alli, ya que en la cabecera post no hay un "?" en la URL, la expresion regular que usabamos antes y que funcionaba para el GET, ahora nos dice claramente que no encuentra ninguna sentencia de esa forma. Por eso mismo estan ambas.

--------

Espero que haya quedado claro. Y se pueda entender.
Título: Re:Esp8266 & LUA
Publicado por: kmiz en 27 de Noviembre de 2016, 22:26:52
Muy agradecido.
Por fin entiendo el funcionamiento. De verdad, HE VISTO LA LUZ!!!!!
No entendía como y que retornaba en cada variable. Y ahora por fin lo entiendo.
osea, los [ ] son los que definirían los patrones y los  ( ) son los que definen lo que se retorna en las variables (las capturas), y el resto de caracteres
(excepto "^$()%.[]*+-?") se toman tal cual.
De verdad me habéis ayudado mucho.
Ahora lo voy a poder aplicar en bastantes rutinas que precisaba muchas instrucciones para filtrar el contenido de las cadenas recibidas.
A veces me atasco en cosas así y pierdo muchísimo tiempo dándole vueltas a lo mismo.



Título: Re:Esp8266 & LUA
Publicado por: KILLERJC en 27 de Noviembre de 2016, 23:12:18
En realidad los corchetes [ ] indican un rango.. si dice de A-Z quiere decir ABCDEFGHIJKLMNOPQRSTUVWXYZ todos mayusculas, si dice a-z son los caracteres en minuscula, si dice 0-9 son los numeros. El + como te decia significa que puede haber 1 o varias letras con el criterio anterior. Tal es el caso de GET (ocurre 3 veces y son todas letras mayusculas), luego el espacio.

El punto, en una expresion regular puede ser cualquier caracter (numero, letra, simbolo, etc) excepto un salto de linea. por eso te toma los "/" y letras en minusculas.

Seguido de eso la expresion tiene un"?", en realidad ese "?" es parte de las operaciones en expresiones regulares, lo vas a ver como un-greedy, y si se quisiera realmente indicar que debe existir una letra ? deberia escaparse el caracter, por eso en mi explicacion puse: "\?"

Si queres probar podes hacerlo, hay muchas paginas online que te lo permiten. Como esta:
http://regexr.com/

En el texto pone:

Código: [Seleccionar]
GET /foros/index.php?userid=30 HTTP/1.1
Host: www.todopic.com.ar
Connection: keep-alive
Cache-Control: max-age=0
***** Aca hay mas ****
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
userid=30&name2=value2


Y luego usa las siguientes expresiones y mira las diferencias:

Código: [Seleccionar]
([A-Z]+) (.+)?(.+) HTTP
([A-Z]+) (.+)\?(.+) HTTP
([A-Z]+) (.+) HTTP

Los valores que coincidan con la expresion se van a remarcar en un color, si apoyas el mouse veras los grupos y la diferencia entre los 2 primeros, Obviamente proba expresion a expresion.

Finalmente podes encontrar un cheat sheet con todos las operaciones que usan las ReGex pero lo mejor es leer un tutorial, ya que son un dolor de cabeza.

http://www.rexegg.com/regex-quickstart.html

El otro problema es que no todos los lenguajes tienen el mismo soporte, aunque la parte basica sea igual para todos.
Título: Re:Esp8266 & LUA
Publicado por: leonardovelasco1972 en 02 de Diciembre de 2016, 18:43:10
buenas tardes yo tambien estoy en el chicle del esp8266 programando en lua utilizando el esplorer les pregunto si alguno sabe como configurar los DNS utilizando lua para que el modulo lo pueda acceder por internet gracias
Título: Re:Esp8266 & LUA
Publicado por: groundman en 06 de Diciembre de 2016, 14:07:31
pues hace tiempo vi algo de lo que comentas.y creo que tenias que configurar el router con una cuenta DynDns o no-ip.y luego cargar en el Esp un archivo.y se podia establecer comunicacion
desde el exterior.creo que estaba en Github.pero no me acuerdo donde.
Título: Re:Esp8266 & LUA
Publicado por: groundman en 22 de Diciembre de 2016, 17:28:09
hola.estoy practicando con el ESP8266-12f. y con el modulo gpio.

en este video pongo la practica:



lo que hace este programa es configurar el ESP en modo estacion y crear un servidor.con el puerto 80 y lo configuraremos con la IP 192.168.1.5 . le daremos el nombre de la red de nuestro router y la clave.
de esta forma el ESP conectara automaticamente con nuestro router y el ESP estara atento a cualquier dato que se le envie desde un cliente que este conectado a nuestro router.

en esta practica el cliente lo configuraremos con el programa hercules.en este indicaremos la IP 192.168.1.5 y el puerto 80.una vez que conectemos tendremos 60s para enviar datos.
transcurrido este tiempo sin enviar datos la conexion se cerrara y tendremos que conectar de nuevo.

este es el codigo con el hay que programar al ESP:

Código: [Seleccionar]
pin4=4                          --asignamos valor  para la variable pin

--Numeros de los pin

--gpio 8=D8 de lolin
--gpio 7=D7 de lolin
--gpio 6=D6 de lolin
--gpio 5=D5 de lolin
--gpio 4=D4 de lolin y led azul del esp8266-12F
--gpio 3=D3 de lolin
--gpio 2=D2 de lolin
--gpio 1=D1 de lolin
--gpio 0=D0 de lolin

gpio.mode(pin4, gpio.OUTPUT)     --configuramos el pin 4 como salida.

wifi.setmode(wifi.STATION)        --modo estacion


ssid="nombre_de_la_wi_fi"
clave="clave_de_wifi_del_router"


 
 wifi.sta.setip({ip="192.168.1.5",netmask="255.255.255.0",gateway="192.168.1.1"})   --configura IP fija.donde ipMem es la ip almacenada en un archivo.
 wifi.sta.config(ssid,clave)                --nombre del punto de acceso wi-fi de nuestro router.y la clave

 wifi.sta.connect()                                         --conectar con el cliente



 srv=net.createServer(net.TCP,60)                           --crea el servidor.y si no hay trafico,cierra conexion pasados 60s
 srv:listen (80,function(conn)                               --estar a la escucha en el puerto 80.
    conn:on("receive",function(conn,payload)                --evento de recepcion y carga el valor leido en payload
    print(payload)                                          --envia al puerto serie lo que se recive desde el cliente

       
                 if payload=="ledon\r" then              --secuencia para encender led
         gpio.write(pin4, gpio.HIGH)         --encender led
          conn:send("Led On")               --envia al cliente.mensage
          print("evento on ",pin4)         --envia datos a la usart
         
        elseif payload=="ledoff\r" then     --secuencia para apagar led
         gpio.write(pin4, gpio.LOW)          --apagar led
         conn:send("Led Off")               --envia al cliente.mensage
         print("evento off ",pin4)         --envia datos a la usart
       
                 end
       
    end)
end)

y asi queda el hercules.abajo estan los botones con el codigo hexagesimal que hay que enviar para encender/apagar el led.que en realidad es ledon y lodoff con el caracter de control 0d.(intro)

(http://www.4shared.com/img/bnBxrPHCce/s25/15921f860f8/hercules2__1_) (http://www.4shared.com/photo/bnBxrPHCce/hercules2__1_.html)


Como Lua es un lenguage intrepretado.al ESP hay que cargarle un firmware.hasta el dia de hoy.yo me bajaba la version 0.9xxxx. pero desde hace un tiempo el firware hay que descargarlo a la carta.
es decir.antes se cargaban todos los modulos aunque no los fueramos a usar.esto hacia que saturaramos la memoria del ESP.ahora debemos elegir los modulos que queramos incluir en el firmware y noslos envian por e.mail

la pagina es esta: https://github.com/nodemcu/nodemcu-firmware/releases





Título: Re:Esp8266 & LUA
Publicado por: elgarbe en 23 de Diciembre de 2016, 10:13:43
Muy bueno!

yo recivi uno de estos:
https://www.aliexpress.com/item/V3-4M-bytes-32Mbits-FLASH-NodeMcu-Lua-WIFI-Networking-development-board-Based-ESP8266-with-firmware/32469449989.html

y estoy esperando finalizar la mudanza y armar el tallercito para meterle mano!
Título: Re:Esp8266 & LUA
Publicado por: groundman en 23 de Diciembre de 2016, 11:19:13
si.es igual que el que yo tengo.y con el que estoy haciendo las practicas.en la placa pone lolin.tambien he comprado los ESP8266-12f .
salen mas varatos.incluso comprando el conversor usb-ttl y el regulador de 3.3v sale mas economico que el lolin.

aunque este es mas comodo. ya que tenemos el reset y el boton que hay que pulsar para cargar el firmware.(boton flash) solo hay que dejarlo pulsado antes de programar la flash.
y solarlo en cuanto se este programando.no hace falta tenerlo pulsado todo el rato.

en la flash 0.9xxx se trabajaba a 9600bps. en la ultima version master funciona a 115200.asi que programar la flash es vastante rapido.

Título: Re:Esp8266 & LUA
Publicado por: groundman en 24 de Diciembre de 2016, 12:20:31
he encontrado esta tienda en ebay para este modulo:

(http://www.4shared.com/img/Z0FPszICce/s25/15931596bc8/esp-12e) (http://www.4shared.com/photo/Z0FPszICce/esp-12e.html)

http://www.ebay.es/itm/381303446767?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT

aqui lo venden por 3.18€   respect a lo que vale el modulo ESP-12e a 1.80€. no vale la pena comprarlo suelto.ya que fabricar la placac ya se nos va mas en tiempo y materiales.aunque si viene bien
para soldarlo a algun prototipo que estemos desarroyando.

quiero poner este enlace a la documentacion del nodemcu.que es de mucha utilidad:

https://nodemcu.readthedocs.io/en/master/

yo lo que he hecho es poner dos litios en serie y regulado con un LM7805. a estos litios le he puesto unos modulos para cargarlos independientemente con dos cargadores de movil.
ya que el usb del ordenador no es suficiente para alimentar estos modulos.

(http://www.4shared.com/img/udB_h13zce/s25/159316041c8/IMAG2415) (http://www.4shared.com/photo/udB_h13zce/IMAG2415.html)
Título: Re:Esp8266 & LUA
Publicado por: groundman en 24 de Diciembre de 2016, 13:40:20
El ESP-12e integra un led azul que esta conectado al pin4 (D4)

y yo lo que queria es saber en todo momento cuando el modulo esta conectado con mi router.he estado practicando con varias instrucciones pero no encontraba lo que buscaba.
hasta que he dado con esto:

wifi.eventmon.register()
 
esta funcion registra los eventos de la wifi en el modo estacion.y podemos informarnos del estado de esta.asi que he modificado el programa anterior para que el led azul se encienda
cuando tenga conexion.y se apage cuando no la tenga.

aqui esta la descripcion:

hay que tener en cuenta que este led enciende a estado 0 y apaga a estado 1 .

Código: [Seleccionar]

pin4=4                          --asignamos valor  para la variable pin

--Numeros de los pin

--gpio 8=D8 de lolin
--gpio 7=D7 de lolin
--gpio 6=D6 de lolin
--gpio 5=D5 de lolin
--gpio 4=D4 de lolin y led azul del esp8266-12F
--gpio 3=D3 de lolin
--gpio 2=D2 de lolin
--gpio 1=D1 de lolin
--gpio 0=D0 de lolin

gpio.mode(pin4, gpio.OUTPUT)     --configuramos el pin 4 como salida.
gpio.write(4, gpio.HIGH)          --apaga led del ESP8266

wifi.setmode(wifi.STATION)        --modo estacion


ssid="nombre_de_la_wi_fi"
clave="clave_de_wifi_del_router"


 
 wifi.sta.setip({ip="192.168.1.5",netmask="255.255.255.0",gateway="192.168.1.1"})   --configura IP fija.donde ipMem es la ip almacenada en un archivo.
 wifi.sta.config(ssid,clave)                --nombre del punto de acceso wi-fi de nuestro router.y la clave

 wifi.sta.connect()                                         --conectar con el cliente


  wifi.eventmon.register(wifi.eventmon.STA_CONNECTED, function(T)
    print("\n\tSTA - CONNECTED".."\n\tSSID: "..T.SSID.."\n\tBSSID: "..
    T.BSSID.."\n\tChannel: "..T.channel)
     gpio.write(4, gpio.LOW)          --enciende led del ESP8266
    end)
  wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
    print("\n\tSTA - DISCONNECTED".."\n\tSSID: "..T.SSID.."\n\tBSSID: "..
    T.BSSID.."\n\treason: "..T.reason)
    gpio.write(4, gpio.HIGH)          --apaga led del ESP8266
    end)   


 srv=net.createServer(net.TCP,60)                           --crea el servidor.y si no hay trafico,cierra conexion pasados 60s
 srv:listen (80,function(conn)                               --estar a la escucha en el puerto 80.
    conn:on("receive",function(conn,payload)                --evento de recepcion y carga el valor leido en payload
    print(payload)                                          --envia al puerto serie lo que se recive desde el cliente

       
                 if payload=="ledon\r" then              --secuencia para encender led
         gpio.write(pin4, gpio.HIGH)         --encender led
          conn:send("Led On")               --envia al cliente.mensage
          print("evento on ",pin4)         --envia datos a la usart
         
        elseif payload=="ledoff\r" then     --secuencia para apagar led
         gpio.write(pin4, gpio.LOW)          --apagar led
         conn:send("Led Off")               --envia al cliente.mensage
         print("evento off ",pin4)         --envia datos a la usart
       
                 end
       
    end)
end)

una cosa muy importante es que al archivo hay que cargarlo en el modulo con el nombre init.lua


dentro de mi casa ha llegado a desconectarse a los 25mtrs con dos puertas metalicas de por medio.pero con vista directa al router llega bastante mas lejos.
cuando me he alejado la luz se ha apagado bastante lejos.pero para encenderse ha tenido que acercarme algo mas.

no voy a ponerme a medir distancias porque todo depende del enfoque de la señal y las antenas que usemos.ademas hay pruebas en youtube que indican distancias kilometricas.
yo lo voy a usar para la apertura de un cochera.y conque se conecte a 25mtrs tengo mas que de sobra.

Título: Re:Esp8266 & LUA
Publicado por: groundman en 25 de Diciembre de 2016, 10:52:23

tambien quiero mostrar el funcionamiento del modulo gpio para el uso de los pin de E/S.

para el uso de las E/S del modulo.hay que configurar el pin como entrada o como salida con esta instruccion.

gpio.mode(pin, mode [, pullup])

en pin hay que poner el numero del pin que vallamos a usar.
en mode. si vamos a usar el pin como entrada,salida,opendrain o como interrupcion.
y en pullup.si lo usamos como entrada.podemos activar las resistencias internas pull-up.por defecto esta en float.float significa que se almacena el valor.es decir que toma el ultimo valor que
le allamos aplicado.por defecto puede tmar el valor 0 o 1 segun como haya quedado cargada la entrada.

hay que configurar las pull-up o usar resistencias para obtener los valores deseados.en el caso de usar pulsadores o dispositivos opendrive.

este modulo trabaja con 3.3v. asi que debemos tener cuidado con el nivel de las señales de entrada.y ponerles las devidas protecciones.como resistencias,diodos u otros componentes.


ejemplo para configurar una entrada con pull-up activada.
gpio.mode(1,gpio.OUTPUT)  --pin 1 como salida.
gpio.mode(2,gpio.INPUT)  --pin 2 como entrada.
gpio.mode(3,gpio.INPUT,gpio.PULLUP)  --pin 3 como entrada.y pullup activada

aqui hay mas funcines que se pueden usar: https://nodemcu.readthedocs.io/en/master/en/modules/gpio/
Título: Re:Esp8266 & LUA
Publicado por: groundman en 25 de Diciembre de 2016, 16:43:57
con este codigo configuramos un pin para que produzca una interrupcion.en este caso es al ponerlo en estado bajo.pero hay muchas mas configuraciones.
Código: [Seleccionar]
pin=2
gpio.mode(pin,gpio.INT,gpio.PULLUP)         --configuramos el pin  como entrada e interrupcion activada


 do
 
 local function pin1cb(level)
  print( "esto es una interrupcion" )
  gpio.trig(pin, level == gpio.HIGH  and "down" or "up")
  end
    gpio.trig(pin, "down", pin1cb)
    end
Título: Re:Esp8266 & LUA
Publicado por: groundman en 14 de Octubre de 2017, 11:15:06
hola.ya estoy aqui de nuevo con la programacion de estos tipos de dispositivos.

ahora que he empezado de nuevo.me esta costando mucho trabajo reiniciar las practicas.ya que se me ha olvidado muchas cosas.
y al olvidarse las cosas.pues se cometen errores.y estos errores bloquean el ESP8266.o mas bien diria que el ESP se queda en un bucle infinito
que imposibilita salir de este.la solucion es poner una instruccion en el codigo que pare la ejecucion del script.

esto se soluciona por ejemplo poniendo estas linea que detiene la ejecucion del programa.

Código: [Seleccionar]
gpio.write(ledAzul, gpio.LOW)          --enciende led del ESP8266
tmr.delay(1000000)
gpio.write(ledAzul, gpio.HIGH)          --apaga led del ESP8266
tmr.delay(1000000)
gpio.write(ledAzul, gpio.LOW)          --enciende led del ESP8266
tmr.delay(1000000)
gpio.write(ledAzul, gpio.HIGH)          --apaga led del ESP8266
tmr.delay(1000000)

-- si durante el reseteo del ESP8266.se mantiene el pin 3(boton Flash) a cero,el archivo init.lua se borrara.esto da la opcion
-- de desbloquear el ESP ante un bucle infinito.
if gpio.read(3)==0 then
print("Init.lua Borrado ")
file.remove("init.lua")
end


al resetear el ESP este enciende dos veces el led azul.antes de que termine esta secuencia hay que mantener pulsado el boton Flash.y de esta forma se borra el archivo de arranque
init.lua   asi pdemos volverlo a grabar sin tener que flasear el modulo.


pero en el caso de que no tubieramos la precaucion de hacer esto.tendriamos que flashear el ESP8266.aunque esto parece muy sencillo.
aveces no lo es tanto.porque si le queda alguna zona de la memoria que no se ha borrado.el flaseo no funciona.

para borrar del todo la flash.antes de grabar el scrip de lua.hay que grabarle unos archivos vacios.hay varios programas
para hacer esto.pero aveces no funcionan como quisieramos.

un programa es el  NODEMCU FIRMWARE PROGRAMMER

aunque si nos da problemas.tambien podemos usar el ficial de aqui: http://espressif.com/en/support/download/other-tools

es el Flash Dounload Tools.

(https://www.4shared.com/img/iyN9P0sWei/s25/15f1a295fc0/nodeMcuProg) (https://www.4shared.com/photo/iyN9P0sWei/nodeMcuProg.html)

lo unico que hay que hacer para borrar la flash.es indicarle donde estan los archivos,la direccion. y darle a grabar.

en el caso de querer grabar archivos en blanco.se le dara la direccion del archivo blanc.bin
depende de la capacidad de Flash que tenga nuestro ESP.se grabaran un archivo por cada 512K.y se indicaran sus direcciones.
ademas de seleccionar los check.

(https://www.4shared.com/img/nHRXN3_Fca/s25/15f1a24bc40/esp8266Flasing) (https://www.4shared.com/photo/nHRXN3_Fca/esp8266Flasing.html)

cuando grabemos el script de lua.por ejempl. el nodemcu-master-8-modues-xxxx
al conectarlo al ESPlorer.lo resetearemos. y aparecera la frase:

Formatting file system. Please wait...


pues esperaremos a que forf¡matee el ESP y ya solo nos queda meterle el archivo init.lua y demas archivos conjuntos si los tenemos.



otra forma de formatear es usar solo el el programa oficial.ESP8266 DOUNLOAD TOOL sin usar los archivos blank.bin

para ello.despues de seleccionar el puerto y la velocidad.que en este caso usaremos la mas alta que nos deje hacer una buena grabacion
sin errores.

pondremos el ESP en modo de Flaseo.manteniendo pulsado el boton Flash,pulsamos brebemente el boton reset sin soltar el boton Flash.
luego soltamos el boton Flash.le damos a ERASE en el programa oficial.y se encendera intermitentemente el led azul durante la operacion de borrado.
luego haremos lo mismo para la programacion.pero hay que pulsar entes el boton STOP para una nueva programacion

aveces incluso habra que desconectar el usb.para que el puerto este abierto.

tambien decir que el boton Flash pertenece al GPIO 0.y el reset al RST.

(https://www.4shared.com/img/WePFG2koei/s25/15f1a79b628/esp8266Flash2) (https://www.4shared.com/photo/WePFG2koei/esp8266Flash2.html)

en el ESPlorer siempre deberemos trabajar a 115200bps.y esperar al formatting despues de un flaseo

despues del flaseo queda conectar el programa ESPlorer y resetear. luego esperar a que termine: Formatting file system. Please wait...
y luego meter el init.lua





Título: Re:Esp8266 & LUA
Publicado por: groundman en 22 de Octubre de 2017, 11:37:25
bueno.pues ya me he puesto al dia con estos mudulitos que ya se pueden conseguir a 3€ con el lolin incluido.aunque no son circuitos muy potentes
son muy buena opcion para proyectos de control domotico.

en este caso he realizado una aplicacion que utilizo para saber cuanto tiempo me duran unas baterias donde le conecto unas lamparas.
lo unico que le conecto al lolin.es un LDR con una resistencia de 2k2.lo dispongo como un divisor de tension.donde el extremo de la resistencia
lo conecto a masa.el extremo del LDR al 3.3v y la union de los dos componentes a ADC0 del lolin.

la entrada analogica puede contener un valor entre 0 y 1024.donde 0 es oscuridad y 1024 claridad.

yo he fijado el valor de corte en 500.para que el circuito no se vea afectado por la luminosidad del ambiente.

una vez que reseteamos el ESP8266.un contador de horas,minutos y segundos.comienza el contage.y este estara contando hasta que el valor
de luminosidad descienda por debajo de 500.cuando se sobrepase este limite,el contador se parara.y sabremos cuanto tiempo ha estado la luz encendida.

para acceder a estos datos.he creado un serevidor WEB.para entrar en este servidor,usaremos el navegador WEB de nuestro ordenador
o el movil.

entraremos con la direccion 192.168.1.5 pero antes deberemos de conectarnos al punto de acceso llamado Contador5.como la seguridad esta abierta,
no necesitaremos contarseña.

una vez conectados aparecera esto:

(https://www.4shared.com/img/lbOeSpXFca/s25/15f4475e550/circuito_contador) (https://www.4shared.com/photo/lbOeSpXFca/circuito_contador.html)

nos indica el valor de contage,valor del nivel de luminosidad y el estado.si esta en funcionamiento o a terminado.

tambien tenemos un boton que nos refrescara los datos.


Código: [Seleccionar]
--config.lua

--Variables
sec=0
min=0
hor=0
final=0
adcval=1024
limite=500



-- WiFi
WIFI_SSID = "Contador5"--"HUAWEI-E5186-AACA"--"WLAN_05"--"WiFi-RepeaterCH"
WIFI_PWD  = ""

MI_IP="192.168.1.5"


-- Confirmation message
print("\nGlobal variables loaded...\n")


Código: [Seleccionar]
--exit_prog.lua

ledAzul=4                           --pin 4.led azul del modulo
pinFlash=3                           --pin para el borrado del archivo init.lua(boton Flash)

gpio.mode(ledAzul,gpio.OUTPUT)       --configuramos el pin ledAzul como salida.
gpio.mode(pinFlash,gpio.INPUT,gpio.PULLUP)       --configuramos el pin exit como entrada.


gpio.write(ledAzul, gpio.LOW)          --enciende led del ESP8266
tmr.delay(1000000)
gpio.write(ledAzul, gpio.HIGH)          --apaga led del ESP8266
tmr.delay(1000000)



-- si durante el reseteo del ESP8266.se mantiene el pin 0(boton Flash) a cero,el archivo init.lua se borrara.esto da la opcion
-- de desbloquear el ESP ante un bucle infinito.
if gpio.read(pinFlash)==0 then
print("Init.lua Borrado ")
file.remove("init.lua")
end

Código: [Seleccionar]
--adc.lua

channel=0                               --pin A0 del nodemcu
gpio.mode(channel,gpio.INPUT)


if adc.force_init_mode(adc.INIT_ADC)
then
  node.restart()
  return -- don't bother continuing, the restart is scheduled
end

Código: [Seleccionar]
--init.lua
 
dofile ("exit_prog.lua")                  --opcion para salir del prgrama
dofile ("config.lua")                     --variables del programa
dofile ("adc.lua")                        --carga el archivo que gestiona el adc



AP_cfg={}                                                       --configura nombre del punto de acceso
AP_cfg.ssid="Contador5"--WIFI_SSID
wifi.ap.config(AP_cfg)



setIP_cfg =                                                     --configura IP
 {
    ip=MI_IP,netmask="255.255.255.0",gateway="192.168.1.1"
 }   
wifi.ap.setip(setIP_cfg)


wifi.setmode(wifi.SOFTAP)                                       --modo punto de acceso
wifi.sta.connect()




wifi.eventmon.register(wifi.eventmon.AP_STACONNECTED, function(T)
 print("\n\tAP - STATION CONNECTED".."\n\tMAC: "..T.MAC.."\n\tAID: "..T.AID)
 
     gpio.write(ledAzul, gpio.LOW)          --enciende led del ESP8266
    end)

wifi.eventmon.register(wifi.eventmon.AP_STADISCONNECTED, function(T)
 print("\n\tAP - STATION DISCONNECTED".."\n\tMAC: "..T.MAC.."\n\tAID: "..T.AID)
     gpio.write(ledAzul, gpio.HIGH)          --apaga led del ESP8266
    end)   
 


 srv=net.createServer(net.TCP,60)                           --crea el servidor.y si no hay trafico,cierra conexion pasados 60s
 srv:listen (80,function(conn)                               --estar a la escucha en el puerto 80.
    conn:on("receive",function(conn,payload)                --evento de recepcion y carga el valor leido en payload
    print(payload)                                          --envia al puerto serie lo que se recive desde el cliente
    --print("ssid: ", wifi.sta.getrssi())

   
     conn:send("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1> Circuito Contador </h1>\r\n")
 
        print (time)
       conn:send("<h3> Tiempo luz encendida: </h3>"..time)
        conn:send("<h3> Intensidad de la Luz. valor entre 0 y 1024. limite:500 </h3>")
        conn:send("<h3> Valor Actual </h3>"..adcval.."<pre></pre>")



       
    conn:send('<form method="post">')
    conn:send('<input type="submit"   value="Actualizar"  style="height: 50px; width: 200px"/>')
    conn:send('</form></body></html>')

   
        if (adcval<limite) then
            conn:send("\r\n\r\n<h2> FINALIZADO </h2>")
                else
            conn:send("\r\n\r\n<h2> RUN </h2>")
        end
       
        end)
    tmr.delay(1000000)                                      -- 1 segundo de retardo
   
end)

        mytimer = tmr.create()
        mytimer:register(1000, tmr.ALARM_AUTO,  function() contador() end )
        mytimer:start()
       
       
 function contador ()
        if (adcval<limite) then  mytimer:stop() end            --para el contador si el valor de luminosidad esta por debajo del limite
 
        adcval=adc.read(channel)   
        sec=sec+1
        if (sec==60) then sec =0 min=min+1 end
        if (min==60) then min = 0 hor=hor+1 end

        if (string.len(hor)<2) then hor="0"..hor end                 --ajusta a dos cifras
         if (string.len(min)<2) then min="0"..min end                 --ajusta a dos cifras
          if (string.len(sec)<2) then sec="0"..sec end                 --ajusta a dos cifras
     
        time=(hor)..":"..(min)..":"..(sec)..":"
     
       print (time)
       print (adcval)
       
end   




config.lua   es donde asignamos nuestras variables

exit_prog.lua  es un script que nos borra el archivo principal init.lua en caso de que el modulo se nos quede bloqueado en un bucle sin fin.
      para ejecutarlo solo tenemos que pulsar el boton reset y seguidamente mantener pulsado el boton flash.luego pulsamos reset de nuevo
      y veremos como se ha borrado el archivo.ya solo tendriamos que volver a cargarlo con el ESPlorer.
adc.lua      configura el ADC interno.

init.lua   es el programa principal.


espero que les sea de utilidad.pondre mas proyectos para circuitos simples que pueden complementar a otros de mayor complejidad.

PD: recordar que cuando compileis el firmware de aqui: https://nodemcu-build.com/  seleccionar tambien el ADC. y descargaros el integer.que es el que yo uso.
Título: Re:Esp8266 & LUA
Publicado por: osposto en 02 de Abril de 2021, 19:31:34
Estimados: Soy un programador en C de microcontroladores, y he comprado un módulo NODE MCU LUA, para conexión wifi con el consabido Esp8266. Lo compré hace 2 días, a un precio razonable, y por la razonabilidad del precio es que creo que hice macanas...
Por supuesto (y es por esto que les consulto), la magnitud de la macana que me mandé va a depender de la respuesta a esta pregunta: Es indefectible aprender LUA para este módulo? Si o si?
No existe forma de cambiar firmware o algo por el estilo, como para que siga teniendo la misma funcionalidad, pero escrito en C, que es algo que manejo de hace muchos años?
Estuve leyendo algo de LUA, y en definitiva es una máscara para C, para hacerlo más entendible y manejable para aquellos que no programan en este.. y es lógico, porque C a veces lleva a romperse la cabeza con facilidad. Pero bueno, burro viejo no agarra el paso.
Gracias por su comprensión, y si saben algo, gracias por su colaboración también.
Saludos.
Título: Re:Esp8266 & LUA
Publicado por: Sispic en 03 de Abril de 2021, 01:28:41
No estoy muy enpapado del tema pero es mi experiencia .
Adquiri el un modulo ESP12E .

(https://images-na.ssl-images-amazon.com/images/I/712MQXA8VIL._SX425_.jpg)

Con el firmware que trade por defecto te puedes comunicar con comandos AT .
rs232 con PC,raspberry,microcontrolador etc. y se tiene acceso a todo lo necesario en lo que respecta al wifi .

https://www.espressif.com/sites/default/files/documentation/4a-esp8266_at_instruction_set_en.pdf

Tambien prove vscode con platformio en C , y tienes acceso a sus E/S ADC spi etc .chuta , pero no tengo experiencia con el ademas que segun que modelo tienes poco hardware libre para usar .

Título: Re:Esp8266 & LUA
Publicado por: fuente en 03 de Abril de 2021, 04:23:28
Hola a todos.
Compré un par de esp12E hace algo más de un año, y con el confinamiento me dio tiempo a hacer algo con ellos.
No es necesario aprender LUA, de hecho he tenido que buscar en Google lo que es. Se pueden programar desde el entorno arduino. Hay un montón de información por internet. Hay librerías que hasta te permiten cargar ficheros con páginas html y scripts de JavaScript para el lado del cliente y programar en c++ el lado del servidor, haciéndolos funcionar como servidores web completamente independientes.

A poco que busques, encontrarás un montón de información y de proyectos que han hecho con estos módulos. Lo que parece es que se están quedando obsoletos, y están siendo reemplazados por los ESP32.
Título: Re:Esp8266 & LUA
Publicado por: osposto en 15 de Abril de 2021, 04:01:37
Gracias por sus respuestas. Efectivamente, se comienzan a usar los Esp32 (comienza en el 3r mundo... el ESP32 es del 2016), pero el principio es el mismo. Solo agrega en el mismo chip  bluetooth y algo mas; muchos puertos de interaccion. Les dejo un link para un somero pantallazo. Pero basicamente es un ESP8266 muy mejorado, lo que lo hace espectacular para domotica y otras yerbas. Pero se puede seguir con el ESP8266 sin quedar fuera de foco. Parece que voy a tener que aprender lua por ahora... je. Saludos!
Título: Re:Esp8266 & LUA
Publicado por: Fer_TACA en 15 de Abril de 2021, 05:54:05
¿y el link?

F.
Título: Re:Esp8266 & LUA
Publicado por: osposto en 22 de Abril de 2021, 09:41:29
Perdón!!!! Se me pasó. El link es a la página del fabricante directamente, donde pueden ver todas als versiones del ESP32... la C3 es aparentemente la última.
https://www.espressif.com/en/support/documents/technical-documents?keys=&field_type_tid%5B%5D=807 (https://www.espressif.com/en/support/documents/technical-documents?keys=&field_type_tid%5B%5D=807)
Si les dificulta con este link, pueden hacer el recorrido completo y encontrarlo en el site.
El módulo ESP32C3WROOM02 es completo. Tiene el agregado de memoria flash, un reloj a 40MHz, todo un chiche.
Si quieren profundizar más aún, está también, por supuesto, la especificación del integrado solo, que abre aún más las posibilidades.
Pensaba subir directamente las hojas de datos, pero son muy grandes para adjuntarlas.
Gracias por avisarme, Fer!
Espero les sirva.
Saludos.
Título: Re:Esp8266 & LUA
Publicado por: uZYNQ en 22 de Abril de 2021, 11:35:46
 Para el ESP32, además de Lua, también se puede programar con micropython, y más comúnmente con el lenguaje C de arduino, utilizando el IDE de arduino o platformio con visual studio Code. Y si quieres profundizar más puedes utilizar el SDK del fabricante con el ESP-IDF que es el IDE. Muy versátil este módulo que tiene dos nucleos! Uno dedicado al manejo del stack de las redes bluetooth y wifi, el otro nucleo lo dejan libre para aplicaciones de usuario. Esto lo logran utilizando el sistema operativo FreeRTOS de forma transparente para el usuario. Pero disponible para usar todas las funciones del RTOS tanto con el ESP-IDF como con el Plugin de Arduino.

Saludos!
Título: Re:Esp8266 & LUA
Publicado por: osposto en 26 de Abril de 2021, 09:21:45
uZYNQ, en este momento estoy instalando el SDK del fabricante, y voy a usar Eclipse como IDE. Parece muy interesante el tema, es un poco engorroso, hay que seguir los pasos con mucho cuidado. Espero no meter la pata demasiado... je.
Gracias por la sugerencia.
Saludos.