C'est ainsi que j'ai finalement mis en œuvre la fabuleuse approche décrite par VillageTech.
Matériel
Câblage
La broche par défaut pour les appareils Onewire sur le Pi est GPIO 4
. J'ai donc câblé GND
au manchon de la prise et connecté la pointe à la broche GPIO mentionnée.
Un jeton
Tout ce dont j'ai besoin pour un jeton est la puce DS18B20 et un jack 3,5 mm.
Soudez ensuite les broches GND et VCC de la puce ensemble et connectez-la au manchon. Ajoutez un tube rétractable à la broche du milieu pour éviter les courts-circuits et connectez-le à la pointe de la prise.
Les deux jacks fonctionnent ceux avec deux anneaux et celui avec juste la pointe.
Résistance de rappel
J'ai décidé de ne pas utiliser de résistance pull up externe, car le Pi possède des résistances Pull up internes.
Ne faisons pas frire les écouteurs
Comme flawr l'a correctement souligné, c'est le fait que si cela ressemble à une prise audio 3,5 mm, les gens pourraient être tentés d'insérer des écouteurs.
Tant que nous utilisons une alimentation parasite, où seuls un fil de terre et une sortie GPIO haute impédance sont exposés à la prise, nous devrions être en sécurité, car nous n'avons pas de V DD sub > ligne qui pourrait créer un court-circuit en raison de la faible résistance du casque.
Configuration
Ajoutez la ligne suivante à /boot/config.txt
:
dtoverlay = w1-gpio
Il y a plus d'options. Vous pouvez en trouver plus dans le / boot / overlays / README
de votre Pi.
Certaines sources ont suggéré d'ajouter les deux modules w1-gpio
et w1_therm
à / etc / modules
, mais j'ai découvert que l'appareil L'entrée de superposition d'arbre dans le boot / config.txt
était suffisante pour mes besoins.
Redémarrez maintenant l'appareil.
Ajouter un pullup via un logiciel en python:
importer RPi.GPIO en tant que GPIO
GPIO_PIN_NUMBER = 14
GPIO.setmode (GPIO.BCM)
GPIO.setup (GPIO_PIN_NUMBER, GPIO.IN, pull_up_down = GPIO.PUD_UP)
Dès que j'ai créé ce pull up, j'ai pu détecter les jetons dans / sys / bus / w1 / devices /
avec le préfixe 28
dans une autre fenêtre de terminal:
$ ls / sys / bus / w1 / périphériques /
28-00000aabbccd w1_bus_master1
Après environ 10 secondes, les entrées dans appareils
disparaissaient. J'ai dû créer la configuration suivante, pour que les appareils disparaissent au bout d'une seconde environ:
sudo nano /etc/modprobe.d/w1.conf
Ajoutez maintenant le contenu au fichier et redémarrez l'appareil à nouveau:
options wire timeout = 1 slave_ttl = 1
Dans ma configuration, ce fichier n'existait pas auparavant.
Logiciel
importation du système d'exploitation
importer un fil
temps d'importation
à partir de date / heure importation date / heure, timedelta
classe W1Service (objet):
__instance = Aucun
def __new __ (cls):
# Initialiseur singleton
si l'instance W1Service .__ est None:
W1Service .__ instance = objet .__ nouveau __ (cls)
retourne l'instance W1Service .__
on_all_token_removed = Aucun
on_token_added = Aucun
is_scanning = Faux
def start_scan (self, delay = 10):
return thread.start_new_thread (self.scan, (délai,))
def scan (self, delay = 10):
W1Service.is_scanning = Vrai
last_token = Aucun
current_token = ''
current_token_timestamp = datetime.now () - timedelta (jours = 1)
tandis que W1Service.is_scanning:
file = open ('/ sys / devices / w1_bus_master1 / w1_master_slaves')
all_tokens = fichier.readlines ()
fichier.close ()
no_token_attached = len (all_tokens) == 0 ou 'not found. \ n' in all_tokens
if no_token_attached et self.on_all_token_removed et current_token! = last_token:
self.on_all_token_removed ()
current_token = Aucun
last_token = Aucun
pour la ligne dans all_tokens:
jeton_actuel = line.split ("\ n") [0]
time_diff = datetime.now () - current_token_timestamp
si self.on_token_added et last_token! = current_token et time_diff.seconds > = 3:
# Tester si le token est toujours attaché
si os.path.exists ('/ sys / bus / w1 / devices /' + current_token + '/ w1_slave'):
self.on_token_added (jeton_actuel)
last_token = jeton_actuel
autre:
current_token = Aucun
autre:
current_token = Aucun
time.sleep (délai)
def stop_scan (auto):
W1Service.is_scanning = Faux
Maintenant, utiliser le service créé est assez simple:
heure d'importation
import w1_service
def token_added (jeton):
print (jeton% "connecté% s")
def all_token_removed ():
print ('Tous les jetons ont été supprimés')
service = w1_service.W1Service ()
service.on_token_added = token_added
service.on_all_token_removed = all_token_removed
service.start_scan (0)
tandis que Vrai:
# L'analyse s'exécute dans un thread séparé
time.sleep (1)
Cela produira la sortie suivante lors de l'insertion de différents jetons
Tous les jetons ont été supprimés
Connecté 28-00000aabbccd
Tous les jetons ont été supprimés
Connecté 28-00000ffddeea
Tous les jetons ont été supprimés
Connecté 28-00000bbddaa1
Connecté 28-00000ffddeea
Tous les jetons ont été supprimés
Connecté 28-00000bbddaa1
Tous les jetons ont été supprimés
Veuillez noter que mon code tient compte du fait que dans ma configuration, un seul jeton peut être ajouté à la fois. Donc, seul le jeton le plus récent est intéressant pour moi. Si plusieurs jetons doivent être ajoutés, ce que le protocole onewire prend en charge correctement, le code devra être mis à jour.
Application
Désormais, chaque fois qu'un jeton est inséré, il correspond à une personne que ma gentille peut envoyer et recevoir des messages de
Remarques et autres considérations
Les jetons Onewire pourraient en théorie être ajoutés en parallèle, ce qui offrirait de nouvelles fonctionnalités comme le chat de groupe ou autres. Vous pouvez donc connecter dix jetons sur un seul GPIO.
J'aime aussi l'approche avec l'approche R / C passive, qui est également très pragmatique et simple à mettre en place. Je pourrais essayer ceci dans un autre projet. Cependant, un ami en avait
J'ai envisagé d'ajouter des iBeacons en tant que jetons, mais je devrais alors tenir compte des différents RSSI des jetons et il ne serait pas clair à 100% quel jeton était actif à un moment donné.
Un ami suggérait d'ajouter un lecteur de carte et d'utiliser d'anciennes cartes SD photo de 1 Go qui pourraient avoir l'image coincée sur le devant. La carte peut contenir toutes les informations sur la personne plus une salutation personnalisée ou similaire. La même chose fonctionnerait avec les anciennes clés USB comme jetons.
C'était très amusant de mettre cela en œuvre et de voir à quel point ma question suscitait l'intérêt des gens. Je vous remercie tous et vous souhaite une belle 0x1414
(= 2020) :-)