Mon BLOG domotique

15.5.06

L'afficheur LCD

Etape suivante du projet : connecter un afficheur LCD sur le io-warrior

Deux pistes :
Finalement, j'ai retenu la première piste et me suis lancé dans la récupération !
L'afficheur LCD est un Densitron (ref LWM2004A-BR-SNG-T) de 4x20 caractères avec rétro-éclairage.

Je n'ai pas trouvé exactement sa datasheet sur le site densitron mais des datasheet de modèles proches me laissent supposer :
  • qu'il est bien compatible HD44780
  • qu'il dispose du jeu de caractére :





























  • que les caractères 1 à 7 sont programmables en RAM (ce sera très utile pour faire une horloge géante).

9.5.06

Les capteurs de température

Voici quelques infos sur mes capteurs de température :

Le matériel
* Une carte IO-Warrior (achetée en Allemagne sur Internet : http://www.codemercs.com/IOW24KIT_E.html) qui permet d'interfacer le monde de l'I²C (alias IIC alias 2-wire alias SMBus : bus de mesure développé au début des années 80 par Philips) et le monde de l'USB.


* 3 capteurs de température I²C (merci François!!!!!) TMP75 de Texas Instrument (même fonctionnalités que les DS75 ou LM75) : voir la Datasheet http://www-s.ti.com/sc/ds/tmp75.pdf (ou http://www.ti.com/i2c pour la page d'accueil I²C)




Les logiciels
* A partir des bibliothèques fournies par CodeMercs pour le IO-Warrior, quelques heures de développement Q&D (Quick and Dirty : ma spécialité ...) en Visual Basic ont suffit pour réaliser les premières mesures.... au dixième de degré près....

Deux étapes :

1. Initialisation de la sonde

Private Sub IICWriteConfig_sd(sd As Byte)
' IIC packet is 8 bytes long (1 byte is used for Report ID)
Dim iicPacket(7) As Byte
Dim repPkt(7) As Byte
' Result
Dim Res As Long
Dim nBytes As Long
Dim sOK As String

ReadLabel.Caption = "Writing to IIC"
ReadLabel.Refresh
' See IO-Warrior documentation for IIC packet specs
' Set Write to IIC Report ID number - 2
iicPacket(0) = 2
Value = Val("&HC3")
iicPacket(1) = Value
Value = sd
iicPacket(2) = Value
Value = Val("&H01")
iicPacket(3) = Value
Value = Val("&H60")
iicPacket(4) = Value
iicPacket(5) = 0
iicPacket(6) = 0
iicPacket(7) = 0
' Write to IIC
Res = IowKitWrite(iowHandle, IOW_PIPE_SPECIAL_MODE, iicPacket(0), 8)
' Check error
'If (Res <> 8) Then
' Exit Sub
'End If
' Read ack/error packet
Res = IowKitRead(iowHandle, IOW_PIPE_SPECIAL_MODE, iicPacket(0), 8)
' Handle packet
' Check if transaction is OK
If (iicPacket(0) = 2) Then
' Report ID is OK
' Check other stuff
If (iicPacket(1) And &H80) <> 0 Then
ReadLabel.Caption = "IIC write error"
MsgBox "Erreur sur sonde " & sd & " : write error !"
' Write error, exit from Sub
Exit Sub
End If
Res = (iicPacket(1) And 7)
sOK = ""
' Check if all bytes are ACKed
If (Res < sok = " - less" res =" nBytes" caption = "IIC ack - " text = "Resultat write : " caption = "Wrong IIC ack report ID!">

2. Lecture de valeurs

Private Function IICReadTemp_sonde(sd As Byte)
' IIC packet is 8 bytes long (1 byte is used for Report ID)
Dim iicPacket(7) As Byte
' Result and other variables
Dim Res As Long
Dim nBytes As Long
Dim nPending As Long
Dim sOK As String


iicPacket(0) = &H2
iicPacket(1) = &HC2
iicPacket(2) = sd
iicPacket(3) = 0
iicPacket(4) = 0
iicPacket(5) = 0
iicPacket(6) = 0
iicPacket(7) = 0

Text1.Text = "Write for read : " & Str(iicPacket(0)) & Str(iicPacket(1)) & Str(iicPacket(2)) & Str(iicPacket(3)) & Str(iicPacket(4)) & Str(iicPacket(5)) & Str(iicPacket(6)) & Str(iicPacket(7)) & Chr(13) & Chr(10) & Text1.Text
' Write packet to IIC
' We initiate IIC read operation by writing this packet
Res = IowKitWrite(iowHandle, IOW_PIPE_SPECIAL_MODE, iicPacket(0), 8)
' Check error
If (Res <> 8) Then
Exit Function
End If

Res = IowKitRead(iowHandle, IOW_PIPE_SPECIAL_MODE, iicPacket(0), 8)
' Handle packet
' Check if transaction is OK
If (iicPacket(0) = 2) Then
' Report ID is OK
' Check other stuff
If (iicPacket(1) And &H80) <> 0 Then
ReadLabel.Caption = "IIC write error"
' Write error, exit from Sub
Exit Function
End If
End If
iicPacket(0) = &H3
iicPacket(1) = &H2
iicPacket(2) = sd + 1
iicPacket(3) = 0
iicPacket(4) = 0
iicPacket(5) = 0
iicPacket(6) = 0
iicPacket(7) = 0

Text1.Text = "Write for read : " & Str(iicPacket(0)) & Str(iicPacket(1)) & Str(iicPacket(2)) & Str(iicPacket(3)) & Str(iicPacket(4)) & Str(iicPacket(5)) & Str(iicPacket(6)) & Str(iicPacket(7)) & Chr(13) & Chr(10) & Text1.Text
' Write packet to IIC
' We initiate IIC read operation by writing this packet
Res = IowKitWrite(iowHandle, IOW_PIPE_SPECIAL_MODE, iicPacket(0), 8)
' Check error
If (Res <> 8) Then
Exit Function
End If
' Set pending bytes count
Res = IowKitRead(iowHandle, IOW_PIPE_SPECIAL_MODE, iicPacket(0), 8)
' Check packet
If (iicPacket(0) <> 3) Then
' Wrong report ID
Exit Function
End If
' OK, report ID is OK, check for error
If (iicPacket(1) And &H80) <> 0 Then
MsgBox "Read transaction aborted", 0, "IIC Error"
End If
' Get number of bytes read this time
Res = iicPacket(1) And 7

' Decrement number of bytes to read left
Text1.Text = "Nombre de bytes lus : " & Str(Res) &amp;amp;amp;amp;amp;amp;amp;amp; Chr(13) & Chr(10) & Text1.Text
' Do something with data
' Six bytes of data are stored in iicPacket(2)-iicPacket(7)
'TextVal1.Text = Hex$(iicPacket(2))
ReadLabel.Caption = "Read " & Str(nBytes) & " bytes"
Text1.Text = "Resultat read sonde " & Str(sd) & " : " & Str(iicPacket(0)) & Str(iicPacket(1)) & Str(iicPacket(2)) & Str(iicPacket(3)) & Str(iicPacket(4)) & Str(iicPacket(5)) & Str(iicPacket(6)) & Str(iicPacket(7)) '& Chr(13) &amp;amp;amp;amp;amp;amp;amp; Chr(10) & Text1.text
tempe(sd).Caption = Str(Round(iicPacket(2) + iicPacket(3) / 256, 2))
IICReadTemp_sonde = Round(iicPacket(2) + iicPacket(3) / 256, 2)
End Function


Les résultats


Les résultats sont impressionnants : au dixième de degré près !!