Search code examples
pythonarduinoserial-portarduino-uno

Multi Threading from a function to another function and back to the main function


currently this is my setup, python in PyCharm, and an Arduino Uno with MAX30100 sensor for heart rate. I am currently able to transmit data via pyserial into my pycharm from arduino, and will show the heartrate in pycharm. But I want my program to run the webcam feed WHILE showing the sensor reading at the same time. Currently my SIMPLIFIED code is as below :

class start_workout_session():

def pushup(self):
   
    #cam start here ~~!!
    cap = cv2.VideoCapture(0)

    with mp_pose.Pose(min_detection_confidence=1.5, min_tracking_confidence=1.5) as pose:

        while cap.isOpened():
           
            # Extract landmarks
            try:
             
               calculate angle here

               Showing angle in frame by using putText method from cv2
               
               Curl counter logic

               Render curl counter

                t1 = threading.Thread(target=arduino)
                t1.start()
    
               cv2.imshow('i-Trainer', image)

        cap.release()
        cv2.destroyAllWindows()



def arduino():
serialInst = serial.Serial()
serialInst.baudrate = 9600
serialInst.port = 'COM3'
serialInst.open()
while True:
    if serialInst.inWaiting:
        packet = serialInst.readline()
        print(packet.decode('utf').rstrip('\n'))

time.sleep(1)

t2 = threading.Thread(target=pushup)
t2.start()
t1.join()
t2.join()

this program can run but it always prompts an error :

File "C:\Users\..\main.py", line 629, in arduino
    serialInst.open()



File "C:\Users\..\Python36\lib\site-packages\serial\serialwin32.py", line 64, in open
    raise SerialException("could not open port {!r}: {!r}".format(self.portstr, ctypes.WinError()))
serial.serialutil.SerialException: could not open port 'COM3': PermissionError(13, 'Access is denied.', None, 5)

Solution

  • Thanks to @cguk70,

    i managed to solve the problem, by putting the

     t1 = threading.Thread(target=arduino)
                    t1.start()
    

    outside together with

    #cam start here ~~!!
        cap = cv2.VideoCapture(0)
    

    reason is that i am creating a new Arduino thread inside the camera loop. So the second time round you'll try and open the serial port again and get the error since it's already open.