in

Datalogger: Adquisición de datos con 18F2550

LMP8601: Amperímetro 0-5A (DIY)

Un “datalogger” es un equipo electrónico encargado de obtener mediciones de magnitudes diversas ordenadas en el tiempo. La toma o adquisición de datos puede realizarse desde diversas fuentes de información o sensores. Dichos datos son almacenados en memorias para luego ser estudiados en forma textual o estadística mediante cartas gráficas. Los campos de aplicación de un datalogger son ilimitados en procesos de monitoreo de variables ya sea en el ámbito industrial, doméstico o como simple ensayo de laboratorio a nivel educacional. Si existe una magnitud que experimenta cambios en el tiempo y deseamos estudiar las características de esa variación, necesitamos un registrador y acumulador de datos: un datalogger.

Un sistema de adquisición de datos puede recibir información desde los más diversos tipos de sensores: de temperatura, de humedad, de tensión, de corriente, de peso, de aceleración, de velocidad, de caudal de líquidos, de fuerzas mecánicas, de movimientos y un etcétera interminable. En nuestra aplicación utilizaremos una única información de entrada, un único tipo de datos ya que no estaremos desarrollando un producto comercial o un equipo dedicado a una aplicación específica. Bastará con un ejemplo para que puedas comprender el funcionamiento de este tipo de equipos y luego adaptarlo al uso que tú necesites. Sería inútil construir un sistema cerrado, sin posibilidades de ampliación. Si así fuera, sólo estaríamos mostrándote un desarrollo propio que te sería de muy poca utilidad en el futuro y aquí lo que se trata de lograr es que obtengas el concepto para luego aplicarlo a tus desarrollos y expandirlos hasta donde las necesidades te lo exijan.

Un datalogger comercial puede costar muchos billetes. Anímate y constrúyelo tú mismo.

El instrumento que veremos en este artículo es “un instrumento de campo” capaz de almacenar los valores que adquiera la variable elegida y almacenar en una memoria la mayor cantidad de “muestras” como le sea posible para facilitarnos un posterior estudio y análisis de la evolución de la mencionada variable. En nuestro diseño utilizaremos un medidor de temperaturas que ya hemos visto en otro artículo anterior: el STCN75. Este sensor nos brinda la facilidad de trabajo a la que el bus I2C ya nos tiene acostumbrados y nos ayuda a trazar una línea de diseño a partir de sensores de diversos tipos, todos “colgados” del mismo bus de datos. Si por el contrario decides agregar canales de entradas analógicos, la placa de Microingenia o nuestra entrenadora NeoTeo con su PIC 18F2550 (el corazón de este instrumento) te permitirán trabajar con múltiples convertidores analógico – digitales para monitorear y controlar a lo largo del tiempo variables de naturaleza analógica.

Diagrama en bloques del datalogger de temperatura

En la imagen superior podemos ver el diagrama en bloques de lo que pretende ser un datalogger a partir del hardware inicial que disponemos. En la misma placa en la que se encuentra ubicado el DS1307, si recuerdan, habíamos dejado un espacio reservado a una memoria EEPROM. El DS1307 nos entregará los datos del horario y la fecha en que se produzcan los eventos que deseamos controlar y monitorear, mientras que las variables obtenidas se almacenarán en la memoria EEPROM que el PCB comparte con el RTC. Estos dos dispositivos que se conectan de manera muy sencilla al 18F2550 comparten, además, el mismo bus de datos para conectar el sensor de temperatura que utilizaremos. La memoria que utilizamos en este ejemplo es una EEPROM 24C64 y en ella podemos almacenar hasta 8192 Bytes de información. Obteniendo una muestra de temperatura cada 15 minutos, podremos almacenar cuatro mediciones en una hora. Si grabamos la hora y los minutos del evento, el día, el mes y los grados de temperatura (en números enteros), debemos considerar 6 bytes por medición si además decidimos tener en cuenta las mediciones de temperatura bajo cero (signo negativo, otro byte).

Nuestra conocida placa con el DS1307 y una EEPROM 24C64

Entonces, si en una hora tenemos 4 mediciones, almacenaremos 24 Bytes. En un día serán 576 Bytes, por lo tanto para “llenar” una memoria 24C64 harán falta 14 días de mediciones. Esta cifra es muy buena si deseamos evaluar o estudiar las temperaturas de ámbitos muy específicos como pueden ser incubadoras de aves, viveros cubiertos (invernaderos), habitaciones donde deben conservarse materias primas muy específicas o donde se realicen procesos puntuales, por ejemplo, la sala donde se pone a leudar la masa con que se hará el pan del día. Por supuesto, podríamos agregar otras mediciones de diversas variables como puede ser la humedad, la luz ambiente o la tensión de línea, pero necesitaremos más espacio de memoria por cada medición almacenada y eso reducirá la cantidad de días que podremos acumular muestras para nuestros estudios. De todos modos, existen memorias EEPROM de hasta 1MBit en las cuales dispondremos de hasta 131.072 bytes de capacidad y nos ayudarán a optimizar la relación “cantidad de datos / días de almacenamiento”. Por ejemplo, si utilizáramos esa memoria en nuestro ejemplo, podríamos almacenar datos durante 227,55 días, algo así como 7 meses, realmente una cantidad de días innecesaria para un equipo de entrenamiento y aprendizaje.

El sensor de temperatura STCN75 instalado y conectado al bus I2C

La rutina de funcionamiento del instrumento que hoy nos convoca se sustenta en la combinación de varios de los programas y montajes que ya hemos realizado aquí en NeoTeo. Utilizaremos un display LCD de dos renglones por 16 caracteres donde mostraremos la hora de manera constante, junto a la fecha (día de la semana y fecha del calendario) y, como función adicional, el equipo tendrá un pulsador para visualizar en forma inmediata la temperatura. De todos modos, este es un valor que, de acuerdo al firmware grabado en el 18F2550, aparece en el LCD cada 30 segundos, pero si deseamos verlo en forma inmediata bastará con pulsar el botón de referencia. Vale aclarar que es el mismo pulsador utilizado para ingresar en modo bootloader al insertar el conector USB en el ordenador. Por lo tanto, este botón cumple una doble función. Si en cambio no deseas utilizar el sistema de carga de archivos conocido como “bootloader”, puedes introducir el firmware en el PIC mediante el conector ICSP de la controladora que quieras utilizar para el montaje.

Si no deseas utilizar el sistema de carga "bootloader", puedes programar el PIC mediante el conector ICSP

El protocolo de funcionamiento del firmware es muy sencillo y sigue una continuidad de acciones muy elementales y fáciles de comprender. Luego de inicializar el PIC con las variables y declaraciones habituales (tal como se hace en cualquier lenguaje de programación), leemos el RTC (DS1307) y mostramos la hora. Luego, leemos los datos que nos envía el sensor de temperatura y armamos el código para que pueda verse cada 30 segundos de manera automática o mediante el pulsador utilizado para la carga del firmware (bootloader). Vale aclarar que antes de leer el dato horario, hemos dejado en el código (comentados) los fragmentos necesarios para grabar, corregir o ajustar el DS1307 en aquellos casos que fuese necesario. Más adelante, luego de leer y mostrar la hora, la fecha y la temperatura, procedemos a grabar los datos necesarios en la memoria EEPROM. Para esto, transformamos toda la información en bytes útiles para ser grabados y almacenados dentro de la EEPROM. Este tipo de memorias (las que superan los 16Kbits – 24C16) poseen un sistema de escritura que en BASIC se puede realizar de manera muy sencilla.

El conector USB se utiliza para programar el PIC y para suministrar alimentación al sistema

Se abre el bus de datos, se graba en la memoria la dirección a la que se quiere acceder y luego se graban los datos. Suponiendo que seleccionamos la posición 158 de memoria y cargamos 6 datos, grabaremos en los lugares 158, 159, 160, 161, 162 y 163 los bytes que aparezcan, producto de la lectura y toma de datos. Lo mismo sucederá con la posición 6336 (por mencionar una posición al azar). Grabaremos en las posiciones 6336, 6337, 6338, 6339, 6340 y 6341. Debes observar que al escribir la dirección de memoria donde escribirás / leerás el byte que desees, no debes preocuparte por la paginación. Debes imaginar a la memoria como un registro “lineal” al que debes indicarle la posición y nada más. En realidad, está dividida en 256 páginas de 32 bytes, pero a los efectos prácticos escribes la dirección en forma directa dentro de los dos bytes que le siguen al byte de control (address high byte y address low byte) y accedes a cualquier punto dentro de la estructura de la memoria.

Direccionamiento de la memoria EEPROM 24C64

Para leer este tipo de memoria, no se envía una instrucción de lectura apenas abierto el bus como hacíamos en memorias pequeñas como la 24C02. En este caso, se abre el bus (BSTART), se graba en la memoria la dirección que se quiere leer (BUSOUT), luego se reabre el bus (BRESTART) y allí entonces se envía el comando de lectura habitual (BUSIN). Finalmente se cierra el bus (BSTOP) y los datos se muestran en el LCD. Realizar una lectura luego de la grabación de los datos en la EEPROM es muy importante. No todos realizamos el hardware con los mismos conceptos técnicos. No todos tenemos el mismo criterio al momento de distribuir los componentes sobre un PCB y hasta hay oportunidades en las que el mismo hardware nos define las posiciones de los componentes “secundarios” dentro de una placa. Esto quiere decir que realizando el proceso de lectura luego de la grabación, estaremos verificando que los datos se hayan grabado de manera correcta. Los tiempos entre instrucciones, los retardos luego de los comandos de grabación y las capacidades parásitas dentro del bus I2C nunca se repetirán entre un diseño y otro. Por este motivo, controlar y verificar (imprimiendo en el LCD) el resultado de la grabación nos permitirá ajustar los tiempos y optimizar el código hasta lograr un firmware libre de errores “sorpresivos, imprevistos e inexplicables”.

Fragmento del firmware donde se verifica que los datos grabados en memoria sean correctos

El hardware utilizado es el mismo que usamos en el desarrollo del RTC DS1307, con el agregado del sensor de temperatura al bus I2C. Las conexiones al PIC 18F2550 son las mismas que traemos desde la entrenadora NeoTeo. El LCD en RB2-RB7; el bus I2C en RB0 y RB1; el pulsador para el sistema bootloader en RC0 y el LED en RC1 (estas dos últimas conexiones varían según la entrenadora utilizada); la conexión al bus USB es siempre igual y no admite errores en el 18F2550; y por último la alimentación de 5 Volts con los capacitores electrolíticos y de desacople correspondientes. Es decir, el mismo circuito de siempre. Si no lo recuerdas de memoria, busca hacia atrás en los artículos donde utilizamos este PIC y verás que la estructura es siempre la misma.

Por otro lado, vale aclarar que por ahora al bus USB lo utilizaremos para cargar el firmware mediante el bootloader y para alimentar el equipo. En la próxima entrega desarrollaremos una aplicación para el ordenador con la que podremos extraer la información que se graba en la memoria EEPROM y que además permitirá graficar las curvas estadísticas del comportamiento de los valores almacenados. En esta primera entrega, te dejamos el hardware y el firmware como para que puedas ver funcionar tu datalogger de temperatura. No desesperes, tienes esta semana para armar el hardware, ensayar y poner a punto el firmware, comprender todo el montaje y hasta ampliar el sistema con más sensores. No lo olvides, el próximo sábado descargamos los datos almacenados en la EEPROM y veremos en un gráfico cómo estuvo la temperatura durante estos días. El datalogger ya está en marcha, no te bajes ahora.

Reportar

¿Qué te pareció?

Escrito por Mario

31 Comments

Leave a Reply
  1. Hola estimado amigo Mario,

    Siempre en las revista de electrónica vi el término “datalogger”, pero no tuve mucho interés por este tema ( ahora veo que es muy interesante las aplicaciones o proyectos que se pueden desarrollar ). Como siempre eres muy didáctico. Me gusta revisar, leer ( hacer algún montaje ) sobre temas de electrónica en los ratos libres que tengo tiempo.

    Muchos Saludos Mario.

  2. muf muf dios al fin mil gracias mario necesitaba esto con urgencia queria comprarlo pero como bien lo dijiste cuesta la madre. empezare a construirlo tan pronto mi novia me regrese mi entrenadora.

    gracias mario no cambies

  3. buenisimo! yo tambien estaba viendo de armarme algo asi, pero necesito leer temperaturas en el orden de 0 – 700°C , supongo que voy a necesitar una PT100 o una termocupla, estaría bueno armar un modulo para I2C con alguno de estos sensores.
    Gracias mario saludos!!

    • Hola dds!

      Me alegra que al menos el concepto pueda ser de tu utilidad.
      Cuéntame. ¿Que presición necesitas? De 0 a 700 es un rango muy amplio …. ¿qué necesitas medir? Si se puede contar, claro! :))

      Una vez utilicé una termocupla de las que traen los multímetros económicos (con escala de temperatura hasta 1000°C) sumada a un AO y obtuve buenos resultados. Claro, yo no necesitaba tanta presición. Con +/- 10°C me alcanzaba.

      Saludos dds! Gracias por estar amigo! :))

      • Saludos mario!
        Gracias por tu respuesta!
        Lo que necesito es tener un registro de la temperatura de un calentador solar para un proyecto de investigación , según se la temperatura alcanza (en el mejor de los casos) 650 °C. LA resolución es importante ya que la temperatura al principio y final del dia también es una variable que tenemos en cuenta y como el valor es considerablemente mas bajo, el error de medida no puede ser muy grosero. supongo que una resolución de 1°C es mas que aceptable, aunque de 0.5 °C seria mas interesante 🙂 . La idea es que sea económico y confiable. ( ya que se nos esta disparando el presupuesto a las nubes ) .
        Desde ya Gracias y Saludos amigo Mario!

  4. Wow, simplemente es usted grande, cada semana aparecen mas proyectos muy buenos y yo sin poder armar algunos que me interesan como el cargador de pilas, la estación meteorológica, el receptor multi-banda… entre otros.

    Quisiera hacerle una pregunta con respecto al firmware de la placa entrenadora NeoTeo me gusto y ya que no consigo imprimirla a tamaño real (siempre me queda mas grande) estoy diseñando una parecida pero con doble socalo uno para el 18f2550 y otro para el 18f4550 todo en una misma placa, pero le metí un plus ya que le estoy agregando aparte de los pines de entrada y salida tiene borneras para poder atornillar los cables de la placa ala proto y asi que no se safen de la placa(no me gusta eso) si la mueves, si me queda la placa la subire para que la descarguen, pero con respecto a lo del firmware mi pregunta es:
    yo programo en CCS y se que el botloader neoteo termina en la dirección 1000, la verdad nunca eh trabajado con eso y no se como o que lineas de código poner en ccs para indicarle a mi programa que empiece después de esa dirección, ¿ud podría decirme que lineas de código poner?.

    Con respecto al proyecto de hoy me gusta y quiero a prender a meter datos en memorias eeprom, solo que un profesor en la universidad que es mi tutor de proyecto quiere que maneje memorias SD (con fat 16 o 32) para hacer lo mismo que aquí pero utilizando termopares y grabando los datos directamente en archivos .xls, según que con eso me titulo y ya me corren de la univeridad.

    Y una ultima pregunta, me interesa hacer un circuito con un reloj(DS1307) y dos termómetros stcn75 pero no se como programar las direcciones del bus i2c ya que aunque físicamente a los termómetros les cambio la direcciones a la hora de programarlos no me lee los datos de cada termómetro y aunque trato de leer la hoja de datos de este no le entiendo bien, no se que direcciones poner para que lea los datos de cada termómetro,
    por ejemplo le doy la dirección 3 y 4 a cada sensor y aunque la cambio en el código para que lea a cada sensor, nomas no muestra nada en el lcd y no se como hacerle, podría decirme como seria la dirección en cada caso, solo requiero del numero binario para ponerlo en mi código.

    gracias por todo y esperando como cada semana nuevos tutoriales de electrónica aunque no comento siempre, pero siempre estoy pendiente de ellos.

    Saludos desde México.

    • Mmmmm porque aparezco como invitado y sin mi avatar, por cierto, como puedo hacer para que al leer un stcn75 me muestre temperaturas negativas, siempre se queda en cero, que registros tengo que leer o mover en el sensor para poder hacer eso.

      gracias por todo

      • Hola amigo! Claro que ya hemos cruzado líneas por aquí! Hasta me has dado tu nombre y yo como un bestia no lo recuerdo! Te pido disculpas.

        Bueno … viene extenso el asunto con muchas preguntas. Voy a tratar de ser breve con cada respuesta.

        Primero – Felicitaciones por estar ya próximo a terminar la carrera! :)) Eso es muy bueno! Felicitaciones!!!

        Segundo – Me alegra que estés construyendo una entrenadora SUPERIOR a lo que hemos colocado nosotros aquí como ejemplo. Eso demuestra que eres de las personas que levantan la apuesta, que ván más allá de los límites y que buscan la superación. Felicitaciones nuevamente!!! :))

        Tercero – No programo en CCS, peeeeeeeero, pero, investiga un poco en la página de Microingenia (www.microingenia.com) que tienen la entrenadora que en este artículo utilizamos y el bootloader de ellos está hecho en CCS. Si programas en ese lenguaje es probable que descubras cómo direccionar el vector de inicio a determinadas direcciones. Ellos allí tienen su propio bootloader, su código de ejemplo, etc. Dále una mirada al artículo del sábado pasado y allí encontrarás todo esto que te digo.

        Cuarto – Para manejar tarjetas SD en CCS no hay como Alejandro (Suky). Aquí te dejo la dirección:
        http://www.infopic.comlu.com/joomla/index.php?option=com_content&view=article&id=55&Itemid=84
        No te arrepentirás.

        Quinto – Puedes "colgar" hasta 8 STCN75 en el bus I2C. La dirección Address con la le pides el dato de temperatura es "10010001" para un solo dispositivo. Para el segundo dispositivo es "10010011" y para el tercero es "10010101". Es decir, el primer nibble (1001) es el tipo de dispositivo dentro del bus. Los tres siguientes es la dirección (cuál de los 8) y el último es escritura/lectura. Espero se haya entendido. ¿Al resto de los registros los lees correctamente? Allí debe estar tu problema. Lamento no poder ayudarte en CCS. 🙁

        Creo que es todo, que no olvido nada.

        Saludos amigo! Gracias por acompañarnos siempre ! 🙂

  5. Mario, sera que me puedas ayudar, resulta que tengo un mause entrada ps2 y le quite la entrada ps2 y ponerle usb, me salen 4 cables per.o no se como ponerle la entrada USB

  6. Excelente artículo Mario! espero ansiosamente el próximo para aprender a recuperar los datos con la PC.

    Hal 9000, no es tan sencillo como sacar un conector y poner otro, usan protocolos diferentes por lo que tendrías que hacer un hardware que interprete y convierta los protocolos en ambas salidas.

    PD: te recomiendo comprarte un mouse USB directamente, salvo que quieras experimentar con los protocolos, si tenes tiempo hacelo! se aprende mucho

  7. Ola Buenas estaria interesado en poder adquirir una placa de estas para poder simular y entrenar con varios circuitos que tengo en mente pero quisiera saber como se programa o que programa se usa si pueden contestarme gracias

  8. Podriamos crear un foro para poder hacer preguntas y en este publicar las cosas como siempre y el otro lo usamo para buscar ayuda y demas

    • porque mejor no entras a servysistem.com es una excelente pagina que ayuda en este entretenido camino de la electronica o si quieres puedes entrar a ayudaelectronica.com para los novatos hay comenze yo pero si quieres crear tu propio foro no vendria mal.

  9. Excelente Mario, tus proyectos son muy interesantes, solo que pense que se iba a usar el entrenador que se publico antes y no uno de "Fabrica". En lo personal preferiria que se usaran los dos entrenadores para proximos montajes, aunque se que eso seria mas tiempo para hacer el articulo, bueno…. pero obviando ese punto negro en la pagina blanca, es un muuuuuuuuuuyyyyyyyyyyyyyyyy bueeeeeeeeeeennnnnnnnnnnn articulo, sigue asi :):)

  10. No entiendo por que no salio mi avatar

    Excelente Mario, tus proyectos son muy interesantes, solo que pense que se iba a usar el entrenador que se publico antes y no uno de "Fabrica". En lo personal preferiria que se usaran los dos entrenadores para proximos montajes, aunque se que eso seria mas tiempo para hacer el articulo, bueno…. pero obviando ese punto negro en la pagina blanca, es un muuuuuuuuuuyyyyyyyyyyyyyyyy bueeeeeeeeeeennnnnnnnnnnn articulo, sigue asi :):)

  11. Hola una pregunta un data readers se podria tomar como un dataloggers ya que yo trabajo en obtener informacion a los termokines o equipos refrigerados y la verdad es que necesito mas informacion sobre los dataloggers.

    Slds….

  12. Hola, he estado montando el datalogger y en el momento que conecto el puerto usb me pide un driver… dice: PIC 18 USB CDC. Que puedo hacer para que el proyecto me funcione? crei que no necesitaba driver y que funcionaba como una interfaz humana… que puedo hacer… gracias!!!… uagav@yahoo.es

  13. hola amigo, oye, te pasaste con información, me sirvio mucho…pero keria hacerte una consulta, yo soy nuevo en esto, y me interesa mucho. Lo que sucede es q estoy haciendo un sistema de adquisicion de datos y me pasaron un data logger el cual tiene 4 entradas analogas, debo registrar temperatura, humedad y luminosidad, pero yo debo hacer el programa en visula basic 6, es ahí donde viene mi problema…este data logger (PCS10 / K8047 de Velleman), trae un programa, pero este es es complejo para entender, y me piden realizar un programa mucho mas sencillo, lo bueno, es q este data logger viene con un dll el cual yo puedo hacer esta comunicacion con el PC sin problemas, pero no sé hacerlo en Visual basic 6. Primero tengo q hacer que se comuniquen, y luego hacer que aparezcan los datos q va registando por un determinado tiempo…¿Me podrías hechar una mano con esto por favor maestro?

    Saludos y Gracias de ante mano.

  14. Hola, soy nuevo por estos avatares y estoy como muchacho en juguetería, no sé que leer ni que escoger como proyecto, lo que si estoy claro es en darle a Mario mis felicitaciones y agradecimiento, compartir sus amplios conocimientos y de la mejor forma es verdaderamente loable, FELICITACIONES, Dios te lo premiará. Paso a comentar que en alguna parte leí que abordarías el tema de desarrollo de una aplicación para la PC y poder leer los datos almacenados en los proyectos realizados, quiero realizar un proyecto de domótica y necesito desarrollar la aplicación para la PC en VB, Mario esperaré tu articulo al respecto, suerte y sigue así, somos muchos los que te seguimos y agradecemos la aparición de tus artículos y de tus compañeros, saludos

  15. Muy interesante!! Felicitaciones! Tengo en mente diseñar algo similar y me viene muy bien ver proyectos como este. Muchas gracias.

  16. AMIGO MARIO ud es un maestro q digo maestro un santo de la electronica hace dos dias me dijeron quiero un proyecto q tome datos de cuantas veces se enciende un motor electrico con fecha y hora bueno ya se que se llama datalogger el disposivo. ahora tengo q hacerlo.. gracias por tan magnifico aporte

Responder a aspire Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Mouseless: Un ratón invisible (MIT)

Proyectos de energía solar