Графики являются удобным инструментом для визуализации различных данных. В настоящее время существует достаточно много программных средств для построения графиков, однако наиболее популярной и мощной из них является математическая система MATLAB, которая не только имеет хороший инструментарий для построения разнообразных графиков, но и хорошо интегрируется в системы с использованием микроконтроллеров.
В этой статье мы рассмотрим построение в системе MATLAB графиков данных температуры и влажности, считываемых в режиме реального времени с датчика DHT11 с помощью платы Arduino. Ранее на нашем сайте мы рассматривали аналогичную задачу с помощью датчика температуры LM35, MATLAB и Arduino, но в этой статье мы рассмотрим более продвинутый инструментарий для решения данной задачи – сконструируем полноценный логгер данных. Более подробно о подключении датчика температуры и влажности DHT11 к плате Arduino и влажности вы можете прочитать в данной статье.
Чтобы лучше понять материал этой статьи вы можете изучить следующие проекты на нашем сайте, посвященные взаимодействию системы MATLAB и платы Arduino:
- мигание светодиодом с помощью MATLAB и Arduino;
- последовательная связь между MATLAB и Arduino;
- управление двигателем постоянного тока с помощью MATLAB и Arduino;
- управление серводвигателем с помощью MATLAB и Arduino;
- управление шаговым двигателем с помощью MATLAB и Arduino.
Также на нашем сайте вы можете посмотреть проект логгера данных на SD карту и компьютер (в лист Excel) с помощью Arduino (то есть без использования MATLAB).
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Установленная на компьютер математическая система MATLAB (предпочтительно версии R2016a или выше).
- Датчик температуры и влажности DHT11 (купить на AliExpress).
- Соединительные провода.
Реклама: ООО «АЛИБАБА.КОМ (РУ)» ИНН: 7703380158
Схема проекта
Схема подключения датчика температуры и влажности DHT11 к плате Arduino представлена на следующем рисунке.
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Первым делом в программе подключим библиотеку для взаимодействия с датчиком DHT11.
1 |
#include <DHT.h> |
Затем дадим осмысленное название контакту, в которому подключен датчик DHT11 – в нашем случае это контакт 4 платы Arduino.
1 |
#define DHTPIN 4 |
В функции ‘void setup’ инициализируем последовательную связь и датчик DHT11.
1 2 3 4 5 |
void setup() { Serial.begin(9600); delay(2000); dht.begin(); // initialise DHT11 sensor } |
В функции ‘void loop’ для хранения считанных с датчика DHT11 данных температуры и влажности мы будем использовать переменные вещественного типа (float) temp и humi. Считанные значения мы будем передавать с помощью последовательного порта связи чтобы система MATLAB могла их считать последовательно.
1 2 3 4 5 6 7 |
void loop() { float temp = dht.readTemperature(); // считываем данные температуры float humi = dht.readHumidity(); // считываем данные влажности Serial.print(temp); Serial.print(humi); delay(2000); } |
Объяснение программы логгера данных в MATLAB
Откройте MATLAB на своем компьютере и нажмите в нем на кнопку ‘new script’ как показано на следующем рисунке. При этом откроется новое окно редактора, в котором вы можете писать программу.
Полный код программы для MATLAB приведен в конце статьи, здесь же мы кратко обсудим ее основные фрагменты.
Написание программы начнем с объявления переменной для взаимодействия (последовательной связи) между MATLAB и Arduino. В нашем случае это взаимодействие осуществляется по последовательному порту COM18 – у себя вы его должны изменить на тот COM порт, по которому подключена плата Arduino к вашему компьютеру (можно посмотреть в диспетчере устройств Windows).
1 |
s = serial('COM18'); |
В следующих строчках кода функция fopen() используется для установления последовательной связи между MATLAB и Arduino. Затем мы сохраняем принятые по последовательному порту данные в переменной ‘out’. Переменная ‘out’ представляет собой строку из 9 символов, в которой первые 4 символа используются для хранения температуры, а остальные символы – для хранения значения влажности. Поэтому, используя далее команды Temp(i)=str2num(out(1:4)) и Humi(i)=str2num(out(5:9)), мы получаем, соответственно, значения температуры и влажности.
1 2 3 4 |
fopen(s) out = fscanf(s) Temp(i)=str2num(out(1:4)); Humi(i)=str2num(out(5:9)); |
Далее скопируем полный текст программы в окно редактора MATLAB. Нажмите на кнопку ‘run’ чтобы запустить нашу программу на выполнение.
Подождите некоторое время пока MATLAB будет компилировать и исполнять вашу программу – в это время в его нижнем левом углу будет гореть надпись busy (занят) как показано на следующем рисунке.
Если в коде программы нет ошибок, то вы увидите окно, в котором в реальном времени будут строиться графики температуры и влажности. В нашей программе эти данные будут обновляться с периодичностью 2 секунды – это время, необходимое для считывания данных с датчика DHT11 и передачи их через последовательный порт связи.
Чтобы посмотреть численные значения считываемых данных температуры и влажности сделайте двойной клик на соответствующей переменной в workspace window (окно рабочей области) как показано на следующем рисунке.
После этого откроется диалоговое окно, в котором вы можете посмотреть все считанные значения интересующей вас переменной.
Таким вот достаточно простым способом вы можете строить графики реального времени в MATLAB на основе данных, получаемых от платы Arduino, и производить их регистрирование – то есть реализовать функцию логгера (регистратора) данных.
Исходные коды программ
Код программы для Arduino
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <DHT.h> #define DHTPIN 4 // контакт, к которому подключен датчик DHT11 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); delay(2000); dht.begin(); // инициализируем датчик DHT11 } void loop() { float temp = dht.readTemperature(); //считываем данные температуры float humi = dht.readHumidity(); // считываем данные влажности Serial.print(temp); Serial.print(humi); delay(2000); } |
Код программы для 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 |
s = serial('COM18'); time=100; i=1; while(i<time) fopen(s) fprintf(s, 'Your serial data goes here') out = fscanf(s) Temp(i)=str2num(out(1:4)); subplot(211); plot(Temp,'g'); axis([0,time,20,50]); title('Parameter: DHT11 Temperature'); xlabel('---> time in x*0.02 sec'); ylabel('---> Temperature'); grid Humi(i)=str2num(out(5:9)); subplot(212); plot(Humi,'m'); axis([0,time,25,100]); title('Parameter: DHT11 Humidity'); xlabel('---> time in x*0.02 sec'); ylabel('---> % of Humidity '); grid fclose(s) i=i+1; drawnow; end delete(s) clear s |