Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5

Communication I2C avec un capteur de température/hygrométrie SHT25
#1

Bonjour,

je débute sur le Raspberry et je découvre petit à petit la puissance de la "bête".
J'ai essayé de mettre en œuvre une communication i2c entre le Raspberry et un capteur SHT25 (température + hygrométrie) via une programmation en Python. Le problème est que les différentes fonctions proposées dans le driver i2c-dev ne me permettent pas de respecter le protocole de communication avec le capteur SHT25 (voir page 8 du pdf suivant : http://www.sensirion.com/fileadmin/user_...eet_V3.pdf ). En effet le constructeur donne le choix entre deux protocoles de communication :
- le premier impose de réaliser une pause de presque 100ms après avoir envoyé l'adresse du composant en "read" le temps que le capteur fasse la mesure demandée. Problème : aucune fonction du driver ne permet de réaliser cette pause
- le second impose de récupérer les deux octets de la mesure juste après avoir envoyé l'adresse du composant en "read". Problème : aucune fonction du driver permet de récupérer 2 octets juste après l'adresse en read. Seule la fonction, read_byte(), permet de récupérer le 1er octet.

Voici mon programme qui fonctionne, mais qui me permet de ne récupérer que le 1er octet de la mesure ! :

import smbus
import time


bus=smbus.SMBus(1)

Adresse=0x40
Temperature=0xf3
Hygrometrie=0xf5
Reset=0xfe

bus.write_byte(Adresse, Reset)
time.sleep(0.1)

bus.write_byte(Adresse,Temperature)
time.sleep(0.1)

temp=bus.read_byte(Adresse)
time.sleep(0.1)

bus.write_byte(Adresse, Hygrometrie)
time.sleep(0.1)

hygro=bus.read_byte(Adresse)
time.sleep(0.1)

temp=-46.85+175.72/65536*temp*256
hygro=-6+hygro*256*125/65536

Est-ce que quelqu'un a une solution ?

Merci d'avance
Répondre
#2

Je penses que tu dois faire deux read_bytes puis tu les additionnes :
val = byte1 * 256+ byte2
Répondre
#3

J'ai déjà essayé cette manip, mais sans surprise ça ne marche pas. En effet, avec cette méthode on envoie 2 fois l'adresse du composant en read et à chaque fois on lit le 1er octet !
A priori aucune fonction proposé dans le driver i2c-dev ne permet de respecter le protocole de communication avec mon capteur SHT25.

Une solution serait peut-être de modifier une fonction existante dans le driver et l'adapter à ce que je souhaite faire. Je pense que c'est possible, car comme le Raspberry est sous Linux, tout est "Open Source".
Mon 1er problème : Où sont ces fonctions ?
Répondre
#4

Read_bytes permet de récupérer l'octet suivant, si tu en as 10, tu fais 10 read_bytes. Voici un exemple d un programe Python qui discute avec un Arduino en I2C.




Code :
[== Indéfini ==]
bus = smbus.SMBus(1)
address = 0x12

def readCompteur():
        bus.write_byte(address, 1)
        time.sleep(0.01)
        mcube = bus.read_byte(address) * 256 + bus.read_byte(address)

        bus.write_byte(address, 2)
        time.sleep(0.01)
        litre = bus.read_byte(address) * 256 + bus.read_byte(address)
        return mcube*1000 + litre

readCompteur()
Répondre
#5

Tout d'abord merci pour tes réponses.
J'avais déjà essayé ce code, je viens de réessayer (on ne sait jamais !) mais ça ne marche toujours pas. J'ai toujours des sauts de température qui correspondent à un octet.
Le problème est que l'instruction read.byte() envoie à chaque fois l'adresse du composant en read puis ne lit que le 1er octet reçu ! Il me faudrait faire un relevé sur oscillo pour confirmer mais en lisant la description de la fonction c'est ce qu'il doit se passer.
En lisant la description de toutes les fonctions du driver, je ne vois pas de commande possible mis à part créer ma propre fonction. Le problème est comment faire !
Répondre
#6

un read word qui lit 16 bits ?

http://wiki.erazor-zone.de/wiki:linux:python:smbus:doc
http://git.kernel.org/cgit/linux/kernel/...s-protocol
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)