Microcontroladores: Termómetro I2C

3 Flares Twitter 0 Facebook 1 Google+ 2 Pin It Share 0 Email -- 3 Flares ×

El circuito integrado STCN75 posee un sensor de temperatura de tecnología CMOS de alta precisión, e incorpora en su interior un convertidor que transforma la temperatura leída en una información digital compatible con el estándar I2C. Con una resolución de 0,5°C y una exactitud de +/- 2°C, en el rango de -25° a 100°C, se convierte en un interesante dispositivo a ensayar. De la mano de Protón+, retomemos los proyectos prácticos con microcontroladores. Anímate, entra y descubre lo sencillo que es construir un instrumento de suma utilidad en cualquier ámbito.

A partir de un simple reloj que permite controlar y medir el tiempo, el hombre siempre se ha interesado por cuantificar las magnitudes de los fenómenos climáticos que lo rodean: medir la temperatura, la humedad, la radiación UV, la presión atmosférica y todo aquello que tenga que ver con mediciones básicas que, combinadas de forma apropiada entre sí, dan el sustento informativo a la meteorología.

El objetivo propuesto
El diseño que hoy te presentamos consta de un termómetro digital capaz de ser conectado a través de una sencilla línea bifilar (como puede ser un par telefónico) a distancias superiores a un kilómetro. Dicho diseño te permite supervisar temperaturas remotas y activar sistemas calefactores o refrigerantes en función de la conveniencia, sin la necesidad de presencia física en el lugar y a través de una aplicación en el ordenador.

Microcontroladores: Termómetro I2C

El sensor elegido
Los medidores de temperatura más elementales se basan en sistemas que utilizan resistencias especiales que varían con la temperatura (NTC o PTC). También es común el uso de diodos discretos y adecuadamente polarizados que aprovechan la linealidad de alguna de sus propiedades para transformar una circulación de corriente en una referencia de temperatura a la que es expuesto el encapsulado de dicho diodo. Avanzando un poco más en la complejidad de los sensores empleados en la medición, nos encontramos con los clásicos y altamente utilizados LM35 y LM335 que proveen a los microcontroladores de tensiones analógicas equivalentes a la temperatura que se está analizando.

Todos los sistemas mencionados hasta aquí poseen un problema que suele ser muy difícil de controlar: la estabilidad y precisión de la tensión de alimentación a los mencionados circuitos analógicos. Cualquier variación en el suministro energético puede significar errores de varios grados en la lectura del instrumento, o puede devolver en la presentación de la información drásticas variaciones que impiden una lectura apropiada de la magnitud que se quiere obtener.

Microcontroladores: Termómetro I2C

Para aliviarte de todos los problemas que causarían el diseño y la construcción de complejos sistemas estabilizados y compensados, hemos decidido ayudarte a construir el termómetro de esta nota con un circuito integrado puramente digital. De esta forma, se evitan circuitos analógicos que puedan inducir errores en la medición. A través de la conexión SDA y SCL de un bus I2C hacia el microcontrolador, y al entregar la información útil en una palabra de 16 bits (es decir, de manera digital), este sencillo dispositivo te resuelve los problemas de ruidos, las variaciones de alimentación, y te permite manejar programaciones más complejas con sólo ajustar apropiadamente los registros internos del STCN75.

Microcontroladores: Termómetro I2C

La configuración de cada uno de estos registros te permitirá utilizar el circuito integrado como un termostato común. Además, podrás programar alarmas de temperatura y pasar a modo de bajo consumo cuando no se requiera de su utilización. También podrás programar una “ventana” de temperaturas de utilización en la que, por debajo de la mínima o por encima de la máxima programada, se active la salida OS/INT energizando una alarma o sistema de aviso. En el datasheet del STCN75 se explica de manera clara la programación de cada registro para obtener el funcionamiento que deseas. No dejes de leerlo para entender claramente lo que aquí está desarrollado.

En el instante de inicialización o power-up del dispositivo, las condiciones del dispositivo te permiten leer la temperatura sin necesidad de escribir previamente ningún registro, situación que facilita de manera enorme la programación del microcontrolador a utilizar. Sólo debes leer la dirección número cero de los registros, que es donde se almacena la palabra de 16 bits que equivale a la temperatura, y luego debes presentarla en el display LCD que decidas agregar al microcontrolador. Es decir, al dar la instrucción de leer el bus I2C, apuntarás a la dirección 0 de los registros del sensor para leer la información allí almacenada. Una y otra vez, el sistema continuará leyendo cíclicamente la temperatura del ámbito donde esté instalado el STCN75. En cuanto a las dimensiones y al package, puedes apreciar que el encapsulado SO8 es una buena opción para aplicaciones en placas pequeñas. Tú sabes soldar SMD, ya lo hemos aprendido también aquí.

Microcontroladores: Termómetro I2C

El Microcontrolador
El dispositivo seleccionado es el PIC 16F628A del que ya se ha hablado bastante en la revista. Aquí encontrarás un entrenador, y hasta un quemador (nombre popular con el que se conoce a un hardware programador), para poder continuar las prácticas con él cuando decidas avanzar hacia otros desarrollos. Particularmente en mi caso utilizo un GTP-USB+ (me ha funcionado siempre de maravillas) pero tú podrás utilizar sin inconvenientes el dispositivo mencionado anteriormente para dar tus primeros pasos en este apasionante mundo.

El circuito inicial
En el circuito se observa (en la parte más destacada) la conexión del 16F628A al LCD. Luego puedes encontrar más abajo el relé que utilizarás para programar un encendido y apagado de algún sistema de calefacción (o refrigeración). También ubicarás la conexión del sensor de temperatura y la aplicación de resistores pull-up a ambas señales del bus I2C. Y arriba del microcontrolador, encontrarás el cristal externo de 20Mhz que brindará la referencia de clock al sistema.
Podríamos haber utilizado cómodamente el oscilador interno que posee el 16F628A, que es de 4Mhz, pero como en futuras ediciones queremos que utilices este mismo circuito en una conexión RS485 a 34800 bps, necesitarás para ello un cristal de alta frecuencia. Por otra parte, el software que utilices para realizar el programa que hará funcionar al PIC sólo admite, en su versión gratuita, cristales de 4 o 20 Mhz.

Microcontroladores: Termómetro I2C

A la izquierda, ingresando por el pin 4, puedes ver el arreglo de componentes que permite obtener el RESET del microcontrolador, al inicializar su conexión. Allí puedes agregar, si deseas, un pulsador a GND (desde el pin 4) para permitir un reset sin necesidad de desconexión del sistema. Luego, a la izquierda, encontrarás el conector ICSP (In Circuit Serial Programer), a través de cual puedes programar el microcontrolador PIC una y otra vez sin necesidad de retirarlo de la placa donde lo hayas instalado, práctica que te recomendamos para ahorrar tiempo y la integridad física de los microcontroladores y zócalos que utilices en tus diseños. Estos últimos se deterioran muy fácilmente al colocar y quitar reiteradamente el IC. Por último se encuentra la fuente de 5 Volts, que también has aprendido a construir gracias a la revista. Notarás que el transformador es de 2 X 7,5 Volts para asegurar un funcionamiento del regulador 7805 en baja temperatura. Recuerda que el backlight del LCD se conecta a los 5 Volts de alimentación, al igual que un LED, pero en este caso lo hace a través de una resistencia de 47 Ohms (no figura en el circuito).

El firmware dentro del microcontrolador PIC
Rara vez se encontrarán dos personas que opinen lo mismo acerca de cuál es el mejor software para realizar el programa que correrá dentro del microcontrolador PIC. Muchos dirán MPLAB, otros se inclinarán por el C, y otros optarán por el BASIC. Los tres son correctos. Mientras el programa deseado y cargado dentro del microcontrolador PIC cumpla la misión imaginada por el desarrollador, da lo mismo que haya sido escrito en cualquier programa. Funciona y posee todas las prestaciones imaginadas: eso es lo que verdaderamente vale.

Microcontroladores: Termómetro I2C

El programa que utilizaremos es el Protón+ en su versión LITE, el cual posee ciertas limitaciones de uso en su versión de demostración, que tú puedes ver en el sitio de descarga del mismo. Queremos contarte que estamos trabajando duro para conseguir la versión completa del programa y poder comenzar cuanto antes a desarrollar trabajos con conectividad USB que posean interfaces al ordenador donde podamos desplegar instrumental, dataloggers, y todo lo que tenga que ver con la interacción entre el diseño y el ordenador. Afortunadamente, para este proyecto inicial, nuestro programa (firmware) alcanzará y no tendrá problemas de ser compilado y preparado para ser introducido en el microcontrolador PIC. Podremos crear sin inconvenientes el archivo .HEX que se requiere gracias a Protón+ LITE. Pero si aspiramos a lograr conectividad USB (nuestro objetivo) necesitaremos obligatoriamente la versión completa del programa. ¿Ustedes qué opinan?

¿Cómo se arma un programa para cargar dentro del PIC?
Protón+ posee una facilidad de uso admirable para todo el que se inicia y comienza a transitar el mundo de los microcontroladores. Pero como todo lenguaje de programación, requiere de un armado estructurado en la secuencia de las líneas del programa para que pueda ser interpretado y compilado correctamente.
Lo primero que deberás determinar dentro del listado del programa es el dispositivo a utilizar y la frecuencia del cristal que usará tu diseño.

Microcontroladores: Termómetro I2C

Observa que todo lo que se inicie con un apóstrofo será considerado por el programa como un comentario y no será tenido en cuenta al momento de compilar el archivo, ni al contabilizar las líneas permitidas por la versión LITE de Protón+. Es decir, a pesar de haber llegado a la línea 11, el programa sólo contabilizará dos líneas.

Una vez elegido el modelo permitido del microcontrolador y el valor de frecuencia del cristal (20 Mhz), puedes seguir planteándole al programa los parámetros de definición de los periféricos que vas a utilizar en torno al microcontrolador. Luego viene la configuración del registro que maneja los comparadores internos mediante el nombre CMCON; se le adjudica a éste el valor que indica el datasheet para su desconexión. En la siguiente línea, debes aclarar que trabajarás en modo totalmente digital ALL_DIGITAL = TRUE. Inmediatamente después definirás la conexión del LCD donde DTPIN te indica a qué pin del microcontrolador irá conectado el Terminal DT del LCD, y lo mismo para los terminales RS y EN. Por último, en la definición del LCD encontrarás la línea que indica que usarás la conexión de 4 bits (INTERFACE), la cantidad de renglones que utilizará el LCD (LINES) y el tipo de display a utilizar, adjudicando un 0 para alfanuméricos y un 1 para gráficos.

Microcontroladores: Termómetro I2C

El próximo paso es indicarle al microcontrolador los pines que utilizarás como SDA y SCL (las líneas que forman el bus I2C). Inmediatamente después adjudicarás a la etiqueta (label) “LEER” el valor que deberá “llamar” al STCN75. El número cargado en esta etiqueta le indicará que es a él a quien el microcontrolador está llamando dentro del bus. Esto se realiza de esta manera ya que pueden existir otros dispositivos I2C conectados al mismo bus. Recordemos que este protocolo admite muchos dispositivos conectados en paralelo, que pueden comunicarse con el microcontrolador cuando éste lo desee. En el caso del STCN75, la dirección viene dada por el numero binario %10010001. Dicho de otro modo, el microcontrolador le dirá al dispositivo seleccionado “a ti te estoy llamando”. Esta acción de cargar la dirección en la etiqueta LEER la realiza la instrucción SYMBOL.

Por último, y antes de empezar a definir el trabajo del microcontrolador, le indicarás al sistema los nombres y los tamaños de las variables donde el firmware irá cargando sus datos en la medida en que los necesite, solicite y utilice. Por supuesto que todo esto está explicado en el HELP del programa. Un ejemplo es la variable WORD que puede desdoblarse en dos variables BYTE (LOW y HIGH), a las que reasignaremos nuevos nombres para su manipulación dentro del firmware.
Es común dar un pequeño retardo (DELAYMS) de 100 milisegundos para estabilizar el funcionamiento del sistema; luego debes iniciar el trabajo con la pantalla limpia (CLS). El paso siguiente será cargar con valores específicos algunas variables para asegurar un inicio válido y no al azar.

El bucle principal del firmware
Aquí dentro se desarrolla la acción: el trabajo de interacción entre el microcontrolador y el mundo exterior, en este caso, a través del sensor de temperatura y el relé RL1.

Microcontroladores: Termómetro I2C

En la etiqueta INICIO comienza el lazo principal del programa que te permitirá leer la temperatura ambiente. Según los datos que hayas programado de mínima y máxima, harás actuar o desactivarás el relé RL 1 que, en este caso en particular, conecta un sistema de calefacción. El primer paso es “abrir” el bus mediante la instrucción BSTART. Luego, mediante la instrucción BUSIN, debes iniciar la comunicación con el dispositivo I2C que se encuentre en la dirección LEER (que en este caso es el sensor de temperatura) y debes indicarle que lo que exista en el registro 0 lo cargue dentro de la variable B, mediante la instrucción BUSIN LEER, 0, [B]. Una vez que esto sucedió, el microcontrolador cerrará el contacto I2C con la instrucción BSTOP.

Más atrás en el texto, cuando se designaron las variables a utilizar, adjudicaste el nombre B a una variable WORD, es decir, a una variable que se puede considerar “doble BYTE”, a la que ahora Protón+ ha dividido en C = B.HIGHBYTE y D = B.LOWBYTE. Las características de los valores obtenidos de esta separación están claramente explicados en el datasheet del STCN75 y en los comentarios del listado del programa, aunque pueden resumirse de la siguiente manera: lo cargado en la variable C determina el valor de la temperatura en números enteros (positivos o negativos, según el número obtenido), mientras que lo almacenado en la variable D indica si la medición es en grados enteros o con 5 décimas por encima, tal como es la resolución del sensor.

Las siguientes instrucciones imprimen en el LCD los valores obtenidos: en el primer renglón puedes colocar la palabra TEMPERATURA, tratando de centrarla en la pantalla, mientras que en el segundo renglón, luego de dejar cinco espacios, escribirás la variable A, que a temperaturas sobre cero es un carácter vacío. Si la temperatura leída está debajo de los cero grados centígrados aparecerá un signo menos. Inmediatamente después llega el valor de C expresado en numeración decimal y que equivale, como dijimos antes, al valor entero del número a mostrar. A este número le sigue la coma y termina el número con F representando al decimal del valor mostrado. 158 es el símbolo “°”, en código ASCII. Termina la línea con la inclusión de la letra C para expresar el resultado en grados centígrados.

La última parte del programa incluye las comparativas de los valores obtenidos con números constantes que sirven de referencia para activar o desactivar el relé. Puedes ver claramente que la expresión indica que si C es menor a 20, se debe activar el relé poniendo la salida correspondiente en un estado lógico alto, y que si es mayor a 26 se debe colocar en estado bajo. Esto genera una ventana lógica que indica que si la temperatura desciende de los 20 grados se encenderá la calefacción, mientras que si supera los 26 grados el sistema ordenará su apagado.
Con los arreglos que ya estarás analizando, también puedes cambiar los valores de programación para encender el aire acondicionado del coche o del dormitorio, y hasta tal vez, para mantener estable la temperatura de tu terrario activando un calefactor que mantenga siempre estable la temperatura ambiente. 
Por último el programa finaliza en la instrucción END.

Microcontroladores: Termómetro I2C

Conclusiones finales
Por supuesto que no incluimos aquí el listado del programa, a pesar de ser pequeño, pero sí te dejamos las imágenes para que tú lo escribas y, de esta forma, analices lo que haces y por qué lo haces para captar mejor el conocimiento. Nada de “copy-paste”. Nos despedimos diciéndote que en la próxima entrega agregaremos a este diseño la posibilidad de conectarse a un bus RS485 que te permitirá trabajar al termómetro en forma remota para seguir la evolución del funcionamiento a cientos de metros, a través de tu ordenador.

En el mercado encontrarás mucha variedad de circuitos integrados que funcionan como termómetros vía bus I2C y que tal vez sean de mayor exactitud al utilizado en este artículo. Un ejemplo claro es el LM92, de National Semiconductor. La implementación del STCN75 ha sido a modo de ejemplo y para orientarte sobre algunas de las posibilidades y facilidades de uso que brinda el protocolo I2C en los microcontroladores.

Microcontroladores: Termómetro I2C

Trabajo de los Lectores: Aquí pueden ver el trabajo desarrollado por el lector y amigo Yesbond, que generosamente ha realizado un video donde nos muestra su trabajo con un sensor de temperatura TMP100. Este sensor también trabaja por bus I2C como el STCN75 empleado en el artículo. ¡Felicitaciones Yesbond!GRACIAS por mostrarnos tu trabajo!


Avatar de Mario
Autor: Mario
  • Ciul

    Excelente nota, te sobraste la verdad.
    Aunque prefiero programar en assembler, en el mismisimo MPlab, es más eficiente; aunque si no tienes idea y no quieres darte dolores de cabeza mientras aprendes pues programar en PIC-C o programas parecidos pues se vale.

    Anteriormente en la universidad tocó hacer el sensado de la velocidad de un motor y visualización en la PC (usamos Visual C para ello), pero fue con RS-232, ¿podrías explicar la diferencia con el RS-485 que mencionas aquí?

    Gracias

    Y felicitaciones por excelente página a todo el grupo de NeoTeo

    • Mario Sacco

      Hola Ciul !

      Las diferencias entre RS232 y RS485 son muchas y hasta te puedo decir que no se asemejan en absoluto. Estamos preparando un artículo sobre RS485 que seguramente te ayudará a despejar muchas dudas. Tal vez esta misma semana salga publicado. No dejes de estar atento.

      Saludos Cordiales

  • Mana

    si supiera algo mas del tema… podria atreverme a ensamblar uno. Me encanta todo esto, sobre todo lo de la comparativa de domensiones con una moneda de cincuenta centavos jajaja que grande!

    saludos!

    • Mario Sacco

      Hola Mana !

      Es cuestión de tiempo, paciencia y ganas. Si tienes esas tres cosas, tarde o temprano podrás lograrlo. En NeoTeo hay artículos desde lo más básico (como Aprender a Soldar) hasta realizaciones de mucha complejidad. Utiliza el buscador de la página (arriba a la derecha) y empieza desde lo que creas convenientes.
      Si no encuentras lo que buscas, pregunta.
      Ánimo ! Nadie nace sabiendo.

      Saludos Cordiales.

  • HAVOCK

    Muy bueno, No tendran una nota de como hacer una Bomba nuclera con 1 gramo de Mercurio? 8D….

  • dds

    Muy interesante, adoro estos tutoriales, pero quisiera saber un par de cosas :
    1_ Que temperatura soporta el IC
    2_ cual es el precio del IC y del circuito en general (en pesos argentinos si es posible )

    • Mario Sacco

      Hola dds !

      1 _ En el Datasheet (está el enlace al mismo en el texto) dice que mide entre -55° y +125°C
      2 _ Al precio del IC en el mercado local (Argentina) no lo sé. Pedí samples (muestras gratis) a ST y me las mandaron sin cargo. El resto del circuito es muy variable de acuerdo a donde quieras y puedas comprar, pero lo más caro es el display LCD que puede salir $30. El resto es más barato. El PIC puede salir hoy unos $15, un relé $5, el cristal $3 … en fin, entre todo tal vez no llegues a gastar $50 (pesos argentinos).

      Saludos !

      • gianko

        #9 Mario, te referiste a pedirlos en ST, al momento de poner la shipping address, me piden un codigo "CNPJ" que es o que deberia poner?? muchas gracias.

  • Kniffe

    Hace tiempo que no encuentro un sensor o algo parecido para medir saturacion de Monoxido de carbono o algo similar, como para saber si hay algun escape de gas en la casa.

    • Mario Sacco

      Hola Kniffe !

      No sé donde estarás (país) pero si eres de Argentina puedes fijarte en esta web : http://www.controlinteligente.com.ar , que entre sus productos ofrecen sensores de CO y CO2.

      Saludos !

  • Truko

    Cada quien tiene su lenguaje de programacion en la hora de usar, PIC a mi me enseñaron en la universidad el ensamblador mediante MPLAB.
    PERO prefiero el PIC-C de ccs, sobre el articulo es muy bueno yo creía que I²C era solo entre PIC pero ya aprendí algo muy interesante hoy gracias señor editor ^_^

    • Mario Sacco

      Hola Truko !
      Gracias por estar siempre.

      I2C fué creado por Philips y hay mucha info interesante en la web acerca de este protocolo de comunicación. Se utiliza en infinidad de aplicaciones. Así como hoy trajimos un termómetro, más adelante veremos circuito de audio manejados por este bus. (Volumen, tono, etc.)

      Saludos Cordiales !

  • Dows

    Hola!

    Excelente como siempre.

    A todo esto se me plantea una pregunta… cómo se cortan las placas de cobre para hacer el circuito integrado? Porque si se hace con sierra y tal debe hacer mucho polvillo y ese polvillo no debe ser muy bueno para los pulmones no?

  • dds

    no te hagas problema por el polvillo es inofensivo :P , la mejor forma de hacerlo es marcar donde quieres cortar y con una regla pasar un cutter por ambos lados del pcb (a la misma altura por supuesto) luego lo alineas con un borde y haces presión para quebrarlo.
    queda perfecto saludos!

  • Yesbond

    Buen Dia Mario:
    Exclente el articulo, aparte de la gran cantidad de aplicaciones que puede tener este proyecto, sino porque muestras avances que en ocasiones son dificiles de saber; soy de colombia, y aca todavia usamos el pic16f84A, pero con este articulos nos das a conocer nuevas cosas, ademas del programador Proton+, que es un hit, la verdad veo que el codigo es muy sencillo, yo habia hecho un proyecto igual, pero el programa en asembler lo hice en MPlab pero es muy complicado y extenso y cualquier error es dificil de encontrar, asi que te agradezco mucho por estos articulos tan buenos, y pues estoy ansioso del proyecto de comunicacion 485 y de muchos mas proyectos.
    Un saludo y felicitaciones.

    • Mario Sacco

      Gracias por los comentarios Yesbond !

      En pocos días comienzan a salir más proyectos, incluyendo el de la red RS485.
      En NeoTeo estamos trabajando duro para brindar toda la ayuda que esté a nuestro alcance. No dejes de visitarnos.

      Saludos Cordiales !

  • ELECTRON

    HOLA ALGUIEN PUEDE AYUDARME A PROGRAMAR PIC EN BASIC

  • Cristian

    Muy buen articulo aca aprendo de todo grasias.
    Tengo una pregunta fuera del tema ¿NEOTEO de que pais es?

    • fonfonete

      Me parece que es de España, al menos por las nota de Telefonica y la ministra de cultura española, y suponiendo un poco por el acento que se nota al ver los videos de aprende a soldar, o al menos eso creo, no te fies del oido, y tampoco importa lo que si importa es que esta en español y es de calidad.

  • Cristian

    eso me dije la primera vez que visite este maravilloso sitio, y si deve ser de España por los acentos que utilizan en los textos, el del video no lo noto tanto.

    • godois

      hola… alguien me puede ajudar, tengo que hacer una programacion de reloj microcontrolado com alarma para activar un motor. ejemplo: activar a las 10:00 desactivar a las 12: 00 hs
      agradesco…. si me ajudan….

  • cuantica

    hola y felises fiestas
    si me podrian ayudar para hacer un termometro de baja temperaturas de 70k

  • mario

    hola , yo uso proton y es muy potente, pero en este ejemplo ocupas el 16f628a pero por los archivos que tiene proton no esta el 628a como bootloader si lo tienes tu lo podrias pasar
    mariogrene@hotmail.com

  • Diseno web

    Muy buen artículo.

    Mantegan ese excelente trabajo!

  • Diseno web

    Estos son los artículos más completos que encuentro aquí

  • menx

    ke ta Mario.
    Me encanto este proyecto y la verdad es ke casi tengo todo para armarlo, solo que me es imposible adquirir el sensor STCN75, pues ya lo busque por todos lados y nada de nada, me encantaria ke existiece un sensor similar, yo cuento con lm35 y DS18B20 de Dallas el cual te otorga una salida digital, kisiera saber si me podrias ayudar?

    Excelente pagina, y lo mejor de todo son estos tutoriales.
    Saludos desde Mexico.

  • Alberto

    Hola, donde se consigue el sensor aqui en Buenos Aires, Argentina?
    Gracias

  • roberto carlos

    Una pagina interesante y muy bien explicada, espero que puedan crecer mas y conseguir el programa completo, yo estoy empezando con todo esto y particularmente me cuesta mucho pasar de ensamblador a c, pero sigo intentando, este articulo estuvo muy completo, gracias.