clear all; close all;
a = arduino('COM4', 'Uno');
disp 'Connection received!'
pause (3);
figure
h = animatedline;
ax = gca;
ax.YGrid = 'on';
ax.YLim = [2.4 3.8];
title('Moisture Sensor Voltage vs Time (live)');
xlabel('Time [HH:MM:SS]');
ylabel('Voltage [volt]');
stop = false;
startTime = datetime('now');
while ~stop
voltage = readVoltage(a, 'A1');
t = datetime('now') - startTime;
addpoints(h,datenum(t),voltage)
ax.XLim = datenum([t-seconds(15) t]);
datetick('x','keeplimits')
drawnow
while (voltage < 2.9)
voltage = readVoltage(a, 'A1');
t = datetime('now') - startTime;
addpoints(h,datenum(t),voltage)
ax.XLim = datenum([t-seconds(15) t]);
datetick('x','keeplimits')
drawnow
end
while (voltage > 2.9)
writeDigitalPin(a,'D2',1);
disp 'Pump is on!'
voltage = readVoltage(a, 'A1');
t = datetime('now') - startTime;
addpoints(h,datenum(t),voltage)
ax.XLim = datenum([t-seconds(15) t]);
datetick('x','keeplimits')
drawnow
if (voltage < 2.9)
writeDigitalPin(a,'D2',0)
disp 'Pump is off!'
while (voltage < 2.9)
voltage = readVoltage(a, 'A1');
t = datetime('now') - startTime;
addpoints(h,datenum(t),voltage)
ax.XLim = datenum([t-seconds(15) t]);
datetick('x','keeplimits')
drawnow
end
end
end
end
Notice how I repeat the following lines over and over again?
voltage = readVoltage(a, 'A1');
t = datetime('now') - startTime;
addpoints(h,datenum(t),voltage)
ax.XLim = datenum([t-seconds(15) t]);
datetick('x','keeplimits')
drawnow
How can I simplify this code so that I don't need to repeat all 6 lines every loop and can call a function to do it.

댓글 수: 1

Slightly off-topic: not clear to me that you need to use the old datenum format for your times. I think you should be able to plot against durations here, and will ultimately be happier.

댓글을 달려면 로그인하십시오.

 채택된 답변

Askic V
Askic V 2022년 12월 6일

0 개 추천

Why not trying straightforward:
function readVoltageDraw(a, startTime, ax)
voltage = readVoltage(a, 'A1');
t = datetime('now') - startTime;
addpoints(h,datenum(t),voltage)
ax.XLim = datenum([t-seconds(15) t]);
datetick('x','keeplimits')
drawnow
end
and call it just like this:
while (voltage > 2.9)
writeDigitalPin(a,'D2',1);
disp 'Pump is on!'
readVoltageDraw(a, startTime, ax)
...

댓글 수: 4

clear all; close all;
a = arduino('COM3', 'Uno');
disp 'Connection received!'
pause (3);
figure
h = animatedline;
ax = gca;
ax.YGrid = 'on';
ax.YLim = [2.4 3.8];
title('Moisture Sensor Voltage vs Time (live)');
xlabel('Time [HH:MM:SS]');
ylabel('Voltage [volt]');
stop = false;
startTime = datetime('now');
while ~stop
readVoltageDraw(a, startTime, ax)
while (voltage < 2.9)
readVoltageDraw(a, startTime, ax)
end
while (voltage > 2.9)
writeDigitalPin(a,'D2',1);
disp 'Pump is on!'
readVoltageDraw(a, startTime, ax)
if (voltage < 2.9)
writeDigitalPin(a,'D2',0)
disp 'Pump is off!'
while (voltage < 2.9)
readVoltageDraw(a, startTime, ax)
end
end
end
end
function readVoltageDraw(a, startTime, ax)
voltage = readVoltage(a, 'A1');
t = datetime('now') - startTime;
addpoints(h,datenum(t),voltage)
ax.XLim = datenum([t-seconds(15) t]);
datetick('x','keeplimits')
drawnow
end
I have rewritten the code as such. However I am receving this error message:
Unrecognized function or variable 'h'.
Error in MinorProjecthelp>readVoltageDraw (line 37)
addpoints(h,datenum(t),voltage)
Error in MinorProjecthelp (line 16)
readVoltageDraw(a, startTime, ax)
Torsten
Torsten 2022년 12월 6일
If "h" is needed in "readVoltageDraw", you must pass it there as input argument...
Just did that, thank you, it works now :)
Askic V
Askic V 2022년 12월 6일
Yes, I forgot to specify animated handle h as an input argument. Thank you Torsten for point that out.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 MATLAB에 대해 자세히 알아보기

제품

릴리스

R2022b

태그

질문:

2022년 12월 6일

댓글:

2022년 12월 9일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by