Está en la página 1de 72

Universidad Autónoma de Baja California

Facultad de Ingeniería

SERVICIO PROFESIONAL UNIVERSITARIO


Nombre:
Castañón Castañeda Gustavo Alejandro
Matricula:
1155830
Semestre:
Noveno
Trabajo:

Proyecto del servicio profesional:


Elaboración de programa de acondicionamiento de sensor resistivo
Profesor:
Herrera García Rigoberto
INTRODUCCIÓN
Vamos a explicar qué es exactamente el proyecto Arduino, así como las principales
características que lo definen, Proteus como acondicionar un sensor resistivo, los
comandos de Arduino y sus librerías. Primero empecemos por el Arduino trata de uno de
los tipos de las placas más populares del mundo maker, pero que a diferencia de la
Raspberry Pi no cuenta con un único modelo, sino que ofrece unas bases de hardware
abierto para que otros fabricantes puedan crear sus propias placas.
¿Qué es?
Arduino es una plataforma de creación de electrónica de código abierto, la cual está
basada en hardware y software libre, flexible y fácil de utilizar para los creadores y
desarrolladores. Esta plataforma permite crear diferentes tipos de microordenadores de
una sola placa a los que la comunidad de creadores puede darles diferentes tipos de uso.
¿Como funciona?
El Arduino es una placa basada en un microcontrolador ATMEL. Los microcontroladores
son circuitos integrados en los que se pueden grabar instrucciones, las cuales las escribes
con el lenguaje de programación que puedes utilizar en el entorno Arduino IDE. Estas
instrucciones permiten crear programas que interactúan con los circuitos de la placa.
El microcontrolador de Arduino posee lo que se llama una interfaz de entrada, que es una
conexión en la que podemos conectar en la placa diferentes tipos de periféricos. La
información de estos periféricos que conectes se trasladará al microcontrolador, el cual
se encargará de procesar los datos que le lleguen a través de ellos.
El tipo de periféricos que puedas utilizar para enviar datos al microcontrolador depende
en gran medida de qué uso le estés pensando dar. Pueden ser cámaras para obtener
imágenes, teclados para introducir datos, o diferentes tipos de sensores.
También cuenta con una interfaz de salida, que es la que se encarga de llevar la
información que se ha procesado en el Arduino a otros periféricos. Estos periféricos
pueden ser pantallas o altavoces en los que reproducir los datos procesados, pero también
pueden ser otras placas o controladores.
Tipos de Arduino

Características
1. El Microcontrolador: Es la parte que procesa toda la información, es donde se
graba el código, en el software de Arduino se conoce como “Sketch”. Los
Microcontroladores que usa Arduino son económicos lo que abarata el costo de la

Tarjeta en general.
2. Pines analógicos: Estos pueden detectar señales análogas como por ejemplo la
Luz o la Temperatura, estos sensores poseen un segmento de voltaje de
funcionamiento desde cero (0) a Cinco (5) Voltios. A través de estos se pueden
medir cosas del mundo real como por ejemplo Temperatura. Si el Pin de lectura
analógica tiene una resolución de ocho (8) bits, te va permitir dividir los cinco (5)
voltios en 256 segmentos, es decir la Temperatura máxima del sensor equivale a

256 y la mínima a cero (0).


3. Pines de Poder o de Salidas: A través de estos se pueden alimentar componentes
que requiera de poca alimentación como 3, 3 o 5 voltios.

4. Pines Digitales: Estos detectan si hay un Cero (09 o un Uno (1) lógico. Se utilizan
para pulsaciones de botones o dispositivos que mandan o reciben información
digital.

Los Pines que contiene una línea ondulada (como en la Ñ) soportan PWM (Power
o Pulse-Width Modulation – Modulación por ancho de Pulso), usado para el
control de intensidad, por ejemplo, de luz.
5. Puerto o conector USB: Este nos permite conectar nuestra Arduino a la PC,
cargar nuestro código y alimentar la tarjeta.
6. Control de USB: Este circuito integrado es el moderador entre el
Microcontrolador y el software o C, es decir, se encarga de convertir la
información del Microcontrolador hacia la información que va a tu computadora.

7. Alimentación: Nos permite alimentar nuestra tarjeta con voltaje de Corriente


Continua de Siete (7) a Doce (12) voltios.

8. Regulador de Voltaje: Permite una salida estable de Cinco (5) voltios


independientemente del voltaje de entrada.

9. 9) Cristal: Da el Ciclo reloj, le marca el pulso o tiempo de trabajo al


Microcontrolador para que este trabaje perfectamente.

10. Botón y Pin de Reinicio: El botón de reinicio está directamente conectado al Pin
número uno (1) del Microcontrolador conocido como “Clear” ó “Master Clear”,
este necesita de sus cinco (5) voltios para hacer correr el programa, al presionar
el botón interrumpe el voltaje a cero (09 voltios y detiene el programa que el
Arduino está ejecutando y vuelve a ejecutar el programa desde su inicio.

El pin de reinicio o Reset permite hacer lo mismo que el botón pero a través de
un circuito individual.
11. GND, Pin Cero Voltios o Tierra: Es la contraparte del positivo (5 voltios), es lo
que permite cerrar el círculo de alimentación

12. Voltaje de entrada Comparador: No es un voltaje de alimentación a la tarjeta,


es una entrada analógica que utiliza para comparar la salida entre positivo y
negativos devolviendo un Cero o un Uno.

13. El LED: El LED está conectado directamente al Pin 13 y contiene su respectiva


resistencia, cada vez que el Pin 13 recibe un Uno (1) lógico ese LED se
enciende.

14. Recepción (RX) y Transmisión (TX) Serial: Esta transmisión se da a


través de los Pines Cero (0) y Uno (1).

15. Referencia Análoga: Trabaja paralelamente con el Comparador (punto


12).

Proteus
Proteus
Proteus VSM es un sistema de diseño electrónico basado en la simulación analógica,
digital o mixta de circuitos, que brinda la posibilidad de interacción con muchos de los
elementos que integran el circuito. Incluye componentes animados para la visualización
de su comportamiento en tiempo real, además de un completo sistema de generación y
análisis de señales. También cuenta con un módulo para el diseño de circuitos impresos.
Las siglas VSM significan Virtual System Modelling, que en español podemos traducir
como sistema de modelado virtual, ya que Proteus VSM permite modelar de forma virtual
en la computadora prácticamente cualquier circuito. La característica principal que hace
de Proteus VSM uno de los simuladores preferidos por muchos aficionados y
profesionales de la electrónica es la posibilidad de simular circuitos que incluyen
microprocesadores o microcontroladores. Aunque el nombre completo del programa es
Proteus VSM, a partir de ahora nos referiremos a él solo como Proteus, para mayor
facilidad.
El programa cuenta con dos partes o componentes principales. Uno de ellos es el módulo
ISIS, que es donde vamos a dibujar los diagramas de los circuitos electrónicos y, también,
desde donde efectuaremos las simulaciones. Si es la primera vez que abrimos el módulo
ISIS, después de instalar Proteus en el sistema, es posible que aparezca una ventana
llamada View Sample Designs, que nos preguntará si queremos ver los diseños de
ejemplo que se instalan junto con el programa.
Además del módulo ISIS, Proteus cuenta con otro módulo, denominado ARES, que es
donde se diseñan las placas de circuito impreso (PCB) utilizadas para el posterior armado
de los circuitos. En relación a este tema, otra característica muy interesante de este
programa es la posibilidad de importar un circuito dibujado en ISIS directamente al
módulo ARES. De esta manera, podremos diseñar fácil y rápidamente un circuito impreso
para él.

Hay que recordar que dentro del Proteus tenemos la opción de realizar un PCB layout o
solamente hacer el diseño virtual para nuestro caso de desarrollo del proyecto del
servicio profesional solamente utilizaremos ISIS, en caso dado que quisiera aplicarse en
la vida real y probar su funcionamiento si será necesario activar la casilla de PCB layout
o mejor dicho ARES.
La interfaz de ISIS
En principio, el módulo ISIS es un espacio para dibujar los diagramas de nuestros
circuitos. Al abrir Proteus desde el icono ISIS, veremos la pantalla que se explica en la
siguiente Guía visual
La hoja de trabajo
En la ventana de edición tenemos dos elementos principales: la hoja de trabajo y la rejilla.
La hoja de trabajo está delimitada por el cuadro de color azul. Cuando accedemos a ISIS
desde su icono, es decir, sin abrir ningún circuito, por defecto la ventana de edición está
vacía, y el tamaño de la hoja de trabajo es de 10 por 7 pulgadas. Si necesitamos cambiar
el tamaño de la hoja de trabajo, podemos hacerlo mediante el menú System/Set Sheet
Sizes…. Al seleccionar esta opción, aparece una ventana con el título Sheet Size
Configuration, donde podemos elegir un tamaño de la lista o uno personalizado, llamado
User. En realidad, es posible seleccionar un tamaño de la lista y luego ajustarlo a la
medida que deseamos.

También podemos utilizar una plantilla diferente para la hoja de trabajo; si vamos al menú
File/New Design…, aparecerá una lista de las plantillas que se instalan con Proteus. En
los mas nuevos dejan de aparecer imágenes y solamente aparecen renglones de opciones.

Las plantillas adicionales contienen un marco con coordenadas y un cuadro de datos en


la parte inferior derecha, que incluye la fecha, la hora y el nombre del archivo, entre
otros datos. En el Capítulo 8 veremos cómo manejar este cuadro de datos.
La rejilla
Además de la hoja de trabajo, en la ventana de edición podemos ver una rejilla de puntos
o líneas, que nos servirá como guía al momento de dibujar los circuitos; podemos
desactivarla u ocultarla si lo deseamos. Los puntos o líneas de la rejilla tienen, por defecto,
una separación fija entre sí. Entre dos puntos o líneas hay una distancia de un décimo de
pulgada; es decir, cada 10 puntos o líneas tendremos una pulgada.

Es posible modificar la separación de los puntos o las líneas que conforman la rejilla, para
lo cual tenemos que ir al menú View y elegir una de las siguientes opciones disponibles:
Snap 10th, Snap 50th, Snap 0.1in o Snap 0.5in, que cambian la división de cada pulgada
en 100, 50, 10 o 2, respectivamente. A la derecha de cada opción en el menú View,
encontramos la indicación de las teclas que podemos usar para la misma función, es decir,
el atajo de teclado, no solo para estas opciones sino para muchas de las de los menús. Una
vez que incorporemos su uso, ahorraremos tiempo de trabajo.
Las barras de herramientas
En la interfaz de Proteus, podemos encontrar diferentes barras de herramientas, que
contienen botones para múltiples funciones del programa. En la siguiente Guía visual
conoceremos cuáles son y dónde están ubicadas, por defecto, en la ventana de ISIS.
Las herramientas de Modo
Veamos con más detalle la barra de herramientas de Modo. Esta se encuentra dividida en
tres partes: la superior presenta las herramientas principales, en la parte media tenemos
herramientas de dispositivos, y en la inferior, herramientas de dibujo en 2D. Detallaremos
aquí solo las herramientas principales de la barra de herramientas de Modo para poder
comenzar a dibujar nuestros diagramas de circuitos; estudiaremos las demás herramientas
en capítulos posteriores. Debemos notar que al cambiar de modo (es decir, al presionar
algunos de los botones de la barra de herramientas de Modo), la parte superior del
Selector de objetos cambia de título, y pueden aparecer uno o dos pequeños botones. Por
otro lado, las herramientas de dibujo en 2D permiten colocar elementos gráficos que no
son componentes en la ventana de edición, para crear, por ejemplo, líneas, marcos,
cuadros de texto, flechas, textos indicativos, títulos, etcétera. También pueden usarse para
dibujar nuevos componentes.
Elegir componentes de las librerías
Veamos cómo elegir los componentes que formarán nuestros circuitos electrónicos en
Proteus. Para seleccionar los componentes, debemos estar en el modo Componente, para
lo cual, simplemente, presionaremos el botón Component Mode en la barra de
herramientas de Modo. Aparentemente no sucede nada al hacerlo, pero si observamos la
ventana del Selector de objetos, en la parte superior aparecen dos pequeños botones, uno
con una P y otro con una L. Además, a la derecha de ellos, en el título de la ventana del
Selector de objetos, podemos apreciar la palabra DEVICES, que significa dispositivos.

Si presionamos el botón P, se abrirá la ventana Pick Devices, donde podemos navegar


por las librerías de componentes para elegir los que formarán nuestro diseño. Desde esta
ventana también es posible hacer una búsqueda concreta. En la siguiente Guía visual
conoceremos cada uno de sus elementos.
Al navegar o realizar una búsqueda en la ventana Pick Devices, es posible encontrar los
componentes que necesitamos para dibujar los circuitos. Para elegir uno de ellos,
podemos manejarnos de dos maneras.
Una es hacer doble clic sobre el componente deseado en la lista de resultados; esto hará
que el nombre del componente se muestre en la ventana del Selector de objetos. De esta
forma, podemos seguir navegando o buscando todos los componentes necesarios y
agregándolos a la ventana del Selector. Cuando finalizamos, cerramos la ventana Pick
Devices presionando el botón Cancel o Cerrar.
Otra posibilidad es hacer un clic sobre el componente para seleccionarlo de la lista, y
después presionar OK en la parte inferior derecha de la ventana Pick Devices. De esta
manera, el componente pasará al Selector de objetos, y la ventana Pick Devices se cerrará.
Todo dependerá de si necesitamos usar solo un componente o más.
Las herramientas de Rotación y reflexión
Después de elegir los componentes en la ventana Pick Devices y tenerlos listos en la
ventana del Selector de objetos, ya podemos colocarlos en el diseño. Antes de hacerlo, es
conveniente analizar las opciones para rotarlos o reflejarlos según lo necesitemos. Para
esto usaremos la barra de herramientas de Rotación y reflexión, que conoceremos en la
siguiente Guía visual.
Las herramientas de la barra de Rotación y reflexión nos permiten cambiar la orientación
de los componentes antes de colocarlos en el diseño. Es importante saber que estos
botones no funcionan con los componentes ya colocados en la ventana de edición. Al
seleccionar algún componente en la ventana del Selector de objetos, este aparecerá en la
ventana de Vista previa, donde observaremos su símbolo y, además, al rotar o reflejar,
también veremos cuál es la nueva orientación.

Una vez que tenemos todos los componentes necesarios en el Selector de objetos y
sabemos cómo rotarlos y reflejarlos, ya podemos colocarlos en la ventana de edición para
empezar a construir un circuito. A continuación, en el siguiente Paso a paso, explicaremos
detalladamente cómo es el procedimiento.
Manipular los componentes en la ventana de Edición
Después de colocar varios componentes en la ventana de Edición, podemos cambiarlos
de lugar, borrarlos, rotarlos o reflejarlos. Para seleccionar un componente que ya está en
dicha ventana, simplemente hacemos un clic sobre él con el mouse, y este aparecerá con
los bordes de color rojo, lo que significa que está seleccionado. Luego, para moverlo,
hacemos un clic sobre él y, manteniendo el botón del mouse presionado, lo desplazamos
hacia otro lugar.
Si hacemos un clic con el botón derecho del mouse sobre un componente, se abrirá un
menú contextual con opciones que nos permiten mover, rotar, reflejar, borrar el
componente, y algunas acciones adicionales que estudiaremos más adelante. Mediante la
opción Drag Object, movemos el componente a otro lugar, arrastrándolo y haciendo un
clic en la ubicación elegida.
Las opciones de rotación y reflexión son idénticas a las de la barra de Rotación y
reflexión, pero, como vimos, los botones de la barra no funcionan con los componentes
ya colocados en la ventana de Edición. Entonces, si necesitamos rotar o reflejar un
componente, debemos hacerlo desde este menú contextual. Aquí aparece una opción para
rotar el componente 180 grados (Rotate 180 degrees), que no está en la barra de Rotación
y reflexión.
La opción Delete Object borrará el componente de la ventana de Edición. También
podemos eliminar un componente seleccionándolo y presionando la tecla SUPR en el
teclado. Un atajo para borrar rápidamente un componente es hacer doble clic sobre él con
el botón derecho del mouse. Es importante tener en cuenta que, al seleccionar e intentar
arrastrar un componente para moverlo, debemos asegurarnos de hacer clic en el cuerpo
del componente y no en los textos que lo acompañan. Si hacemos clic sobre los textos,
solo arrastraremos estos elementos.
Es posible seleccionar los componentes desde muchas de las opciones de la barra de
herramientas de Modo, pero lo más adecuado es hacerlo desde el Modo de selección.
Para seleccionar más de un componente a la vez, hacemos un clic en algún lugar vacío de
la ventana de Edición y, manteniendo el botón del mouse presionado, lo arrastramos para
crear un recuadro. Al soltar el botón del mouse, todos los elementos que se encuentren
dentro de este recuadro quedarán seleccionados. Otra manera es mantener presionada la
tecla CTRL mientras hacemos un clic sobre cada uno de los componentes que queremos
seleccionar.
Si hacemos un clic con el botón derecho del mouse en un lugar vacío de la ventana de
Edición, aparecerá un menú contextual que contiene la opción Select All Objects, para
seleccionar todos los componentes.
Las herramientas de Visualización
A continuación, conoceremos en detalle las diferentes herramientas que integran la barra
de Visualización.
Las herramientas de Vista nos permiten acercar, alejar y centrar un área específica del
diseño para verla o trabajar cómodamente. El acercamiento o alejamiento también puede
hacerse con la rueda del mouse; al girarla hacia abajo, alejaremos la vista en la ventana
de Edición, y al girarla hacia arriba, haremos un acercamiento. Estos movimientos se
harán basados en la posición del cursor del mouse dentro de la ventana de Edición.
Las herramientas de Edición
La barra de herramientas de Edición también nos permite trabajar con los componentes
en el diseño. En la siguiente Guía visual conoceremos los principales elementos que
contiene.
Como podemos apreciar, las diferentes herramientas de edición nos permiten trabajar con
bloques de componentes. La selección de componentes puede contener solo uno, varios
de ellos o incluso todos los componentes del diseño. Si seleccionamos varios
componentes y hacemos un clic con el botón derecho del mouse sobre ellos, aparece un
menú contextual que contiene muchas de las opciones de la barra de herramientas de
Edición, además de las opciones de rotación y reflexión, que ya conocemos, así que
podemos usarlas también desde este menú contextual.
Entre ellas encontramos una que se destaca: el botón para copiar bloques o Block Copy.
Este puede resultar de gran utilidad en aquellos diseños que contienen bloques que se
repiten, ya que nos permite copiar toda una sección de nuestro diseño de manera simple
y rápida, en vez de tener que dibujar todo el bloque otra vez. Como podemos ver, las
herramientas de Proteus siempre simplifican nuestro trabajo.
Conexiones
Después de haber aprendido a colocar y manejar los componentes dentro de la ventana
de Edición, es fundamental saber cómo se realizan las conexiones entre ellos dentro de
un circuito. Para realizar las conexiones, debemos estar en el modo Componente, aunque
es posible efectuarlas desde otros modos también. En el siguiente Paso a paso,
conoceremos en detalle cómo es el procedimiento para conectar componentes.
Como podemos notar, hacer conexiones en ISIS es simple y rápido. Podemos hacer así
las conexiones entre las terminales de los componentes, y también es posible llevar las
conexiones de una terminal a una línea de conexión ya existente o de una línea a otra.
Como vemos en la Figura 13, es posible conectar dos líneas entre sí. En el lugar donde se
juntan las líneas, aparecerá un punto de unión para indicar que hay conexión entre ellas.
En cambio, si las líneas se cruzan sin haber conexión entre ellas, el punto no estará
presente, para mostrar que ahí no existe ninguna conexión.
Al realizar las diferentes conexiones dentro de un circuito, Proteus cuenta con una función
de autoruteo, es decir que la trayectoria de la conexión es calculada de manera automática,
mientas llevamos la conexión de un punto hacia otro.
Para activar o desactivar esta función usaremos el botón Toggle Wire Autorouter, que
está en la barra de herramientas de Diseño, o podemos hacerlo desde el menú Tools,
donde aparece la misma opción. Si desactivamos el autoruteo, solo se dibujará una línea
recta entre los puntos donde hagamos la conexión, a menos que vayamos haciendo un clic
en los puntos donde queremos fijar la conexión o realizar cambios de dirección. Es decir,
nosotros decidiremos completamente la dirección que seguirá una conexión.
Mover y borrar conexiones
Después de realizar las conexiones, podemos moverlas para ajustarlas y así mantener el
diseño ordenado. Para esto, debemos ingresar en el modo de Selección. Veamos cómo
hacerlo.
Mediante este sencillo procedimiento, reorganizaremos las conexiones para que todo
quede ordenado como queremos. También es posible seleccionar más de una línea de
conexión a la vez y moverlas juntas, para acelerar la tarea.

Con todos estos pasos sobre Proteus son suficientes para poder realizar nuestro
proyecto en la parte desarrollo. Ahora explicaremos las formas de acondicionar un
sensor resistivo.
Existen esencialmente 3 formas de acondicionar un sensor resistivo:
• Divisor de tensión
• Fuente de corriente
• Puente de Wheatstone
Vamos a describir solamente la de divisor de tensión de estas opciones, señalando algunas
ventajas y desventajas de su uso.
Acondicionamiento por divisor de tensión
Probablemente la forma más simple de acondicionar un sensor resistivo es formar un
divisor de tensión entre el sensor y un resistor fijo, como se ve en la Figura 6-1, donde
R1 es una resistencia de valor fijo y RS Representa el sensor resistivo.

Si analizamos este circuito podemos observar que el voltaje Vout está dado por
𝑅𝑆
𝑉𝑜𝑢𝑡 = 𝑉1 ∗
𝑅𝑆 + 𝑅1
De este modo, si el valor de RS varía, el valor de Vout también los hace
proporcionalmente. Evidentemente este circuito es muy simple y económico de
implementar, por lo cual puede resultar conveniente. Sin embargo, debemos analizar un
poco más sus características para encontrar las consideraciones que debemos tener a la
hora de implementarlo y las posibles desventajas de esta configuración.
Relación directa o inversa
En el circuito de la Figura 6-1, vemos que la ecuación nos presenta una relación directa
entre el voltaje y a la resistencia, puesto que a mayor resistencia tendremos mayor voltaje.
En caso de requerir que la relación sea inversa, bastará con invertir el orden de las
resistencias como se aprecia en la Figura 6-2.
En este caso la ecuación para el voltaje Vout sería:

Y tendríamos que, a medida que sube la resistencia, baja el voltaje de salida. La elección
acerca de cuál de las dos opciones es más conveniente, depende de cual sea la relación
entre la resistencia y la variable a medir (si es directa o inversa) y de la conveniencia o
necesidades propias del sistema de medición.
Linealidad de la relación
Una consideración importante que tenemos que tener es la forma que tiene la relación
existente entre la resistencia y el voltaje, que está dada por la ecuación 6.1. Es evidente
que esta no es una relación lineal, pero vemos en detalle con un ejemplo.
Ejemplo 6.1
Suponga que en el circuito de la Figura 6-1, el resistor R1 tiene un valor de 1kΩ, que el
sensor RS tendrá una variación entre 100Ω y 5K para la variación de la variable a medir
y que V1 es igual a 5V. Primero, sabemos que el voltaje Vout variará entre un voltaje
mínimo (cuando Rs vale 100Ω) y un máximo (cuando Rs vale 5kΩ), así

Pero, ¿cómo será la variación en este rango? En la figura siguiente se puede ver una
gráfica de voltaje versus resistencia para este caso, donde se aprecia la no linealidad en la
relación. Esto implica que cuando tengamos un voltaje Vout que representa la variable a
medir, la relación entre voltaje y variable a medir no es lineal, aún si la relación e entre la
resistencia y la variable a medir si lo es. Esto hace más compleja la interpretación del
voltaje en términos de la variable. Es decir, si por ejemplo este se tratara de un sensor
resistivo, no podríamos decir que tenemos una relación (por poner un caso) de 0.1V por
grado centígrado, porque esta sería una relación lineal, que este caso no existe.
DESARROLLO
Se pidió realizar un acondicionamiento para un sensor resistivo de temperatura, el valor
de temperatura sensado deberá pasar por una etapa de acondicionamiento para poder ser
visto en una pantalla LCD, en dos Display de 7 segmentos y poder utilizarlo o controlarlo
con una App de celular.
No se puede hablar de los sensores, como componentes electrónicos básicos, sin ver como
se pueden adaptar a un sistema de adquisición y control. Por lo que se tendrán que ver las
nuevas tecnologías de adaptación de estos sensores que, como parte de una cadena de
dispositivos, forman un sistema. Estos adaptadores, como acondicionadores de señal, son
los amplificadores operacionales en sus diferentes estructuras de montaje, pasando por
filtros o por procesadores analógicos, convirtiendo estas señales de analógico a digital
para posteriormente ser procesados los datos con un DSP o Microcontrolador y actuando
por medio de las salidas lógicas del procesador o por medio de un convertidor digital a
analógico.

En nuestro caso la línea de obtención de datos seguiría este patrón, primero tenemos que
aclarar que el Proteus tiene varios dispositivos que pueden simular temperaturas pero
nosotros tenemos que insertarlas es decir, hacer una inserción artificial o digital de
temperatura, teniendo esto vamos hacer un cálculo para ello ocupamos una temperatura
digamos de 25 grados centígrados de la cual nos basaremos para hacer cálculos y
programar el microcontrolador, una vez establecida la temperatura debemos de
acondicionar la señal es decir convertirla del estado analógico al digital si no se podría
dañar un componente por los voltajes altos, hacemos las conversiones de voltaje, el
convertir voltaje en temperatura y de temperatura a resistencia y al final reflejarse como
temperatura medida y de esto se establecen entradas y salidas dependiendo de la señal.
De aquí se tienen 3 opciones o si se quieren realizar en conjunto también puede hacerse,
para el Display es necesario enviarlo a la multiplexación porque como estaremos
manejando Display dobles de 7 segmentos es necesario establecer que Display va a
encender según la temperatura que se tenga y si se quisiera enseñar decimales, para el
LCD solamente es necesario enviar la señal de salida al LCD y programar dentro del
microcontrolador lo que se quiera ver en la pantalla LCD. Para la aplicación es necesario
tener otro microcontrolador porque ya no tenemos espacio de salidas dentro del Arduino,
entonces programamos que se este preguntando que es lo que desea el usuario y si se tiene
conexión con el para poder recibir o mandar información, la información que se obtiene
entra de igual manera al microcontrolador pasando por el filtro de analógico a digital y
en las salidas es enviado al dispositivo bluetooth en el que espera al usuario para
conectarse y enviar la información a la app de celular también contara con luces de
temperatura que el usuario podrá estar viendo para monitorear estas cuentan con tres
temperaturas regular, alta y peligros al verlas el usuario tomara las acciones que considere
pertinentes en este caso pueden ser prender luces de emergencia, una sirena o si no
prender ventiladores.
PROGRAMAS
PROGRAMA DE LCD Y DISPLAY
Primero analizaremos el programa que envía la información al LCD y al Display doble
de 7 segmentos.

Vamos a ir por partes, primero explicaremos el primer renglón del comando #include que
trata sobre incluir librería que pudiéramos ocupar en nuestra programación en este caso
hay dos de ellas, la librería liquidcrystal y la ledcontrol.

La librería liquidcrytal tiene como fin permitir la comunicación alfanumérica de los


Display cristalinos y líquidos de sus siglas en ingles LCD´S. Permite al Arduino controlar
al LCD basado en el chipset Hitachi que es encontrado en la mayoría de los LCD basados
en texto. La librería funciona para trabajar del modo de 4 o 8 bits.
La otra librería LedControl es una librería dirigida para nuestro multiplexor MAX7219
que utilizaremos para el Display doble de 7 segmentos. Esta librería soporta las
conexiones múltiples de drivers y soporta una matriz de leds, así como Display´s de 7
segmentos.
La librería ledcontrol cuenta con varios comandos que debemos tomar en cuenta y están
en la siguiente imagen.
Estos comandos aparecen en nuestro código y los explicaremos todos a su tiempo. Por
el momento el primero de ellos es el ledcontrol.

• Como podemos ver creamos un objeto con el nombre lc, seguido establecimos los
pines que tomaran el lugar del DIN que es nuestra entrada de datos, el CLK que
es el reloj y el chip selecta si como el numero de dispositivos de circuitos
integrados que tendremos como se pueden conectar hasta 8 es necesario establecer
cuantos conectaremos.

Ahora explicaremos este comando, pero para ello debemos explicar primero como
funciona la pantalla LCD. Debemos tener en cuenta que la pantalla LCD funciona en base
a una matriz de 15 columnas y 2 renglones mas adelante hablaremos de otros comandos
acerca de cómo configurarla.
MODULO LCD 1602A

• El pin 1 es nuestra alimentación a tierra.


• El pin 2 es nuestra alimentación a voltaje.
• El pin numero 3 es el contraste con este se conecta una resistencia variable para
regular el nivel de contraste para una correcta visualización.
• El pin 4 RS es el selector de registro, este módulo de LCD tiene circuitos
integrados que se encargan de las tareas de bajo nivel para el funcionamiento de
la pantalla con este se controla con una librería especial dentro de Arduino.
• El pin 5 es para designar si la pantalla estará en modo lectura o modo escritura,
pero en este caso estará en modo escritura porque ocupamos enviar un mensaje.
• El pin 6 indicaremos para habilitar el tipo de registro a utilizar para cada caso,
pero este se encargará la librería liquidcrystal dentro del código en el momento
adecuado.
• Tenemos los pines de 7 a 14 que son el bus de datos de 8 bits con el que recibimos
la información que buscamos plasmar, tiene un modo que funciona con 4 bits y
también funciona bien solo para evitar conexiones grandes.
• Los últimos dos terminales son el ánodo y cátodo que brindan la iluminación
trasera de la pantalla, el ánodo se conectara con resistencia para bajar ligeramente
el brillo, el ánodo se puede conectar directamente a 5V pero sería demasiado brillo
y no se vería.
Teniendo esto en cuenta y retomando el comando anterior vamos a declarar únicamente
los pines de salida en el Arduino que servirán para enviarle información a nuestro LCD
y son del pin 7 al 2 de la salida digital del Arduino.

Después de configurar los pines de salida que enviarán información de temperatura al


LCD, creamos 7 variables, 4 de ellas serán flotantes y están ligadas a lo que ocuparemos
para medir la curva característica del termistor, los valores enteros como el Vo y el
TEMP_DISPLAY también entran para medir la curva característica del termistor.

Primero explicaremos lo que es el sensor de temperatura Termistor.


El termistor es un componente semiconductor de oxido que tiene una variación en su
resistencia según la temperatura que este midiendo en el ambiente este tiene dos
variaciones una de ellas es el NTC que se llama coeficiente negativo de temperatura, que
dice que si la temperatura aumenta la resistencia del termistor tiende a bajar. En el caso
del termistor PTC llamado coeficiente positivo de temperatura, cuando la temperatura
sube la resistencia de igual manera tiende a subir. En nuestro de proyecto utilizaremos el
NTC.

En esta grafica podemos ver las curvas características del termistor NTC y PTC, en donde
se tiene temperatura contra resistencia, la línea azul es el termistor PTC y la línea roja es
nuestro termistor NTC que explica como se comento anteriormente tiene a bajar su
resistencia cuando la temperatura es muy alta y tiende a subir la resistencia cuando la
temperatura es baja.
Hay que señalar que hay valores típicos de termistores NTC existen entre ellos termistores
de 5K, 10K, 25K, 50K y 100K. Es importante resaltar que la resistencia de 10K siempre
está ligada a 25 grados de temperatura es decir a 25 grados centígrados tendrá 10K cuando
comience a subir disminuirá; el rango típico por lo general esta entre -55 grados
centígrados y 260 grados centígrados.
Ahora la respuesta del termistor no es lineal con respecto a la temperatura por lo que
tenemos que hacer ajustes en la programación para que nos arroje una respuesta parecida
ala de la grafica de la curva característica del termistor.

Tendremos que utilizar la ecuación de Steinhart-Hart para poder obtener el valor de


temperatura, la ecuación que aquí vemos podemos obtener el valor de temperatura en
base el valor de resistencia del termistor, esta ecuación esta compuesta por las variable T
que es la temperatura en grados Kelvin que en el programa será convertida a centígrados,
el valor R que es el valor de la resistencia en ohms que brinda el termistor, A, B y C son
los coeficientes de Steinhart-Hart y dependen del modelo del termistor que utilicemos. El
material del cual este fabricado determinara el valor de resistencia que es afectado con la
temperatura, estos valores son provistos por la hoja de datos del fabricante o calculables
mediante una pagina web. Aquí abajo esta el Link y de nuevo estará en las referencias.
https://www.thinksrs.com/downloads/programs/therm%20calc/ntccalibrator/ntccalculator.html
Ahora volviendo al código tenemos Vo es la tensión leída que tenemos en la entrada A0.
Luego la variable R1 se declara flotante ya que su valor lo vamos a requerir en una
ecuación que requiere valores con coma o punto decimal. R1 es la resistencia que
colocamos en el circuito y que forma parte del divisor de tensión, luego declaramos en
simultaneo 3 variables flotantes, logR2, R2 y TEMPERATURA aquí R2 representa al
valor de resistencia del termistor recordemos que en la ecuación que utilizaremos en la
ecuación de loop debemos tener el valor de la resistencia del termistor. Luego también
como flotantes declaramos las variables Steinhart-Hart como c1, c2 y c3 estas serán
equivalentes a A, B y C, estas 3 son fundamentales para la ecuación por lo que se tienen
que obtener con el enlace que ven en pantalla.

Cuando entremos en el link la configuración de resistencias será lo único que


modifiquemos, tomando en consideración que el valor de nuestro termistor no será de
10K si no de 1000 a 25 grados centígrados. Que esta aumenta a 2500 cuando esta a 5
grados y disminuye a 400 cuando está a 45 grados. Los valores de A, B y C estarán dados
automáticamente en la parte de abajo que se tienen que copiar con su notación científica
al código del Arduino y la beta del termistor también debe ser copiada tal cual da el
programa de la página.
Después de haber obtenido estos valores procedemos con el código. La parte de void
setup se utiliza únicamente para establecer configuraciones antes del código principal y e
ejecutan una sola vez al inicio del programa y por única vez. Por eso aquí se inicializan
variables.
• El comando Serial.Begin(9600) es para iniciar la comunicación serie o la tasa de
transferencia estos valores pueden ser de 300, 600, 1200, 2400, 4800, 9600,
14400, 19200, 28800, 38400, 57600 o 115200 en nuestro caso será a 9600 bps.

Aquí retomaremos la ayuda visual de los comandos del Display.


• Después tenemos el comando lcd.begin que viene en la librería liquidcrystal con
este comando se trata de configurar y hacerle entender al Arduino el tamaño que
tendremos nuestro LCD, el primero digito es para columnas y el segundo es para
renglones, para nuestro caso será de (16,2).
• Para el comando lc.shutdown cuyo primer parámetro es el numero de dispositivo
al cual haremos referencia este se enumera desde 0 recordemos que si tuviésemos
dos MAX7219 el valor seria de 1 y si tuviéramos 3 MAX7219 el valor cambiaria
a 2, el segundo parámetro es para el estado por lo general el MAX7219 está por
defecto apagado por lo que le mandamos un valor booleano false.

• El comando lc.setIntensity como primer parámetro es el numero de dispositivo que


utilizaremos que será de 0 ya que solo tenemos un solo circuito integrado, el segundo
parámetro es la intensidad este va de 0 a 15 como valor máximo, para nuestro agrado
tomaremos el valor de 4.
• Por último, tenemos el comando clearDisplay que su propósito es eliminar lo que
teníamos anteriormente en el Display.
Ahora comenzaremos con la parte de void loop que se encarga principalmente de leer los
comandos una y otra vez repetidamente hasta que el usuario desconecte o apague el
Arduino.

• Tenemos como primera instancia que consiste en leer la


información analógica de tension que se tiene en el pin A0 y pasar el valor leído
a la variable Vo.
• Aquí hacemos la conversión de la
medición de tension en A0 a resistencia para el termistor.
• Se obtiene el logaritmo de dicho valor para la ecuación de
Steinhart-Hart.
• Se hace la
ecuación de Steinhart-Hart y se pasa la información del resultado de la ecuación
a la variable de temperatura.
• Después de esto se iguala temperatura con
temperatura restándole el valor de grados kelvin a la variable temperatura. Es
decir, hacemos la conversión de grados Kelvin a centígrados.

• Despues redondeamos el valor de


temperatura para no tener decimales. E igualamos el valor de temperatura*100 a
la variable TEMP_DISPLAY.

• El comando serial.print sirve para imprimir un valor en el monitor serie, si se


colocan entre comillas saldrá como estilo texto, el no colocar comillas significa
que imprimiremos un valor de una variable con el nombre designado en este caso
imprimiremos el valor de Temperatura: (TEMPERATURA) C. Esto debería de
verse en la pantalla del monitor serial.
• El comando delay se utiliza solamente para generar retardos, en este caso
colocamos una demora solamente de medio segundo entre lecturas.
Ahora lo que tenemos que hacer es enviar la información de la temperatura medida del
termistor al Display para ello utilizamos el comando de arriba.

• El comando setDigit tiene sus parámetros como primero es el numero de


dispositivo para nosotros un 0, como segundo tiene el digito en la imagen para
que quede claro son los 4 dígitos de nuestro proyecto, el digito de hasta la derecha
tiene como numero 0, el de las decenas tendrá índice 1 y así hasta el índice 3. Se
toman en cuenta en base al bit menos significativo que es el 0. Como tercer
parámetro tenemos el valor que deseamos mostrar en dicho digito en nuestro caso
es lo que se quedo guardado en el TEMP_DISPLAY y por último tenemos un
valor de tipo booleano como true o falso para indicar si estaremos prendiendo el
punto decimal de esta forma podemos indicar si es decimal.
Volviendo al código tenemos un problema y es que debemos descomponer el valor de
temperatura en sus dígitos individuales y si fueron 0.25 grados debemos colocar en el
digito 0 el numero 5 y en el digito 1 el numero 2. Esto se resuelve de una manera simple
con un operador aritmético llamado modulo y se representa con el valor de porciento o
porcentaje.

Este soluciona el problema de separar dígitos en individuales para mostrar en un Display


de 7 segmentos. El modulo devuelve el resto de la división de dos números enteros, si por
ejemplo aplicamos 7 modulo 5 el valor será 2. Aquí si vemos la forma gráfica la división
de 7 dividido 5 el valor será 1 pero en realidad seria 1.4, pero no nos importa la parte
decimal entonces como nos hace falta 2 para poder llegar a 7 el resultado de 7 modulo 5
el resultado seria 2. En otro caso de 15 modulo 10, el valor que nos hace falta para llegar
a 15 es 5. Esto nos permite obtener el ultimo digito de un numero y permite descomponer
dos números y obtener el valor menos significativo para expresarlo en el Display.

• Ahora volviendo al código en el primer caso pues solamente tenemos un


MAX7219 por lo que es 0 en el primer parámetro para todos, después colocamos
0 porque es el Display menos significativo, después colocamos el valor que
buscamos mostrar que es el TEMP_DISPLAY modulo 10, este tiene el valor de
temperatura medido en el termistor y por último tenemos el ultimo parámetro
como false ya que se encuentra en los decimales.

Ahora en el digito 1 que es el de las decenas lo haremos dividiendo por 10 que
equivale a moverse una posición hacia la izquierda por ejemplo si tuviésemos 25
mili centígrados al dividirlo por 10 nos daría 2 porque no tomamos la parte
decimal y ahora obtenemos el digito para mostrar y nuevamente colocamos en
false el punto.
• Para el
tercer digito en el Display índice 2 lo tenemos que mover dos posiciones hacia la
izquierda por lo que le colocamos el módulo 10, aquí prendemos el punto del
Display para hacer énfasis en que ya se encuentra midiendo grados y no milis.
• En el ultimo caso del cuarto digito del Display de los millares se divide entre 1000
para poder tener las expresiones de 10 a 90 y en este no se prende el punto ya que
lo hace el Display índice 2.
• Por último, colocamos un retardo de medio mili segundo con el comando delay.

• El primer comando setcursor es para establecer en la variable lcd e indicarle al


programa en que parte de la pantalla LCD se va a comenzar en nuestro caso será
desde el (0,0).
• El segundo comando que es el print se utiliza al igual que en el monitor serial para
colocar un texto solamente si se usan las comillas en caso contrario solamente se
coloca el nombre de la variable a mostrar. En este caso se escribe Temp:
• En el tercer print se coloca la variable a mostrar que es TEMPERATURA seguido
del 1 para prender el LCD.
• El cuarto print se utiliza la expresión de escritura de texto para mostrar la letra C
para indicar que son grados centígrados.
• Por ultimo se añade un retardo de medio segundo.
Por último, para este código de controlar únicamente el LCD y el Display se coloca
las condicionales if.
• En el primer if se condiciona si se tiene en la variable TEMPERATURA un
valor mayor o igual a 0 o si se tiene en la variable TEMPERATURA un valor
menor o igual a 10. Entonces utilizaremos el comando lcd.clear para limpiar
la pantalla LCD, con el comando setcursor lo colocamos en la columna 4 en
el renglón 1, e imprimimos con el comando print la palabra FRIO.
• En el segundo if se condiciona que, si se tiene en la variable TEMPERATURA
un valor mayor o igual a 11 o si se tiene un valor en la variable
TEMPERATURA menor o igual a 20, limpiaremos la pantalla LCD, nos
posicionaremos en la posición (4,1) del display e imprimiremos en la pantalla
la palabra REGULAR.
• En el tercer if se condiciona que, si se tiene en la variable TEMPERATURA
un valor igua o mayor a 21 o que si en la variable TEMPERATURA se tiene
un valor igual o menor a 30, limpiaremos la pantalla LCD, nos posicionaremos
en la posición (4,1) del display e imprimiremos en la pantalla la palabra
PELIGROSO
PROGRAMA DE APLICACIÓN
Ahora explicaremos el código para la aplicación de celular del control de temperatura del
termistor.

• Declaramos la variables ledPin=13 cuando hacemos una igualdad estamos


dandole a entender al programa que la variable tiene como salida o entrada el pin
del Arduino numero 13. Este pin nos servira para encender o apagar la luz de
emergencia.
• Declaramos la variable ledregular que es para indicar una temperatura regular esta
se encontrara en el pin 10.
• El LEDALTO estara en el pin 9 que indicara que la temperatura esta alta en la
habitacion medida por el termistor.
• El LEDPELIGROSO que es el pin 8 indica que la temperatura es peligrosa.
• Los ventiladores encargados de enfriar la habitacion se encontraran alimentados
en el pin 12.
• La alarma encargada para avisar alas personas del lugar que la temperatura es
peligrosa o alta estara ubicada en el pin 11 del arduino.
• La variable llamda state=0 es la cargada de la lectura del dato serial esta funciona
como un alto para que el programa no se vaya de paso y en las condiciones
pregunte por otra condicion.
• La flotante llamda TEMP es la que usaremos para declarar temperatura.
• La variable Vo sera utilizada como al vez pasada para medir el valor de tension
en la entrada analogica A0.
• La flotante R1 es la otra resistencia que es necesaria para el divisor de voltaje.
• La flotantes R2 es la resistencia del termistor que se mide con la entrada del A0,
el logR2 es el logaritmo del valor de R2 y la flotante temperatura es la variable
que usaremos para guardar los valores de temperatura del A0.
• Los valores de c1, c2 y c3 vuelven a ser los valores de A, B y C de la ecuacion de
Steinhart-Hart obtenidos de la pagina del link publicado anteriormente.
• Ahora configuramos las salidas de cada variable que mencionamos anteriormente
para enseñarle al usuario lo que se tienen visualmente de temperatura ya sea alta,
peligrosa o regular y si el desea activar alguna de las opciones como sirena, luces
de emergencia o ventiladores se veran activados con un led simulando las teclas
de la apliacion.
• El comando pinmode sirve para definir si es entrada o salida, en el primer
parametro van nuestras variables que utilizaremos y el segundo parametro se
coloca INPUT o OUTPUT.
• El comando digitalWrite es para escribir en las variables de LOW o HIGH que
tienen la funcion de decir si en la entrada o salida va un cero o un uno
respectivamente.
• Y de nuevo volvemos a colocar el comando serial.begin para controlar el bus de
transferencia de datos y los ajustamos a 9600.

• En esta primera parte se vuelve hacer el mismo procedimiento del circuito pasado
en el que consiste convertir la señal de tension del A0 en resistencia y despues
aplicar la formula de Steinhart-Hart y convertir la temperatura de grados Kelvin a
centigrados y rendondearla e imprimirla en el serial para que el usuario pueda ver
la temperatura de la habitacion.

• En esta parte del codigo tambien se vuelve a realizar el mismo proceso que el
codigo de LCD y Display pero con valores de respuesta diferentes.
• Para el caso de 0 a 10 de temperatura el led regular se encendera y el led alto y
peligroso se mantendran apagados esto se utiliza con el digitalWrite como dijimos
anteriormente y estableciendo en el primer parametro el nombre de la variable a
colocar 0 o 1 y en el segundo parametro para indicar si sera LOW o High pero en
este caso sera LOW.
• Para el caso de 11 a 20 de temperatura, el led regular se mantiene en LOW, el alto
en HIGH y el led de peligroso se mantiene en low con el mismo comando de
digitalWrite.
• Para el caso de 21 a 30 de temperatura, el led regular y el led de temperatura alta
se mantienen apagados y el led de temperatura peligrosa se prende. De igual
manera se utiliza el comando digitalWrite para establecerlos como estado LOW y
HIGH.

En esta última parte del código es importante recalcar algunas cosas.


• Se condiciona primero que si se encuentra disponible el serial es decir si es mayor
a 0, con esto damos a entender que si se encuentra activo el dispositivo bluetooth
activa la comunicación con el para poder empezar a mandar información.
• Se coloca la variable state que será igual al serial.red, recordemos que la variable
state será como nuestra consola en el escribiremos letras como la E,A,D,F o
cualquier otra y el comando serial.read será el encargado de leer lo que nosotros
escribimos y colocarlo en dicha variable.
• Después colocamos un retardo de medio segundo entre lecturas para evitar el
exceso de preguntas.
Y con esto cerramos esta primera condicional para darle acceso alas condiciones que
permiten activar al usuario las distintas herramientas para controlar la temperatura.
• Después se tiene una condición if en donde se dice que si en el serial se tiene
exactamente la letra Q, utilizamos el comando digitalWrite para activar la variable
ledPin que es la encargada de la luz de emergencia. Al final colocamos state
igualado a 0 para evitar que el programa siga preguntando y se quede ciclado el
programa en esas preguntas.
• Se tiene otra condición if en donde se dice que si en el serial se tiene una letra W,
utilizamos nuevamente el comando digitalWrite para desactivar la variable ledPin
que es la que se encarga de la luz de emergencia. Al final colocamos nuevamente
el state igualado a 0 para evitar que el programa siga preguntando y se quede
ciclado el programa en esas preguntas.
• Luego tiene otra condición if en donde se dice que, si en el serial se tiene una letra
E, utilizamos nuevamente el comando digitalWrite para activar la variable
ALARMA que es la que se encarga de la sirena de emergencia. Al final colocamos
nuevamente el state igualado a 0 para evitar que el programa siga preguntando y
se quede ciclado el programa en esas preguntas.
• Siguiente tenemos otra condición if en donde se dice que, si en el serial se tiene
una letra R, utilizamos nuevamente el comando digitalWrite esta vez desactivar
la variable ALARMA que es la que se encarga de la sirena de emergencia. Al final
colocamos nuevamente el state igualado a 0 para evitar que el programa siga
preguntando y se quede ciclado el programa en esas preguntas.
• En el siguiente caso se tiene otra condición if en donde se dice que, si en el serial
se tiene una letra T, utilizamos nuevamente el comando digitalWrite para activar
la variable VENTILADORES que es la que se encarga de controlar los
ventiladores. Al final colocamos nuevamente el state igualado a 0 para evitar que
el programa siga preguntando y se quede ciclado el programa en esas preguntas.
• Y por último se tiene otra condición if en donde se dice que, si en el serial se tiene
una letra Y, utilizamos nuevamente el comando digitalWrite para desactivar la
variable VENTILADORES que es la que se encarga de controlar los ventiladores.
Al final colocamos nuevamente el state igualado a 0 para evitar que el programa
siga preguntando y se quede ciclado el programa en esas preguntas.
Y con todo este código el programa se encarga de recibir la información de temperatura
del termistor y lo convierte de analógico a digital, resuelve el problema de linealización
del termistor y envía la información al usuario en vivo de lo que esta sucediendo con el
termistor y este tiene la libertad de elegir que hacer con el lugar donde se encuentra el
termistor.
Por último, anexare el código escrito de los dos programas para facilidad de copiar y
pegar en el programa de Arduino.
PROGRAMA DE LCD Y DISPLAY
#include <LiquidCrystal.h> //LIBRERIA

//DECLARACION DE VARIABLES PARA CONTROLAR EL DISPLAY Y LA PANTALLA LCD

#include "LedControl.h" //librerias de control de led

LedControl lc= LedControl(11, 13, 10, 1); //le pasamos los pines que deseamos conectar los pines del MAX7219

LiquidCrystal lcd(7,6,5,4,3,2);

int SENSOR ;

float TEMPERATURE;

int TEMP_DISPLAY;

int Vo;

float R1 = 1000; // resistencia fija del divisor de tension

float logR2, R2, TEMPERATURA;

float c1 = 2.229674985e-03, c2 = 1.211871252e-04, c3 = 8.713435086e-07;

// coeficientes de S-H en pagina:

// http://www.thinksrs.com/downloads/programs/Therm%20Calc/NTCCalibrator/NTCcalculator.htm

//CONFIGURACION DEL PROGRAMA Y EL BRILLO DE LA PANTALLA LCD.

void setup() {

Serial.begin(9600); // inicializa comunicacion serie a 9600 bps

lcd.begin(16,2); //inicializa el LCD que es de 16 lineas y 2 renglones, con este indicamos el tamaño del LCD.

lc.shutdown(0, false); //su primer parametro es el numero de referencia y el segundo es el estado que en este caso es apagado

lc.setIntensity(0, 4); // establecer el nivel de brillo que va de 0 a 15

lc.clearDisplay(0); // limpiar el display lo que hay en los digitos

//AQUI EMPIEZA EL CODIGO DE PROGRAMACION PARA LA CONVERSION DE DATOS DE TEMPERATURA MEDIDA


ANALOGICA A LA DIGITAL Y HACER LA CURVA CARACTERISTICA DEL TERMISTOR.

void loop() {

Vo = analogRead(A0); // lectura de A0 es decir la señal que se detecta en el primer pin de lectura analogico.

R2 = R1 * (1023.0 / (float)Vo - 1.0); // conversion de tension a resistencia

logR2 = log(R2); // logaritmo de R2 necesario para ecuacion de steinhart-hart

TEMPERATURA = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2)); // ecuacion S-H

TEMPERATURA = TEMPERATURA - 276.0; // Kelvin a Centigrados (Celsius)

TEMPERATURA= round(TEMPERATURA);// redondeamos el valor de temperatura para evitar altibajas en las lecturas

TEMP_DISPLAY= TEMPERATURA*100;

Serial.print("Temperatura: "); // imprime valor en monitor serie

Serial.print(TEMPERATURA);

Serial.println(" C");
delay(500); // demora de medio segundo entre lecturas

lc.setDigit(0, 0, TEMP_DISPLAY %10, false); //en este caso si tuvieramos una temperatura mayor a 1 grado obtendriamos un
valor que fuese entero por lo tanto no ocupariamos el punto decimal y se pone false.

lc.setDigit(0, 1, (TEMP_DISPLAY/10) %10, false); //aqui se mueve una posicion hacia la izquierda, si tuvieramos 25 tendriamos
2.5 pero en este caso no tomariamos el 0.5 al final tendriamos el valor de 2

lc.setDigit(0, 2, (TEMP_DISPLAY/100) %10, true);// al dividir entre 100 y despues tenemos el modulo 10 para obtener el bit
menos significativo que obtendriamos en la division de valores flotantes. cuando colocamos true damos por entendido que esto
significa que es 22.27 convertiendo el valor que no pdoemos ver a uno que si

lc.setDigit(0,3, (TEMP_DISPLAY/1000) %10, false);// en el parametro de true se le colocaria para que pudieramos mostrar un
valor que no se podria enseñar a uno que si entonces si tuvieramos 1000 realmente tendriamos 10 grados.

delay(500);

lcd.setCursor(0,0); // establecemos el lugar de donde vamos a empezar

lcd.print("Temp: ");

lcd.print(TEMPERATURA,1);

lcd.print(" C");

delay(500);

if(TEMPERATURA >=0 &&TEMPERATURA <=10) {

lcd.clear(); // limpia la pantalla del LCD

lcd.setCursor(4,1);

lcd.print ("FRIO"); //escribe el texto que estamos escribiendo

if(TEMPERATURA >=11 &&TEMPERATURA <=20) {

lcd.clear();

lcd.setCursor(4,1);

lcd.print ("REGULAR");

if(TEMPERATURA >=21 &&TEMPERATURA <=30) {

lcd.setCursor(4,1);

lcd.print ("PELIGROSO");

}
PROGRAMA DE APLICACIÓN DE CELULAR
//bluetooth hc-05

//DECLARACION DE VARIABLES ANTES DEL PROGRAMA

int ledPin = 13; // PIN PARA ENCENDER LA LUZ DE EMERGENCIA

int LEDREGULAR = 10; //PIN LUZ DE LED PARA INDICAR TEMPERATURA REGULAR

int LEDALTO = 9; //PIN LUZ DE LED PARA INDICAR TEMPERATURA ALTA

int LEDPELIGROSO = 8; // PIN LUZ DE LED PARA INDICAR TEMPERATURA PELIGROSA

int VENTILADORES = 12;// PIN PARA PRENDER O APAGAR VENTILADORES

int ALARMA = 11; // PIN PARA ENCENDER O APAGAR ALARMA

int state = 0; // Variable lectrura dato serial

float TEMP = 12; // Usamos un pin de salida de la info de temperatura

int Vo; // VALOR DE LA ENTRADA ANALOGICA A0

float R1 = 1000; // resistencia fija del divisor de tension

float logR2, R2, TEMPERATURA;

float c1 = 2.229674985e-03, c2 = 1.211871252e-04, c3 = 8.713435086e-07;

//CONFIGURACION DE VOID SETUP QUE SOLAMENTE SE CORRE UNA VEZ

void setup() {

pinMode(ledPin, OUTPUT); //Declara pin de Salida

pinMode(VENTILADORES, OUTPUT); //Declara pin de Salida

pinMode(ALARMA, OUTPUT); //Declara pin de Salida

pinMode(TEMP, OUTPUT); // declaramos su salida

pinMode(LEDREGULAR, OUTPUT); // declaramos su salida

pinMode(LEDALTO, OUTPUT); // declaramos su salida

pinMode(LEDPELIGROSO, OUTPUT); // declaramos su salida

digitalWrite(ledPin, LOW); //Normalmente Apagado

Serial.begin(9600);

// CODIGO DE PROGRAMA DE APLICACION Y CONTROL DE TEMPERATURA DEL TERMISTOR

void loop() {

Vo = analogRead(A0); // lectura de A0

R2 = R1 * (1023.0 / (float)Vo - 1.0); // conversion de tension a resistencia

logR2 = log(R2); // logaritmo de R2 necesario para ecuacion

TEMPERATURA = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2)); // ecuacion S-H

TEMPERATURA = TEMPERATURA - 276.0; // Kelvin a Centigrados (Celsius)

TEMPERATURA= round(TEMPERATURA);

Serial.print("Temperatura: "); // imprime valor en monitor serie

Serial.print(TEMPERATURA);

Serial.println(" C");
if(TEMPERATURA >=0 &&TEMPERATURA <=10) {

digitalWrite(LEDREGULAR, HIGH);

digitalWrite(LEDALTO, LOW);

digitalWrite(LEDPELIGROSO, LOW);

if(TEMPERATURA >=11 &&TEMPERATURA <=20) {

digitalWrite(LEDREGULAR, LOW);

digitalWrite(LEDALTO, HIGH);

digitalWrite(LEDPELIGROSO, LOW);

if(TEMPERATURA >=21 &&TEMPERATURA <=30) {

digitalWrite(LEDREGULAR, LOW);

digitalWrite(LEDALTO, LOW);

digitalWrite(LEDPELIGROSO, HIGH);

if(Serial.available() > 0){

state = Serial.read();

delay(500); // demora de medio segundo entre lecturas

if (state == 'Q') {

digitalWrite(ledPin, HIGH); //PRENDEMOS LUZ DE EMERGENCIA

state = 0;

if (state == 'W'){

digitalWrite(ledPin, LOW); //APAGAMOS LUZ DE EMERGENCIA

state = 0;

if (state == 'E'){

digitalWrite(ALARMA, HIGH); // ACTIVAMOS SIRENA

state = 0;

if (state == 'R'){

digitalWrite(ALARMA, LOW);//DESACTIVAMOS SIRENA

state = 0;

if (state == 'T'){

digitalWrite(VENTILADORES, HIGH); // ACTIVAMOS VENTILADORES

state = 0;

if (state == 'Y'){

digitalWrite(VENTILADORES, LOW);//DESACTIVAMOS VENTILADORES


state = 0;

CIRCUITOS EN PROTEUS

Esta es la conexión que se tiene en Proteus para controlar lo que es el LCD y Display
del lado derecho con un Arduino y del lado izquierdo tenemos otro Arduino en conjunto
de dispositivos de bluetooth para simular el control del usuario y el envió de datos de la
terminal del Arduino.
Para explicar la conexión del Display de 7 segmentos a fondo es necesario ver este
diagrama eléctrico.

Se utiliza la multiplexación para activar un solo digito a la vez como habíamos dicho
antes. Los módulos se conectan en paralelo para activar los segmentos dentro del Display
y se activaran de acuerdo al valor que se envíen a sus salidas con el valor de modulo %
que se encuentra dentro del programa. El segDP está designado para manejar el punto
decimal pero solamente se utilizará en el Display índice 3 si lo vemos de derecha a
izquierda.
El iset controla simplemente el brillo del Display si colocamos la resistencia es para
regular la corriente al Display y que no se queme con demasiado voltaje. Se coloca el
capacitor para evitar los picos de corriente que pudieran entrar dentro del MAX.
PASOS NECESARIOS PARA CREAR PUERTOS VIRTUALES Y SIMULAR EL
DISPOSITIVO BLUETOOTH
Es necesario instalar este programa para poder simular que tenemos una conexión serial
con el Arduino y poder recibir y mandar información por el bus de datos el Arduino.

Cuando se haya instalado este programa y se haya abierto por primera vez, debemos crear
puertos virtuales para simular que en esos dos puertos hay dos conexiones de serial para
establecer uno de ellos sea la señal que sale del dispositivo bluetooth que se encuentra en
la cámara en conjunto con el termistor y la otra conexión virtual que estará conectado al
dispositivo de bluetooth para simular el envió de información del usuario al lugar de
trabajo. En mi caso fue el COM1 y el COM2.

Cuando nos abramos Proteus y tengamos instalado las librerías de Arduino y la de


bluetooth HC-05 de Arduino debemos establecer algunos valores.
• Los valores del monitor serial que tiene Proteus que es el RX y el TX deben ir
conectados ala entradas del dispositivo bluetooth de la simulación de celular en
TX y RX respectivamente es decir en sus inversos.
• Para el caso del bluetooth del dispositivo de Arduino de la planta, es necesario
conectarlo a un monitor serial en el que se mostrara las acciones del usuario y
pero igualmente se conecta RX con TX y TX con RX, pero se tiene que enviar
esta información también al Arduino por lo que la salida de TX del dispositivo
de bluetooth tiene que ir ala entrada TX del Arduino y la RX con la RX del
Arduino.
El paso siguiente es configurarlos internamente a los dispositivos bluetooth como
nosotros queramos, pero siguiendo los puertos virtuales del programa mencionado
anteriormente.

Al hacerle doble click al dispositivo de bluetooth debemos irnos únicamente ala


parte de puerto físico y establecer el puerto virtual que nosotros establecimos
anteriormente que para el ejemplo de este proyecto fue el COM1 y el COM2. Lo
demás se deja tal y como esta.
COMO ENVIAR EL CODIGO DEL ARDUINO AL PROTEUS
Para poder enviar el código del Arduino al proteus es necesario compilar el código ya
sea de la aplicación de celular o del Display se tiene que hacer los mismos pasar.
Primero compilamos y en la parte de la consola del Arduino aparecerá la ubicación
guardada del archivo. hex que es el que ocupa el arduino de proteus para poder correr el
programa, cabe señalar que cada vez que se abre proteus es necesario compilar de nuevo
el programa de Arduino y enviarle la dirección nueva al proteus o si no, no funcionara y
marcara error Proteus.

Pero primero tenemos que remarcar algo importante antes de compilar, en la parte del
Arduino nos iremos a herramientas y escogeremos la placa de Arduino Uno porque es la
que tenemos en el Proteus para simular, si fuera alguna otra diferente tendría que cambiar
el modelo de la placa, y si por error colocáramos otro modelo de placa y compiláramos y
lo mandáramos al Arduino del proteus este marcara error.
Una vez realizada la compilación del código únicamente tenemos que irnos a la parte
final de la consola de Arduino y desplazarnos un poco ala derecha y buscar la ubicación
donde se haya guardado el código del programa como archivo.hex y la copiamos y de
ahí nos vamos al Proteus.
Le damos doble clic a nuestro Arduino con la ubicación del archivo.hex ya sea del
código de la APP o del LCD y Display y colocamos la dirección que tenemos en la
parte que dice Program File. Y ya quedara listo para correr.
RESULTADOS DE SIMULACIÓN
PROGRAMA DE DISPLAY Y LCD

En la primera simulación le colocamos a nuestro termistor 21 grados centígrados que


podemos ver en nuestro Display de 7 segmentos doble. La luz de temperatura peligrosa
del dispositivo de la APP también se encuentra encendida indicando que esta muy caliente
la habitación y el usuario puede verlo, también tenemos en nuestro monitor serial la
temperatura saliente del termistor en dado caso que quisiéramos verlo en terminales de
control dentro de una empresa y también podemos verlo en la pantalla LCD la
temperatura junto con el mensaje de PELIGROSO.
En la segunda simulación colocamos un valor de 18 grados centígrados que entra en la
categoría de 11 grados centígrados a 20 y cómo podemos apreciar en la pantalla del
monitor serial sucede un retraso un poco corto del cambio de temperatura en la habitación.
Tenemos también el indicador de la aplicación de celular la luz amarilla que indica una
temperatura alta en la habitación. Por otra parte también el LCD muestra la temperatura
de la habitación y con el mensaje que categoriza la temperatura como ALTA.
Como tercer caso colocamos como ejemplo una temperatura de 9 grados centígrados en
la habitación el led de temperatura regular en la aplicación se encendió, en el caso de los
dos Display nos muestran una temperatura de 9 grados centígrados y en el LCD nos
muestra igual la temperatura, pero con el mensaje que categoriza esta temperatura como
REGULAR.
CASOS DE APP DE CELULAR

En estos casos vamos a dejar claro primero que el EMISOR es la persona con la aplicación
de celular desde alguna parte de su trabajo mientras que el RECEPTOR es el área de
trabajo controlable que recibe la información del usuario a distancia, en pantalla vemos
los leds que son indicadores en la misma app para que el usuario vea lo que está
sucediendo.
En este primer caso el usuario inserto la letra Q que es el código para encender la luz de
emergencia, pero solamente para probarla ya que la temperatura es regular.
En este segundo caso activamos el código con la letra E que es la encargada de encender
la alarma de emergencia de que la temperatura esta alta pero nuevamente es solamente
para probarlo.
En este caso tenemos el código con la letra T que es la encargada de activar los
ventiladores, lo que debemos poner atención es que la luz de emergencia y la alarma aun
no se han desactivado lo que damos a entender que aun la temperatura esta alta. Pero otro
punto importante a tocar es que los dispositivos que activo el usuario no se desactivan por
si solos el usuario tiene que desactivarlos de manera manual es por ello que el código de
Q y E aún siguen activos.
Para este caso pusimos a prueba el código de desactivación de la luz de emergencia que
era la letra W, en la pantalla del receptor podemos ver que ya le llego al sistema del lugar,
y apaga la luz de emergencia rápidamente.

En el siguiente caso usamos el código R que es el código de desactivación de la Alarma


o sirena del lugar, en el tablero de Proteus podemos observar que ya no se encuentra activa
por lo que ya no deberían de sonar en el lugar de trabajo.
Y en el ultimo caso usamos el código de desactivación de los ventiladores del lugar, el
código de desactivación es la letra Y, en la terminal virtual podemos ver que llego el
mensaje del emisor al receptor.
TABLA DE SATURACION
TEMPERATURA MEDICION
0 -1
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
13 13
14 14
15 15
16 16
17 17
18 18
19 19
20 20
21 21
22 22
23 23
24 24
25 25
26 26
27 27
28 28
29 29
30 29
31 30
32 31
33 32
34 33
35 34
36 35
37 35
38 37
39 37
40 38
41 39
42 39
43 40
44 41
45 42
46 42
47 43
48 44
49 45
50 46
51 46
52 47
53 48
54 49
55 49
56 50
57 51
58 51
59 52
60 53
61 54
62 54
63 55
64 56
65 56
66 57
67 58
68 58
69 59
70 60
71 60
72 61
73 62
74 62
75 63
76 64
77 64
78 65
79 66
80 66
81 67
82 67
83 68
84 69
85 69
86 70
87 71
88 71
89 72
90 73
91 73
92 73
93 74
94 75
95 76
96 76
97 76
98 77
99 78
100 78
340 -273
En esta tabla de saturación del programa, los valores tienden a variar con la temperatura
debido a que el programa estaba definido a un cierto rango de temperatura entonces en
este caso no contamos con números negativos pero puede hacerse el cambio en el código
para que pueda contarse pero eso incluirá tener otro Display o usar simplemente el punto
decimal pero seria algo confuso, el rango máximo de temperatura medible por este
programa es de 340 grados centígrados, pero nuevamente si se hacen ajustes en la formula
Steinhart-Hart con los valores de temperatura que nosotros queremos, el programa podrá
leer más temperaturas.
OTRO MODELO

Se hizo este otro circuito en un principio, pero hubo un problema con él, este residía en
que ya había una etapa de acondicionamiento pues el termistor estaba ubicado en el
puente de Wheatstone donde este era la resistencia desconocida y el valor de voltaje de
la fuente era aumentada por un amplificador de instrumentación. En un principio se
tomaba el valor de voltaje de la salida del amplificador de instrumentación pero como la
señal de inicio ya era modificada por el amplificador de instrumentación y el puente de
Wheatstone era afectado por la resistencia del termistor el calculo de la resistencia del
termistor tendía a ser muy difícil pues ocurría el caso de que solamente eran 3 resistencias
cuando tendía temperaturas muy altas y el caso de alimentación del A0 del Arduino no
tiende ser fijo es muy volátil y tiende a cambiar muy a menudo. Además, tuviéramos que
hacer ajustes en el programa debido a que la salida del amplificador de instrumentación
era un voltaje amplificado y las resistencias de este amplificador también tendía a afectar
el valor de salida.
Como conclusión había muchos factores de por medio en este tipo de circuito y los valores
de salida hubieran sido algo distantes a los que realmente hubiera tenido el termistor, es
por ello, que se opto por usar un divisor de voltaje para realizar el proyecto.
REFERENCIAS
LINK SOBRE TUTORIAL DE PROTEUS PASO A PASO
https://latecnicalf.com.ar/descargas/material/informaticaelectronica/Proteus%20Introduc
cion.pdf
LINK SOBRE TIPOS DE ACONDICIONAMIENTO DE SENSORES RESISTIVOS
https://tableroalparque.weebly.com/uploads/5/1/6/9/51696511/capitulo_acondicionamie
nto_de_sensores_resistivos.pdf
LINK SOBRES INFORMACION DEL ARDUINO Y CARACTERISTICAS
https://docs.google.com/document/preview?hgd=1&id=1rYaZQDZi_ILyT8KOYZ7eB
CxKyjd6-k95RE-9MKa1AvE
LINK PARA PROTEUS 8.8 CON LICENCIA HASTA 2099
https://www.youtube.com/watch?v=HxfFValobIQ
https://www.youtube.com/watch?v=yNp_DYcnFko
https://www.youtube.com/watch?v=Rru48DApb_o
LINK PARA LIBRERIAS DE ARDUINO EN PROTEUS
https://www.youtube.com/watch?v=k5GUOHJ3RCY
LINK PARA LIBRERIAS DE DISPOSITIVO BLUETOOTH DE ARDUINO EN
PROTEUS
https://www.youtube.com/watch?v=3eca175Thfg
NOTA: Para instalar las librerías de bluetooth del Arduino es necesario ver el video
anterior de librerías de Arduino para poder instalarlas ya que es el mismo proceso.
LINK PARA INFORMACION EXTRA SOBRE LIBRERÍA LEDCONTROL
https://arduwiki.perut.org/wiki/LedControl
LINK PARA INFORMACION EXTRA SOBRE LIBRERÍA LIQUIDCRYSTAL
https://eldesvandejose.com/2016/04/02/la-libreria-liquidcrystal/
LINK PARA PAGINA DE FORMULA STEINHART-HART
http://www.thinksrs.com/downloads/programs/Therm%20Calc/NTCCalibrator/NTCcal
culator.html
LINK PARA DESCARGA EL VIRTUAL SERIAL PORT
https://www.youtube.com/watch?v=S0jpOttqeXg

También podría gustarte