Hola estoy intentado graficar mediante Matlab y Arduino los datos recibidos de un ldr y un sensor de temperatura.Pero no consigo que me haga una grafica a tiempo real de los valores que esta obteniendo.Ademas quiero que cada sensor tenga su propia grafica a tiempo real.
El codigo que uso en arduino es el siguiente:
#include <math.h>
#define ThermistorPIN 9
int ldr = A8;
float pad = 9850;
float thermr = 10000;
float Thermistor(int RawADC){
long Resistance;
float Temp;
Resistance=((1024 * pad / RawADC) - pad);
Temp = log(Resistance);
Temp = 1 / (0.001129148 + (0.000234125 * Temp) +
(0.0000000876741 * Temp * Temp * Temp));
Temp = Temp - 273.15;
return Temp;
}
void setup(){
Serial.begin(9600);
}
void loop(){
float ldrreading = analogRead(ldr);
Serial.println(ldrreading);
float temp;
float celsius;
celsius = Thermistor(analogRead(ThermistorPIN));
Serial.println(celsius);
delay(500);
}
En matlab estoy usando este pero no me funciona:
function Multiples(numero_muestras)
%Declaramos un vector,donde se van a almacenar los datos obtenidos
close all;
clc;
y=zeros(1,1000);
x=zeros(1,1000);%Vector donde se guardan los datos
%Iniciamos el puerto serial
delete(instrfind({'Port'},{'COM7'}));
puerto_serial=serial('COM7');
puerto_serial.BaudRate=9600;
warning('off','MATLAB:serial:fscanf:unsuccessfulRead');
%Abrir puerto serial
fopen(puerto_serial);
contador_muestras=1;
%Crear una ventana grafica
figure('Name','Serial communication: Matlab + Arduino.')
title('Serial Cummunication Matlab+Arduino')
xlabel('Numero de muestra')
ylabel('Luz')
grid on;
hold on;
while contador_muestras<=numero_muestras
ldrreading=fscanf(puerto_serial,'%d')';
xlim([contador_muestras-20 contador_muestras+5]);
y(contador_muestras)=(ldrreading(1));
subplot(2,1,1);plot(contador_muestras,y(contador_muestras),('s-r'));
contador_muestras=contador_muestras+1;
celsius=fscanf(puerto_serial,'%d')';
xlim([contador_muestras-20 contador_muestras+5]);
x(contador_muestras)=(celsius(1));
subplot(2,1,2);plot(contador_muestras,x(contador_muestras),('s-r'));
contador_muestras=contador_muestras+1;
end
%Cerrar la conexion y eliminar las variables
fclose(puerto_serial);
delete(puerto_serial);
clear all;
end
Gracias por vuestra ayuda.
Muy buenas interesante el trabajo,Yo me hayo en una situación parecida pero me decante por python.
Y la verdad que lo logre a la primera graficar los datos del sensor en tiempo real ,pero ahora tengo otros problemillas.
Te paso el código
#include <DHT.h>
#define DHTPIN 2 //Seleccionamos el pin en el que se conectará el sensor
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600); //Se inicia la comunicación serial
dht.begin(); //Se inicia el sensor
}
void loop() {
float t = dht.readTemperature(); //Se lee la temperatura
Serial.println(t);
delay(1000);
}
Y ahora el de python
#! /usr/bin/python
import serial
import numpy as np
from matplotlib import pyplot as plt
#Abrimos la conexion al puerto serie
ser = serial.Serial('/dev/ttyACM0', baudrate=9600, timeout=1.0)
#Datos iniciales: 50 puntos de valor 30
ydata = [30] * 50
#Abrimos display definiendo los ejes.
ax1=plt.axes()
plt.ion()
plt.xlabel("Tiempo (s)--->")
plt.ylabel("Temperatura (C)--->")
#Representaremos los datos.La coma después de line es muy importante,
#para que pinte los puntos continuamente.Se define el rango de y.
line, = plt.plot(ydata)
plt.ylim([10,40]) # set the y range to 10 to 40
while True:
data = ser.readline().rstrip()
print data
if len(data.split(".")) == 2:
ymin = float(min(ydata))-5 #Fija los limites de la grafica a min -5
ymax = float(max(ydata))+5 #y +5
plt.ylim([ymin,ymax])
ydata.append(data)
del ydata[0]
line.set_xdata(np.arange(len(ydata)))
line.set_ydata(ydata) # actualiza los datos
plt.draw() # actualiza la figura
Te lo comento por que lo he intentado con matlab y no he sido capaz.
Pero por el contrario con python a la primera.
http://pybonacci.org/2012/05/14/manual-de-introduccion-a-matplotlib-pyplot-i/
Matplotlib es probablemente el paquete de Python más utilizado para gráficos 2D. Proporciona una manera muy rápida de visualizar datos y figuras con calidad de publicación en varios formatos. Vamos a explorar Matplotlib en modo interactivo cubriendo los casos más comunes.
http://claudiovz.github.io/scipy-lecture-notes-ES/intro/matplotlib/matplotlib.html
Matplotlib que tienen la misma funcionalidad que Matlab/Mathematica.
Un saludo
Otro que es muy potente siguiendo la línea de aku_tineo es GNUPLOT.
Lo puedes descargar versión windows, versión LINUX o como complemento de python.
Python es un gran descubrimiento para mi también no solo para cosas como interactuar entre PC y Arduino con programa Open Source sino que es muy fácil de entender. Un par de tutos y ya haces cosas interesantes.
Estos programas Matplotlib y Gnuplot no envidian nada en presentaciones gráficas 2D/3D al Matlab o a Labview.
Gracias.Estoy probando python pero tengo el mismo problema, necesito dos graficas en cada una mostrar los valores de dos sensores distintos.¿Como es el codigo para ello en python?
Mira te diré como a muchos, la información esta toda disponible en la web. No hay que frustrarse diciendo que no se encuentro porque hay que saber que poner para hallarla.
En tu caso prueba esto: Google: python matplotlib
http://matplotlib.org/
Que tal este subplot demo