Travailler pour créer un système d'acquisition de données pour un véhicule hors route personnalisé. Utilisation de Raspberry Pi et d'un tachymètre personnalisé (testé et confirmé) pour mesurer RPM. Utilisation d'interruptions dans le code suivant pour obtenir la valeur RPM.Utiliser Python pour obtenir l'état du moteur à combustion en fonction de l'activation de la bougie
def get_rpm():
GPIO.wait_for_edge(17, GPIO.FALLING)
start = time.time()
GPIO.wait_for_edge(17, GPIO.FALLING)
end = time.time()
duration = end - start
rpm = (1/duration)*60
return rpm
Ce code ne fonctionne que si le moteur tourne et produit une étincelle. S'il n'y a pas d'étincelle, le code attend pour ce bord et ne continue pas. Lorsque vous appelez get_rpm()
, si le code attend un tronçon, les autres processus sont bloqués.
Ma solution de contournement prévue pour ceci est d'obtenir l'état du moteur dans un autre processus. Je pense que cela fonctionnera mieux en deux parties.
partie 1, en cours d'exécution (boucle) dans un thread séparé:
GPIO.wait_for_edge(17, GPIO.RISING)
last = time.time
partie 2, en cours d'exécution appelé en fonction au besoin:
def get_state():
while time.time - last < .5:
engine_state = true
else:
engine_state = false
return engine_state
à la partie 1 d'économie last
de mémoire accessible à La partie 2, partie 2 déterminera si la voiture fonctionne ou non en fonction de la dernière fois que la bougie s'est déclenchée. En utilisant engine_state
comme comparateur, le système d'acquisition de données obtiendra et stockera la valeur RPM de get_rpm()
uniquement lorsque engine_state
est vrai.
Comment puis-je implémenter la partie 1 de telle sorte que je puisse utiliser la variable last
dans la partie 2? last
va changer très, très rapidement. Je ne veux pas le stocker dans un fichier texte sur la carte SD du Raspberry Pi chaque fois que last
est mis à jour. Je veux stocker last
en RAM.
Merci beaucoup!
'last' est déjà dans la RAM, je pense que tout ce que vous avez besoin est de passer comme une variable' get_State (dernier) '' .. –
time.time' devrait être 'time.time()' Je pense – jDo
Est-ce que vous configurez la configuration des broches ailleurs ou pas du tout? Ne pourriez-vous pas utiliser les rappels d'interruption à la place? Ils sont enfilés par la nature et ne bloqueront pas. Je ne pense pas que vous deviez attendre le bord. Projet intéressant btw. :) – jDo