风筝
发表于: 2018-11-27 20:19:37 | 显示全部楼层

图形总是有助于可视化数据,通过查看它们变得非常容易找到趋势和模式。有许多软件可用于根据输入值绘制图形,今天我们将使用MATLAB根据LM35传感器的温度数据绘制图形。本篇文章将介绍有关如何使用MATLAB绘制实时图形的基本思路。同时本文还使用Arduino Uno开发板从LM35温度传感器获取温度数据。

How-to-Plot-Graph-using-MATLAB_0.jpg


为绘图创建MATLAB图形用户界面

首先,我们必须使用温度数据构建用于绘制图形的GUI(图形用户界面)。要启动GUI,请在命令窗口中键入以下命令

  1. guide
复制代码

然后弹出一个窗口,在窗口中选择新的空白GUI,如下图所示,

Creating-GUI-in-MATLAB.png


现在我们必须为MATLAB图形界面选择一个按钮、两个轴和一个文本框。按钮将用于启动感应温度,两个轴用于绘制图形,文本框用于显示温度的当前值。

Designing-GUI-for-Plot-Graph-using-MATLAB.png

要调整大小或更改按钮、轴或编辑文本按钮的形状,只需单击它,您就可以拖动按钮的角。通过双击其中任何一个,您将能够更改该特定按钮的颜色、字符串和标记。定制后,如下所示

Editing-GUI-for-Plot-Graph-using-MATLAB.png

GUI-for-Plot-Graph-using-MATLAB.png

您可以根据自己的选择自定义按钮。现在当你保存它时,在MATLAB的Editor窗口中生成一个代码。要使Arduino执行与项目相关的任何特定任务,您始终必须编辑此生成的代码。所以下面我们编辑了MATLAB代码。您可以在MATLAB入门教程中了解有关命令窗口、编辑器窗口等的更多信息。


用于绘制图形的MATLAB代码

在本篇文章的末尾处给出了使用LM35和Arduino开发板制作温度计的完整MATLAB代码。此外,我们还包括GUI文件(.fig)和代码文件(.m)供下载,您可以根据需要自定义按钮或轴大小。我们编辑了生成的代码,如下所述。


复制并粘贴以下代码到第74行,确保每次运行m文件时Arduino正在与MATLAB通讯。

  1. clear all;
  2. global a;
  3. a = arduino();
复制代码

IInitializing-Arduino-in-MATLAB.png

向下滚动时,您将看到在GUI中为按钮和编辑文本创建了两个函数,不会为Axes创建任何函数。现在根据您要执行的任务在按钮(开始按钮)功能中编写代码。


在“开始”按钮的函数中,在函数的末尾处复制并粘贴以下代码以启动温度感测。对于温度的连续感测、显示和图形绘制,我们使用while循环。我们在每次迭代后提供1秒的暂停,因此温度值将每秒更新一次。

  1. x = 0;
  2. go = true;
  3. global a;

  4. while go              
  5. value = readVoltage(a,'A1');
  6. temp = (value*100);
  7. disp(temp);
  8. x = [x temp];
  9. plot(handles.axes1,x);
  10. grid on;
  11. xlabel('Time(seconds)')
  12. ylabel('Temperature(°C)');
  13. title('Real-Time Temperature Graph');
  14. drawnow
  15. set(handles.edit1,'String',num2str(temp));
  16. pause(1);
  17. end
复制代码

Code-for-Plot-Graph-using-MATLAB.png


现在,让我们看看代码是如何工作的。在下面的三行代码中,我们将'x'的初始值设置为零,将'go'定义为true以启动while循环,并声明'global a'用于调用函数中的Arduino。

  1. x = 0;
  2. go = true;
  3. global a;
复制代码

下面的代码行用于检测Arduino的模拟引脚A1的电压值,该引脚连接到LM35温度传感器的“OUT”引脚。输出将是电压值而不是模拟值。

  1. value = readVoltage(a,'A1');
复制代码

在这里,我们可以将电压值直接转换为温度值(摄氏度),乘以10

  1. temp = (value*100);
复制代码

现在,要绘制图形,我们使用'plot(handles.axes1,x)'函数,其中axes1是Graph区域的引用或名称。因此,如果您要绘制多个图形,那么您只需要更改轴的名称,就像绘制另一个图形一样,您可以编写绘图(handles.axes2,x)'

'Grid on'用于图的网格视图,'xlabel','ylabel'和'title'用于命名x轴、y轴和标题。

  1. plot(handles.axes1,x);
  2. grid on;
  3. xlabel('Time(seconds)')
  4. ylabel('Temperature(°C)');
  5. title('Real-Time Temperature Graph');
复制代码

'Drawnow'用于实时更新图形表示。

  1. drawnow
复制代码

要使用编辑文本框中每秒低于命令显示温度值,

  1. set(handles.edit1,'String',num2str(temp));
复制代码

所需的材料

●    安装MATLAB的笔记本电脑(首选:R2016a或以上版本)

●    Arduino UNO开发板

●    LM35 - 温度传感器

●    连接线

●    面包板


电路原理图

Circuit-Diagram-for-Plot-Graph-using-MATLAB.png


用MATLAB绘制图形

根据电路图设置硬件后,只需单击运行按钮即可在.m文件中运行编辑后的代码

Run-MATLAB-GUI.png

MATLAB可能需要几秒钟的时间来响应,不要点击任何GUI按钮,直到MATLAB在左下角显示忙消息,如下所示,

Processing-MATLAB-GUI-Program.png

一切准备就绪后,单击开始按钮,您将开始在图形区域和编辑文本框中获取温度数据。该值将每秒自动更新。您可以在MATLAB代码中相应地更改一秒的间隔。

输出将如下图所示,

Circuit-Hardware-for-Plot-Graph-using-MATLAB.jpg


这就是如何使用MATLAB绘制Arduino中任何传入值的图形。


代码

以下是本篇文章使用的MATLAB代码

  1. MATLAB Code:

  2. function varargout = Temperature(varargin)

  3. gui_Singleton = 1;
  4. gui_State = struct('gui_Name',       mfilename, ...
  5.                    'gui_Singleton',  gui_Singleton, ...
  6.                    'gui_OpeningFcn', @Temperature_OpeningFcn, ...
  7.                    'gui_OutputFcn',  @Temperature_OutputFcn, ...
  8.                    'gui_LayoutFcn',  [] , ...
  9.                    'gui_Callback',   []);
  10. if nargin && ischar(varargin{1})
  11.     gui_State.gui_Callback = str2func(varargin{1});
  12. end

  13. if nargout
  14.     [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
  15. else
  16.     gui_mainfcn(gui_State, varargin{:});
  17. end

  18. function Temperature_OpeningFcn(hObject, eventdata, handles, varargin)

  19. handles.output = hObject;

  20. guidata(hObject, handles);

  21. function varargout = Temperature_OutputFcn(hObject, eventdata, handles)

  22. varargout{1} = handles.output;
  23. clear all;
  24. global a;
  25. a = arduino;

  26. function start_Callback(hObject, eventdata, handles)

  27. x = 0;
  28. go = true;
  29. global a;
  30. while go
  31.                   
  32. value = readVoltage(a,'A1');
  33. temp = (value*100);
  34. disp(temp);
  35. x = [x temp];
  36. plot(handles.axes1,x);
  37. grid on;
  38. xlabel('Time(seconds)')
  39. ylabel('Temperature(°C)');
  40. title('Real-Time Temperature Graph');
  41. drawnow
  42. set(handles.edit1,'String',num2str(temp));
  43. pause(1);
  44. end



  45. function edit1_Callback(hObject, eventdata, handles)

  46. function edit1_CreateFcn(hObject, eventdata, handles)

  47. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
  48.     set(hObject,'BackgroundColor','white');
  49. end
复制代码
跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-8 10:58 , Processed in 0.054356 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表