Integrado : servo, display, calculo temp

Dependencies:   mbed

Revision:
0:7a2fe5b2b624
Child:
1:0865dce20cf3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Sep 03 01:12:24 2014 +0000
@@ -0,0 +1,179 @@
+/*--------------------------------------------------------------------------------------------- 
+    Instru_Tarea1
+    Tarea 1 de la clase de instrumentación. Lee un sensor de temperatura y lo muestra en un 
+    display de 7 segmentos de 4 dígitos con presición de un decimal. Un motor servo se mueve 
+    dependiendo de la temperatura (actúa como indicador analógico).
+ 
+    Elementos empleados:
+        * (1) Sensor de temperatura y humedad HMZ-433
+        * (1) Resistencia de 10 Kohms
+        * (1) Display de 7 segmentos de 4 digitos de ánodo común
+        * (9) Resistencias de 100 ohms
+        * (4) Transistores BC549
+        * (1) Motor servo standard
+ 
+    Autores:
+        * Sarahí Moran      A00366454
+        * Gerardo Carmona   A00940517
+ 
+    Fecha última actualización:
+        * 31/Ago/2014
+ 
+    Control de versiones:
+        * 23/Ago/2014: Se hizo la programación inicial, terminando la lectura del sensor de 
+        temperatura, se pudo desplegar en el display de 7 segmentos la temperastura (solo
+        números enteros)
+        * 26/Ago/2014: Se pudo desplegar con un decimal de presición, se cambió el tiempo de la
+        interrupción a 2.0 segundos.
+        * 31/Ago/2014: Se realizarón mejores prácticas de programación, se agregaron los
+        comentarios.
+---------------------------------------------------------------------------------------------*/
+ 
+//----- Librerias -----------------------------------------------------------------------------
+#include "mbed.h"
+ 
+//----- Parametros ----------------------------------------------------------------------------
+// tiempo que permanece encendido cada segmento (en seg)
+#define TIME_ON 0.005
+// Constantes para el termistor
+#define AA 0.002301985
+#define BB 0.0002758611
+#define CC 0.000000416479325577
+// Parametros para el display 7 segmentos de 4 digitos
+#define TURN_OFF 0xFF
+#define N0 64
+#define N1 121
+#define N2 36
+#define N3 48
+#define N4 25
+#define N5 18
+#define N6 2
+#define N7 120
+#define N8 0
+#define N9 24
+#define S1 1 
+#define S2 2
+#define S3 4
+#define S4 8
+#define LC 70
+#define ON 0
+#define OFF 1
+ 
+//----- Puertos y objetos --------------------------------------------------------------------- 
+DigitalOut on_led(LED_GREEN);
+             // A      B      C     D     E     F     G
+BusOut display(PTB18, PTB19, PTC1, PTC8, PTC9, PTC0, PTC7);
+            //  S1     S2     S3    S4  (de izquierda a derecha) 
+BusOut segmento(PTC16, PTC17, PTB9, PTA1);
+DigitalOut punto(PTC5);                 // Punto decimal
+DigitalOut punto_c(PTB23);              // "°" para °C
+AnalogIn tem_pin (A0);
+PwmOut PWM1(D5);                        // Salida PWM para mover el servo
+Ticker temperatura;                     // Interrupción por tiempo para calcular la temperatura
+Ticker servo;                           // Interrupción por tiempo para mover el servo
+ 
+//----- Variables -----------------------------------------------------------------------------
+volatile double tem;                    // Variable global para guardar el valor de tem en °C
+float t = 0;                       
+ 
+//----- Prototipo funciones -------------------------------------------------------------------
+void prende(float num);                 // Funcion para determinar que numeros prender
+void prende_segmento(int num, int seg); // Funcion para encender el display
+void mover_servo ();                    // Funcion para mover el servo
+void calc_tem();                        // Funcion para calcular el nuevo valor de temperatura
+ 
+//----- Programa principal --------------------------------------------------------------------
+int main(){
+    PWM1.period_ms(20);                 // Periodo de 20 ms
+    display = TURN_OFF;                 // Apagar display (anodo comun)
+    segmento = 0;                       // Ningun segmento seleccionado
+    wait (2);                           // Espera antes de  iniciar
+    temperatura.attach(&calc_tem, 2.0); // Actualiza la medicion de temperatura cada 2.0 seg
+    servo.attach(&mover_servo, 2.0);    // Actualiza la posicion del servo cada 2.0 seg
+ 
+    while (true) {
+        t = tem;
+        //printf ("%d\n\r",x);
+        prende(t);
+           
+    }
+}
+ 
+//----- Funciones ----------------------------------------------------------------------------- 
+void prende(float num){
+    float decimal;
+    int decenas, unidades;
+    
+    decenas = num / 10;
+    unidades = num - (decenas * 10);
+    
+    decimal = num - decenas * 10 - unidades;
+    decimal = decimal * 10;
+ 
+    prende_segmento(decenas, 1);        // Segmento de decenas con su valor
+    prende_segmento(unidades, 2);       // Segmento de unidades
+    prende_segmento((int)decimal,3);    // Segmento de decimales
+    prende_segmento(10,4);              // Letra C
+ 
+    //printf("cen = %d, dec = %d, uni = %d\n\r", centenas, decenas, unidades);
+}
+ 
+void prende_segmento(int num, int seg){
+    switch (num){
+        case 0: display = N0; break;
+        case 1: display = N1; break;
+        case 2: display = N2; break;
+        case 3: display = N3; break;
+        case 4: display = N4; break;
+        case 5: display = N5; break;
+        case 6: display = N6; break;
+        case 7: display = N7; break;
+        case 8: display = N8; break;
+        case 9: display = N9; break;
+    }
+   
+    switch (seg){
+        case 1: 
+            segmento = S1; 
+            break;
+        case 2:
+            segmento = S2;
+            punto = ON;
+            punto_c = ON;               // Apaga el simbolo de °
+            break;
+        case 3:
+            segmento = S3;
+            punto = OFF;
+            punto_c = OFF;              // Prender el simbolo de °
+            break;
+        case 4:
+            display= LC;                // Desplega la C
+            segmento = S4;
+            break;
+    }
+    wait (TIME_ON);                     // Espera un instante
+}
+ 
+ 
+void calc_tem(){
+    tem = tem_pin;
+    tem = tem * 3.3;
+    tem = (4.8*8.81) / tem - 8.81;
+    // Utiliza la ecuacion de Steinhart–Hart
+    // The Steinhart–Hart equation is a model of the resistance of a semiconductor at 
+    // different temperatures
+    tem = (1 / (AA + BB * log(tem) + pow(CC * log(tem),3))) - 273.15;
+    
+    //printf("Tem %f C \n\r", tem);
+}   
+
+void mover_servo(){
+    int pulso = (tem - 20) * 100 + 1000;
+    if (pulso < 1000){
+        pulso=1000;
+       }
+         else if (pulso > 2000){
+          pulso=2000;
+          }
+    PWM1.pulsewidth_us(pulso);
+} 
\ No newline at end of file