Gabriel St-Pierre
Published © MIT

Programmable Fluidic Pumping System

Low-cost and scalable fluidic pumping system.

AdvancedWork in progress12 hours611
Programmable Fluidic Pumping System

Things used in this project

Hardware components

Raspberry Pi 3 Model B
Raspberry Pi 3 Model B
×1
mp-Highdriver Pump Driver (High flow-rate application)
×1
mp6 Micropumps
×1
kuman 3.5 inch TFT LCD Display Monitor
×1
Right Angle HDMI Adapter (Male to Female)
×1
GEEETECH PLA 3D Printer Filament
×1
Molex FCC Connectors
×1
Low Pump Driver (Low flow-rate application)
×1
Low Voltage Switch IC
×1

Software apps and online services

Fusion 360
Autodesk Fusion 360
Raspbian
Raspberry Pi Raspbian
EasyEDA
JLCPCB EasyEDA
QT Design
Eric Python IDE
Eagle Circuit Design

Hand tools and fabrication machines

Creality Ender 3 - 3D Printer

Story

Read more

Custom parts and enclosures

Overall Assembly

Front Perspective

Back Perspective

Dimensions

Fusion 360 Model

Vessel Holder STL File

Bottom Frame STL File

Side Frames STL File

Screen Cover Perimeter STL File

Back Cover STL File

Schematics

Overall Design

PCB Layout

Schematic

Gerber Manufacturing Files

Schematic Design Netlist

Code

Response Functions

Python
Class containing response functions.
from PyQt5.QtCore import pyqtSlot,  QSize
from PyQt5.QtWidgets import QMainWindow,  QMessageBox,  QInputDialog,  QFileDialog
from .Ui_window import Ui_MainWindow
import sys
import time
import RPi.GPIO as GPIO
import numpy as np 
import os 
import csv

# Hardware Pin Assignment 
GPIO.setmode(GPIO.BCM) ##Use GPIO Pin Reference
logic_switch_pumpA = 17 ##Hardware pin 11 - GPIO 17 --> Turning switch IC A OPEN/CLOSE
logic_switch_pumpB = 27 ##Hardware pin 13 - GPIO 27 --> Turning switch IC B OPEN/CLOSE
frequency_PIN_pumpA = 13 ##Hardware pin 33 - GPIO 13 --> Adjust pump_A driving frequency
frequency_PIN_pumpB = 12 ##Hardware pin 32 - GPIO 12 --> Adjust pump_B driving frequency

# Function converting flow rate values (uL/Min) to frequency values (Hz)
def flowRate_convert(flow_rate):
    
    if (flow_rate < 8.0):
        
        driving_frequency = 1
        
    elif (flow_rate > 12000.0):
        driving_frequency = 1
        
    else:##Convert flow rate (uL/min) to frequency (Hz)
        driving_frequency = flow_rate * 2
        # Derive required PWM frequency to produce desired flow rate output
        # Pump driving frequency = 0 - 300 Hertz
        # Driver default output frequency = 200 Hertz
        # Driver output frequency control with quadruplicated (4X) input frequency = 50 - 800 Hz
        ## for 300 Hz driver output --> 300*4 = 1200 Hz PWM 50% duty is required
        ## for 200 Hz driver output --> 200*4 = 800 Hz PWM 50% duty is required
        
        # 1) Derive required driver output frequency (Hz) from desired flow rate (uL/Min)
        ##driver_output = 199 + (-386*flow_rate) + (331* pow(flow_rate, 2)) + (- 106 * pow(flow_rate, 3)) + (17.1* pow(flow_rate, 4)) + (-1.36 * pow(flow_rate, 5)) + (0.0417 * pow(flow_rate, 6))
        
        #2) Derive required drive input frequency (Hz) from desired output frequency (Hz)
        ##driving_frequency = 997 + (-8.67*driver_output) + (0.0575 * pow(driver_output, 2)) + ((-7.26 * pow(10, -5)) * pow(driver_output, 3)) + ((3.05 * pow(10, -8)) * pow(driver_output, 4))
    
    return driving_frequency
    
    

class ON_OFF_RESPONSES(QMainWindow, Ui_MainWindow):
    def __init__(self,  parent=None):

        super(ON_OFF_RESPONSES, self).__init__(parent)
        self.setupUi(self)
        
        # STATIC PARAMETERS
        self.run_time_pA = 0
        self.run_time_pB = 0
        self.flowRate_pumpA  = 0
        self.flowRate_pumpB = 0
        self.driving_frequency_pumpA = 0 ##flowRate_convert(self.flowRate_pumpA)
        self.driving_frequency_pumpB = 0 ##flowRate_convert(self.flowRate_pumpB)
        self.duty_cycle_pA = 0
        self.duty_cycle_pB = 0
        
        #FLOW MODE PARAMETERS
        self.customFlow_pumpB = False
        self.customFlow_pumpA = False
        self.staticFlow_pumpA = False
        self.staticFlow_pumpB = False
        self.dynamicFlow_pumpA = False
        self.dynamicFlow_pumpB = False
        
        # DYNAMIC PARAMETERS
        self.dynamic_sweepRate_pumpB = 0
        self.flowRate_end_pumpB = 0
        self.flowRate_start_pumpB = 0
        self.dynamic_sweepRate_pumpA = 0
        self.flowRate_start_pumpA = 0
        self.flowRate_end_pumpA = 0
        
        #CUSTOM PARAMETERS
        self.custom_flowRate_values_pA = [] ##List to store values from CSV file
        self.custom_flowRate_values_pB = [] ##List to store values from CSV file
        
    
# ================ ON / OFF BUTTONS  ==================    
    #ON BUTTON PUMP_A
    @pyqtSlot()
    def on_ON_btn_pumpA_clicked(self):
        #Pin State Assignment 
        GPIO.setmode(GPIO.BCM) ##Use GPIO Pin
        GPIO.setup(logic_switch_pumpA,  GPIO.OUT)
        GPIO.setup(frequency_PIN_pumpA,  GPIO.OUT)
        
        # Derive and define driving frequencies (Hz) from flow rate input (uL/Min)
        driving_frequency_pumpA = flowRate_convert(self.flowRate_pumpA) ##Hertz (Driver = 4x pump freq)
        dynamic_start_frequency_pA = flowRate_convert(self.flowRate_start_pumpA)
        dynamic_end_frequency_pA = flowRate_convert(self.flowRate_end_pumpA)
        ##dynamic_sweepRate_pumpA = flowRate_convert(self.dynamic_sweepRate_pumpA)
        duty_cycle_pA = 50 ## % 

        #Define possible flow modes
        staticMode = (self.staticFlow_pumpA == True and self.dynamicFlow_pumpA == False and self.customFlow_pumpA == False)
        dynamicMode = (self.staticFlow_pumpA == False and self.dynamicFlow_pumpA == True and self.customFlow_pumpA == False)
        customMode = (self.staticFlow_pumpA == False and self.dynamicFlow_pumpA == False and self.customFlow_pumpA == True)
        
        #Flow Mode Condition 
        if (staticMode):
            #Condition handling out of range flow rate values
            if ((self.flowRate_pumpA < 8.0) or (self.flowRate_pumpA > 12000.0)):
                #Error message pop-up
                msg = QMessageBox()
                msg.setWindowTitle("---> FLOW RATE OUT OF RANGE <---")
                msg.setText("----->   THE FLOW RATE MUST BE BETWEEN 8 - 12 000 uL/Min   <-----")
                msg.setInformativeText("Information regarding flow range scope can be found below.")
                msg.setDetailedText("mp6-liq piezoelectric pump: \n\n Liquids flow range: 8 - 12 000 uL/Min \n\n Typical flow rate: 8 mL/Min \n\n Typical back pressure: 600 mbar @ 100Hz, 250 Vpp \n\n *** Review datasheet for further information. \n\n ")
                msg.setStyleSheet("background-color: rgb(114, 159, 207);")
                msg.setIcon(QMessageBox.Warning) ##.Information or .Warning or .Question
                msg.setStandardButtons(QMessageBox.Retry) ##.Ok or .Ignore or .Save or .Cancel
                msg.setDefaultButton(QMessageBox.Retry)
                x = msg.exec_()
                self.flowRate_pumpA = 0
                
            #Drive the pumps according to selected parameters 
            else:
                GPIO.output(logic_switch_pumpA,  GPIO.HIGH)
                frequency_ON_pumpA = GPIO.PWM(frequency_PIN_pumpA,  driving_frequency_pumpA)
                #Set 100% progress bar to the total run time entered
                self.progressBar_staticFlow_pumpA.setMaximum(self.run_time_pA)
                progressBar_staticFlowA_index = 0
                
                #Turn pumping ON
                frequency_ON_pumpA.start(duty_cycle_pA)
                #Iterate until run_time_pA value is reached
                for i in np.arange(self.run_time_pA):
                    progressBar_staticFlowA_index +=1
                    time.sleep(1)
                    self.progressBar_staticFlow_pumpA.setValue(progressBar_staticFlowA_index)
                
                #Stop pumping frequency
                frequency_ON_pumpA.stop()
                #Static mode terminated pop up message
                msg = QMessageBox()
                msg.setWindowTitle("COMPLETED")
                msg.setInformativeText(" PREDEFINED STATIC FLOW TERMINATED \n\n PRESS OFF TO STOP PUMPING ")
                msg.setStyleSheet("background-color: rgb(114, 159, 207);")
                msg.setIcon(QMessageBox.Information) ##.Information or .Warning or .Question
                msg.setStandardButtons(QMessageBox.Ok) ##.Ok or .Ignore or .Save or .Cancel
                msg.setDefaultButton(QMessageBox.Ok)
                x = msg.exec_()

            
        
        elif (dynamicMode):
            #Condition handling out of range flow rate values
            if ((self.flowRate_start_pumpA < 8.0) or (self.flowRate_end_pumpA >12000.0)):
                #Error message pop-up
                msg = QMessageBox()
                msg.setWindowTitle("---> FLOW RATE OUT OF RANGE <---")
                msg.setText("----->   THE FLOW RATE MUST BE BETWEEN 8 - 12 000 uL / Min   <-----")
                msg.setInformativeText("Information regarding flow range scope can be found below.")
                msg.setDetailedText("mp6-liq piezoelectric pump: \n\n Liquids flow range: 8 - 12 000 uL/Min \n\n Typical flow rate: 8 mL/Min \n\n Typical back pressure: 600 mbar @ 100Hz, 250 Vpp \n\n *** Review datasheet for further information. \n\n ")
                msg.setStyleSheet("background-color: rgb(114, 159, 207);")
                msg.setIcon(QMessageBox.Warning) ##.Information or .Warning or .Question
                msg.setStandardButtons(QMessageBox.Retry) ##.Ok or .Ignore or .Save or .Cancel
                msg.setDefaultButton(QMessageBox.Retry)
                x = msg.exec_()
                self.flowRate_start_pumpA = 0
                self.flowRate_end_pumpA = 0
                
            #Drive the pumps according to selected parameters
            else:
                GPIO.output(logic_switch_pumpA,  GPIO.HIGH)
                frequency_ON_pumpA = GPIO.PWM(frequency_PIN_pumpA,  dynamic_start_frequency_pA)
                #Define a range of frequencies from the input
                frequency_range = np.arange(dynamic_start_frequency_pA,  dynamic_end_frequency_pA,  self.dynamic_sweepRate_pumpA)
                #Set 100% progress to the total frequency values to be iterated upon
                self.progressBar_dynamicFlow_pumpA.setMaximum(len(frequency_range))
                progressBar_dynamicFlowA_index = 0
                
                # Iterate through frequency_range following dynamic_sweepRate_pumpA
                frequency_ON_pumpA.start(duty_cycle_pA)
                for n in frequency_range:
                    progressBar_dynamicFlowA_index +=1
                    time.sleep(1)
                    frequency_ON_pumpA.ChangeFrequency(n)
                    self.progressBar_dynamicFlow_pumpA.setValue(progressBar_dynamicFlowA_index)
                
                #Stop pumping frequency
                frequency_ON_pumpA.stop()
                #Dynamic mode terminated pop-up message
                msg = QMessageBox()
                msg.setWindowTitle("COMPLETED")
                msg.setInformativeText(" DYNAMIC FLOW TERMINATED \n\n PRESS OFF TO STOP PUMPING ")
                msg.setStyleSheet("background-color: rgb(114, 159, 207);")
                msg.setIcon(QMessageBox.Information) ##.Information or .Warning or .Question
                msg.setStandardButtons(QMessageBox.Ok) ##.Ok or .Ignore or .Save or .Cancel
                msg.setDefaultButton(QMessageBox.Ok)
                x = msg.exec_()
            
        elif(customMode):
            
            GPIO.output(logic_switch_pumpA,  GPIO.HIGH)
            frequency_ON_pumpA = GPIO.PWM(frequency_PIN_pumpA,  flowRate_convert(self.custom_flowRate_values_pA[0]))
            #Set 100% progress bar value to the number of values contained in the CSV file
            self.progressBar_customFlow_pumpA.setMaximum(len(self.custom_flowRate_values_pA))
            progressBar_customFlowA_index = 0
            
            #Initiate pumping and iterate through all flow rate values parsed from the CSV file
            frequency_ON_pumpA.start(duty_cycle_pA)
            for n in self.custom_flowRate_values_pA:
                    progressBar_customFlowA_index +=1
                    time.sleep(1)
                    frequency_ON_pumpA.ChangeFrequency(flowRate_convert(n))
                    self.progressBar_customFlow_pumpA.setValue(progressBar_customFlowA_index)
                
            #Terminate custom pumping frequency
            frequency_ON_pumpA.stop()
            #Custom mode terminated message
            msg = QMessageBox()
            msg.setWindowTitle("COMPLETED")
            msg.setInformativeText(" CUSTOM FLOW TERMINATED \n\n PRESS OFF TO STOP PUMPING ")
            msg.setStyleSheet("background-color: rgb(114, 159, 207);")
            msg.setIcon(QMessageBox.Information) ##.Information or .Warning or .Question
            msg.setStandardButtons(QMessageBox.Ok) ##.Ok or .Ignore or .Save or .Cancel
            msg.setDefaultButton(QMessageBox.Ok)
            x = msg.exec_()           
            
            
        #Condition handling invalid flow mode selection
        else:
            #Error message pop-up
            msg = QMessageBox()
            msg.setWindowTitle("---> INVALID FLOW MODE <---")
            msg.setText("----->  ONE FLOW MODE MUST BE SELECTED   <-----")
            msg.setInformativeText("   Details regarding the flow modes available can be found below.   ")
            msg.setDetailedText("\n STATIC FLOW MODE: Constant flow rate (uL / Min) during a pre-defined time period (Sec).  \n\n DYNAMIC FLOW MODE: Constant change of flow rate within a pre-define range of values following a desired sweep rate (uL/Min). \n\n CUSTOM FLOW MODE: Flow rate output follows complex periodic functions uploaded via CSV file. \n\n")
            msg.setStyleSheet("background-color: rgb(114, 159, 207);")
            msg.setIcon(QMessageBox.Critical) ##.Information or .Warning or .Question
            msg.setStandardButtons(QMessageBox.Retry) ##.Ok or .Ignore or .Save or .Cancel
            msg.setDefaultButton(QMessageBox.Retry)
            x = msg.exec_()
    
    #OFF BUTTON PUMP_A
    @pyqtSlot()
    def on_OFF_btn_pumpA_clicked(self):
        
        driving_frequency_pumpA = flowRate_convert(self.flowRate_pumpA)
        GPIO.setmode(GPIO.BCM) ##Use GPIO Pin
        GPIO.setup(logic_switch_pumpA,  GPIO.OUT)
        GPIO.setup(frequency_PIN_pumpA,  GPIO.OUT)
        
        #Turn OFF switch IC Logic Pin
        GPIO.output(logic_switch_pumpA,  GPIO.LOW)
        #Turn OFF frequency pin 
        frequency_ON_pumpA = GPIO.PWM(frequency_PIN_pumpA,  driving_frequency_pumpA)
        frequency_ON_pumpA.stop()
        #Clean up pins 
        GPIO.cleanup((logic_switch_pumpA, frequency_PIN_pumpA))
        
        #Reset progress bar to 0% + flow modes to default
        if (self.staticFlow_pumpA == True):
            self.progressBar_staticFlow_pumpA.setValue(0)
            self.staticFlow_pumpA = False
            #self.flow_rate_pumpA.setValue(0.00)
            #self.run_time_pumpA.setValue(0.00)
        
        elif (self.dynamicFlow_pumpA == True):
            self.progressBar_dynamicFlow_pumpA.setValue(0)
            self.dynamicFlow_pumpA = False
            #self.flowRate_start_pumpA.setValue(0.00)
            #self.flowRate_end_pumpA.setValue(0.00)
            #self.dynamic_sweepRate_pumpA.setValue(0.00)
        
        elif (self.customFlow_pumpA == True):
            self.progressBar_customFlow_pumpA.setValue(0)
            self.dynamicFlow_pumpA = False

    #ON BUTTON PUMP_B
    @pyqtSlot()
    def on_ON_btn_pumpB_clicked(self):
        
        GPIO.setmode(GPIO.BCM) ##Use GPIO Pin
        GPIO.setup(frequency_PIN_pumpB,  GPIO.OUT)
        GPIO.setup(logic_switch_pumpB,  GPIO.OUT)
        
        # Derive & define pumping frequencies (Hz) from fow rate input (uL/Min)
        driving_frequency_pumpB = flowRate_convert(self.flowRate_pumpB) ##Hertz (Driver = 4x pump freq)
        dynamic_start_frequency_pB = flowRate_convert(self.flowRate_start_pumpB)
        dynamic_end_frequency_pB = flowRate_convert(self.flowRate_end_pumpB)
        ##dynamic_sweepRate_pumpB= flowRate_convert(self.dynamic_sweepRate_pumpB)
        duty_cycle_pB = 50 ## %      
        
        #Define available flow modes
        staticMode = (self.staticFlow_pumpB == True and self.dynamicFlow_pumpB == False and self.customFlow_pumpB == False)
        dynamicMode = (self.staticFlow_pumpB == False and self.dynamicFlow_pumpB == True and self.customFlow_pumpB == False)
        customMode = (self.staticFlow_pumpB == False and self.dynamicFlow_pumpB == False and self.customFlow_pumpB == True) 
        
        if (staticMode):
            #Condition handling out of range flow rate input
            if ((self.flowRate_pumpB < 8.0) or (self.flowRate_pumpB > 12000.0)):
                #Error message pop-up
                msg = QMessageBox()
                msg.setWindowTitle("---> FLOW RATE OUT OF RANGE <---")
                msg.setText("----->   THE FLOW RATE MUST BE BETWEEN 8 - 12 000 uL/Min   <-----")
                msg.setInformativeText("Information regarding flow range scope can be found below.")
                msg.setDetailedText("mp6-liq piezoelectric pump: \n\n Liquids flow range: 8 - 12 000 uL/Min \n\n Typical flow rate: 8 mL/Min \n\n Typical back pressure: 600 mbar @ 100Hz, 250 Vpp \n\n *** Review datasheet for further information. \n\n ")
                msg.setStyleSheet("background-color: rgb(114, 159, 207);")
                msg.setIcon(QMessageBox.Warning) ##.Information or .Warning or .Question
                msg.setStandardButtons(QMessageBox.Retry) ##.Ok or .Ignore or .Save or .Cancel
                msg.setDefaultButton(QMessageBox.Retry)
                x = msg.exec_()
                self.flowRate_pumpB = 0
                
            #Drive the pump according to the parameters selected
            else:
                GPIO.output(logic_switch_pumpB,  GPIO.HIGH)
                frequency_ON_pumpB = GPIO.PWM(frequency_PIN_pumpB,  driving_frequency_pumpB)
                #Set 100% progress bar value to total run time selected 
                self.progressBar_staticFlow_pumpB.setMaximum(self.run_time_pB)
                progressBar_staticFlowB_index = 0
                
                #Initiate pumping until total run time has been reached
                frequency_ON_pumpB.start(duty_cycle_pB)
                for i in np.arange(self.run_time_pB):
                    progressBar_staticFlowB_index +=1
                    time.sleep(1)
                    self.progressBar_staticFlow_pumpB.setValue(progressBar_staticFlowB_index)
                
                #Terminate pumping frequency
                frequency_ON_pumpB.stop()
                #Static terminated message
                msg = QMessageBox()
                msg.setWindowTitle("COMPLETED")
                msg.setInformativeText(" PREDEFINED STATIC FLOW TERMINATED \n\n PRESS OFF TO STOP PUMPING ")
                msg.setStyleSheet("background-color: rgb(114, 159, 207);")
                msg.setIcon(QMessageBox.Information) ##.Information or .Warning or .Question
                msg.setStandardButtons(QMessageBox.Ok) ##.Ok or .Ignore or .Save or .Cancel
                msg.setDefaultButton(QMessageBox.Ok)
                x = msg.exec_()

        
        elif (dynamicMode):
            #Condition handling out of range flow rate input
            if ((self.flowRate_start_pumpB < 8.0) or (self.flowRate_end_pumpB >12000.0)):
                #Error message pop-up
                msg = QMessageBox()
                msg.setWindowTitle("---> FLOW RATE OUT OF RANGE <---")
                msg.setText("----->   THE FLOW RATE MUST BE BETWEEN 8 - 12 000 uL / Min   <-----")
                msg.setInformativeText("Information regarding flow range scope can be found below.")
                msg.setDetailedText("mp6-liq piezoelectric pump: \n\n Liquids flow range: 8 - 12 000 uL/Min \n\n Typical flow rate: 8 mL/Min \n\n Typical back pressure: 600 mbar @ 100Hz, 250 Vpp \n\n *** Review datasheet for further information. \n\n ")
                msg.setStyleSheet("background-color: rgb(114, 159, 207);")
                msg.setIcon(QMessageBox.Warning) ##.Information or .Warning or .Question
                msg.setStandardButtons(QMessageBox.Retry) ##.Ok or .Ignore or .Save or .Cancel
                msg.setDefaultButton(QMessageBox.Retry)
                x = msg.exec_()
                self.flowRate_start_pumpB = 0
                self.flowRate_end_pumpB = 0
            
            #Initiate pumping according to the parameters selected
            else:
                
                GPIO.output(logic_switch_pumpB,  GPIO.HIGH)
                frequency_ON_pumpB = GPIO.PWM(frequency_PIN_pumpB,  dynamic_start_frequency_pB)
                #Define the range of frequencies to be iterated upon
                frequency_range = np.arange(dynamic_start_frequency_pB,  dynamic_end_frequency_pB,  self.dynamic_sweepRate_pumpB)
                #Set 100% progress bar value to the total number of frequency values
                self.progressBar_dynamicFlow_pumpB.setMaximum(len(frequency_range))
                progressBar_dynamicFlowB_index = 0
                
                # Iterate through frequency_range following dynamic_sweepRate_pumpA
                frequency_ON_pumpB.start(duty_cycle_pB)
                for n in frequency_range:
                    progressBar_dynamicFlowB_index +=1
                    time.sleep(1)
                    frequency_ON_pumpB.ChangeFrequency(n)
                    self.progressBar_dynamicFlow_pumpB.setValue(progressBar_dynamicFlowB_index)
                
                #Terminate pumping frequency
                frequency_ON_pumpB.stop()
                #Dynamic mode terminated message
                msg = QMessageBox()
                msg.setWindowTitle("COMPLETED")
                msg.setInformativeText(" DYNAMIC FLOW TERMINATED \n\n PRESS OFF TO STOP PUMPING ")
                msg.setStyleSheet("background-color: rgb(114, 159, 207);")
                msg.setIcon(QMessageBox.Information) ##.Information or .Warning or .Question
                msg.setStandardButtons(QMessageBox.Ok) ##.Ok or .Ignore or .Save or .Cancel
                msg.setDefaultButton(QMessageBox.Ok)
                x = msg.exec_()
        
        elif(customMode):
            
            GPIO.output(logic_switch_pumpB,  GPIO.HIGH)
            frequency_ON_pumpB = GPIO.PWM(frequency_PIN_pumpB,  flowRate_convert(self.custom_flowRate_values_pB[0]))
            #Set 100% progress bar value to the total number of flow rate value parsed in the CSV file
            self.progressBar_customFlow_pumpB.setMaximum(len(self.custom_flowRate_values_pB))
            progressBar_customFlowB_index = 0
            
            #Initiate pumping following the range of values parsed in the CSV file
            frequency_ON_pumpB.start(duty_cycle_pB)
            for n in self.custom_flowRate_values_pB:
                    progressBar_customFlowB_index += 1
                    time.sleep(1)
                    frequency_ON_pumpB.ChangeFrequency(flowRate_convert(n))
                    self.progressBar_customFlow_pumpB.setValue(progressBar_customFlowB_index)
            
            #Terminate pumping frequency
            frequency_ON_pumpB.stop()
            #Custom mode terminated message
            msg = QMessageBox()
            msg.setWindowTitle("COMPLETED")
            msg.setInformativeText(" CUSTOM FLOW TERMINATED \n\n PRESS OFF TO STOP PUMPING ")
            msg.setStyleSheet("background-color: rgb(114, 159, 207);")
            msg.setIcon(QMessageBox.Information) ##.Information or .Warning or .Question
            msg.setStandardButtons(QMessageBox.Ok) ##.Ok or .Ignore or .Save or .Cancel
            msg.setDefaultButton(QMessageBox.Ok)
            x = msg.exec_()  
            
        
        #Condition handling invalid flow mode selections
        else:
            #Error message pop-up
            msg = QMessageBox()
            msg.setWindowTitle("---> INVALID FLOW MODE <---")
            msg.setText("----->  ONE FLOW MODE MUST BE SELECTED   <-----")
            msg.setInformativeText("   Details regarding the flow modes available can be found below.   ")
            msg.setDetailedText("\n STATIC FLOW MODE: Constant flow rate (uL / Min) during a pre-defined time period (Sec).  \n\n DYNAMIC FLOW MODE: Constant change of flow rate within a pre-define range of values following a desired sweep rate (uL/Min). \n\n CUSTOM FLOW MODE: Flow rate output follows complex periodic functions uploaded via CSV file. \n\n")
            msg.setStyleSheet("background-color: rgb(114, 159, 207);")
            msg.setIcon(QMessageBox.Critical) ##.Information or .Warning or .Question
            msg.setStandardButtons(QMessageBox.Retry) ##.Ok or .Ignore or .Save or .Cancel
            msg.setDefaultButton(QMessageBox.Retry)
            x = msg.exec_()
    
    
    
    #OFF BUTTON PUMP_B
    @pyqtSlot()
    def on_OFF_btn_pumpB_2_clicked(self):
        
        driving_frequency_pumpB = flowRate_convert(self.flowRate_pumpB)
        GPIO.setmode(GPIO.BCM) ##Use GPIO Pin
        GPIO.setup(logic_switch_pumpB,  GPIO.OUT)
        GPIO.setup(frequency_PIN_pumpB,  GPIO.OUT)
        
        #Turn OFF all pins
        GPIO.output(logic_switch_pumpB,  GPIO.LOW)
        frequency_ON_pumpB = GPIO.PWM(frequency_PIN_pumpB,  driving_frequency_pumpB)
        frequency_ON_pumpB.stop()
        GPIO.cleanup((logic_switch_pumpB, frequency_PIN_pumpB))
        
        #Reset progress bars & flow modes
        if (self.staticFlow_pumpB == True):
            self.progressBar_staticFlow_pumpB.setValue(0)
            self.staticFlow_pumpB = False
            #self.flow_rate_pumpB.setValue(0.00)
            #self.run_time_pumpB.setValue(0.00)
        
        elif (self.dynamicFlow_pumpB == True):
            self.progressBar_dynamicFlow_pumpB.setValue(0)
            self.dynamicFlow_pumpB = False
            #self.flowRate_start_pumpB.setValue(0.00)
            #self.flowRate_end_pumpB.setValue(0.00)
            #self.dynamic_sweepRate_pumpB.setValue(0.00)
        
        elif (self.customFlow_pumpB == True):
            self.progressBar_customFlow_pumpB.setValue(0)
            self.customFlow_pumpB = False
   
  








# =============== FLOW MODE TOGGLE BUTTONS ================
    @pyqtSlot(bool)
    def on_staticFlow_pumpA_toggled(self, staticFlow_pumpA):
       if staticFlow_pumpA == True:
            self.staticFlow_pumpA = True
       elif staticFlow_pumpA == False:
           self.staticFlow_pumpA = False
        
    @pyqtSlot(bool)
    def on_dynamicFlow_pumpA_toggled(self, dynamicFlow_pumpA):
        if dynamicFlow_pumpA == True:
            self.dynamicFlow_pumpA = True
        elif dynamicFlow_pumpA == False:
            self.dynamicFlow_pumpA = False

    @pyqtSlot(bool)
    def on_customFlow_pumpA_toggled(self, customFlow_pumpA):
        if customFlow_pumpA == True:
            self.customFlow_pumpA = True
        elif customFlow_pumpA == False:
            self.customFlow_pumpA = False
     
    @pyqtSlot(bool)
    def on_staticFlow_pumpB_toggled(self, staticFlow_pumpB):
        if staticFlow_pumpB == True:
            self.staticFlow_pumpB = True
        elif staticFlow_pumpB == False:
            self.staticFlow_pumpB = False
        
    @pyqtSlot(bool)
    def on_dynamicFlow_pumpB_toggled(self, dynamicFlow_pumpB):
        if dynamicFlow_pumpB == True:
            self.dynamicFlow_pumpB = True
        elif dynamicFlow_pumpB == False:
            self.dynamicFlow_pumpB = False
        
    @pyqtSlot(bool)
    def on_customFlow_pumpB_toggled(self, customFlow_pumpB):
        if customFlow_pumpB == True:
            self.customFlow_pumpB = True
        elif customFlow_pumpB == False:
            self.customerFlow_pumpB = False
        
    








# ================== STATIC PARAMETERS SELECTION BUTTONS ============
    @pyqtSlot(float)
    def on_run_time_pumpA_valueChanged(self, run_time_pA):
        self.run_time_pA = run_time_pA
            
        
    @pyqtSlot(float)
    def on_run_time_pumpB_valueChanged(self, run_time_pB):
        self.run_time_pB = run_time_pB
        
    @pyqtSlot(float)
    def on_flow_rate_pumpA_valueChanged(self, flowRate_pumpA):
        self.flowRate_pumpA = flowRate_pumpA
        
    
    @pyqtSlot(float)
    def on_flow_rate_pumpB_valueChanged(self, flowRate_pumpB):
        self.flowRate_pumpB = flowRate_pumpB
         
    








# ================= DYNAMIC PARAMETERS SELECTION BUTTONS ===========
    @pyqtSlot(float)
    def on_flowRate_start_pumpA_valueChanged(self, flowRate_start_pumpA):
        self.flowRate_start_pumpA = flowRate_start_pumpA
        
    
    @pyqtSlot(float)
    def on_flowRate_end_pumpA_valueChanged(self, flowRate_end_pumpA):
        self.flowRate_end_pumpA = flowRate_end_pumpA
        
    
    @pyqtSlot(float)
    def on_dynamic_sweepRate_pumpA_valueChanged(self, dynamic_sweepRate_pumpA):
        self.dynamic_sweepRate_pumpA = dynamic_sweepRate_pumpA
        
    
    @pyqtSlot(float)
    def on_flowRate_start_pumpB_valueChanged(self, flowRate_start_pumpB):
        self.flowRate_start_pumpB = flowRate_start_pumpB
        
    
    @pyqtSlot(float)
    def on_flowRate_end_pumpB_valueChanged(self, flowRate_end_pumpB):
        self.flowRate_end_pumpB = flowRate_end_pumpB
        
    @pyqtSlot(float)
    def on_dynamic_sweepRate_pumpB_valueChanged(self, dynamic_sweepRate_pumpB):
        self.dynamic_sweepRate_pumpB = dynamic_sweepRate_pumpB



# =====================CUSTOM PARAMETERS / FILE UPLOAD BUTTONS ====================
    @pyqtSlot()
    def on_upload_pumpA_clicked(self):
        file_filter = '(*.csv)'
        filename = QFileDialog.getOpenFileName(parent = self,  caption = 'SELECT A DATA FILE', directory = os.getcwd(), filter = file_filter)
        
        #Read the CSV file
        with open("testFile.csv",  'r') as csv_file:
            csv_reader = csv.reader(csv_file)
            #Parse + save flow rate values in list
            for row in csv_reader:
                self.custom_flowRate_values_pA.append(row)
            #Convert values to float
            self.custom_flowRate_values_pA = list(np.float_(self.custom_flowRate_values_pA))

    @pyqtSlot()
    def on_upload_pumpB_clicked(self):
        file_filter = '(*.csv)'
        filename = QFileDialog.getOpenFileName(parent=self,  caption = 'SELECT A DATA FILE', directory = os.getcwd(), filter = file_filter)
        
        #Read the CSV file
        with open("testFile.csv",  'r') as csv_file:
            csv_reader = csv.reader(csv_file)
            #Parse + save flow rate values
            for row in csv_reader:
                self.custom_flowRate_values_pB.append(row)
            #Convert values to float
            self.custom_flowRate_values_pB = list(np.float_(self.custom_flowRate_values_pB))

Front End Design using QT5

Python
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '/home/pi/fluidicControl/ui/window.ui'
#
# Created by: PyQt5 UI code generator 5.7
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1800, 899)
        MainWindow.setMaximumSize(QtCore.QSize(1800, 900))
        palette = QtGui.QPalette()
        brush = QtGui.QBrush(QtGui.QColor(114, 159, 207))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(114, 159, 207))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(114, 159, 207))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(114, 159, 207))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(114, 159, 207))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(114, 159, 207))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(114, 159, 207))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(114, 159, 207))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(114, 159, 207))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
        MainWindow.setPalette(palette)
        MainWindow.setAutoFillBackground(False)
        MainWindow.setStyleSheet("background-color: rgb(114, 159, 207);")
        self.centralWidget = QtWidgets.QWidget(MainWindow)
        font = QtGui.QFont()
        font.setKerning(True)
        self.centralWidget.setFont(font)
        self.centralWidget.setAutoFillBackground(False)
        self.centralWidget.setStyleSheet("background-color: rgb(114, 159, 207);")
        self.centralWidget.setObjectName("centralWidget")
        self.Pump_A = QtWidgets.QGroupBox(self.centralWidget)
        self.Pump_A.setGeometry(QtCore.QRect(20, 30, 850, 850))
        self.Pump_A.setMaximumSize(QtCore.QSize(850, 850))
        palette = QtGui.QPalette()
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
        self.Pump_A.setPalette(palette)
        font = QtGui.QFont()
        font.setPointSize(45)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.Pump_A.setFont(font)
        self.Pump_A.setMouseTracking(False)
        self.Pump_A.setFocusPolicy(QtCore.Qt.StrongFocus)
        self.Pump_A.setAcceptDrops(False)
        self.Pump_A.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.Pump_A.setAutoFillBackground(False)
        self.Pump_A.setStyleSheet("background-color: rgb(52, 101, 164);\n"
"")
        self.Pump_A.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignTop)
        self.Pump_A.setFlat(True)
        self.Pump_A.setCheckable(False)
        self.Pump_A.setChecked(False)
        self.Pump_A.setObjectName("Pump_A")
        self.staticFlow_pumpA = QtWidgets.QGroupBox(self.Pump_A)
        self.staticFlow_pumpA.setGeometry(QtCore.QRect(30, 155, 780, 215))
        font = QtGui.QFont()
        font.setPointSize(35)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        font.setKerning(True)
        self.staticFlow_pumpA.setFont(font)
        self.staticFlow_pumpA.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.staticFlow_pumpA.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
        self.staticFlow_pumpA.setCheckable(True)
        self.staticFlow_pumpA.setChecked(False)
        self.staticFlow_pumpA.setObjectName("staticFlow_pumpA")
        self.labelStatic_flowRate_pumpA = QtWidgets.QLabel(self.staticFlow_pumpA)
        self.labelStatic_flowRate_pumpA.setGeometry(QtCore.QRect(90, 72, 261, 31))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(False)
        font.setWeight(50)
        self.labelStatic_flowRate_pumpA.setFont(font)
        self.labelStatic_flowRate_pumpA.setObjectName("labelStatic_flowRate_pumpA")
        self.labelStatic_runTime_pumpA = QtWidgets.QLabel(self.staticFlow_pumpA)
        self.labelStatic_runTime_pumpA.setGeometry(QtCore.QRect(500, 72, 191, 31))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(False)
        font.setWeight(50)
        self.labelStatic_runTime_pumpA.setFont(font)
        self.labelStatic_runTime_pumpA.setObjectName("labelStatic_runTime_pumpA")
        self.flow_rate_pumpA = QtWidgets.QDoubleSpinBox(self.staticFlow_pumpA)
        self.flow_rate_pumpA.setGeometry(QtCore.QRect(90, 115, 230, 90))
        font = QtGui.QFont()
        font.setPointSize(55)
        font.setBold(False)
        font.setWeight(50)
        self.flow_rate_pumpA.setFont(font)
        self.flow_rate_pumpA.setMaximum(12000.0)
        self.flow_rate_pumpA.setSingleStep(0.01)
        self.flow_rate_pumpA.setObjectName("flow_rate_pumpA")
        self.run_time_pumpA = QtWidgets.QDoubleSpinBox(self.staticFlow_pumpA)
        self.run_time_pumpA.setGeometry(QtCore.QRect(480, 115, 230, 90))
        font = QtGui.QFont()
        font.setPointSize(55)
        font.setBold(False)
        font.setWeight(50)
        self.run_time_pumpA.setFont(font)
        self.run_time_pumpA.setMaximum(12000.0)
        self.run_time_pumpA.setSingleStep(0.01)
        self.run_time_pumpA.setObjectName("run_time_pumpA")
        self.progressBar_staticFlow_pumpA = QtWidgets.QProgressBar(self.staticFlow_pumpA)
        self.progressBar_staticFlow_pumpA.setGeometry(QtCore.QRect(320, 5, 450, 55))
        font = QtGui.QFont()
        font.setPointSize(45)
        font.setBold(True)
        font.setItalic(False)
        font.setWeight(75)
        self.progressBar_staticFlow_pumpA.setFont(font)
        self.progressBar_staticFlow_pumpA.setProperty("value", 0)
        self.progressBar_staticFlow_pumpA.setObjectName("progressBar_staticFlow_pumpA")
        self.dynamicFlow_pumpA = QtWidgets.QGroupBox(self.Pump_A)
        self.dynamicFlow_pumpA.setGeometry(QtCore.QRect(30, 390, 780, 310))
        palette = QtGui.QPalette()
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
        self.dynamicFlow_pumpA.setPalette(palette)
        font = QtGui.QFont()
        font.setPointSize(35)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.dynamicFlow_pumpA.setFont(font)
        self.dynamicFlow_pumpA.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.dynamicFlow_pumpA.setCheckable(True)
        self.dynamicFlow_pumpA.setChecked(False)
        self.dynamicFlow_pumpA.setObjectName("dynamicFlow_pumpA")
        self.labelDynamic_from_pumpA = QtWidgets.QLabel(self.dynamicFlow_pumpA)
        self.labelDynamic_from_pumpA.setGeometry(QtCore.QRect(50, 130, 81, 21))
        font = QtGui.QFont()
        font.setPointSize(18)
        font.setBold(False)
        font.setWeight(50)
        self.labelDynamic_from_pumpA.setFont(font)
        self.labelDynamic_from_pumpA.setStyleSheet("color: rgb(0, 0, 0);")
        self.labelDynamic_from_pumpA.setObjectName("labelDynamic_from_pumpA")
        self.labelDynamic_to_pumpA = QtWidgets.QLabel(self.dynamicFlow_pumpA)
        self.labelDynamic_to_pumpA.setGeometry(QtCore.QRect(470, 130, 51, 21))
        font = QtGui.QFont()
        font.setPointSize(18)
        font.setBold(False)
        font.setWeight(50)
        self.labelDynamic_to_pumpA.setFont(font)
        self.labelDynamic_to_pumpA.setStyleSheet("color: rgb(0, 0, 0);")
        self.labelDynamic_to_pumpA.setObjectName("labelDynamic_to_pumpA")
        self.labelDynamic_startFRate_pumpA = QtWidgets.QLabel(self.dynamicFlow_pumpA)
        self.labelDynamic_startFRate_pumpA.setGeometry(QtCore.QRect(90, 72, 321, 31))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(False)
        font.setWeight(50)
        self.labelDynamic_startFRate_pumpA.setFont(font)
        self.labelDynamic_startFRate_pumpA.setObjectName("labelDynamic_startFRate_pumpA")
        self.labelDynamic_endFRate_pumpA = QtWidgets.QLabel(self.dynamicFlow_pumpA)
        self.labelDynamic_endFRate_pumpA.setGeometry(QtCore.QRect(475, 72, 291, 31))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(False)
        font.setWeight(50)
        self.labelDynamic_endFRate_pumpA.setFont(font)
        self.labelDynamic_endFRate_pumpA.setObjectName("labelDynamic_endFRate_pumpA")
        self.labelDynamic_sweep_pumpA = QtWidgets.QLabel(self.dynamicFlow_pumpA)
        self.labelDynamic_sweep_pumpA.setGeometry(QtCore.QRect(20, 230, 271, 31))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(False)
        font.setWeight(50)
        self.labelDynamic_sweep_pumpA.setFont(font)
        self.labelDynamic_sweep_pumpA.setObjectName("labelDynamic_sweep_pumpA")
        self.flowRate_start_pumpA = QtWidgets.QDoubleSpinBox(self.dynamicFlow_pumpA)
        self.flowRate_start_pumpA.setGeometry(QtCore.QRect(140, 110, 230, 90))
        font = QtGui.QFont()
        font.setPointSize(55)
        font.setBold(False)
        font.setWeight(50)
        self.flowRate_start_pumpA.setFont(font)
        self.flowRate_start_pumpA.setMaximum(12000.0)
        self.flowRate_start_pumpA.setSingleStep(0.01)
        self.flowRate_start_pumpA.setObjectName("flowRate_start_pumpA")
        self.flowRate_end_pumpA = QtWidgets.QDoubleSpinBox(self.dynamicFlow_pumpA)
        self.flowRate_end_pumpA.setGeometry(QtCore.QRect(530, 110, 230, 90))
        font = QtGui.QFont()
        font.setPointSize(55)
        font.setBold(False)
        font.setWeight(50)
        self.flowRate_end_pumpA.setFont(font)
        self.flowRate_end_pumpA.setMaximum(12000.0)
        self.flowRate_end_pumpA.setSingleStep(0.01)
        self.flowRate_end_pumpA.setObjectName("flowRate_end_pumpA")
        self.dynamic_sweepRate_pumpA = QtWidgets.QDoubleSpinBox(self.dynamicFlow_pumpA)
        self.dynamic_sweepRate_pumpA.setGeometry(QtCore.QRect(345, 210, 230, 90))
        font = QtGui.QFont()
        font.setPointSize(55)
        font.setBold(False)
        font.setWeight(50)
        self.dynamic_sweepRate_pumpA.setFont(font)
        self.dynamic_sweepRate_pumpA.setMinimum(-12000.0)
        self.dynamic_sweepRate_pumpA.setMaximum(12000.0)
        self.dynamic_sweepRate_pumpA.setSingleStep(0.01)
        self.dynamic_sweepRate_pumpA.setObjectName("dynamic_sweepRate_pumpA")
        self.progressBar_dynamicFlow_pumpA = QtWidgets.QProgressBar(self.dynamicFlow_pumpA)
        self.progressBar_dynamicFlow_pumpA.setGeometry(QtCore.QRect(320, 5, 450, 55))
        font = QtGui.QFont()
        font.setPointSize(45)
        font.setBold(True)
        font.setWeight(75)
        self.progressBar_dynamicFlow_pumpA.setFont(font)
        self.progressBar_dynamicFlow_pumpA.setProperty("value", 0)
        self.progressBar_dynamicFlow_pumpA.setObjectName("progressBar_dynamicFlow_pumpA")
        self.customFlow_pumpA = QtWidgets.QGroupBox(self.Pump_A)
        self.customFlow_pumpA.setGeometry(QtCore.QRect(30, 720, 780, 115))
        font = QtGui.QFont()
        font.setPointSize(35)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.customFlow_pumpA.setFont(font)
        self.customFlow_pumpA.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.customFlow_pumpA.setCheckable(True)
        self.customFlow_pumpA.setChecked(False)
        self.customFlow_pumpA.setObjectName("customFlow_pumpA")
        self.upload_pumpA = QtWidgets.QPushButton(self.customFlow_pumpA)
        self.upload_pumpA.setGeometry(QtCore.QRect(90, 68, 190, 40))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(True)
        font.setWeight(50)
        self.upload_pumpA.setFont(font)
        self.upload_pumpA.setStyleSheet("background-color: rgb(211, 215, 207);")
        self.upload_pumpA.setObjectName("upload_pumpA")
        self.progressBar_customFlow_pumpA = QtWidgets.QProgressBar(self.customFlow_pumpA)
        self.progressBar_customFlow_pumpA.setGeometry(QtCore.QRect(320, 5, 450, 55))
        font = QtGui.QFont()
        font.setPointSize(45)
        font.setBold(True)
        font.setWeight(75)
        self.progressBar_customFlow_pumpA.setFont(font)
        self.progressBar_customFlow_pumpA.setProperty("value", 0)
        self.progressBar_customFlow_pumpA.setObjectName("progressBar_customFlow_pumpA")
        self.ON_btn_pumpA = QtWidgets.QPushButton(self.Pump_A)
        self.ON_btn_pumpA.setGeometry(QtCore.QRect(50, 30, 230, 110))
        self.ON_btn_pumpA.setMaximumSize(QtCore.QSize(230, 110))
        palette = QtGui.QPalette()
        brush = QtGui.QBrush(QtGui.QColor(115, 210, 22))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(115, 210, 22))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(115, 210, 22))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(115, 210, 22))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(115, 210, 22))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(115, 210, 22))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(115, 210, 22))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(115, 210, 22))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(115, 210, 22))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
        self.ON_btn_pumpA.setPalette(palette)
        font = QtGui.QFont()
        font.setPointSize(70)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.ON_btn_pumpA.setFont(font)
        self.ON_btn_pumpA.setMouseTracking(True)
        self.ON_btn_pumpA.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.ON_btn_pumpA.setStyleSheet("background-color: rgb(115, 210, 22);")
        self.ON_btn_pumpA.setCheckable(False)
        self.ON_btn_pumpA.setChecked(False)
        self.ON_btn_pumpA.setAutoDefault(False)
        self.ON_btn_pumpA.setDefault(False)
        self.ON_btn_pumpA.setFlat(False)
        self.ON_btn_pumpA.setObjectName("ON_btn_pumpA")
        self.OFF_btn_pumpA = QtWidgets.QPushButton(self.Pump_A)
        self.OFF_btn_pumpA.setGeometry(QtCore.QRect(580, 30, 230, 110))
        palette = QtGui.QPalette()
        brush = QtGui.QBrush(QtGui.QColor(200, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(200, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(200, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(200, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(200, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(200, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(200, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(200, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(200, 0, 0))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
        self.OFF_btn_pumpA.setPalette(palette)
        font = QtGui.QFont()
        font.setPointSize(70)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.OFF_btn_pumpA.setFont(font)
        self.OFF_btn_pumpA.setMouseTracking(True)
        self.OFF_btn_pumpA.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.OFF_btn_pumpA.setStyleSheet("background-color: rgb(200, 0, 0);\n"
"\n"
"\n"
"")
        self.OFF_btn_pumpA.setCheckable(False)
        self.OFF_btn_pumpA.setChecked(False)
        self.OFF_btn_pumpA.setObjectName("OFF_btn_pumpA")
        self.Pump_B = QtWidgets.QGroupBox(self.centralWidget)
        self.Pump_B.setGeometry(QtCore.QRect(930, 30, 850, 850))
        self.Pump_B.setMaximumSize(QtCore.QSize(850, 850))
        palette = QtGui.QPalette()
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
        brush = QtGui.QBrush(QtGui.QColor(52, 101, 164))
        brush.setStyle(QtCore.Qt.SolidPattern)
        palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
        self.Pump_B.setPalette(palette)
        font = QtGui.QFont()
        font.setPointSize(45)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.Pump_B.setFont(font)
        self.Pump_B.setAutoFillBackground(False)
        self.Pump_B.setStyleSheet("background-color: rgb(52, 101, 164);")
        self.Pump_B.setAlignment(QtCore.Qt.AlignCenter)
        self.Pump_B.setFlat(True)
        self.Pump_B.setCheckable(False)
        self.Pump_B.setObjectName("Pump_B")
        self.staticFlow_pumpB = QtWidgets.QGroupBox(self.Pump_B)
        self.staticFlow_pumpB.setGeometry(QtCore.QRect(30, 155, 780, 215))
        font = QtGui.QFont()
        font.setPointSize(35)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.staticFlow_pumpB.setFont(font)
        self.staticFlow_pumpB.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.staticFlow_pumpB.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
        self.staticFlow_pumpB.setCheckable(True)
        self.staticFlow_pumpB.setChecked(False)
        self.staticFlow_pumpB.setObjectName("staticFlow_pumpB")
        self.labelStatic_flowRate_pumpB = QtWidgets.QLabel(self.staticFlow_pumpB)
        self.labelStatic_flowRate_pumpB.setGeometry(QtCore.QRect(90, 72, 271, 31))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(False)
        font.setWeight(50)
        self.labelStatic_flowRate_pumpB.setFont(font)
        self.labelStatic_flowRate_pumpB.setObjectName("labelStatic_flowRate_pumpB")
        self.labelStatic_runTime_pumpB = QtWidgets.QLabel(self.staticFlow_pumpB)
        self.labelStatic_runTime_pumpB.setGeometry(QtCore.QRect(500, 72, 221, 31))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(False)
        font.setWeight(50)
        self.labelStatic_runTime_pumpB.setFont(font)
        self.labelStatic_runTime_pumpB.setObjectName("labelStatic_runTime_pumpB")
        self.flow_rate_pumpB = QtWidgets.QDoubleSpinBox(self.staticFlow_pumpB)
        self.flow_rate_pumpB.setGeometry(QtCore.QRect(90, 115, 230, 90))
        font = QtGui.QFont()
        font.setPointSize(55)
        font.setBold(False)
        font.setWeight(50)
        self.flow_rate_pumpB.setFont(font)
        self.flow_rate_pumpB.setMaximum(12000.0)
        self.flow_rate_pumpB.setSingleStep(0.01)
        self.flow_rate_pumpB.setObjectName("flow_rate_pumpB")
        self.run_time_pumpB = QtWidgets.QDoubleSpinBox(self.staticFlow_pumpB)
        self.run_time_pumpB.setGeometry(QtCore.QRect(480, 115, 230, 90))
        font = QtGui.QFont()
        font.setPointSize(55)
        font.setBold(False)
        font.setWeight(50)
        self.run_time_pumpB.setFont(font)
        self.run_time_pumpB.setMaximum(12000.0)
        self.run_time_pumpB.setSingleStep(0.01)
        self.run_time_pumpB.setObjectName("run_time_pumpB")
        self.progressBar_staticFlow_pumpB = QtWidgets.QProgressBar(self.staticFlow_pumpB)
        self.progressBar_staticFlow_pumpB.setGeometry(QtCore.QRect(320, 5, 450, 55))
        font = QtGui.QFont()
        font.setPointSize(45)
        font.setBold(True)
        font.setWeight(75)
        self.progressBar_staticFlow_pumpB.setFont(font)
        self.progressBar_staticFlow_pumpB.setProperty("value", 0)
        self.progressBar_staticFlow_pumpB.setObjectName("progressBar_staticFlow_pumpB")
        self.customFlow_pumpB = QtWidgets.QGroupBox(self.Pump_B)
        self.customFlow_pumpB.setGeometry(QtCore.QRect(30, 720, 780, 115))
        font = QtGui.QFont()
        font.setPointSize(35)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.customFlow_pumpB.setFont(font)
        self.customFlow_pumpB.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.customFlow_pumpB.setCheckable(True)
        self.customFlow_pumpB.setChecked(False)
        self.customFlow_pumpB.setObjectName("customFlow_pumpB")
        self.upload_pumpB = QtWidgets.QPushButton(self.customFlow_pumpB)
        self.upload_pumpB.setGeometry(QtCore.QRect(90, 68, 190, 40))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(True)
        font.setWeight(50)
        self.upload_pumpB.setFont(font)
        self.upload_pumpB.setStyleSheet("background-color: rgb(211, 215, 207);")
        self.upload_pumpB.setObjectName("upload_pumpB")
        self.progressBar_customFlow_pumpB = QtWidgets.QProgressBar(self.customFlow_pumpB)
        self.progressBar_customFlow_pumpB.setGeometry(QtCore.QRect(320, 5, 450, 55))
        font = QtGui.QFont()
        font.setPointSize(45)
        font.setBold(True)
        font.setWeight(75)
        self.progressBar_customFlow_pumpB.setFont(font)
        self.progressBar_customFlow_pumpB.setProperty("value", 0)
        self.progressBar_customFlow_pumpB.setObjectName("progressBar_customFlow_pumpB")
        self.ON_btn_pumpB = QtWidgets.QPushButton(self.Pump_B)
        self.ON_btn_pumpB.setGeometry(QtCore.QRect(50, 30, 230, 110))
        font = QtGui.QFont()
        font.setPointSize(70)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.ON_btn_pumpB.setFont(font)
        self.ON_btn_pumpB.setMouseTracking(True)
        self.ON_btn_pumpB.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.ON_btn_pumpB.setStyleSheet("background-color: rgb(115, 210, 22);")
        self.ON_btn_pumpB.setCheckable(False)
        self.ON_btn_pumpB.setChecked(False)
        self.ON_btn_pumpB.setAutoRepeat(False)
        self.ON_btn_pumpB.setObjectName("ON_btn_pumpB")
        self.OFF_btn_pumpB_2 = QtWidgets.QPushButton(self.Pump_B)
        self.OFF_btn_pumpB_2.setGeometry(QtCore.QRect(580, 30, 230, 110))
        font = QtGui.QFont()
        font.setPointSize(70)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.OFF_btn_pumpB_2.setFont(font)
        self.OFF_btn_pumpB_2.setMouseTracking(True)
        self.OFF_btn_pumpB_2.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.OFF_btn_pumpB_2.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)
        self.OFF_btn_pumpB_2.setStyleSheet("background-color: rgb(200, 0, 0);")
        self.OFF_btn_pumpB_2.setCheckable(False)
        self.OFF_btn_pumpB_2.setChecked(False)
        self.OFF_btn_pumpB_2.setObjectName("OFF_btn_pumpB_2")
        self.dynamicFlow_pumpB = QtWidgets.QGroupBox(self.Pump_B)
        self.dynamicFlow_pumpB.setGeometry(QtCore.QRect(30, 390, 780, 310))
        font = QtGui.QFont()
        font.setPointSize(35)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.dynamicFlow_pumpB.setFont(font)
        self.dynamicFlow_pumpB.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.dynamicFlow_pumpB.setCheckable(True)
        self.dynamicFlow_pumpB.setChecked(False)
        self.dynamicFlow_pumpB.setObjectName("dynamicFlow_pumpB")
        self.labelDynamic_from_pumpB = QtWidgets.QLabel(self.dynamicFlow_pumpB)
        self.labelDynamic_from_pumpB.setGeometry(QtCore.QRect(50, 130, 81, 21))
        font = QtGui.QFont()
        font.setPointSize(18)
        font.setBold(False)
        font.setWeight(50)
        self.labelDynamic_from_pumpB.setFont(font)
        self.labelDynamic_from_pumpB.setStyleSheet("color: rgb(0, 0, 0);")
        self.labelDynamic_from_pumpB.setObjectName("labelDynamic_from_pumpB")
        self.labelDynamic_to_pumpB = QtWidgets.QLabel(self.dynamicFlow_pumpB)
        self.labelDynamic_to_pumpB.setGeometry(QtCore.QRect(470, 130, 51, 21))
        font = QtGui.QFont()
        font.setPointSize(18)
        font.setBold(False)
        font.setWeight(50)
        self.labelDynamic_to_pumpB.setFont(font)
        self.labelDynamic_to_pumpB.setStyleSheet("color: rgb(0, 0, 0);")
        self.labelDynamic_to_pumpB.setObjectName("labelDynamic_to_pumpB")
        self.labelDynamic_startFRate_pumpB = QtWidgets.QLabel(self.dynamicFlow_pumpB)
        self.labelDynamic_startFRate_pumpB.setGeometry(QtCore.QRect(90, 72, 321, 31))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(False)
        font.setWeight(50)
        self.labelDynamic_startFRate_pumpB.setFont(font)
        self.labelDynamic_startFRate_pumpB.setObjectName("labelDynamic_startFRate_pumpB")
        self.labelDynamic_endFRate_pumpB = QtWidgets.QLabel(self.dynamicFlow_pumpB)
        self.labelDynamic_endFRate_pumpB.setGeometry(QtCore.QRect(475, 72, 301, 31))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(False)
        font.setWeight(50)
        self.labelDynamic_endFRate_pumpB.setFont(font)
        self.labelDynamic_endFRate_pumpB.setObjectName("labelDynamic_endFRate_pumpB")
        self.labelDynamic_sweep_pumpB = QtWidgets.QLabel(self.dynamicFlow_pumpB)
        self.labelDynamic_sweep_pumpB.setGeometry(QtCore.QRect(20, 230, 271, 31))
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(False)
        font.setWeight(50)
        self.labelDynamic_sweep_pumpB.setFont(font)
        self.labelDynamic_sweep_pumpB.setObjectName("labelDynamic_sweep_pumpB")
        self.flowRate_start_pumpB = QtWidgets.QDoubleSpinBox(self.dynamicFlow_pumpB)
        self.flowRate_start_pumpB.setGeometry(QtCore.QRect(140, 110, 230, 90))
        font = QtGui.QFont()
        font.setPointSize(55)
        font.setBold(False)
        font.setWeight(50)
        self.flowRate_start_pumpB.setFont(font)
        self.flowRate_start_pumpB.setMaximum(12000.0)
        self.flowRate_start_pumpB.setSingleStep(0.01)
        self.flowRate_start_pumpB.setObjectName("flowRate_start_pumpB")
        self.flowRate_end_pumpB = QtWidgets.QDoubleSpinBox(self.dynamicFlow_pumpB)
        self.flowRate_end_pumpB.setGeometry(QtCore.QRect(530, 110, 230, 90))
        font = QtGui.QFont()
        font.setPointSize(55)
        font.setBold(False)
        font.setWeight(50)
        self.flowRate_end_pumpB.setFont(font)
        self.flowRate_end_pumpB.setMaximum(12000.0)
        self.flowRate_end_pumpB.setSingleStep(0.01)
        self.flowRate_end_pumpB.setObjectName("flowRate_end_pumpB")
        self.dynamic_sweepRate_pumpB = QtWidgets.QDoubleSpinBox(self.dynamicFlow_pumpB)
        self.dynamic_sweepRate_pumpB.setGeometry(QtCore.QRect(345, 210, 230, 90))
        font = QtGui.QFont()
        font.setPointSize(55)
        font.setBold(False)
        font.setWeight(50)
        self.dynamic_sweepRate_pumpB.setFont(font)
        self.dynamic_sweepRate_pumpB.setMinimum(-12000.0)
        self.dynamic_sweepRate_pumpB.setMaximum(12000.0)
        self.dynamic_sweepRate_pumpB.setSingleStep(0.01)
        self.dynamic_sweepRate_pumpB.setObjectName("dynamic_sweepRate_pumpB")
        self.progressBar_dynamicFlow_pumpB = QtWidgets.QProgressBar(self.dynamicFlow_pumpB)
        self.progressBar_dynamicFlow_pumpB.setGeometry(QtCore.QRect(320, 5, 450, 55))
        font = QtGui.QFont()
        font.setPointSize(45)
        font.setBold(True)
        font.setWeight(75)
        self.progressBar_dynamicFlow_pumpB.setFont(font)
        self.progressBar_dynamicFlow_pumpB.setProperty("value", 0)
        self.progressBar_dynamicFlow_pumpB.setObjectName("progressBar_dynamicFlow_pumpB")
        self.line = QtWidgets.QFrame(self.centralWidget)
        self.line.setGeometry(QtCore.QRect(890, 0, 20, 900))
        self.line.setMaximumSize(QtCore.QSize(50, 900))
        font = QtGui.QFont()
        font.setBold(False)
        font.setWeight(50)
        self.line.setFont(font)
        self.line.setStyleSheet("color: rgb(0, 0, 0);\n"
"")
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setLineWidth(10)
        self.line.setMidLineWidth(1)
        self.line.setFrameShape(QtWidgets.QFrame.VLine)
        self.line.setObjectName("line")
        MainWindow.setCentralWidget(self.centralWidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.Pump_A.setTitle(_translate("MainWindow", "Pump A"))
        self.staticFlow_pumpA.setTitle(_translate("MainWindow", "Static Flow"))
        self.labelStatic_flowRate_pumpA.setText(_translate("MainWindow", "Flow Rate (uL / Min)"))
        self.labelStatic_runTime_pumpA.setText(_translate("MainWindow", "Run Time (Sec)"))
        self.dynamicFlow_pumpA.setTitle(_translate("MainWindow", "Dynamic Flow"))
        self.labelDynamic_from_pumpA.setText(_translate("MainWindow", "FROM:"))
        self.labelDynamic_to_pumpA.setText(_translate("MainWindow", " TO:"))
        self.labelDynamic_startFRate_pumpA.setText(_translate("MainWindow", "Start Flow Rate (uL/ Min)"))
        self.labelDynamic_endFRate_pumpA.setText(_translate("MainWindow", "End Flow Rate (uL/ Min)"))
        self.labelDynamic_sweep_pumpA.setText(_translate("MainWindow", "Sweep Rate (uL/ Min)"))
        self.customFlow_pumpA.setTitle(_translate("MainWindow", "Custom Flow"))
        self.upload_pumpA.setText(_translate("MainWindow", "Upload CSV File"))
        self.ON_btn_pumpA.setText(_translate("MainWindow", "ON"))
        self.OFF_btn_pumpA.setText(_translate("MainWindow", "OFF"))
        self.Pump_B.setTitle(_translate("MainWindow", "Pump B"))
        self.staticFlow_pumpB.setTitle(_translate("MainWindow", "Static Flow"))
        self.labelStatic_flowRate_pumpB.setText(_translate("MainWindow", "Flow Rate (uL / Min)"))
        self.labelStatic_runTime_pumpB.setText(_translate("MainWindow", "Run Time (Sec)"))
        self.customFlow_pumpB.setTitle(_translate("MainWindow", "Custom Flow"))
        self.upload_pumpB.setText(_translate("MainWindow", "Upload CSV File"))
        self.ON_btn_pumpB.setText(_translate("MainWindow", "ON"))
        self.OFF_btn_pumpB_2.setText(_translate("MainWindow", "OFF"))
        self.dynamicFlow_pumpB.setTitle(_translate("MainWindow", "Dynamic Flow"))
        self.labelDynamic_from_pumpB.setText(_translate("MainWindow", "FROM:"))
        self.labelDynamic_to_pumpB.setText(_translate("MainWindow", " TO:"))
        self.labelDynamic_startFRate_pumpB.setText(_translate("MainWindow", "Start Flow Rate (uL/ Min)"))
        self.labelDynamic_endFRate_pumpB.setText(_translate("MainWindow", "End Flow Rate (uL/ Min)"))
        self.labelDynamic_sweep_pumpB.setText(_translate("MainWindow", "Sweep Rate (uL/ Min)"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Fluidic Control Github Project Page

Credits

Gabriel St-Pierre

Gabriel St-Pierre

3 projects • 3 followers
Thanks to PiFlow Project.

Comments