2017-06-19 1 views
1

J'essaye d'écrire du code pour un pi de framboise. Le code est censé établir une connexion pour obd sur ma voiture. Ce que le code est censé faire est d'attendre que j'appuie sur une broche GPIO et l'enregistrement s'arrête. Cette broche (27) agit comme une bascule, je peux donc démarrer/arrêter en appuyant dessus.Boutons GPIO: AttributeError: l'objet 'int' n'a pas d'attribut 'var1'

J'ai écrit le code à l'origine en dehors d'une classe juste pour le faire fonctionner, mais je l'ai réécrit à partir de zéro pour l'adapter à une classe, mais les événements GPIO ne se comportent pas.

Voici le code:

import RPi.GPIO as GPIO 
import time 
import obd 
import numpy as np 


class obdScan: 
    rec_loop = 0 
    key_listen = 1 
    rec_freq = 2 # per second 
    my_data = [] 
    def __init__(self): 
     try: 
      self.conn = obd.OBD() 
     except: 
      print("connection failed") 

    def stop_loop(self): 
     self.rec_loop = (self.rec_loop +1)%2 

    def closeall(self): 
     self.rec_loop, self.key_listen = 0,0 

    def measurement(self,val): 
     device = obd.commands[1][val] 
     value = self.conn.query(device).value.magnitude 
     return value 

    def record(self,devices): 
     value=[] 
     for i in range(len(devices)): 
      value.append(self.measurement(devices[i])) 
     self.my_data.append(value) 
     time.sleep(1/self.rec_freq) 
     print(["recording:", self.my_data[-1]]) 


if __name__ == "__main__": 
    dat_file = "data.csv" 
    GPIO.setmode(GPIO.BCM) 

    GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP) 
    GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP) 

    try: 
     my_data = np.genfromtxt(dat_file, delimiter=',') 
    except: 
     my_data = [[], []] 
    obd_connection = obdScan() 

    GPIO.add_event_detect(27, GPIO.FALLING, callback=obd_connection.stop_loop) 
    GPIO.add_event_detect(22, GPIO.FALLING, callback=obd_connection.closeall) 

    print("ready") 
    while obd_connection.key_listen: 
     while obd_connection.rec_loop: 
      obd_connection.record([13,7]) 
    else: 
     print("done") 
     try: 
      data = np.append(my_data,obd_connection.my_data,axis=0) 
     except: 
      data = obd_connection.my_data 
     np.savetxt(dat_file, data, delimiter=",") 

L'erreur que je reçois:

"TypeError: stop_loop() prend 1 argument de position, mais 2 ont reçu"

+0

Note: en collant le code, une indentation se est foiré, donc supposer indentation correcte –

Répondre

0

GPIO.add_event_detect() appelle apparemment passé callback avec un argument contenant le canal, et puisque vous définissez vos méthodes de classe comme callbacks, vous devrez ajouter un argument supplémentaire dans leur définition:

def stop_loop(self, channel): 
    self.rec_loop = (self.rec_loop + 1) % 2 

def closeall(self, channel): 
    self.rec_loop, self.key_listen = 0, 0 

Vous pouvez le faire en option, quoique ...