Medición de Temperatura y Distancia en tiempo real presentado en una pantalla LCD.

Dependencies:   mbed HCSR04 MEDIDORCORRIENTEVOLTAJEYPOTENCIA

Medición de Temperatura y Distancia en tiempo real presentado en una pantalla LCD.

DESCRIPCIÓN:

Se desea realizar las medición de temperatura y distancia en tiempo real, los valores medidos se mostrarán en una pantalla de de 20X4 (caracteresxlíneas) vía I2C; ademas se establece dos alarmas visuales por rangos (20cm > d <20 cm); si la distancia es mayor a 20 cm la pantalla nos mostrara un mensaje de fuera de rango.

Materiales y Dispositivos a emplear:

-Sensor de temperatura LM35 -Pantalla LCD 20x4 con luz de fonfo azul con interfaz I2C -Sensor ultrasonico hc-sr04 - Discovey board STM32F4 - Piout STM32F4 - Protoboard

Breve descripción de funcionamiento de los los sensores

Sensores ultrasónicos: Emite un sonido y mide el tiempo que la señal tarda en regresar. Estos se reflejan en un objeto, el sensor recibe el eco producido y lo convierte en señales eléctricas, las cuales son elaboradas en el aparato de valoración. Estos sensores trabajan solamente donde tenemos presencia de aire (no pueden trabajar en el vacío, necesitan medio de propagación), y pueden detectar objetos con diferentes formas, diferentes colores, superficies y de diferentes materiales. Los materiales pueden ser sólidos, líquidos o polvorientos, sin embargo han de ser deflectores de sonido. Los sensores trabajan según el tiempo de retorno del eco, es decir, se valora la distancia temporal entre el impulso de emisión y el impulso del eco.

Terminales y Conexiones: Sensor Ultrasónico: Vcc............5; Trigger...Din; Echo........Dout==>Din en STM32; Ground...GND

https://os.mbed.com/media/uploads/edinson/hc-sr04.jpg

Sensor de temperatura: El LM35 es un circuito electrónico sensor que puede medir temperatura. Su salida es analógica, es decir, te proporciona un voltaje proporcional a la temperatura. El sensor tiene un rango desde −55°C a 150°C. Su popularidad se debe a la facilidad con la que se puede medir la temperatura. Incluso no es necesario de un microprocesador o microcontrolador para medir la temperatura. Dado que el sensor LM35 es analógico, basta con medir con un multímetro, el voltaje a salida del sensor.

Terminales y Conexiones. Sensor de temperatura: Pin1 .....4-20V; Pin2....Out; Pin3....GND

https://os.mbed.com/media/uploads/edinson/lm35.jpg

Diagramas Referenciales: A continuación adjuntamos los siguientes diagramas reverenciales, para la conexiones de los sensores de temperatura , distancia y LCD.

Diagrama para Conexión LCD

https://os.mbed.com/media/uploads/edinson/diagrama_lcd_1024x1024.png

Diagrama para Conexión Sensor LM35

https://os.mbed.com/media/uploads/edinson/diagrama_lm35.png

Diagrama para Conexión Sensor ultrasonico hc-sr04 https://os.mbed.com/media/uploads/edinson/diagrama_ultrasonico.jpg

Pruebas del Sistema:

Si la distancia es menor a 20 cm; el sistema presenta los siguientes datos en la pantalla LCD. Linea 1 : Datos de temperatura en (°C). Linea 2: Voltaje de trabajo del sensor de temperatura en (mv). Linea 3: Datos de distancia en (cm). Linea 4: Tiempo de lectura en (ms).

https://os.mbed.com/media/uploads/edinson/dastos_normales.jpg

Si la distancia es mayor a 20 cm; el sistema presenta los siguientes datos en la pantalla LCD. Linea 2: Datos de distancia en (cm)). Linea 3: Mensaje "Fuera de Rango".

https://os.mbed.com/media/uploads/edinson/fuera_de_rango.jpg

Observaciones: -Para la presentaciones del mensaje de fuera de rango se aplico la condición IF para que cuando la distancia esta mayor de 20cm el mensaje principal sea interrumpido y se quede dentro de esa rutina hasta que su valor de distancia cambie (menor a 20cm).

https://os.mbed.com/media/uploads/edinson/rutina_fuera_de_rango.png

-Dentro de esta rutina se observo que la pantalla parpadeaba , esto se corrigió disminuyendo el tiempo de espera a 0,1 y aumentando el tiempo de espera en la rutina if (d<20) {.

Files at this revision

API Documentation at this revision

Comitter:
edinson
Date:
Sat Feb 15 15:49:23 2020 +0000
Parent:
1:49382e23d412
Commit message:
Proyecto Final

Changed in this revision

HCSR04.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/HCSR04.lib	Sat Feb 15 15:49:23 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/aralshukaili/code/HCSR04/#0bda99bb39a4
--- a/main.cpp	Sat Feb 15 00:06:19 2020 +0000
+++ b/main.cpp	Sat Feb 15 15:49:23 2020 +0000
@@ -1,137 +1,72 @@
 #include "mbed.h"
 #include "TextLCD.h"
+#include "HCSR04.h"// Biblioteca del sensor ultrasonico
 
-DigitalOut myled(PD_13);
 Serial pc(PA_2,PA_3);
 I2C i2c_lcd(PB_7, PB_8); // SDA, SCL
 TextLCD_I2C lcd(&i2c_lcd, 0x4E, TextLCD::LCD20x4);
 
-////////ENTRADAS ANALOGICAS
-AnalogIn IFASE1(PB_0);
-AnalogIn IFASE2(PB_1);
-AnalogIn IFASE3(PC_5);
-AnalogIn VFASE1_2(PA_6);
-AnalogIn VFASE2_3(PA_7);
-AnalogIn VFASE3_1(PC_4);
-float valor_IFASE1=0;
-float valor_IFASE2=0;
-float valor_IFASE3=0;
-float valor_VFASE1_2=0;
-float valor_VFASE2_3=0;
-float valor_VFASE3_1=0;
-////ESTRUCTURA
+//DigitalOut led(LED1, 0);                    // Create the LED object and setup OFF
+Timeout timeout;                            // Create the Timeout object
 
-int main()
+Timer t; //declaracion de contador
+AnalogIn sensor(PB_0);               //entrada analogica para sensor de temperatura
+HCSR04 sensord(PB_4,PB_5);            //Declaración del sensor ultrasonico y de los puertos de entrada a trigger y echo
+DigitalOut myled (PD_14);
+DigitalOut myled2 (PD_13);
+float value; //variable para datos de temparatura
+float volt; //variable para datos de voltaje
+int d;
+
+int main()     //Rutina Principal
 {
-            while(true){
-            pc.baud(115200);
-            //myled = 1;
-            //wait(0.2);
-            //myled = 0;
-            //wait(0.2);
-            valor_IFASE1=IFASE1.read();
-            valor_IFASE2=IFASE2.read();
-            valor_IFASE3=IFASE3.read();
-            valor_VFASE1_2=VFASE1_2.read();
-            valor_VFASE2_3=VFASE2_3.read();
-            valor_VFASE3_1=VFASE3_1.read();
-            //device.printf("el valor de la corriente FASE1 es: %2.2fA%\n",valor_IFASE1*20);//ESCALAMIENTO A SENSOR DE 20 AMP
-            //device.printf("el valor de la corriente FASE2 es: %2.2fA%\n",valor_IFASE2*20);
-            //device.printf("el valor de la corriente FASE3 es: %2.2fA%\n",valor_IFASE3*20);
-            //device.printf("el valor del voltaje F1-F2 es: %2.2fV%\n",valor_VFASE1_2*480);//ESCALAMIENTO A VOLTAJE DE 480
-            //device.printf("el valor del voltaje F2-F3 es: %2.2fV%\n",valor_VFASE2_3*480);
-            //device.printf("el valor del voltaje F3-F1 es: %2.2fV%\n",valor_VFASE3_1*480);
-            
-            //pc.printf("From here is a new example for Master classes in UPS Guayaquil \r\n");
+    
+value = (((sensor.read()*5000)/10)-22); // calculo para prsentar tempertura
+volt = (value*10);// calculo para presentar voltaje de sensor
 
-    // Clear the screen and locate to 0,0
-    lcd.cls();
-
-    // LCD Backlight control
-    lcd.setBacklight(TextLCD::LightOn);
-
-    // LCD Orientation control, supported for some Controllers
-    //lcd.setOrient(TextLCD::Bottom);
-
-    // LCD BigFont control, supported for some Controllers
-    //lcd.LCDBigFont(TextLCD::TopBottomLine);
+lcd.cls();
+lcd.setBacklight(TextLCD::LightOn);
+lcd.setCursor(TextLCD::CurOff_BlkOff);
+          pc.baud(115200); //    Velocidad de Transmisión
 
-    // Locate cursor to a screen column and row
-    //int col = 0;
-    //int row = 0;
-    //lcd.locate(col,row);
-    //lcd.printf("Iniciando...¡");
-    //wait(1);
-
-    //No Show cursor as blinking character
-    lcd.setCursor(TextLCD::CurOff_BlkOff);
-
-    // Write a character to the LCD "ARROW"
-    //int c = 1;
-    //lcd.cls();
-    //lcd.locate(0,0);
-    //for (int row=0; row<4; row++) {
-        //lcd.putc(c);
-        //wait(0.01);
-
-        //for (col=0; col<19; col++) {
-            //lcd.putc(c);
-            //wait(0.01);
-        //}
-    //}
-    //wait(2);
+        while(1) {  // inicio de bucle,Condicional establecido para que siempre sea verdadero
+        
+                    
+            int d= sensord.distance(1); // comando para un numero largo de bits
+            if (d<20) { //condicional de led
+                myled=1;
+                myled2=0;
+                
+                t.start(); // inicio de contador
+                lcd.cls();
+                lcd.locate(0,0);
+                lcd.printf ("Temp= %2.2f C, ", value);  //escribir dato de temperatura
+                lcd.locate(0,1);
+                lcd.printf ("volt= %2.2f mv, ", volt); //escribir dato de voltaje sensor
+                lcd.locate(0,2);
+                lcd.printf ("D= %d cm, ",d); // comando de impresion para mostra
+                lcd.locate(0,3);
+                lcd.printf ("time= %d ms, \r\n", t.read_ms()); // escribir datos de tiempo de lectura
+                t.stop(); //pausa de contador
 
-    // Write a raw string to the LCD
-    lcd.cls();
-    lcd.locate(0,0);
-    lcd.printf("IA%2.1f%", valor_IFASE1*20);
-    lcd.locate(7,0);
-    lcd.printf("IB%2.1f%", valor_IFASE2*20);
-    lcd.locate(14,0);
-    lcd.printf("IC%2.1f%", valor_IFASE3*20);
-    lcd.locate(0,1);
-    lcd.printf("V1=%1.0f%", valor_VFASE1_2*480);
-    lcd.locate(7,1);
-    lcd.printf("V2=%1.0f%", valor_VFASE2_3*480);
-    lcd.locate(14,1);
-    lcd.printf("V3=%1.0f%", valor_VFASE3_1*480);
-    lcd.locate(0,2);
-    lcd.printf("P1=%1.1f%", (((valor_IFASE1*20)*(valor_VFASE1_2*480)))/1000);
-    lcd.locate(7,2);
-    lcd.printf("P2=%1.1f%", (((valor_IFASE2*20)*(valor_VFASE2_3*480)))/1000);
-    lcd.locate(14,2);
-    lcd.printf("P3=%1.1f%", (((valor_IFASE3*20)*(valor_VFASE3_1*480)))/1000);
-    wait(0.5);
-    
-    // Write a raw string to the LCD -> pointer
+                wait (1);
+                } 
+                
+                else if (d>=20) {
+                myled=0;
+                myled2=1;
+                lcd.cls();
+                lcd.locate(6,1);
+                lcd.printf ("D= %d cm, ",d); // comando de impresion para mostra
+                lcd.locate(3,2);
+                lcd.printf ("Fuera de rango"); //
+                wait (1);
+            }
+           
+   
+}
 
-    //lcd.locate(0,1);
-    //lcd.printf("/----------------/");
-
-    //const char* msg = "Mensaje con punteros";
-    //int string_size = strlen (msg);
-    //lcd.locate(0,2);
-    //lcd.printf("%.*s", string_size, msg);
-
-    //lcd.locate(0,3);
-    //const char* msg2 = "\"TXT: %.*s\",size,msg";
-    //int string_size2 = strlen (msg2);
-    //lcd.printf("%.*s", string_size2, msg2);
-    //wait(0.2);
+}
 
 
 
-    // Return the memoryaddress of screen column and row location
-    //lcd.getAddress(col,row);
-    //pc.printf("column %d\trow %d\r\n",col,row);
-    //wait(1);
-
-
-
-    // Return the number of rows ans columns
-    //pc.printf("column %d\trow %d\r\n",lcd.rows(),lcd.columns());
-    //wait(1);
-      }                      
-    }
-
-