Графики являются удобным инструментом для визуализации различных данных. Для их построения в настоящее время можно использовать множество разнообразных инструментов. В этой статье мы рассмотрим построение графика в реальном времени в системе MATLAB на основе данных, получаемых от датчика температуры LM35, подключенного к плате Arduino.
Чтобы лучше понять материал этой статьи вы можете изучить следующие проекты на нашем сайте, посвященные взаимодействию системы MATLAB и платы Arduino:
- мигание светодиодом с помощью MATLAB и Arduino;
- последовательная связь между MATLAB и Arduino;
- управление двигателем постоянного тока с помощью MATLAB и Arduino;
- управление серводвигателем с помощью MATLAB и Arduino;
- управление шаговым двигателем с помощью MATLAB и Arduino.
Создание графического интерфейса в MATLAB для построения графика
Чтобы в MATLAB запустить графический интерфейс пользователя (GUI - Graphical User Interface) напечатайте в окне команд:
1 |
guide |
Откроется новое всплывающее окно, в нем выберите новый blank GUI как показано на следующем рисунке.
После этого нам на рабочее поле редактора графического интерфейса необходимо поместить кнопку (push button), две оси (two axes) и одно текстовое поле (text box). Кнопка будет использоваться для старта измерений и построения графика, две оси – для построения графика, а в текстовом поле будет показываться текущее значение температуры.
Чтобы изменить размер или форму размещенных в поле редактора элементов нажмите на них один раз. После двойного нажатия на эти элементы можно будет изменять множество других их параметров.
Вы можете настроить внешний вид этих элементов по своему усмотрению, мы использовали (кастомизировали) следующий дизайн этих элементов:
Когда вы сохраните этот созданный в графическом интерфейсе пользователя проект в окне редактирования MATLAB автоматически сгенерируется соответствующий код. В дальнейшем мы будем вносить изменения в этот код.
Объяснение кода MATLAB для построения графика
Полный код программы приведен в конце статьи, здесь же мы рассмотрим его основные фрагменты.
Скопируйте следующие строки и вставьте их в программу начиная со строки №74 чтобы убедиться в том что плата Arduino взаимодействует с MATLAB каждый раз когда вы запускаете на выполнение m-файл.
1 2 3 |
clear all; global a; a = arduino(); |
Когда вы прокрутите созданный редактором графического интерфейса код программы вниз, вы увидите что в нем созданы две функции для обработки событий от кнопки и текстового поля, для графика никакой функции не будет создано. Теперь вам необходимо в тело этих функций добавить соответствующие фрагменты кода.
Для функции кнопки старта (Start button’s function) скопируйте и вставьте следующий фрагмент программы. Для непрерывного измерения, отображения и построения графика температуры мы будем использовать цикл типа while. В этом цикле мы будем использовать задержку в 1 секунду – с этой периодичностью будут обновляться результаты измерений.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
x = 0; go = true; global a; while go value = readVoltage(a,'A1'); temp = (value*100); disp(temp); x = [x temp]; plot(handles.axes1,x); grid on; xlabel('Time(seconds)') ylabel('Temperature(°C)'); title('Real-Time Temperature Graph'); drawnow set(handles.edit1,'String',num2str(temp)); pause(1); end |
Теперь давайте рассмотрим как работает этот фрагмент кода. В следующих 3-х строчках кода мы устанавливаем начальные значения переменных: ‘x’- 0, ‘go’ – true. Также мы объявляем глобальную переменную ‘global a’ для взаимодействия с платой Arduino в программе.
1 2 3 |
x = 0; go = true; global a; |
Следующая команда используется для считывания температуры с аналогового контакта A1 платы Arduino, к которому подключен контакт OUT’ датчика температуры LM35.
1 |
value = readVoltage(a,'A1'); |
Считанное значение напряжения мы можем конвертировать в значение температуры в градусах Цельсия умножив его на 100.
1 |
temp = (value*100); |
Далее для построения графика используется функция ‘plot(handles.axes1,x)’, в ней axes1 обозначает ссылку или имя графического поля/графика (Graph area). То есть если ли вы будете строить несколько графиков, вам необходимо будет использовать несколько таких имен. К примеру, для построения второго графика вам необходимо будет уже записать ‘plot(handles.axes2,x)’.
Команда ‘grid on’ используется для включения сетки на графике, ‘xlabel’, ‘ylabel’ и ‘title’ используются для установки имен осей x и y на графике и для названия графика.
1 2 3 4 5 |
plot(handles.axes1,x); grid on; xlabel('Time(seconds)') ylabel('Temperature(°C)'); title('Real-Time Temperature Graph'); |
Команда ‘Drawnow’ используется для обновления информации на графике в режиме реального времени.
1 |
drawnow |
Для отображения значения температуры в текстовом поле каждую секунду используется команда:
1 |
set(handles.edit1,'String',num2str(temp)); |
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Установленная на компьютер математическая система MATLAB (предпочтительно версии R2016a или выше).
- Датчик температуры LM35 (купить на AliExpress).
- Соединительные провода.
- Макетная плата.
Схема проекта
Схема проекта для построения графика температуры в реальном времени с помощью MATLAB и Arduino представлена на следующем рисунке.
Построение графика с помощью MATLAB
После сборки аппаратной части проекта запустите на выполнение созданный .m файл в системе MATLAB.
Системе MATLAB может потребоваться несколько секунд на запуск этого файла, не нажимайте никакую кнопку на графическом интерфейсе до тех пор пока горит индикация BUSY (система занята) в левом нижнем углу экрана.
Когда все будет готово нажмите на кнопку старта в окне графического интерфейса и вы увидите как на экране компьютера будет строиться график температуры в режиме реального времени, а значение температуры будет показываться в текстовом поле. Значения будут автоматически обновляться каждую секунду – эту задержку вы самостоятельно можете изменить в программе при необходимости.
На экране компьютера при этом у вас должна формироваться примерно следующая картина:
Более подробно все эти процессы вы можете посмотреть на видео, приведенном в конце статьи.
Исходный код программы для MATLAB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
function varargout = Temperature(varargin) gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @Temperature_OpeningFcn, ... 'gui_OutputFcn', @Temperature_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end function Temperature_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles); function varargout = Temperature_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; clear all; global a; a = arduino; function start_Callback(hObject, eventdata, handles) x = 0; go = true; global a; while go value = readVoltage(a,'A1'); temp = (value*100); disp(temp); x = [x temp]; plot(handles.axes1,x); grid on; xlabel('Time(seconds)') ylabel('Temperature(°C)'); title('Real-Time Temperature Graph'); drawnow set(handles.edit1,'String',num2str(temp)); pause(1); end function edit1_Callback(hObject, eventdata, handles) function edit1_CreateFcn(hObject, eventdata, handles) if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor')) set(hObject,'BackgroundColor','white'); end |