Programa de lectura de un termistor y visualizar su valor en un lcd 16x2. Mediante un teclado matricial 4x4 se ingresa un valor de 3 dígitos para su uso futuro como setpoint de temperatura.

Dependencies:   mbed PID KeypadLib TextLCD

Lectura de temperatura mediante un termistor NTC y visualizacion en LCD 16X2

Objetivo general: El objetivo es medir la temperatura ambiente y visualizarla en un display de 16x2. Se usará un teclado matricial para el ingreso de un valor de 3 dígitos, este valor de 3 dígitos podrá ser usado a futuro como setpoint de temperatura objetivo.

Los periféricos que se han implementado son:

  • Teclado Matricial 4x4
  • Lcd 16x2
  • Termistor NTC 100kOhm. >STM32T407G

Teclado Matricial: El teclado alfanumérico usado es de 4 filas x 4 columnas. Su pinout se muestra en la siguiente gráfica:

https://os.mbed.com/media/uploads/mvillamar/keypad.png

De izquierda a derecha tenemos Filas (4hilos) y columnas (los ultimos4 hilos). Es decir: F1, F2, F3, F4, C1, C2, C3, C4.

La librería usada es: _KeypadLib_.

Lcd 16x2: El display utilizado es de 16x2 con backlight el cual trabaja con la librería TextLCD.

A continuación, el pinout del lcd:

https://os.mbed.com/media/uploads/mvillamar/lcd-16x2-pinout.png

GND: se conecta a GND de la tarjeta STM32

VCC: se conectar a +5Vcc

Contraste: se conecta una resistencia de 1[Kohm] a tierra.

Rs: se conecta a un pin de la tarjeta STM32

RW: se conecta a GND de la tarjeta STM32

EN: se conecta a un pin de la tarjeta STM32

D4 a D7: se conectan a los pines de la tarjeta STM32

Backlight(+): se conectar a +5Vcc

Backlight(-): se conecta una resistencia de 330[Ohm].

_Nota:_ Mas adelante se mostrarán las conexiones de todos los dispositivos.

Termistor NTC 100kOhm: Se ha utilizado un termistor NTC para la medición de la temperatura. Este sensor decrementa la resistencia entre sus terminales a medida que la temperatura sube. Este sensor no trabaja con una librería específica, pero si es necesario incluir la librería _<math.h>_ ya que es necesario realizar cálculos logarítmicos en el código.

Para realizar la lectura del sensor, es necesario conocer previamente varios aspectos técnicos del mismo, los cuales son: Raux: resistencia en serie conectada al terminador. Típicamente, deberá ser del mismo valor del termistor.

Beta; resistencia característica del material.

To: Temperatura en grados Kelvin (25C= 298k).

Ro: Valor de resistencia en To.

Todos los parámetros provienen de la hoja de datos del sensor

https://os.mbed.com/media/uploads/mvillamar/termistor-ntc-100k-impresora-3d-prusa-thermistor-con-ficha-d_nq_np_731869-mla31929302945_082019-f.jpg

El termistor es una resistencia variable en base a la temperatura, por lo tanto, se usa un divisor de voltaje para lograr la medición de la temperatura.

https://os.mbed.com/media/uploads/mvillamar/conexion-termistor-ntc.jpg

Nota: R100k será nuestra resistencia auxiliar Raux que se usará para el cálculo. Cálculos a realizar para obtener la temperatura en grados centígrados:

1.- Medición del voltaje que llega al canal analógico del microcontrolador. Este voltaje debe oscilar entre 0.1 y 3.3 Vcc. El uC lo interpretará como un valor desde 0.1 a 1 el cual luego se tendrá que manipular para convertirlo a milivoltios.

En el uC, se calcula mediante la declaración: vm=ain; vm*=3,3; Siendo Ain, pin analógico PC_5 y vm una variable tipo float para guardar el valor analógico y posterior convertirlo a voltaje al multiplicarlo *3,3.

2.- Calcular la resistencia del del termistor “Rntc” partiendo de la fórmula del divisor de tensión.

Vout=Vin*(Raux/(Rntc+Raux))

Despejando Rntc tendremos:

Rntc=((Raux*Vin)/Vm)-Raux

Siendo: Vm: el valor en milivoltios calculado en el punto 1. Vin: el voltaje de alimentación del divisor de tensión. Raux: la resistencia en serie con el termistor.

3.- Calcular la temperatura del termistor usando la fórmula:

TemperaturaK=(Beta/(log⁡(Rntc/Ro)+(Beta/To) ))-273

Formula Steinhart–Hart

STM32T407G.- tarjeta de entrenamiento

https://os.mbed.com/media/uploads/mvillamar/discovery.jpg

Conexiones:

En la siguiente gráfica se muestran las interconexiones realizadas: https://os.mbed.com/media/uploads/mvillamar/foto_general_-_copia.jpg

Diagrama de conexiones hechas:

https://os.mbed.com/media/uploads/mvillamar/conxiones.jpg

Nota: Rvar, se usa para ajustar el valor de la Raux a exactamente 100.000[Kohm]. Imágenes:

  • Conexión del termistor

https://os.mbed.com/media/uploads/mvillamar/img_20200215_033158_-_copia.jpg

  • Conexión del lcd Temperatura medida: 29Grados C. https://os.mbed.com/media/uploads/mvillamar/temp.jpg

Link: https://youtu.be/DDGYvQzlm0Y _ ya que es necesario realizar cálculos logarítmicos en el código.

Para realizar la lectura del sensor, es necesario conocer previamente varios aspectos técnicos del mismo, los cuales son: Raux: resistencia en serie conectada al termistor. Típicamente, deberá ser del mismo valor del termistor. Beta; resistencia característica del material. To: Temperatura en grados Kelvin (25C= 298k). Ro: Valor de resistencia en To.

Todos los parámetros provienen de la hoja de datos del sensor

https://os.mbed.com/media/uploads/mvillamar/termistor-ntc-100k-impresora-3d-prusa-thermistor-con-ficha-d_nq_np_731869-mla31929302945_082019-f.jpg

El termistor es una resistencia variable en base a la temperatura, por lo tanto, se usa un divisor de voltaje para lograr la medición de la temperatura.

https://os.mbed.com/media/uploads/mvillamar/conexion-termistor-ntc.jpg

Nota: R100k será nuestra resistencia auxiliar Raux que se usará para el cálculo. Cálculos a realizar para obtener la temperatura en grados centígrados:

1.- Medición del voltaje que llega al canal analógico del microcontrolador. Este voltaje debe oscilar entre 0.1 y 3.3 Vcc. El uC lo interpretará como un valor desde 0.1 a 1 el cual luego se tendrá que manipular para convertirlo a milivoltios.

En el uC, se calcula mediante la declaración: vm=ain; vm*=3,3; Siendo Ain, pin analógico PC_5 y vm una variable tipo float para guardar el valor analógico y posterior convertirlo a voltaje al multiplicarlo *3,3.

2.- Calcular la resistencia del del termistor “Rntc” partiendo de la fórmula del divisor de tensión.

Vout=Vin*(Raux/(Rntc+Raux))

Despejando Rntc tendremos:

Rntc=((Raux*Vin)/Vm)-Raux

Siendo: Vm: el valor en milivoltios calculado en el punto 1. Vin: el voltaje de alimentación del divisor de tensión. Raux: la resistencia en serie con el termistor.

3.- Calcular la temperatura del termistor usando la fórmula:

TemperaturaK=(Beta/(log⁡(Rntc/Ro)+(Beta/To) ))-273

Formula Steinhart–Hart

STM32T407G.- tarjeta de entrenamiento

https://os.mbed.com/media/uploads/mvillamar/discovery.jpg

Conexiones:

En la siguiente gráfica se muestran las interconexiones realizadas: https://os.mbed.com/media/uploads/mvillamar/foto_general_-_copia.jpg

Diagrama de conexiones hechas:

https://os.mbed.com/media/uploads/mvillamar/conxiones.jpg

Nota: Rvar, se usa para ajustar el valor de la Raux a exactamente 100.000[Kohm]. Imágenes:

  • Conexión del termistor

https://os.mbed.com/media/uploads/mvillamar/img_20200215_033158_-_copia.jpg

  • Conexión del lcd Temperatura medida: 29Grados C. https://os.mbed.com/media/uploads/mvillamar/temp.jpg

Link: https://youtu.be/DDGYvQzlm0Y

Files at this revision

API Documentation at this revision

Comitter:
mvillamar
Date:
Mon Feb 17 02:34:21 2020 +0000
Parent:
2:9fa12e9c368d
Commit message:
Lectura de temperatura mediante termistor NTC

Changed in this revision

PID.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/PID.lib	Mon Feb 17 02:34:21 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/aberk/code/PID/#6e12a3e5af19
--- a/main.cpp	Fri Feb 14 06:00:49 2020 +0000
+++ b/main.cpp	Mon Feb 17 02:34:21 2020 +0000
@@ -7,10 +7,15 @@
 #include "mbed.h"
 #include "keypad.h"                                 //se incluye libreria del teclado 4x4
 #include "TextLCD.h"                                //Libreria para el lcd
+#include <math.h>
+#include <iostream>
+#include <string>
+#include <sstream>
+
 ////////////////////////////////////////////////////////////////////////////////
 
 //////////TIMERS////////////////////////////////////////////////////////////////
-Ticker tempo1;                                       //Tiempo para lectura de tecla
+Ticker tempo1;                                       //Tiempo para lectura del termistor
 Timer Rele;
 
 //////////CONFIGURACION PUERTO SERIE///////////////////////////////////////////
@@ -22,18 +27,18 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 /////////CONFIGRACION PUERTO ANALOGICO//////////////////////////////////////////
-AnalogIn ain(PC_1);                                 // pin para lectura del termistor
-float vm=0.0;                                    //variable con dato analogo proveniente del divisor
+AnalogIn ain(PC_5);                                 // pin para lectura del termistor
+float vm=0;                                    //variable con dato analogo proveniente del divisor
+
 ////////////////////////////////////////////////////////////////////////////////
 
 /////////Datos de fabrica del termistor////////////////////////////////////////
-float Raux=10000.0;                                     // Resisrencia auxiliar para el divisor de voltaje
-float vcc=5.0;                                          // voltaje del divisor de tension
-float Beta=3977.0;                                      //constante ntc OBTENIDO de la hoj de datos
-float temp0 = 298.0;
-//float T0=25.0;                                          //tempertura referencia
-float r0 = 10000.0;                                       //resistencia a la temperatura referencia
-float Rntc=0.0;
+float Raux=100000.0;                                     // Resisrencia auxiliar para el divisor de voltaje
+float vcc=3.34;                                          // voltaje del divisor de tension
+float temp0 = 298.0;                                    //temperatua 24C en grados kelvin
+float r0 = 100000.0;                                    //resistencia a los 24C
+float Beta=3950.0;                                      //constante ntc OBTENIDO de la hoj de datos
+float Rntc=0;
 float tempC=0.0;
 float temperaturaK = 0.0;
 ////////////////////////////////////////////////////////////////////////////////
@@ -42,43 +47,55 @@
 char key;                                                 //variable para almacenar la tecla pulsada
 //  c0   c1    c2    c3   r0   r1    r2    r3
 //define pines para el teclado
+//  c0   c1   c2   c3  r0   r1   r2   r3
+Keypad keypad(PD_7,PC_8,PD_6,PB_0,PC_9,PA_8,PC_6,PC_7 );
+
 /////////////////////////////////////////////////
 
-int x=0;
-DigitalOut RLY(PB_3);
+char setpoint;
+
+int numero;
+int unidad;
+int decena;
+int centena;
+int total; //valor de setpoint para pid
+int i=0;
+
+
+DigitalOut RLY(PB_1);       //Rele de estado solido para activar el cautin.
+DigitalOut Bled(PD_15);    //LED AZUL
+DigitalOut Rled(PD_14);    //LED ROJO
+
 ///////////DECLARACION DE FUNCIONES////////////////////////////////////////////
 void TermistorRead();
 void lcd_16x2();
-void teclado(void);
+void asiganacion();
 void Calentador();
+void menu();
 
 
 int main()
 {
-    Rele.start(); //da inicio al temportizador RELE. 
+    keypad.enablePullUp();
+    //Rele.start(); //da inicio al TIMER RELE.
     tempo1.attach(&TermistorRead, 1.5); //caca 1.5 seg se ejecuta la lectura del termistor
     while(1) {
-        if (Rele.read_ms()>=1000) { // read time in ms
-            Calentador(); // call tarea function
-            Rele.reset(); // reset timer
+        //if (Rele.read_ms()>=1000) { // read time in ms
+        //   Calentador(); // call tarea function
+        //   Rele.reset(); // reset timer
+        //}
+        //teclado();
+        key = keypad.getKey();
+        if(key != KEY_RELEASED) {
+            wait(0.6);
         }
-        //lcd.locate(1,0);
-        //lcd.printf("%c",key);
-        // hercules.printf("%c",key);
-        //lcd.locate(0,1);
-        teclado();
+        if (key=='A') {
+            menu();
+        }
         lcd_16x2();
-        //TermistorRead();
-        //hercules.printf("%f\n\r",vm);
-        //hercules.printf("%f\n\r",Rntc);
-        hercules.printf("%c",key);
-        //lcd.printf("Valor: %3.3f%\n",termistor);                        //presentacion de datos
-        x+=1;
-        if (x==1000) {
-            x=0;
-        }
+        menu();
         RLY =! RLY;
-        wait(0.1);
+        wait(0.3);
     }//WHILE
 }//MAIN
 
@@ -87,42 +104,90 @@
 
 void TermistorRead()  //lectura de dato analogico proveniente del divisor de voltaje.
 {
-
-    //vm=(ain*3.3)/4096;
-    vm=(vcc/1024)*ain; //lectura puerto analogico
-    //vm= (ain*3.3)/4096;
-    Rntc= Raux/((vcc/vm)-1);
-    temperaturaK =Beta/(log(Rntc/r0)+(Beta/temp0));
-    tempC= temperaturaK - 273;
+    vm=ain;
+    vm*=3,3;
+    Rntc= ((Raux*vcc)/vm)-Raux; //despejando Rntc la formula del divisor.
+    temperaturaK =Beta/(log(Rntc/r0)+(Beta/temp0));     //formula para encontrar la temperatura
+    tempC= temperaturaK - 273;                          //convertir kelvin a C
+    Bled =! Bled;
 }
 
 void lcd_16x2()
 {
     lcd.cls();
-    lcd.printf("%d",x);
-    lcd.locate(0,1);
-    lcd.printf("%c",key);
-    lcd.locate(8,1);
-    lcd.printf("T:%3.2f",tempC);
+    lcd.locate(0,0);
+    lcd.printf("%.0f",tempC);                       // solo muestra la partedecimal
+}
+
+void menu()
+{
+    if (key=='A') {
+        for(i=0; i<3; i++) {
+            if (i==0) {
+                hercules.printf("ingrese SetPoint\r\n");
+                asiganacion();
+                unidad =numero*1;
+                hercules.printf("%d\r\n",unidad);
+            }
+
+            if (i==1) {
+                hercules.printf("ingrese 2da tecla\r\n");
+                asiganacion();
+                decena =numero*10;
+                hercules.printf("%d\r\n",decena);
+            }
+
+            if (i==2) {
+                hercules.printf("ingrese 3era tecla\r\n");
+                asiganacion();
+                centena =numero*100;
+                hercules.printf("%3d\r\n",centena);
+            }
+            if (key == 'B') {   //sale del ciclo si se pulsa B
+                hercules.printf("Exit");
+                main();
+            }
+        }
+        wait(0.1);
+        total=unidad+decena+centena;
+        hercules.printf("%d",total);
+    }
+}
+
+
+void asiganacion ()
+{
+
+    do {
+        key = keypad.getKey();
+        if(key != KEY_RELEASED) {
+            wait(0.6);
+        }
+    } while (key ==0x00);
+    
+    if(key == '0') numero=0;
+    if(key == '1') numero=1;
+    if(key == '2') numero=2;
+    if(key == '3') numero=3;
+    if(key == '4') numero=4;
+    if(key == '5') numero=5;
+    if(key == '6') numero=6;
+    if(key == '7') numero=7;
+    if(key == '8') numero=8;
+    if(key == '9') numero=9;
 
 }
 
-void teclado ()
+
+void Calentador()
 {
-    //  c0   c1   c2   c3  r0   r1   r2   r3
-    Keypad keypad(PD_7,PC_8,PD_6,PB_0,PC_9,PA_8,PC_6,PC_7 );
-    keypad.enablePullUp();
-    //while (1) {
-    key = keypad.getKey();
-    if(key != KEY_RELEASED) {
-        wait(0.6);
-   }
+    RLY = !RLY;
 }
 
-void Calentador(){
-    RLY = !RLY;
-    }
-
 
 
 
+
+
+
+