Mediciones Directas a Excel.

by jaimearavena in Circuits > Sensors

3273 Views, 4 Favorites, 0 Comments

Mediciones Directas a Excel.

pag.jpg

SIMPLE Y BARATO. Varios excelentes Instructables han mostrado como leer desde Excel las variables físicas que un instrumento mide de un proceso. Estas soluciones se basan en el uso de DLL's que leen una puerta COM y la incorporan directamente a la hoja Excel en tiempo real los datos leídos. Algunas de estas soluciones son gratis como PLX-DAQ de Paralax y otras tienen un valor de algunos dólares como Windmill. Algunas soluciones se apoyan en Arduino como lector de datos y manejo de la interfaz. Por ejemplo:

https://www.instructables.com/id/Live-data-to-excel-from-an-Arduino-Light-Sensor/

https://www.instructables.com/id/Sending-data-from-Arduino-to-Excel-and-plotting-it/

https://www.instructables.com/id/Export-Data-From-Arduino-to-Excel-Sheet/

https://www.instructables.com/id/Linkit-One-Live-data-monitored-in-Excel-and-displa/

Acá se propone una solución más simple, flexible y económica mediante el uso la capacidad de Excel para leer datos desde un sitio web (web-query) de modo que el acceso a la información es a través de una conexión TCP.IP sobre la red LAN o Internet. El núcleo de la solución propuesta es el chip ESP8266 de Expressif, Shangai, que controla un stack TCP.IP y permite configurar fácilmente un servidor web, además de leer un sensor sin otro hardware.

Cómo Funciona

esp12-8266-.jpg

El ESP NODE 8266 contiene una CPU de 32 bits y 80Mhz lo que es más poderoso que Arduino y permite leer sensores I2C, SPI además de tener una puerta ADC de 10 bits. Además tiene incorporado un stack TCP.IP que permite definir fácilmente un servidor web sobre WIFI y muestre una página web que se actualice según los datos medidos. De esta forma, dichos datos estarán disponibles a través de una LAN. El equipo con Excel puede llevar el control de la medición de modo de alivianar el trabajo del sensor, generar una marca de tiempo y gestionar el almacenamiento en disco de la data.

Con el fin de ejemplificar el concepto se presenta acá la medición de un sensor de temperatura LM35 conectado a la puerta ADC del ESP8266. Es posible extender el concepto para leer varios sensores en forma centralizada observando directamente los datos en un gráfico Excel. El tiempo de medida eficaz es del orden de un segundo pero esto depende finalmente del ambiente de programación y sistema operativo del lector.

Material Necesario.-

pag.jpg
  • - NodeMcu8266. US $6 Ebay u otros sitios, hay más baratos.
  • - LM35 sensor de temperatura. US$ 1,5
  • - alambres.
  • - fuente de 5V disponible por ejemplo de un celular.
  • - PC con Windows y Excel… US$ muchos, pero ya lo tengo.
  • - accesos a una red LAN o Internet, también existente..
  • - LuaLoader también gratis.

Conexiones.-

esp12-8266-.jpg

El sensor LM35 tiene tres conectores:

- Vcc que se conecta al pin 3.3V del ESP8266

- Gnd que se conecta al correspondiente pin del ESP8266

- Salida, que se conecta a pin A0 que es la entrada del ADC.

En la foto se puede ver que las conexiones se han hecho mediante cables conectados a un protoboard.

Preparación Del ESP8266.-

loader.jpg

El ESP8266 viene cargado con un firmware que le permite interpretar programas escritos en lenguaje LUA que se cargan a través de la puerta USB. Hay quienes prefieren cambiar el firmware para que el chip se pueda programar utilizando el IDE Arduino y también existe la posibilidad de programarlo con MicroPython pero en este Instructable usará la versión LUA que es muy simple.

Hay varias herramientas para cargar los programas. Usaremos cualquier editor de texto simple, como Notepad para luego cargar el sketch con el programa gratuito LuaLoader de Peter Jennings.

( https://github.com/GeoNomad/LuaLoader).

Es necesario conectar al ESP8266 con la red WIFI para lo cual se envían los siguientes comandos a través de LuaLoader:

print(wifi.sta.getip())

Y se espera la respuesta: "nil" puesto que aun no está definido la red en el ESP8266.

Luego se envía el comando:

wifi.setmode(wifi.STATION)

seguido de:

wifi.sta.config("SSID","password")

Entre comillas se pone la correspondiente SSID y password del Access Point de la red WIFI.

Luego se carga y ejecuta el programqa "wifi.lua" con LuaLoader.

wifi.sta.connect()

wifi.sta.connect()

tmr.alarm(1, 1000, 1, function()

if wifi.sta.getip() == nil then

print("Connecting...")

else

tmr.stop(1)

print("Connected, IP is "..wifi.sta.getip())

end

end)

Este programa dejará conectado el ESP8266 al Access Point de la red WIFI sin que sea necesario volverlo a correrlo nuevamente. Está en el archivo "wifi.lua" adjunto.

Si se envía el nuevamente el comando:

print(wifi.sta.getip())

se podrá obtener la dirección IP que el AP le asignó a la tarjeta , dato importante para leer el web.

Servidor Web.-

La creación del servidor web es muy simple. Se cargan para ello los siguientes dos programas escritos en archivos de texto plano con extensión ".lua" y subidos al ESP8266 mediante LuaLoader:

1.- Programa en archivo Init.lua:

uart.setup(0,115200,8,0,1)
tmr.alarm(0,5000,0,function() dofile("temper.lua") end)

El ESP8266 ejecuta automáticamente el archivo de nombre "init.lua" cada vez que parte de modo que este programa incializa la UART y hace una espera por si fuese necesario hacer algún cambio pues si algo anda mal, se puede entrar en un bucle que exigirá reprogramar el firmware del interprete, lo que es tedioso.

2.- Programa en archivo Temper.lua:

 -- HTTP server lee ADC(0) del ESP8266

--20 junio 2016 Jaime Aravena srv = net.createServer(net.TCP,30) srv:listen(80, function(conn) conn:on ("receive", function (conn, payload) temper = adc.read(0) temper=temper*330./1024. -- calibrar conn:send('<!DOCTYPE HTML><head></head><body>', function(c1) c1:send('<div> temp= '..temper..'</div></body></html>',function(c2) c2:close() end) --close c2 end) --close c1 end) end)

Ambos programas residen en archivos con los nombres indicados, los que se cargan, como se dijo, mediante LuaLoader.

El segundo archivo es invocado por el primero para realizar la medición y publicación de la página en el servidor web el cual el cual se actualiza cada vez que la página es consultada por un browser que en nuestro caso, será el web-query de Excel.

Puede llamar la atención el anidamiento de C1 y C2 el que se debe a una particularidad de la implementación de LUA. Este programa lee la puerta ADC cada vez.

Preparación De Excel.

query.jpg
options.jpg

En la hoja Excel se pone el cursor en "A1" y se realiza la operación " Data -> Import External Data -> New Web Query" con lo que se inicia el diálogo para indicar la URL del NODEMCU de modo de leer el servidor web. Para ello se apunta la dirección del WiFi del ESPNODE detectada en el paso 4. Usando un DNS dinámico se podrá leer desde cualquier lugar del mundo.

Formula.-

formula.jpg

Una vez que se obtenga la página, se aprieta "Import" y se define un área en que están el resultado y las actualizaciones. En este caso, el área reservada es el rango "A1:C4".

A continuación se definen las celdas D1 y E1 con las siguientes formulas:

D1: now() 
D2: =VALUE(SUBSTITUTE(MID($A$3;14;16);".";",";1))

La primera, para obtener la fecha y hora de la lectura y la segunda, para extraer el valor leído como String y transformarlo en un número válido, con decimal separado por coma según costumbre latina que usa la coma como separación decimal ya que el servidor web lo expresa con un punto. Si la configuración de Excel fuese al revés, se puede simplificar esta formula eliminando la substitución

Macros

El proceso de medición y gráfico se automatiza en Excel mediante dos macros, una inicial para limpiar el área de lectura y la segunda macro inicia el proceso de lectura automática.

La cantidad de puntos a leer y el intervalo de lectura se especifican en la misma hoja, en las celdas "L1" y "L2". La velocidad máxima de lectura es de alrededor de una muestra por segundo aunque depende del entorno y la carga sobre el sistema operativo. El número máximo de puntos a leer esta limitado por los cerca de 32.000 pares que se pueden graficar pero en versiones posteriores de Excel este número es mayor. El gráfico y otros cálculos útiles como máximos y mínimos se pueden realizar directamente sobre la data.

Macro de inicio:

' Macro recorded 20/06/2016 by Jaime Aravena

' Keyboard Shortcut: Cnt+ i
Sub inicia() ActiveSheet.Range("D4:E32005").ClearContents End Sub

Se emplea al inicio para limpiar el área de escritura de la secuencia de valores.

Macro de lectura:

Sub temper()

' Macro recorded 20/06/2016 by Jaime Aravena Lee desde web esp8266
' Keyboard Shortcut: Ctrl+t Row = 4 ' fila de inicio de los datos leidos Final = ActiveSheet.Range("L2").Value + 4 'numero de datos a leer Retardo = ActiveSheet.Range("L1").Value 'retardo medición(aprox) L: Range("A1").Select 'area donde esta el query On Error Resume Next ' para no trabarse Selection.QueryTable.Refresh BackgroundQuery:=False ActiveSheet.Range("D" & CStr(Row)).Value = Worksheets(1).Range("D1").Value ActiveSheet.Range("E" & CStr(Row)).Value = Worksheets(1).Range("E1").Value newHour = Hour(Now()) newMinute = Minute(Now()) newSecond = Second(Now()) + Retardo waitTime = TimeSerial(newHour, newMinute, newSecond) Application.Wait waitTime 'esperar para continuar Row = Row + 1 If (Row < Final) Then GoTo L: End Sub

Esta macro copia los valores de "D1:E1" en una línea que se va incrementando automáticamente. Puede llamar la atención el uso de la obsoleta estructura con GOTO pero, al parecer los bucles While interactúan con el query pudiendo provocar que se "cuelgue". La cláusula ON ERROR es fundamental pues la conexión entre equipos no está garantizada. En caso de pérdida de conectividad, se repite el valor anterior y es frecuente causa de conflicto, por lo que se recomienda realizar la conexión mediante una LAN dedicada exclusivamente a este fin.

En el gráfico mostrado se ha definido una Trendline que suaviza 30 lecturas. La sensibilidad del sensor es del orden de 1/3 de grado debido a la resolución del ADC.

Downloads

Conclusiones.-

pag.jpg

El principal mérito de la solución propuesta es su simpleza y economía basada en el maravilloso 8266 que además puede leer I2C y SPIO de modo que la gama de sensores posibles es amplia.

El acceder a través de TCP.IP hace que la solución que esta disponible en cualquier parte mediante Internet.

El procesador del nodo es capaz de poner también los datos en la nube como en plot.ly lo que está aún por hacer.

Es posible realizar la lectura casi simultánea de varios 8266 y cada uno de ellos con varios sensores por lo que la capacidad de la solución es enorme.

El que no exista una conexión galvánica entre el sensor y el registrador puede ser una ventaja importante en algunos ambientes así como también el tamaño y consumo pequeño facilita el despliegue en terreno.

Estoy en deuda con varias personas que han hecho aporte a diversos foros, en particular, con la solución dada por RinusW en https://github.com/nodemcu/nodemcu-firmware/issues/730 y también de mis hijos.

Estaré muy agradecido de los comentarios y correcciones que puedan hacer llegar.

Buena suerte y felicitaciones a los diseñadores del 8266.