Seguramente recordaras que en nuestros primeros pasos mencionamos que Arduino cuenta con pines Analógicos, pero... ¿Qué tienen de diferencia con los digitales? ¿Sirven de la misma manera?
Para aclarar todas tus preguntas vamos a definir que es una señal analógica. Una señal analógica es nos arrojara valores de la tensión o voltaje, los cuales estarán en un constante cambio, provocando que puedan tomar cualquier valor. A esto le llamaremos corriente alterna, la cual puede poseer 2 estados: un estado con un valor con signo positivo (+) a lo largo de un medio ciclo y va a decaer con un signo negativo (–) en el medio ciclo siguiente.
Como podrás ver, es muy similar a la definición que se le otorga a las señales digitales, pero a diferencia de estas Arduino no es capaz se trabajar con señales analógicas, Entonces... ¿Cómo será posible leer este tipo de señales? Pues bien, vamos a necesitar convertir la señale analógica en una señal digital, así Arduino será capaz de reconocerlas y trabajar con ellas.
En la placa de Arduino vamos a tener convertidores de analógico a digital, estos se encontraran en los pines A0 a A6 El convertidor contara con una resolución de 10 bits, lo que permite devolver enteros en un intervalo de 1023 a 0. Una ventaja que tienen estos pines es la dualidad que tienen, pero ¿a qué nos referimos? Esto quiere decir que podemos usar los pines analógicos como pines digitales.
Te tenemos malas noticias... a comparación de las salidas analógicas, en Arduino.... no existen las salidas analógicas, así que aquí termina el tutorial. Gracias a todos... ‚ ¡Mentira! si bien no existen las salidas analógicas en su lugar estan los PWM, pero ¿Qué son los PWM?
Los PWM son modulación por ancho de pulsos (por sus siglas en ingles), este tipo de pulsos va a permitir que usemos los pines digitales como salidas analógicas. Este metodo va a permitir reconfigurar los ciclos de trabajo de la señal periódica, permitiendo controlar la energía que se va a enviar a una carga o para transmitir información por medio de canales. El ciclo de trabajo de una señal periódica es el ancho relativo de su parte positiva en relación con el período. duty cycle = (tiempo que la salida está a uno o HIGH)/ (periodo de la función). Hablando del ciclo de trabajo de una señal periódica es el ancho relativo de su parte positiva con respecto al periodo y podremos definirlo como duty cycle - (HIGH o tiempo de salida en uno)/ (periodo de la función).
Aunque tenemos que aclararte que esto solo sucede en Arduino uno, si cuentas con otro tipo de Arduino, por ejemplo Arduino Due, este si va a poseer salidas analógicas, pero como nosotros estaremos trabajando con una placa Arduino uno, nos vamos a enfocar en sus especificaciones.
En Arduino, vamos a tener diferentes funciones las cuales vamos a poder utilizar I/O analógicos, estas son:
analogWrite() – escribe un valor analógico (onda PWM) al pin especificado. No en todos los pines digitales se puede aplicar PWM.
analogRead() – lee el valor del pin analógico especificado.
analogReference() – configura la referencia de voltaje usada para la entrada analógica.
Ajale, un poquito más complejo que las I/O digitales ¿Cierto? pero no te preocupes, seguramente con algún proyecto podrás entender mejor el uso de estos conceptos.
Para esto vamos a necesitar
Arduino
Cable USB
LED's (de cualquier color )
Cables jumpers (de preferencia de colores diferentes)
Resistencias de 4.70 kOhm
Piezo
Sensor de gas
Protoborad
Vamos a comenzar haciendo unos puentes para que toda la placa este conectada al Arduino. Utilizando nuestro cable jumper negro, una punta la vamos a conectar en el agujero de "GND" del Arduino, la otra punta la vamos a conectar en la segunda columna de la protoboard, justo donde esta la figura de "menos". Ahora, con ayuda de otro jumper negro, vamos a interconectar las columnas de tierra de la protoboard, una de las puntas ira en la segunda columna mientras que la otra punta ira hasta la última columna. Seguimos con un jumper amarillo, una punta la vamos a conectar en el agujero de "5V" del Arduino, la otra punta estara conectada en la primera columna, justo donde esta la figura de "mas".
Es turno de conectar nuestro piezo, como podrás ver, también tiene dos patas, una negativa y una positiva. El piezo lo vamos a colocar de tal modo que la pata negativa este en la columna "d" y la positiva en la columna "h". Ahora vamos con un jumper negro, una punta estará contigua a la pata negativa, la otra punta estará en la segunda columna. Con un jumper verde, una punta estará contigua a la pata positiva, la otra punta estará conectada en el pin 13 del Arduino. Recuerda que tú puedes conectarla en cualquier pin.
Llego el turno de nuestro sensor de gas. Este posee 6 patas, sus nombres son A1, H1, A2, por otro lado vamos a tener B1, H2 y B2. Aquí vamos a tener que elegir cuál lado a funcionar como positivo y negativo, nosotros vamos a elegir las patas A1, H1 y A2 como negativo, mientras que B1, H2 y B2 como positivo.
Ahora, vamos hacer un punte para las 3 patas de nuestro lado positivo, con jumpers amarillos, una punta esta contigua a la pata B1 y la otra estará en la primera columna, siguiendo una linea horizontal. De la misma manera vamos a conectar las patas B2 y H2 de manera paralela a B1. Ahora, en el caso del lado negativo, vamos utilizar nuestra resistencia, una punta la colocaremos contigua a la pata A1 y la otra punta estará en la ultima columna. Analogamente para la pata H1, solo que vamos a sustituir la resistencia por un jumper negro. Por último, con un jumper azul vamos a conectar una punta en el pin A0 de ANALOG IN y la otra punta estara colocada contigua a la pata A2.
Y listo, hemos terminado de ensamblar todas las piezas de nuestro detector de humo. A continuación te dejamos el sketch que vamos a utilizar para poder programar nuestra placa.
Primero lo primero, vamos a declarar nuestras variables. La primera de ellas será la variable "gas" que se encargara de la lectura del sensor y no le otorgaremos ningún valor asociado, el programa se encargara de eso. La segunda variable piezo, que igualaremos al pin 13.
Ahora vamos a identificar nuestro sensor como una entrada, en el pin A0, que es donde conectamos el sensor y este es el que le brindara los datos al Arduino (ahora puedes ir entendiendo el porque análogo y entrada), por lo que escribiremos "pinMode(A0, INPUT);"
La siguiente linea estará el piezo, este lo configuraremos como una salida, te preguntaras ¿por qué?... Esto es porque el piezo fungirá como el detector y este va a emitir un sonido en caso de que detecte el humo. Entonces el sensor se encargara de llevar la información al Arduino, este enviara la información hacia el piezo, por lo que escribiremos "pinMode(piezo, OUTPUT);".
Continuamos con el loop. Aquí vamos a igualar la variable gas a la lectura analógica del pin A0 y procedemos a condicionar. Si el valor de gas es igual o mayor a 600, pero ¿por qué este valor? Fácil, siempre hay que mirar el instructivo de nuestros sensores, este nos indica que tiene una lectura de 760, así que si cambiamos el valor de 600 por 760 funcionara de la misma manera, pero recordemos que estamos haciendo un detector, este deberá avisarnos con anticipación de un accidente, de todos modos tu puedes ir jugando con este valor dependiendo de lo que busques o de tu experiencia.
Ahora, vamos a configurar el tono de nuestro piezo bajo los siguientes parametros, el pin en el que se encuentra. frecuencia con la que emite el sonido y la duración del tono (en milisegundos). Los últimos dos parametros podrás configurarlos como gusten, ya que podrás jugar con la frecuencia con la que suene el tono, aquí no importa tanto, ya que, solo buscamos que haga un tono para que nos de la señal de alarma, y el tiempo podrás elegir el la duración de este.
!Hemos terminado! ahora vamos a comprobar que funciona.
Cabe aclarar que al tratarse de un gif, este no podrá emitir el sonido, pero puedes apreciar en el momento en el que se acerca el gas, el piezo comienza a destellar unas ondas de sonido, indicando que esta sonando.
Para esto vamos a necesitar
Arduino
Cable USB
LED's (de color rojo)
Cables jumpers (de preferencia de colores diferentes)
Resistencias de 220 kOhm
Sensor de temperatura
Protoborad
¿Recuerdas como a lo largo de este tutorial hemos conectado y conectado LED's? Pues bien, esta no es la excepción, vamos a conectar los 3 LED's rojos de la misma forma de siempre, con una resistencia en cada cátodo y un jumper en el ánodo, al ser 3 le vamos asignar un jumper de diferente color a cada LED en un pin diferente, vamos a conectarlos en los pin 2, 3 y 4.
Con un jumper de color negro, vamos a conectar la tierra de la protoboard con el del Arduino, una punta ira conectada en el pin GND y la otra punta en la columna negativa de la protoboard. Lo mismo vamos hacer con el voltaje, vamos a usar un jumper amarillo, una de las puntas estará conectada en el pin 5V y la otra punta en la columna positiva de la protoboard.
Por último vamos a conectar nuestro sensor de temperatura, este lo colocaremos en alguna de las columnas contiguas a los led. Podrás ver que este posee 3 conexiones: potencia, Vout y GND, vamos a comenzar haciendo un puente para la potencia, usaremos un jumper de color amarillo, un apunta la vamos a conectar debajo de la conexión potencia, la otra punta la vamos a conectar en la columna positiva.
Ahora usaremos un jumper de color verde, un apunta la vamos a conectar debajo de la conexión Vout y la otra punta la vamos a conectar en el pin A0 del Arduino. Usando un jumper de color negro, vamos a crear un punte, un apunta la vamos a conectar en la columna negativa de la protoboard y la otra punta la vamos a conectar debajo en la conexión GND.
Hemos terminado de ensamblar nuestro proyecto, ahora vamos a la parte de la programación.
A diferencia de nuestros primeros proyectos, ahora vamos a comenzar por declarar constantes en lugar de variables, esto lo haremos con "const".
Vamos a declarar una constante del tipo entero con el nombre "sensortemp" y lo vamos a igualar al pin correspondiente al sensor, en este caso A0; en la siguiente linea vamos a declarar una constante del tipo flotante "float" con el nombre "tempref" este será la temperatura de referencia para que, al momento de encenderlo, el Arduino sepa que temperatura marca el sensor sin que haya algo cerca. En este caso vamos a igualarlo a 24.71, mas adelante sabras de donde sale este valor.
Vamos a iniciar con un "Serial.begin(9600)" seguido de un ciclo for del tipo contador, esto quiere decir que vamos a determinar la repetición de un ciclo.
Comenzamos declarando una variable de tipo entero con el nombre "numeropin" y lo igualamos al pin 2, esa misma variable le escribiremos "numeropin<5" y un "numeropin++" solo estamos indicando que suba 2 números mas desde el inicio pero que sea menor al pin 5.
Dentro del for, escribimos "pinMode(numeropin,OUTPUT);" aquí indicamos que cada vez que el ciclo avance, numeropin va ir apagandose. Ahora, para que se apaguen los LED vamos a escribir la siguiente linea "digitalWrite(numeropin,LOW);". Sino hubieramos usado el ciclo for, todo esto lo hubiéramos escrito 3 lineas por cada "pinModo" y "digitalWrite" lo que nos enseña que con los ciclos for, podemos simplificar nuestros códigos y con forme avancemos veras que estos ciclos son de mucha ayuda.
Vamos a declara una variable de tipo entero con el nombre "ValorSensor" y vamos a igualar al valor que va a leer de la entrada analógica, teniendo "ValorSensor=analogRead(sensortemp);" recordemos que sensortemp tiene el valor del pin analógico A0.
Vamos a escribir las siguientes dos lineas "Serial.print("Valor del sensor: ");" y "Serial.print(ValorSensor);", esto para conocer el valor de referencia real que marca nuestro sensor, muy bien al inicio pudiste escribir un valor cualquiera, pero al correr el código, veras que marca el valor de 24.71, entonces en caso de que al inicio hayas escrito un valor diferente, es momento de corregirlo.
Ahora, te estaras preguntando, cómo es que vamos a conocer el valor de la temperatura. Pues bien, esto lo vamos a conocer mediante la tensión que se genera en el pin, entonces vamos a convertir la tensión a temperatura y vamos a enviar este valor a la computadora. En este momento no vamos a adentrar de como es que se hace, solo debes saber que por cada 10 mili voltios de cambio en la tensión, va a equivaler a un cambio de 1 grado Celsiu y todo esto lo vamos a escribir en nuestras siguientes lineas. Declaramos como "float" la variable "Tension=(ValorSensor/1024.0)*5.0;" lo igualamos a "ValorSensor" que es la variable que almacena el valor leido de manera analógica, dividido por 1024.0 multiplicando por 5.0. Con esta linea vamos a conocer la tensión que recibe el sensor y para conocer dicho valor vamos a escribir "Serial.print(", Voltios: ");" y "Serial.print(Tension);" para que cuando iniciemos el programa, nos muestre los valores que lee.
Ahora vamos a convertir la tensión en temperatura, declaramos un float con la variable "temperatura" tal que "Temperatura=(Tension-0.5)*100;" (recuerda que esta conversión la mencionamos anteriormente) y si quieres ver la traducción de todo esto, de nueva cuenta escribimos "Serial.print(", Grados C: ");" y "Serial.println(Temperatura);"
Has programado mucho. Toma un descanso y continua con el código. ¡Ya falta poco!
Ahora, vamos utilizar la temperatura de referencia para después ir aumentando 2 grados para cada LED rojo. Por ende, si acercamos un objeto con una temperatura de 26 grados, se encenderá 1 LED y con una temperatura de 30 grados, se encenderán los 3 LED's.
Sabiendo esto, vamos a comenzar escribiendo nuestra condición, la cual es... Si mi temperatura es menor a la temperatura de referencia, los LED's no se encenderán.
en código quedaria tal que:
if(Temperatura<tempref){
digitalWrite(4,LOW);
digitalWrite(3,LOW);
digitalWrite(2,LOW);
}
Ahora, vamos a poner una condición anidada con else if, teniendo una condición tras una condición, por así decirlo. Dado que necesitamos que un LED se encienda cuando la temperatura de referencia tenga dos grados más, vamos a escribir:
else if(Temperatura>=tempref+2&&Temperatura<tempref+4){
digitalWrite(4,HIGH);
digitalWrite(3,LOW);
digitalWrite(2,LOW);
}
Así es como vamos a condicionar que cuando haya solamente 2 grados de mas, se encienda 1 solo LED, siguiendo esta misma lógica, vamos a seguir condicionando para que los 2 LED's esten encendidos bajo las mismas condiciones, pero por cada nueva condición. Vamos agregar 2 grados, teniendo que en la siguiente sea "else if(Temperatura>=tempref+4&&Temperatura<tempref+6)" pero para que los 3 esten encendidos y dado que no hay mas LED's vamos a cambiarlo por "else if(Temperatura>=tempref+6)" ya que, es el límite e indicamos que se enciendan los 3.
Por último, para un mejor funcionamiento agregamos un delay de 100 milisegundos.
Al fin... hemos acabado el que, hasta el momento, es nuestro proyecto más complejo en cuanto a la programación, pero ¡Hey! Nos falta probarlo, vamos a ello.
Aquí podeos ver que con con si agregamos un grado de más con respecto a la referencia, tenemos un LED encendido, conforme vamos aumentando se van encendiendo 2, 3 LED's, y si es menor a la referencia, no se encenderá ninguna. ¡Felicidades lo hemos logrado!