Sarahi Moran
/
Tarea1_instr_part1
Integrado : servo, display, calculo temp
main.cpp@1:0865dce20cf3, 2014-09-05 (annotated)
- Committer:
- Sarahi
- Date:
- Fri Sep 05 14:32:51 2014 +0000
- Revision:
- 1:0865dce20cf3
- Parent:
- 0:7a2fe5b2b624
jij
Who changed what in which revision?
User | Revision | Line number | New 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 | } |