Professional Documents
Culture Documents
Electrnica y Telecomunicaciones
Cedula: 2-732-497
Introduccin
En este proyecto vamos a aprender a implementar un sensor de temperatura, en este proyecto simularemos seis estados de aviso de exceso de temperatura, sobre los cuales los cuales podramos conectar cualquier elemento que quisiramos que actuara llegado dicho nivel, podramos conectar circuitos de ventilacin de manera que si no consiguieran mitigar el exceso de calor llegara un punto que desconectara el sistema que estemos monitorizando, en resumen, en cualquier lugar donde un control de exceso de temperatura sea necesario.
Material necesario para este proyecto: 1 x Arduino Uno 1 x Protoboard 1 x NTC 1 x Potencimetro 10k 6 x Diodos LED 6 x Resistencias 220 1 x Resistencia 1K 1 x Juego de Cables
Diseando el hardware
En este nuevo proyecto Arduino tenemos que conseguir, mediante una NTC (Negative Temperature Coefficient o Coeficiente de Temperatura Negativo) activar 6 salidas de nuestro Arduino, una de esas salidas nos mostrar que la temperatura est por debajo del nivel crtico, y a partir de ese nivel, ir activando una salida tras otra cada dos grados que aumente la temperatura. Adems vamos a colocar un potencimetro para ajusta la temperatura, a partir de la cual, nos empezar a lanzar los avisos. Visto esto, estructuremos el circuito en tres partes: Entrada de temperatura ambiente. Entrada de ajuste mnimo de temperatura. Salidas.
En cuanto a la otra resistencia que formar el divisor de tensin, utilizaremos una de 1K, esto es as para aprovechar el rango de muestreo que nos proporciona Arduino con un consumo de corriente limitado, veamos rpidamente el motivo.
Veremos que si la resistencia mxima de nuestra NTC va a ser 10K, y la fija de 1K, tendremos una variacin de tensin entre 0v y 4,55v. Podis hacer cuentas vosotros mismos con otros valores y veris que si aumentamos la resistencia, disminuye el rango de Vout, y si la disminuimos, aumentar los consumos de corriente en exceso. Entrada de ajuste mnimo de temperatura. Para tener un mando sobre el que ajustar la temperatura mnima, simplemente colocaremos un potencimetro dispuesto como divisor de tensin, a una de las entradas analgicas y utilizaremos su muestreo para mapearlo a nuestro antojo como veremos en la seccin de programacin. Salidas. Para las salidas utilizaremos la ya conocida configuracin de LED ms resistencia. De manera que el esquema elctrico global nos quedara as:
Cdigo original
//Aadimos la librera math.h #include <math.h> //Pines para los LED int pinLed1 = 8; int pinLed2 = 9; int pinLed3 = 10; int pinLed4 = 11; int pinLed5 = 12; //Pines para las entradas analgicas int analogPin1 = 0; int analogPin2 = 1; //Escala de Avisos int escala = 2; //Variable para la temperatura de disparo double tempMin = 0.0; //Datos para las ecuaciones float Vin = 5.0; // [V] Tensin alimentacin del divisor float Rfija = 1000; // [ohm] Resistencia fija del divisor float R25 = 2800; // [ohm] Valor de NTC a 25C float Beta = 3900.0; // [K] Parmetro Beta de NTC float T0 = 293.15; // [K] Temperatura de referencia en Kelvin float Vout = 0.0; float Rntc = 0.0; // [V] Variable para almacenar Vout // [ohm] Variable para NTC en ohmios Temperatura salida en Kelvin Temperatura salida en Celsius
float TempK = 0.0; // [K] float TempC = 0.0; // [C] void setup() {
//Declaramos pines de salida pinMode(pinLed1, OUTPUT); pinMode(pinLed2, OUTPUT); pinMode(pinLed3, OUTPUT); pinMode(pinLed4, OUTPUT); pinMode(pinLed5, OUTPUT); //Y los pines de entrada pinMode(analogPin1, INPUT); pinMode(analogPin2, INPUT); } void loop() { //Primero leemos el potencimetro tempMin = analogRead(analogPin2); //Lo mapeamos a valores de -100 a 800 tempMin = map (tempMin, 0, 1023, -100, 800); //Y lo dividimos entre 10 para darle un decimal tempMin = tempMin/10; //Y lanzamos el ajuste establecido via serie Serial.println(-----------------------------------------------); Serial.println(); Serial.print(AJUSTE DE TEMPERATURA MINIMA A ); Serial.print(tempMin); Serial.println( GRADOS CELSIUS); Serial.println(); Serial.println(-----------------------------------------------); //Y ahora calculamos la Temperatura //Primero la Vout del divisor Vout=(Vin/1024)*(analogRead(analogPin1)); //Ahora la resistencia de la NTC Rntc=(Vout*Rfija)/(Vin-Vout);
//Y por ltimo la temperatura en Kelvin TempK = Beta/(log(Rntc/R25)+(Beta/T0)); //Y ahora la pasamos a celsius TempC = TempK-273.15; //Y lo mostramos por puerto serie Serial.println(); Serial.print(LA TEMPERATURA DE LA NTC ES DE ); Serial.print(TempC); Serial.println( GRADOS CELSIUS); Serial.println(); //Ahora las comparaciones para las salidas if(TempC < tempMin) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, LOW); digitalWrite(pinLed3, LOW); digitalWrite(pinLed4, LOW); digitalWrite(pinLed5, LOW); } else if (((TempC <= (tempMin + escala)) & (TempC > tempMin))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, LOW); digitalWrite(pinLed4, LOW); digitalWrite(pinLed5, LOW); } else if (((TempC<=(tempMin+(escala*2)))&(TempC>tempMin+escala))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, LOW);
digitalWrite(pinLed5, LOW); } else if ((TempC<=(tempMin+(escala*3)))&(TempC>tempMin+(escala*2))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, HIGH); digitalWrite(pinLed5, LOW); } else if (TempC > (tempMin + (escala*4))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, HIGH); digitalWrite(pinLed5, HIGH); } delay(500); }
Divisor de tensin:
Proyecto construido:
Codigo Final
//Aadimos la librera math.h #include <math.h> //Pines para los LED int pinLed1 = 4; int pinLed2 = 5; int pinLed3 = 6; int pinLed4 = 7; int pinLed5 = 8; int pinLed6 = 9;
//Pines para las entradas analgicas int analogPin1 = 2; int analogPin2 = 3; //Escala de Avisos int escala = 2; //Variable para la temperatura de disparo double tempMin = 0.0; //Datos para las ecuaciones float Vin = 5.0; // [V] Tensin alimentacin del divisor float Rfija = 1000; // [ohm] Resistencia fija del divisor float R25 = 60000; // [ohm] Valor de NTC a 25C float Beta = 5000; // [K] Parmetro Beta de NTC float T0 = 293.15; // [K] Temperatura de referencia en Kelvin float Vout = 0.0; float Rntc = 0.0; // [V] Variable para almacenar Vout // [ohm] Variable para NTC en ohmios Temperatura salida en Kelvin Temperatura salida en Celsius
float TempK = 0.0; // [K] float TempC = 0.0; // [C] void setup() {
Serial.begin(9600); //Declaramos pines de salida pinMode(pinLed1, OUTPUT); pinMode(pinLed2, OUTPUT); pinMode(pinLed3, OUTPUT); pinMode(pinLed4, OUTPUT); pinMode(pinLed5, OUTPUT); pinMode(pinLed6, OUTPUT);
//Y los pines de entrada pinMode(analogPin1, INPUT); pinMode(analogPin2, INPUT); } void loop() { //Primero leemos el potencimetro tempMin = analogRead(analogPin2); //Lo mapeamos a valores de -100 a 800 tempMin = map (tempMin, 0, 1023, -100, 800); //Y lo dividimos entre 10 para darle un decimal tempMin = tempMin/10; //Y lanzamos el ajuste establecido via serie Serial.println(-----------------------------------------------); Serial.println(); Serial.print(AJUSTE DE TEMPERATURA MINIMA A ); Serial.print(tempMin); Serial.println( GRADOS CELSIUS); Serial.println(); Serial.println(-----------------------------------------------); //Y ahora calculamos la Temperatura //Primero la Vout del divisor Vout=(Vin/1024)*(analogRead(analogPin1));
//Ahora la resistencia de la NTC Rntc=(Vout*Rfija)/(Vin-Vout); //Y por ltimo la temperatura en Kelvin TempK = Beta/(log(Rntc/R25)+(Beta/T0)); //Y ahora la pasamos a celsius TempC = TempK-273.15; //Y lo mostramos por puerto serie Serial.println(); Serial.print(LA TEMPERATURA DE LA NTC ES DE ); Serial.print(TempC); Serial.println( GRADOS CELSIUS); Serial.println(); //Ahora las comparaciones para las salidas if(TempC < tempMin) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, LOW); digitalWrite(pinLed3, LOW); digitalWrite(pinLed4, LOW); digitalWrite(pinLed5, LOW); digitalWrite(pinLed6, LOW);
} else if (((TempC <= (tempMin + escala)) & (TempC > tempMin))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, LOW); digitalWrite(pinLed4, LOW); digitalWrite(pinLed5, LOW); digitalWrite(pinLed6, LOW);
} else if (((TempC<=(tempMin+(escala*2)))&(TempC>tempMin+escala))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, LOW); digitalWrite(pinLed5, LOW); digitalWrite(pinLed6, LOW);
} else if ((TempC<=(tempMin+(escala*3)))&(TempC>tempMin+(escala*2))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, HIGH); digitalWrite(pinLed5, LOW); digitalWrite(pinLed6, LOW); }
else if ((TempC<=(tempMin+(escala*4)))&(TempC>tempMin+(escala*3))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, HIGH); digitalWrite(pinLed5, HIGH); digitalWrite(pinLed6, LOW); } else if (TempC > (tempMin + (escala*5))) { digitalWrite(pinLed1, HIGH); digitalWrite(pinLed2, HIGH); digitalWrite(pinLed3, HIGH); digitalWrite(pinLed4, HIGH);