Aprovechando la publicación sobre sensor de temperatura con el LM35, vamos a mostrar otro ejemplo pero en esta ocasión graficaremos esa temperatura en Processing, aprovechamos la publicación de Gerardo Guacaneme con un tema similar, pero vamos a modificar un poco para obtener el resultado que nosotros deseamos.
Circuito:
El circuito utilizado es muy sencillo, basta con conectar Vout del sensor al canal A0 de nuestra LaunchPad, así que quedara de la siguiente forma:
Circuito:
El circuito utilizado es muy sencillo, basta con conectar Vout del sensor al canal A0 de nuestra LaunchPad, así que quedara de la siguiente forma:
Código para Processing:
Aquí el código para Processing, el ejemplo esta pensado para graficar de 0 a 150°C, con un tiempo de muestreo de aproximadamente 100mS:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/******************************************************************************* | |
* | |
* Graficar temperatura del LM35 | |
* | |
******************************************************************************* | |
* FileName: PDE_001.pde | |
* Processor: EX-LM4F120XL u otro | |
* Complier: Proccesing 3.2.2 | |
* Author: Pedro Sánchez Ramírez (MrChunckuee) | |
* Blog: http://mrchunckuee.blogspot.com/ | |
* Email: mrchunckuee.psr@gmail.com | |
* Description: En este ejemplo graficaremos en la señal de temperatura | |
proveniente del sensor LM35. | |
******************************************************************************* | |
* Rev. Date Comment | |
* v1.00 04/11/2016 Creación del firmware | |
******************************************************************************/ | |
import processing.serial.*; // Carga la librería para el manejo de puerto serial | |
String portname = "COM13"; // Puerto al que está conectado el Stellaris | |
Serial puerto; // Objeto de puerto | |
PFont font; // Objeto de tipo de fuente | |
char[] datosc=new char[13]; // Array de almacen de trama recibida en el puerto serie | |
int[] datos2=new int[17]; // Array de datos ajustados para guardar en archivo | |
float[][] tempe_pantalla = new float[700][4]; // Array para la visualización de datos en pantalla | |
int muestras; // Indica la ubicación donde se almacenará la muestra actual | |
char inByte; // Almacena el byte recibido del puerto serie | |
int index=0; // Index del array de datos de entrada del puerto | |
float temperatura=0.0; // Almacena la temperatura | |
int largew=660; // Largo de la ventana de la gráfica | |
/******************************************************************************* | |
* Function: void setup() | |
* Description: Inicializa los parámetros del programa | |
* Precondition: None | |
* Parameters: None | |
* Return Values: None | |
* Remarks: None | |
* *****************************************************************************/ | |
void setup() { | |
for (int i = 0; i <largew ; i = i+1) { // Inicializa la matriz de visualización de datos | |
for (int j = 0; j <2 ; j = j+1) { | |
tempe_pantalla[i][j]=200; | |
} | |
} | |
size(700, 300); // Especifica las dimensiones del diálogo | |
smooth(); // Activa el suavizado de imagen | |
font = loadFont("Verdana-16.vlw"); // Carga el tipo de Fuente | |
textFont(font); // Establece el tipo de fuente | |
frameRate (60); // Establece el número de ejecuciones de draw() por segundo | |
muestras=0; | |
index=0; | |
puerto = new Serial(this, portname, 9600); // El último valor es el BaudRate | |
puerto.clear(); // Limpia buffer del puerto | |
puerto.buffer(1); // El buffer generará el evento SerialEvent al recibir un caracter | |
} | |
/******************************************************************************* | |
* Function: void draw() | |
* Description: Función de dibujo del diálogo | |
* Precondition: None | |
* Parameters: None | |
* Return Values: None | |
* Remarks: None | |
* *****************************************************************************/ | |
void draw() { | |
int w; | |
background(204); // Redibuja el diálogo | |
stroke(64, 64, 64); // Establece el color utilizado para dibujar líneas y bordes alrededor de las formas | |
fill(63, 102, 150); // Establece el color de relleno del comando siguiente | |
rect(15, 20, 670, 200); // Ventana de visualización de la gráfica | |
stroke(49, 65, 111); | |
for (int k = 0; k <=7 ; k++) { | |
w=25+25*k; | |
line(20, w, 680, w); // Líneas de división horizontales de la gráfica | |
} | |
line(19, 25, 19, 200); //Lineas verticales de la grafica | |
line(680, 25, 680, 200); | |
fill(255, 255, 255); | |
rect(22, 233, 10, 10); | |
fill(255, 0, 0); | |
rect(22, 258, 10, 10); | |
fill(0); // Establece el color de relleno del comando siguiente | |
text("Bits en el ADC: " + datos2[0], 40, 245); // Escribe los datos obtenidos en el diálogo | |
text("Temperatura: " + temperatura, 40, 270); // Escribe los datos obtenidos en el diálogo | |
text("Gafricar temperatura del LM35", 300, 245); // Escribe los datos obtenidos en el diálogo | |
text("Processing + Stellaris LaunchPad + Energia", 300, 270); // Escribe los datos obtenidos en el diálogo | |
text("http://mrchunckuee.blogspot.com/", 300, 295); // Escribe los datos obtenidos en el diálogo | |
grafiko(); // Actualiza la gráfica | |
} | |
/******************************************************************************* | |
* Function: void serialEvent() | |
* Description: Atiende un Evento del Puerto Serie | |
* Precondition: None | |
* Parameters: Puerto desde el que se produce la interrupción | |
* Return Values: None | |
* Remarks: None | |
* *****************************************************************************/ | |
void serialEvent(Serial puerto_serie) { | |
if(puerto_serie==puerto){ | |
inByte=puerto.readChar(); // Leemos byte recibido | |
datosc[index]=inByte; // Armamos el array | |
index++; | |
if (index>=4) { | |
index=0; | |
datos2[0]=datosc[0]+(datosc[1])*256; // Armamos la variable int | |
temperatura = 0.08 * (float)(datos2[0]); //Calculamos la temperatura | |
tempe_pantalla[muestras][0]= 200 - (0.08 * (float)(datos2[0])); //Modificamos los datos para mostrar en pantalla | |
muestras=muestras+1; | |
if (muestras>=largew) muestras=0; | |
} | |
puerto.clear(); | |
} | |
} | |
/******************************************************************************* | |
* Function: void grafiko() | |
* Description: Dibuja el Array temperatura en el diálogo | |
* Precondition: None | |
* Parameters: None | |
* Return Values: None | |
* Remarks: None | |
* *****************************************************************************/ | |
void grafiko() { | |
stroke(255, 0, 0); // Gráfico temperatura | |
for (int i = 0; i+muestras-0 <largew-1 ; i = i+1) { | |
line(i+20, tempe_pantalla[i+muestras][0], (i+21), tempe_pantalla[i+muestras+1][0]); | |
} | |
for (int i = 0; i<muestras-1; i = i+1) { | |
line(i+largew-muestras+20, tempe_pantalla[i][0], (i+largew-muestras+21), tempe_pantalla[i+1][0]); | |
} | |
} | |
/******************************************************************************* | |
* Referencias: | |
* - https://antiepoke.wordpress.com/2013/04/05/puerto-serie-en-processing/ | |
* - https://processing.org/ | |
******************************************************************************/ |
Aquí el código para la Stellaris, como la máxima temperatura del LM35 es de 150°C limito antes de mandar el dato:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/******************************************************************************* | |
* | |
* Graficar temperatura del LM35 | |
* | |
******************************************************************************* | |
* FileName: LM4F_E005.ino | |
* Processor: EX-LM4F120XL | |
* Complier: Energia 0101e0017 | |
* Author: Pedro Sánchez Ramírez (MrChunckuee) | |
* Blog: http://mrchunckuee.blogspot.com/ | |
* Email: mrchunckuee.psr@gmail.com | |
* Description: En este ejemplo graficaremos en processing la señal de | |
temperatura proveniente del sensor LM35. | |
******************************************************************************* | |
* Rev. Date Comment | |
* v1.00 27/10/2016 Creación del firmware | |
******************************************************************************/ | |
const int pinLM35 = A0; // Pin analogico | |
int tMax = 1900; //Limitamos pa no mandar mas de 150°C | |
int valueADC = 0; //Para almacenar el valor del ADC | |
char inByte, muestras; | |
char sendByte[4] = {0,0,0,0}; | |
void setup(){ | |
Serial.begin(9600); // Start serial port at 9600 bps | |
} | |
void loop(){ | |
// Los datos se encias aproximadamente cada 100 ms | |
// Read the analog in value: | |
valueADC+=analogRead(pinLM35); | |
muestras++; | |
if(muestras==32){ | |
muestras=0; | |
valueADC=valueADC>>5; | |
if(valueADC>=tMax) valueADC = tMax; | |
sendByte[0]=(char)(valueADC); | |
sendByte[1]=(char)(valueADC>>8); | |
Serial_SendData(sendByte, 4); | |
} | |
delay (3); | |
} | |
/******************************************************************************* | |
* Function: void Serial_SendData(char data[], char len) | |
* Description: Envia el array con la temperatura | |
* Precondition: None | |
* Parameters: char data[] = Array a enviar, char len = Tamaño del array | |
* Return Values: None | |
* Remarks: None | |
* *****************************************************************************/ | |
void Serial_SendData(char data[], char len){ | |
char index=0; | |
while(index<len){ | |
Serial.print(data[index]); | |
index++; | |
} | |
} |
Aquí un vídeo en acción.
Descargas:
Aquí el enlace directo para DESCARGAR los archivos disponibles, también puedes revisar o descargar la información desde mi repositorio en GitHub, si no sabes como descargarlo puedes checar aquí, bueno por el momento es todo si tienes dudas, comentarios, sugerencias, inquietudes, traumas, etc. dejarlas y tratare de responder lo mas pronto posible.
Donaciones:
Si te gusta el contenido o si los recursos te son de utilidad, comparte el enlace en tus redes sociales o sitios donde creas que puede ser de interés y la otra puedes ayudarme con una donación para seguir realizando publicaciones y mejorar el contenido del sitio. También puedes hacer donaciones en especie, ya sea con componentes, tarjetas de desarrollo o herramientas. Ponte en contacto para platicar, o puedes volverte uno de nuestros sponsors.
Pido una retroalimentación avisando cada que un enlace no sirva o tenga errores al momento de abrirlo, así también si una imagen no se ve o no carga, para corregirlo en el menor tiempo posible.
Bibliografía:
- Gerardo Guacaneme, "Puerto Serie en Processing", https://antiepoke.wordpress.com/2013/04/05/puerto-serie-en-processing/
- Pedro Sanchez, "Stellaris LaunchPad & Energia: Sensor de temperatura LM35", https://mrchunckuee.blogspot.com/2016/11/ek-lm4f120xl-e004.html
- Processing, https://processing.org/
- Energia, http://energia.nu/
0 Comentarios