因此,这里是我想要做的事。我有一个硬件的我正在使用的Adafruit的ADS1115模拟数字转换器分线板对树莓派。这个概念是在100至500赫兹,其中,除其他许多东西,触发一个GPIO引脚在特定微秒时间经过一段n秒(2至10),以读取来自ADS1115数据的速率创建使用pigpio一个波,然后执行一些numpy的和SciPy的功能(中位数,SEM),并返回中位数和SEM值。
我遇到的问题是获得pigpio回调而等待n秒运行。我知道我需要把pigpio回调线程,但我难倒就如何使这项工作。现在会发生什么是线程开始,该功能的getSample等待n秒,则回调开始n秒的时间内完成之后才发生的。
所以,我怎么得到pigpio回调在一个线程中运行,n秒后的数据输出负载进行后处理的_data变量?
该方法的getSample被称为当用户点击一个按钮来开始收集数据。该ALLOFF方法只是将关闭pigpio波。该setFrequency方法只是开始pigpio波。的READDATA是从ADS1115收集数据并且应该将其追加到_data变量的方法。所述_gain变量绑定到Tkinter的组合框来设置ADS芯片的增益值。
我不能用一个简单的time.sleep循环来收集数据,因为我需要在当GPIO引脚从波脉冲开启微秒时间收集的数据,当然time.sleep将无法提供可靠的微秒精度的。
我试着从成立的Python Threading inside a class第一个答案,但显然我失去了一些东西就如何当一个方法中初始化的线程工作十分重要。
pigpio回调引用:http://abyz.co.uk/rpi/pigpio/python.html#callback
下面是长类的一个缩短的版本:
class sampling:
#SETUP GPIO PINS
_PWM2=17 #RECEIVER SIGNAL PIN
_PWM3=18 #RECEIVER INPUT TEST PIN
_pi = pigpio.pi()
_wave=""
_pi.set_mode(_PWM2, pigpio.OUTPUT)#RX TRIGGER PIN
_pi.set_mode(_PWM3, pigpio.INPUT)#RX MONITOR PIN
_pi.set_pull_up_down(_PWM3, pigpio.PUD_UP)
_callback=""
_data=[]
_ADS1115 = 0x01 # 16-bit ADC
# Initialise the ADC using the default mode (use default I2C address)
try:
_ADC = ADS1x15(ic=_ADS1115, debug=False)
except:
print "ADS1115 Could not be started. Check address"
_SPS=IntVar()
_SPS.set(860)
_gain=StringVar()
_gain.set("256")
_delay=float(1/_SPS.get())+float(0.001)
def getSample(self, frequency, seconds, gain):
self._delay=float(1/self._SPS.get())+float(0.0005)
datasample=[None]*3
self._data=[]
print "Starting SetFrequency"
self.setFrequency(int(frequency))
datathread=threading.Thread(target=self._pi.callback, args=(self._PWM3, pigpio.RISING_EDGE, self.readData, )).start()
print "Waiting %s Seconds" % str(seconds)
time.sleep(int(seconds))
print "Shutting down frequencies"
self.allOff()
##Lengthy POST PROCESSING OF _data array goes here
def allOff(self):
self._pi.wave_tx_stop()
self._pi.wave_clear()
self._pi.write(self._PWM1, 0)
self._pi.write(self._PWM2, 0)
self._pi.write(self._PWM4, 0)
def readData(self, gpio, level, tick):
print "Reading Data"
self._data.append(round(self._ADC.readADCDifferential(2, 3, int(self._gain.get()), int(self._SPS.get())), 0))
我写的是少年ADS1115上的一篇文章,我用“纯香草” Raspbian SMBus和与Python3 Rpi.GPIO库。在一个示例程序和测试电路我提供4种不同的配置,其中三个使用GPIO.add_event_detect(),以获得在GPIO引脚通知时发生数据的转换。后者可以例如被触发通过传递的阈值。我不能完全肯定,如果这有助于实现你的目标(在特定微秒读取的值),但至少回调正常工作。 https://smartypies.com/projects/ads1115-with-raspberrypi-and-python/