Integrado : servo, display, calculo temp

Dependencies:   mbed

Committer:
Sarahi
Date:
Fri Sep 05 14:32:51 2014 +0000
Revision:
1:0865dce20cf3
Parent:
0:7a2fe5b2b624
jij

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sarahi 0:7a2fe5b2b624 1 /*---------------------------------------------------------------------------------------------
Sarahi 0:7a2fe5b2b624 2 Instru_Tarea1
Sarahi 0:7a2fe5b2b624 3 Tarea 1 de la clase de instrumentación. Lee un sensor de temperatura y lo muestra en un
Sarahi 0:7a2fe5b2b624 4 display de 7 segmentos de 4 dígitos con presición de un decimal. Un motor servo se mueve
Sarahi 0:7a2fe5b2b624 5 dependiendo de la temperatura (actúa como indicador analógico).
Sarahi 0:7a2fe5b2b624 6
Sarahi 0:7a2fe5b2b624 7 Elementos empleados:
Sarahi 0:7a2fe5b2b624 8 * (1) Sensor de temperatura y humedad HMZ-433
Sarahi 0:7a2fe5b2b624 9 * (1) Resistencia de 10 Kohms
Sarahi 0:7a2fe5b2b624 10 * (1) Display de 7 segmentos de 4 digitos de ánodo común
Sarahi 0:7a2fe5b2b624 11 * (9) Resistencias de 100 ohms
Sarahi 0:7a2fe5b2b624 12 * (4) Transistores BC549
Sarahi 0:7a2fe5b2b624 13 * (1) Motor servo standard
Sarahi 0:7a2fe5b2b624 14
Sarahi 0:7a2fe5b2b624 15 Autores:
Sarahi 0:7a2fe5b2b624 16 * Sarahí Moran A00366454
Sarahi 0:7a2fe5b2b624 17 * Gerardo Carmona A00940517
Sarahi 0:7a2fe5b2b624 18
Sarahi 0:7a2fe5b2b624 19 Fecha última actualización:
Sarahi 0:7a2fe5b2b624 20 * 31/Ago/2014
Sarahi 0:7a2fe5b2b624 21
Sarahi 0:7a2fe5b2b624 22 Control de versiones:
Sarahi 0:7a2fe5b2b624 23 * 23/Ago/2014: Se hizo la programación inicial, terminando la lectura del sensor de
Sarahi 0:7a2fe5b2b624 24 temperatura, se pudo desplegar en el display de 7 segmentos la temperastura (solo
Sarahi 0:7a2fe5b2b624 25 números enteros)
Sarahi 0:7a2fe5b2b624 26 * 26/Ago/2014: Se pudo desplegar con un decimal de presición, se cambió el tiempo de la
Sarahi 0:7a2fe5b2b624 27 interrupción a 2.0 segundos.
Sarahi 0:7a2fe5b2b624 28 * 31/Ago/2014: Se realizarón mejores prácticas de programación, se agregaron los
Sarahi 0:7a2fe5b2b624 29 comentarios.
Sarahi 0:7a2fe5b2b624 30 ---------------------------------------------------------------------------------------------*/
Sarahi 0:7a2fe5b2b624 31
Sarahi 0:7a2fe5b2b624 32 //----- Librerias -----------------------------------------------------------------------------
Sarahi 0:7a2fe5b2b624 33 #include "mbed.h"
Sarahi 0:7a2fe5b2b624 34
Sarahi 0:7a2fe5b2b624 35 //----- Parametros ----------------------------------------------------------------------------
Sarahi 0:7a2fe5b2b624 36 // tiempo que permanece encendido cada segmento (en seg)
Sarahi 0:7a2fe5b2b624 37 #define TIME_ON 0.005
Sarahi 0:7a2fe5b2b624 38 // Constantes para el termistor
Sarahi 0:7a2fe5b2b624 39 #define AA 0.002301985
Sarahi 0:7a2fe5b2b624 40 #define BB 0.0002758611
Sarahi 0:7a2fe5b2b624 41 #define CC 0.000000416479325577
Sarahi 0:7a2fe5b2b624 42 // Parametros para el display 7 segmentos de 4 digitos
Sarahi 0:7a2fe5b2b624 43 #define TURN_OFF 0xFF
Sarahi 0:7a2fe5b2b624 44 #define N0 64
Sarahi 0:7a2fe5b2b624 45 #define N1 121
Sarahi 0:7a2fe5b2b624 46 #define N2 36
Sarahi 0:7a2fe5b2b624 47 #define N3 48
Sarahi 0:7a2fe5b2b624 48 #define N4 25
Sarahi 0:7a2fe5b2b624 49 #define N5 18
Sarahi 0:7a2fe5b2b624 50 #define N6 2
Sarahi 0:7a2fe5b2b624 51 #define N7 120
Sarahi 0:7a2fe5b2b624 52 #define N8 0
Sarahi 0:7a2fe5b2b624 53 #define N9 24
Sarahi 0:7a2fe5b2b624 54 #define S1 1
Sarahi 0:7a2fe5b2b624 55 #define S2 2
Sarahi 0:7a2fe5b2b624 56 #define S3 4
Sarahi 0:7a2fe5b2b624 57 #define S4 8
Sarahi 0:7a2fe5b2b624 58 #define LC 70
Sarahi 0:7a2fe5b2b624 59 #define ON 0
Sarahi 0:7a2fe5b2b624 60 #define OFF 1
Sarahi 0:7a2fe5b2b624 61
Sarahi 0:7a2fe5b2b624 62 //----- Puertos y objetos ---------------------------------------------------------------------
Sarahi 0:7a2fe5b2b624 63 DigitalOut on_led(LED_GREEN);
Sarahi 0:7a2fe5b2b624 64 // A B C D E F G
Sarahi 1:0865dce20cf3 65 BusOut display(PTB23, PTA2, PTC2, PTC3, PTB18, PTC4, PTD0);
Sarahi 0:7a2fe5b2b624 66 // S1 S2 S3 S4 (de izquierda a derecha)
Sarahi 0:7a2fe5b2b624 67 BusOut segmento(PTC16, PTC17, PTB9, PTA1);
Sarahi 1:0865dce20cf3 68 DigitalOut punto(PTD2); // Punto decimal
Sarahi 1:0865dce20cf3 69 DigitalOut punto_c(PTD3); // "°" para °C
Sarahi 0:7a2fe5b2b624 70 AnalogIn tem_pin (A0);
Sarahi 1:0865dce20cf3 71 PwmOut PWM1(D13); // Salida PWM para mover el servo
Sarahi 0:7a2fe5b2b624 72 Ticker temperatura; // Interrupción por tiempo para calcular la temperatura
Sarahi 0:7a2fe5b2b624 73 Ticker servo; // Interrupción por tiempo para mover el servo
Sarahi 0:7a2fe5b2b624 74
Sarahi 0:7a2fe5b2b624 75 //----- Variables -----------------------------------------------------------------------------
Sarahi 0:7a2fe5b2b624 76 volatile double tem; // Variable global para guardar el valor de tem en °C
Sarahi 0:7a2fe5b2b624 77 float t = 0;
Sarahi 0:7a2fe5b2b624 78
Sarahi 0:7a2fe5b2b624 79 //----- Prototipo funciones -------------------------------------------------------------------
Sarahi 0:7a2fe5b2b624 80 void prende(float num); // Funcion para determinar que numeros prender
Sarahi 0:7a2fe5b2b624 81 void prende_segmento(int num, int seg); // Funcion para encender el display
Sarahi 0:7a2fe5b2b624 82 void mover_servo (); // Funcion para mover el servo
Sarahi 0:7a2fe5b2b624 83 void calc_tem(); // Funcion para calcular el nuevo valor de temperatura
Sarahi 0:7a2fe5b2b624 84
Sarahi 0:7a2fe5b2b624 85 //----- Programa principal --------------------------------------------------------------------
Sarahi 0:7a2fe5b2b624 86 int main(){
Sarahi 0:7a2fe5b2b624 87 PWM1.period_ms(20); // Periodo de 20 ms
Sarahi 0:7a2fe5b2b624 88 display = TURN_OFF; // Apagar display (anodo comun)
Sarahi 0:7a2fe5b2b624 89 segmento = 0; // Ningun segmento seleccionado
Sarahi 0:7a2fe5b2b624 90 wait (2); // Espera antes de iniciar
Sarahi 0:7a2fe5b2b624 91 temperatura.attach(&calc_tem, 2.0); // Actualiza la medicion de temperatura cada 2.0 seg
Sarahi 0:7a2fe5b2b624 92 servo.attach(&mover_servo, 2.0); // Actualiza la posicion del servo cada 2.0 seg
Sarahi 0:7a2fe5b2b624 93
Sarahi 0:7a2fe5b2b624 94 while (true) {
Sarahi 0:7a2fe5b2b624 95 t = tem;
Sarahi 0:7a2fe5b2b624 96 //printf ("%d\n\r",x);
Sarahi 0:7a2fe5b2b624 97 prende(t);
Sarahi 0:7a2fe5b2b624 98
Sarahi 0:7a2fe5b2b624 99 }
Sarahi 0:7a2fe5b2b624 100 }
Sarahi 0:7a2fe5b2b624 101
Sarahi 0:7a2fe5b2b624 102 //----- Funciones -----------------------------------------------------------------------------
Sarahi 0:7a2fe5b2b624 103 void prende(float num){
Sarahi 0:7a2fe5b2b624 104 float decimal;
Sarahi 0:7a2fe5b2b624 105 int decenas, unidades;
Sarahi 0:7a2fe5b2b624 106
Sarahi 0:7a2fe5b2b624 107 decenas = num / 10;
Sarahi 0:7a2fe5b2b624 108 unidades = num - (decenas * 10);
Sarahi 0:7a2fe5b2b624 109
Sarahi 0:7a2fe5b2b624 110 decimal = num - decenas * 10 - unidades;
Sarahi 0:7a2fe5b2b624 111 decimal = decimal * 10;
Sarahi 0:7a2fe5b2b624 112
Sarahi 0:7a2fe5b2b624 113 prende_segmento(decenas, 1); // Segmento de decenas con su valor
Sarahi 0:7a2fe5b2b624 114 prende_segmento(unidades, 2); // Segmento de unidades
Sarahi 0:7a2fe5b2b624 115 prende_segmento((int)decimal,3); // Segmento de decimales
Sarahi 0:7a2fe5b2b624 116 prende_segmento(10,4); // Letra C
Sarahi 0:7a2fe5b2b624 117
Sarahi 0:7a2fe5b2b624 118 //printf("cen = %d, dec = %d, uni = %d\n\r", centenas, decenas, unidades);
Sarahi 0:7a2fe5b2b624 119 }
Sarahi 0:7a2fe5b2b624 120
Sarahi 0:7a2fe5b2b624 121 void prende_segmento(int num, int seg){
Sarahi 0:7a2fe5b2b624 122 switch (num){
Sarahi 0:7a2fe5b2b624 123 case 0: display = N0; break;
Sarahi 0:7a2fe5b2b624 124 case 1: display = N1; break;
Sarahi 0:7a2fe5b2b624 125 case 2: display = N2; break;
Sarahi 0:7a2fe5b2b624 126 case 3: display = N3; break;
Sarahi 0:7a2fe5b2b624 127 case 4: display = N4; break;
Sarahi 0:7a2fe5b2b624 128 case 5: display = N5; break;
Sarahi 0:7a2fe5b2b624 129 case 6: display = N6; break;
Sarahi 0:7a2fe5b2b624 130 case 7: display = N7; break;
Sarahi 0:7a2fe5b2b624 131 case 8: display = N8; break;
Sarahi 0:7a2fe5b2b624 132 case 9: display = N9; break;
Sarahi 0:7a2fe5b2b624 133 }
Sarahi 0:7a2fe5b2b624 134
Sarahi 0:7a2fe5b2b624 135 switch (seg){
Sarahi 0:7a2fe5b2b624 136 case 1:
Sarahi 0:7a2fe5b2b624 137 segmento = S1;
Sarahi 0:7a2fe5b2b624 138 break;
Sarahi 0:7a2fe5b2b624 139 case 2:
Sarahi 0:7a2fe5b2b624 140 segmento = S2;
Sarahi 0:7a2fe5b2b624 141 punto = ON;
Sarahi 0:7a2fe5b2b624 142 punto_c = ON; // Apaga el simbolo de °
Sarahi 0:7a2fe5b2b624 143 break;
Sarahi 0:7a2fe5b2b624 144 case 3:
Sarahi 0:7a2fe5b2b624 145 segmento = S3;
Sarahi 0:7a2fe5b2b624 146 punto = OFF;
Sarahi 0:7a2fe5b2b624 147 punto_c = OFF; // Prender el simbolo de °
Sarahi 0:7a2fe5b2b624 148 break;
Sarahi 0:7a2fe5b2b624 149 case 4:
Sarahi 0:7a2fe5b2b624 150 display= LC; // Desplega la C
Sarahi 0:7a2fe5b2b624 151 segmento = S4;
Sarahi 0:7a2fe5b2b624 152 break;
Sarahi 0:7a2fe5b2b624 153 }
Sarahi 0:7a2fe5b2b624 154 wait (TIME_ON); // Espera un instante
Sarahi 0:7a2fe5b2b624 155 }
Sarahi 0:7a2fe5b2b624 156
Sarahi 0:7a2fe5b2b624 157
Sarahi 0:7a2fe5b2b624 158 void calc_tem(){
Sarahi 0:7a2fe5b2b624 159 tem = tem_pin;
Sarahi 0:7a2fe5b2b624 160 tem = tem * 3.3;
Sarahi 0:7a2fe5b2b624 161 tem = (4.8*8.81) / tem - 8.81;
Sarahi 0:7a2fe5b2b624 162 // Utiliza la ecuacion de Steinhart–Hart
Sarahi 0:7a2fe5b2b624 163 // The Steinhart–Hart equation is a model of the resistance of a semiconductor at
Sarahi 0:7a2fe5b2b624 164 // different temperatures
Sarahi 0:7a2fe5b2b624 165 tem = (1 / (AA + BB * log(tem) + pow(CC * log(tem),3))) - 273.15;
Sarahi 0:7a2fe5b2b624 166
Sarahi 0:7a2fe5b2b624 167 //printf("Tem %f C \n\r", tem);
Sarahi 0:7a2fe5b2b624 168 }
Sarahi 0:7a2fe5b2b624 169
Sarahi 0:7a2fe5b2b624 170 void mover_servo(){
Sarahi 1:0865dce20cf3 171 int pulso = abs((tem - 29)) * 100 + 1000;
Sarahi 0:7a2fe5b2b624 172 if (pulso < 1000){
Sarahi 0:7a2fe5b2b624 173 pulso=1000;
Sarahi 0:7a2fe5b2b624 174 }
Sarahi 0:7a2fe5b2b624 175 else if (pulso > 2000){
Sarahi 0:7a2fe5b2b624 176 pulso=2000;
Sarahi 0:7a2fe5b2b624 177 }
Sarahi 0:7a2fe5b2b624 178 PWM1.pulsewidth_us(pulso);
Sarahi 0:7a2fe5b2b624 179 }