
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:
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:
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
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.
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
Conexiones:
En la siguiente gráfica se muestran las interconexiones realizadas:
Diagrama de conexiones hechas:
Nota: Rvar, se usa para ajustar el valor de la Raux a exactamente 100.000[Kohm]. Imágenes:
- Conexión del termistor
- Conexión del lcd
Temperatura medida: 29Grados C.
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
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.
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
Conexiones:
En la siguiente gráfica se muestran las interconexiones realizadas:
Diagrama de conexiones hechas:
Nota: Rvar, se usa para ajustar el valor de la Raux a exactamente 100.000[Kohm]. Imágenes:
- Conexión del termistor
- Conexión del lcd
Temperatura medida: 29Grados C.
Link: https://youtu.be/DDGYvQzlm0Y
Revision 3:977c21fea266, committed 2020-02-17
- 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 |
diff -r 9fa12e9c368d -r 977c21fea266 PID.lib --- /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
diff -r 9fa12e9c368d -r 977c21fea266 main.cpp --- 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; - } - + + + +