- "tic" is called twice, only one is needed before the 1000-sample loop.
- "sound_data(i) = readVoltage" is missing a semicolon which can spam the Command Window.
- Pre-allocate "sound_data/time_data" so the loop doesn’t grow arrays.
- Your first plot uses seconds on the x-axis, but the live plot uses "datenum"—mixing styles isn’t necessary. Use elapsed seconds for both.
- Add simple debouncing so a noisy button doesn’t stop the loop immediately.
Need help to see if the two codes I fused together are correctly placed
    4 ビュー (過去 30 日間)
  
       古いコメントを表示
    
clear all; close all;
a = arduino('/dev/tty.SLAB_USBtoUART', 'uno')
tic
max_samples = 1000;
tic 
for i = 1:max_samples
    sound_data(i) = readVoltage(a,'A2')
    time_data(i) = toc;
end
plot(time_data, sound_data)
figure
h = animatedline;
ax = gca;
ax.YGrid = 'on';
ax.YLim = [-0.1 5];
title('Sound sensor voltage vs time (live)');
ylabel('Time [HH:MM:SS]');
xlabel('Voltage [volt]');
stop = false;
startTime = datetime('now'); 
while ~stop
voltage = readVoltage(a,'A2');
t = datetime('now') - startTime;
addpoints(h,datenum(t),voltage)
ax.XLim = datenum([t-seconds(15) t]);
datetick('x','keeplimits')
drawnow
stop = readDigitalPin(a,'D6');
end
0 件のコメント
回答 (1 件)
  Abhipsa
 2025 年 9 月 2 日
        The combined code looks almost correct, but it requires some minor changes.
clearvars; close all; clc
% 1) Connect to Arduino / Grove
a = arduino('/dev/tty.SLAB_USBtoUART','uno');    % adjust port if needed
configurePin(a,'D6','DigitalInput');            % stop button
% 2) Capture 1000 samples
max_samples = 1000;
sound_data = zeros(1,max_samples);
time_data  = zeros(1,max_samples);
tic;                                            % start timer
for i = 1:max_samples
    sound_data(i) = readVoltage(a,'A2');        % Grove sound sensor on A2
    time_data(i)  = toc;                        % seconds since tic
end
figure; 
plot(time_data, sound_data, 'LineWidth', 1);
grid on
xlabel('Time [s]');
ylabel('Voltage [V]');
title('Captured sound (1000 samples)');
% 3) Live feed until button D6 is pressed
figure
h  = animatedline('LineWidth',1);
ax = gca; ax.YGrid = 'on'; ax.YLim = [-0.1 5];
xlabel('Time [s]'); ylabel('Voltage [V]');
title('Sound sensor voltage vs time (live)');
tic;                                           % new timer for live view
stop = false;
lastPressT = -Inf;                              % for debounce
DEBOUNCE = 0.15;                                % seconds
while ~stop
    v = readVoltage(a,'A2');
    t = toc;
    addpoints(h, t, v)
    % show last 15 s
    xlim([max(0, t-15), t])
    drawnow limitrate
    % --- Stop condition on D6 (adjust logic if using pull-down) ---
    btn = readDigitalPin(a,'D6');               % HIGH when pressed with pull-up
    if btn && (t - lastPressT) > DEBOUNCE
        stop = true;
        lastPressT = t;
    end
end
I hope this helps you.
0 件のコメント
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

