Page 1 of 1

Making computation with 2 channels using python

Posted: Wed Nov 20, 2019 2:17 am
by YLM
Hi,

I used the generated python code to get the signal of 2 channels, I modify it a little bit and did some calibration. Now that I have my 2 channels independently, I'd like to use them together in order to make some computation. Here is the code :

Code: Select all

from Phidget22.Phidget import *
from Phidget22.Devices.VoltageRatioInput import *
import time
import datetime

TIME_OUT = 5000 #5s before it throws a timeout exception 
DATA_INTERVAL = 1000 #1000ms data interval 

# Calibration factor
A0 = -6.128983223994E-06
B0 = -0.000059639277340
A1 = -6.101017778744E-06
B1 = -0.000286467338645

def onVoltageRatioChange0(self, voltageRatio):
	Masse = (voltageRatio - (B0) ) / (A0)
	print(str(Masse))

def onVoltageRatioChange1(self, voltageRatio):
	Masse = (voltageRatio - (B1) ) / (A1)
	print(str(Masse))
	
def main():

		voltageRatioInput0 = VoltageRatioInput()
		voltageRatioInput0.setChannel(0)
		voltageRatioInput0.setOnVoltageRatioChangeHandler(onVoltageRatioChange0)
		voltageRatioInput0.openWaitForAttachment(TIME_OUT)
		voltageRatioInput0.setBridgeGain(BridgeGain.BRIDGE_GAIN_128)
		voltageRatioInput0.setDataInterval(DATA_INTERVAL)


		voltageRatioInput1 = VoltageRatioInput()
		voltageRatioInput1.setChannel(1)
		voltageRatioInput1.setOnVoltageRatioChangeHandler(onVoltageRatioChange1)
		voltageRatioInput1.openWaitForAttachment(TIME_OUT)
		voltageRatioInput1.setBridgeGain(BridgeGain.BRIDGE_GAIN_128)
		voltageRatioInput1.setDataInterval(DATA_INTERVAL)

		try:
			input("Press Enter to Stop\n")

		except (Exception, KeyboardInterrupt):

			pass
I have tried to do :

Code: Select all

Masse0 = voltageRatioInput0.setOnVoltageRatioChangeHandler(onVoltageRatioChange0)
To then called Masse0.Masse but it returns me None...

I am not so good with python code, and I do not know how to call each Masse from the 2 function onVoltageRatioChange0 and 1 to use them inside my main and make some computation using the 2 channels...

Thank you

Re: Making computation with 2 channels using python

Posted: Wed Nov 20, 2019 9:36 am
by mparadis
The change events do not return any variable on their own. In python, in order to gain access to these values outside of the event, you need to create a new variable and assign it to the handler. I've updated your code sample to do this for each channel, and print both mass values when the program quits to prove that both values are available in main:

Code: Select all

from Phidget22.Phidget import *
from Phidget22.Devices.VoltageRatioInput import *
import time
import datetime

TIME_OUT = 5000 #5s before it throws a timeout exception
DATA_INTERVAL = 1000 #1000ms data interval

# Calibration factor
A0 = -6.128983223994E-06
B0 = -0.000059639277340
A1 = -6.101017778744E-06
B1 = -0.000286467338645

def onVoltageRatioChange0(self, voltageRatio):
   Masse = (voltageRatio - (B0) ) / (A0)
   self.masse = Masse
   print(str(Masse))

def onVoltageRatioChange1(self, voltageRatio):
   Masse = (voltageRatio - (B1) ) / (A1)
   self.masse = Masse
   print(str(Masse))
   
def main():

      voltageRatioInput0 = VoltageRatioInput()
      voltageRatioInput0.masse = 0
      voltageRatioInput0.setChannel(0)
      voltageRatioInput0.setOnVoltageRatioChangeHandler(onVoltageRatioChange0)
      voltageRatioInput0.openWaitForAttachment(TIME_OUT)
      voltageRatioInput0.setBridgeGain(BridgeGain.BRIDGE_GAIN_128)
      voltageRatioInput0.setDataInterval(DATA_INTERVAL)   

      voltageRatioInput1 = VoltageRatioInput()
      voltageRatioInput1.masse = 0
      voltageRatioInput1.setChannel(1)
      voltageRatioInput1.setOnVoltageRatioChangeHandler(onVoltageRatioChange1)
      voltageRatioInput1.openWaitForAttachment(TIME_OUT)
      voltageRatioInput1.setBridgeGain(BridgeGain.BRIDGE_GAIN_128)
      voltageRatioInput1.setDataInterval(DATA_INTERVAL)
      

      try:
         input("Press Enter to Stop\n")

      except (Exception, KeyboardInterrupt):
         pass

      print(str(voltageRatioInput0.masse) + " / " + str(voltageRatioInput1.masse))
      voltageRatioInput0.close()

main()

Re: Making computation with 2 channels using python

Posted: Thu Nov 21, 2019 7:29 am
by YLM
Great. Thank you !

Re: Making computation with 2 channels using python

Posted: Thu Nov 21, 2019 8:46 am
by YLM
With my previous code, with the

Code: Select all

		try:
			input("Press Enter to Stop\n")

		except (Exception, KeyboardInterrupt):

			pass
I had the value in my console using my DATA_INTERVAL until I press 'Enter'. Now with the print of 2 Channels inside the main I only have one print and then the code stop.. Do you know why ?

Thank you

Re: Making computation with 2 channels using python

Posted: Thu Nov 21, 2019 3:21 pm
by mparadis
I'm not sure why yours is only printing one event- using the code I posted, mine keeps printing until enter is pressed.

Re: Making computation with 2 channels using python

Posted: Thu Nov 21, 2019 4:05 pm
by jdecoux
Only getting one event with that code sounds like you may be using IDLE.

IDLE has problems dealing with multiple threads (which are needed for events), so we recommend against using IDLE for development with Phidgets. Try with another IDE, or running the program from the command line.

Re: Making computation with 2 channels using python

Posted: Fri Nov 22, 2019 2:57 am
by YLM
curently I am writing my code inside Sublime Text and then I run the code inside the terminal using

Code: Select all

python3 mycode.py
This is not the good solution ?

Thank you

Re: Making computation with 2 channels using python

Posted: Fri Nov 22, 2019 5:24 pm
by jdecoux
That should work then...

To clarify, do you see more than one set of data printed to the screen before you press ENTER?

If so, the code provided is working as intended. The data being printed while waiting for input is happening in the Event Handlers, which you can think of as happening in the background at the same time as the rest of your code.

The final print statement only happens once as it is written to only print once, to demonstrate how you would use voltageRatioInput0.masse and voltageRatioInput1.masse in your main code.