Commande linux pour clé USB TEMPer Hum

Voici pour ceux qui ont fait l’acquisition d’une clé USB TEMPer Hum un programme que j’ai écrit sous Linux et qui permet de lire les mesures de température et d’humidité en ligne de commande.

Mise à jour : La commande présentée dans cet article ne convient pas pour les clés TEMPer Hum bleues. Elles utilisent une interface USB HID différentes des clés grises, plus anciennes (USB Serial). Toutefois leur fonctionnement interne reste identique. Ne possédant pas la version bleue de la clé je ne peux pas faire évoluer la commande moi-même pour la prendre en charge.

Présentation

Clés USB TEMPer et TEMPer Hum

Clés USB TEMPer et TEMPer Hum

J’ai fait l’acquisition il y a un an de deux clés USB : une clé TEMPer qui contient un capteur de température et une clé TEMPer HUM qui contient un capteur de température et d’humidité. Ces périphériques simples peuvent être interrogés depuis un PC. Pour ceux que ça intéresse vous pouvez lire l’article publié sur The Gadgeteer. Je considère que la précision de la mesure est suffisante pour mon usage personnel, les caractéristiques des composants utilisés dans ces périphériques ne sont pas mauvais du tout.

Mon malheur a été de constater qu’ils sont livrés avec un driver et un programme uniquement destiné aux environnements Microsoft. Moi je souhaitais pouvoir l’utiliser sous linux. Après quelques recherches j’ai trouvé les sources d’un programme plutôt expérimental qui permettait d’interroger le périphérique. En continuant mes recherches j’ai trouvé la liste des composants qui composent ces périphériques et de proche en proche j’ai établi le schéma logique de leur fonctionnement interne. A partir de là et en utilisant les datasheets des composants j’ai réussi à écrire une petite application en ligne qui permet d’interroger les capteurs à partir de Linux.

Pour simplifier voici le principe de fonctionnement :

Schéma logique de cablage des composants dans une clé TEMPer Hum

Schéma logique de cablage des composants dans une clé TEMPer Hum

  • En entrée USB on trouve un adaptateur série RS232 de type CH341
  • Les lignes DTR et DSR du port série servent respectivement de ligne SLC et SDA d’un bus I2C pour dialoguer avec les autres composants
  • Sur ce bus I2C on trouve ces composants :
    1. Une mémoire EEPROM Microchip EE2402 de 256 octets conforme au bus I2C (Id du chip 0xA0). Cette mémoire contient juste une paire d’octets utiles permettant d’identifier le type de périphérique (TEMPer V1, TEMPer V2, TEMPer Hum)
    2. Sur le modèle TEMPer : Un capteur de température Maxim DS75 conforme au bus I2C (Id du chip 07h).
    3. Sur le modèle TEMper Hum : Un capteur de température et d’humidité Sensirion SHT11. Pour des raisons de royalties, ce capteur n’est pas 100% conforme au bus I2C et n’a donc pas de Id mais applique les chronogrammes sensibus qui s’y rapprochent. Il faut en tenir compte car la séquence d’initialisation du périphérique est différente de I2C.

L’accès aux lignes DTR et DSR de l’adaptateur USB/Série CH341 se fait à travers le driver inclus dans le noyau linux. Attention toutefois à utiliser un noyau 2.6.30 au minium car ces lignes ne sont pas supportées sur les versions antérieures du noyau. Toutefois un patch existe pour ceux qui travaillent avec des versions antérieures.

Téléchargements

Sources pour Linux de la commande TH : Télécharger “TH-1.0.tar.gz” TH-1.0.tar.gz – 23,49 Ko
Documentation constructeur des composants : Télécharger “TEMPerHum-DataSheets.tar.gz” TEMPerHum-DataSheets.tar.gz – 1,90 Mo

Fonctionnement

Une fois le code source compilé vous obtenez une commande TH à lancer en ligne de commande :

linux_prompt$ TH
temp: 23.752460
hum: 57.130796
dew: 14.763353

temp : température en °C
hum
: humidité relative en %
dew : point de rosée en °C (température en dessous de laquelle se formera de la condensation) calculée à partir de la température et de l’humidité mesurées.

Remarques importantes

  • Le port de connexion est actuellement codé en dur dans le programme (dans le fichier rs232.c la valeur par défaut est /dev/ttyUSB0). Pour changer la valeur il faudra éditer le code source et recompiler le programme.
  • Le timing du bus I2C impose l’utilisation d’une fonction d’attente. Cette fonction a pour nom Delay(), elles est présente dans le fichier I2C.c mais également dans le fichier SHT11.c (car non conforme à la norme du bus I2C). Il est possible que sur un processeur rapide il soit nécessaire d’augmenter la valeur de ce délai. Changez la valeur 10 dans l’expression (10 * msec) dans le fichier SHT11.c ou 50 dans l’expression (50 * msec) dans le fichier I2C.c
  • Le driver ch341 de linux ne prend en charge les lignes DTR et DSR qu’à partir de la version 2.6.30 du noyau. Vous trouverez dans les sources un patch pour les versions 2.6.27 à 2.6.29. Pour les version antérieures il n’y a pas de patch fourni mais il existe, faites une recherche avec google.

14 réflexions sur « Commande linux pour clé USB TEMPer Hum »

  1. bonjour

    j’ai acheté la clé TEMPer Hum, mais je n’arrive pas à la faire fonctionner sous ubuntu.
    quand je la branche, je n’ai pas de fichier /dev/ttyUSBx mais /dev/hidraw3 et /dev/hidraw4.
    j’ai essayé de modifier rs232.c mais sans résultats …
    pouvez-vous m’aider ?

    merci !

    • Avec la commande lsmod voit-on le driver usbserial chargé ? C’est lui qui permet de gérer /dev/ttyUSBx . S’il n’est par chargé c’est que la chaine de reconnaissance USB n’a pas reconnu le périphérique. En fait le driver final, celui qui attaque réellement le matériel, est le ch341. Que donne alors la commande modprobe ch341 ? La commande dmesg permet de voir les messages système. Voici ce que ça donne chez moi :

      kernel: usbcore: registered new interface driver usbfs
      kernel: usbcore: registered new interface driver hub
      kernel: usbcore: registered new device driver usb
      kernel: uhci_hcd: USB Universal Host Controller Interface driver
      kernel: uhci_hcd 0000:00:07.2: PCI INT D -> Link[LNKD] -> GSI 5 (level, low) -> IRQ 5
      kernel: uhci_hcd 0000:00:07.2: UHCI Host Controller
      kernel: uhci_hcd 0000:00:07.2: new USB bus registered, assigned bus number 1
      kernel: uhci_hcd 0000:00:07.2: irq 5, io base 0x0000c000
      kernel: usb usb1: configuration #1 chosen from 1 choice
      kernel: hub 1-0:1.0: USB hub found
      kernel: hub 1-0:1.0: 2 ports detected
      kernel: usb 1-2: new full speed USB device using uhci_hcd and address 2
      kernel: usb 1-2: configuration #1 chosen from 1 choice
      kernel: usbcore: registered new interface driver usbserial
      kernel: USB Serial support registered for generic
      kernel: usbcore: registered new interface driver usbserial_generic
      kernel: usbserial: USB Serial Driver core
      kernel: USB Serial support registered for ch341-uart
      kernel: ch341 1-2:1.0: ch341-uart converter detected
      kernel: usb 1-2: ch341-uart converter now attached to ttyUSB0
      kernel: usbcore: registered new interface driver ch341

      Pour en savoir plus, quelle est la version du noyau linux (uname -r) ? Ubuntu utilise-t-il devfs ou faut-il créer manuellement les noeuds dans /dev ? (dans ce cas il faudra créer le noeud avec les commandes

      mknod /dev/ttyUSB0 c 118 0
      chmod a+rw /dev/ttyUSB0

  2. usbserial est bien chargé, par contre modprobe ch341 ne renvoie rien.

    le résultat de dmesg :

    [ 527.241930] usbcore: registered new interface driver usbserial
    [ 527.241965] USB Serial support registered for generic
    [ 527.242015] usbcore: registered new interface driver usbserial_generic
    [ 527.242020] usbserial: USB Serial Driver core
    [ 527.290967] USB Serial support registered for ch341-uart
    [ 527.291020] usbcore: registered new interface driver ch341
    [ 545.476790] usb 1-3.1: new low speed USB device using ehci_hcd and address 5
    [ 545.630349] usb 1-3.1: configuration #1 chosen from 1 choice
    [ 545.650835] input: PCsensor Temper as /devices/pci0000:00/0000:00:02.1/usb1/1-3/1-3.1/1-3.1:1.0/input/input6
    [ 545.651032] generic-usb 0003:1130:660C.0004: input,hidraw3: USB HID v1.10 Keyboard [ PCsensor Temper] on usb-0000:00:02.1-3.1/input0
    [ 545.668487] input: PCsensor Temper as /devices/pci0000:00/0000:00:02.1/usb1/1-3/1-3.1/1-3.1:1.1/input/input7
    [ 545.668655] generic-usb 0003:1130:660C.0005: input,hidraw4: USB HID v1.10 Device [ PCsensor Temper] on usb-0000:00:02.1-3.1/input1

    la version du noyau : 2.6.31-19-generic

    j’ai créé /dev/ttyUSB0, mais ça ne marche pas mieux …

    • Aie, ça donne l’impression que le constructeur a modifié l’interface USB pour qu’elle soit reconnue en tant que HID (clavier, souris, …) et non comme un port série. J’ai acheté mes clés TEMPer et TEMPer Hum au mois d’août 2008. Les spécifications ont peut-être changé entre-temps. En cherchant un peu sur le web j’ai trouvé cet article : TEMPer Temperature Sensor Linux Driver dans lequel on peut lire que l’auteur a créé un petit programme qui permet de lire le capteur à travers le driver HID de linux. Toutefois d’après les commentaires ce programme ne s’applique qu’à la version TEMPer du capteur, pas le TEMPer Hum qui n’est pas équipé du même composant de mesure physique.
      Si tel est le cas alors mon petit programme ne fonctionne qu’avec les anciennes clés. Je vais chercher à en savoir plus…

  3. J’ai trouvé sur le site du constructeur (http://www.pcsensor.com) l’information comme quoi la dénomination du capteur est désormais HID TEMPer et HID TEMPer Hum ce qui confirme que l’interface USB a changé. Ce n’est plus du Serial USB Adapter. Pour ce qui est de la précision il faut lire attentivement les spécifications du fournisseur de composants. Le MAXIM DS75 qui équipe les TEMPer ont une précision de +/- 2°C pour une mesure entre -25°C et +100°C. La conversion peut être configurée pour une résolution de 0.5°C ou 0.0625°C mais vu la précision c’est complètement idiot. Pour résumer, je confirme que oui, le capteur est médiocre car il a été construit autour d’un composant médiocre.
    En ce qui concerne le TEMPer Hum, le composant utilisé est le SENSIRION SHT11 qui est bien meilleur. A 25°C sa précision est de +/- 0.4°C pour la température et de +/- 3 %RH pour la mesure d’humidité. Un point précisé par le fabriquant de composants est de ne pas faire de mesure trop rapprochées car le composant chauffe un peu quand on l’interroge (+0.1°C avec 2 mesures par seconde). Si la clé est branchée sur l’ordinateur il faut veiller à ce qu’elle ne soit pas dans la ventilation. Le mieux est d’utiliser une rallonge USB.

  4. Maybe this thread is a bit old now…

    Your code works like a charm on my old lifebook B, running Ubuntu server 12.10 🙂 It’s critical to know the version of your USB device in order to make it run, but you state it very clearly in your article.

    Sorry, I cannot write much in French: Merci beaucoup et avant le bon travail!

  5. salut je va achetè se thermometre Temper m le brobleme j va de faire ds commande sous linux pour avoir ces aquisitions(les degré) et apres je v le testé avec langage « nodejs » svp si possible

    • La clé décrite dans cet article est déjà ancienne. Je ne suis pas certain qu’elle soit encore en vente. Je ne connais pas nodejs, je ne pourrai pas vous aider.

Répondre à llwynrt Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *