Code: MatLab

clear all;
clc;

pause(15)

%% Delete old serial port objects
instrs = instrfind;                         % Locate open ports
if (~isempty(instrs))                       % Close any open ports
    disp('Cleaning old serial ports...');
    delete(instrs);
end

%% Set up the com port

disp('Allocating serial port...');
s_port = serial('COM4');                    % Select the COM port
set(s_port, 'BaudRate', 9600);            % Baud rate matches Arduino
set(s_port, 'Timeout', 10);                  % Set port timeout
set(s_port, 'Terminator','CR');

%% Open the com port

disp('Trying to open serial port...');
fopen(s_port);
disp('Opened!');
pause(1);

%% Initialize Figures

figure(1)
set(gcf,'OuterPosition',[ 95         658        1830         540])
    h1=plot(0,'bo-','LineWidth',2);
    xlabel('Time (min)')
    ylabel('Speed (mph)')
    grid on
    set(gca,'YMinorGrid','on')
    ylim([0 20])
    set(findall(gcf,'-property','FontSize'),'FontSize',30)
    f1 = gcf;
    a1 = f1.CurrentAxes;
    set(a1,'GridAlpha',1)
    set(a1,'MinorGridAlpha',1)

figure(2)
set(gcf,'OuterPosition',[ 0         125        1927         544])
    h2=plot(0,'ro-','LineWidth',2);
    xlabel('Time (min)')
    ylabel('Energy (at 20% Eff.)')
    grid on
    set(gca,'YMinorGrid','on')
    set(findall(gcf,'-property','FontSize'),'FontSize',30)
    f2 = gcf;
    a2 = f2.CurrentAxes;
    set(a2,'GridAlpha',1)
    set(a2,'MinorGridAlpha',1)

figure(3)
set(gcf,'OuterPosition',[ 2   669   214   532])
    h3 = bar(1);
    ylim([0 20])
    set(a1,'GridAlpha',.7)

pause(1)

%% Read in data and plot


flag.start = 0;
flag.runningColor = 0;
bikeSpeed = 0;

j=2;
while 1
    
    % Tell Arduino to start measuring speed 
    fprintf(s_port,1);
    pause(.01);
    
    % Read serial port twice (once for time, once for trainer speed)
    t_in = fscanf(s_port,'%f');         % s
    trainerSpeed = fscanf(s_port,'%f'); % rps

    t(j) = t_in;
    
    % Tire Geometry
    tireToCylRatio = mean([12.25,12.7]);
    rpsWheel = trainerSpeed / tireToCylRatio;
    wheelDia = 27*1.57828E-05; % mi
    wheelCirc = wheelDia*pi;
    
    % Bike Speed in MPH
    bikeSpeed(j) = wheelCirc * rpsWheel*60*60; % MPH
    
    % Integrate speed to find distance in Miles
    distance = trapz(t/60/60,bikeSpeed);
    
    % Power curve of Kurt Kinetic Trainer
    Power(j) = (5.244820) * bikeSpeed(j) + (0.019168) * bikeSpeed(j).^3; % W;
    
    % Integrate power to find total energy
    Energy(j) = trapz(t,Power) * 0.000239006; % kCal
    
    tWindow = 3;
    EWindow = 25;
    
    set(h1,'XData',t/60)
    set(h1,'YData',bikeSpeed)
    
    set(h2,'YData',Energy/.20)
    set(h2,'XData',t/60)
    set(a2,'YLim',[0  max(ceil(max(Energy)/.20),.1)])
    
    set(h3,'YData', bikeSpeed(j))

    if t(j) > tWindow*60;
        set(a1,'XLim',[ceil(max(t)/60)-tWindow  ceil(max(t)/60)])
        set(a2,'XLim',[ceil(max(t)/60)-tWindow  ceil(max(t)/60)])
    else
        set(a1,'XLim',[0  tWindow])
        set(a2,'XLim',[0  tWindow])
    end
    
    if Energy(j) > EWindow*.2;
        set(a2,'YLim',[ceil(max(Energy/.2))-EWindow  ceil(max(Energy/.2))])
    else
        set(a2,'YLim',[0  EWindow])
    end
    refreshdata
    drawnow
    
    if flag.runningColor == 0
        set(h3,'FaceColor',[0 0 1])
        flag.runningColor = 1;
    else
        set(h3,'FaceColor',[0 .5 1])
        flag.runningColor = 0;
    end
    
    % Quit if energy requirment is met
    humanEff = 0.20;
    energy_limit = (400) * humanEff;
    if Energy(j-1) > energy_limit
        % Change color of plot to indicate completion
        set(h1,'Color',[1 0 1])
    end
    
    j=j+1;
    
end

%% Close the port

fclose(s_port);
delete(s_port);