IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Raspberry Pi Discussion :

Bus Pirate (v3.6a) TOL 12942 de Sparkfun


Sujet :

Raspberry Pi

  1. #61
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    ... Pas du tout. Dans mes explications, je me trouve dans le paragraphe 3) de mes tests.
    Dans ce montage, il n'y a pas de transistor. ...
    Bien sûr qui si il y en a un, c'est celui de la plaquette et non le NPN que vous avez rajouté au test 4) et c'est pourquoi, quand vous dites : "L'intensité à la sortie du bus pirate n'est pas suffisante pour déclencher le relais.", je vous ai dit : ce n'est pas le relais, mais la base du transistor qui alimente le relais. Donc, vous avez bien fait un raccourci, mais cela venait du fait que pour vous, le relais ou sa plaquette ne faisait qu'un. D'où mon incompréhension.

    Bon, maintenant qu'on sait de quoi chacun parle , pas de problème.

    Cordialement.

    Pierre.

  2. #62
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 619
    Points : 56 854
    Points
    56 854
    Billets dans le blog
    40
    Par défaut
    Hello messieurs

    J'ai sans doute décroché de la discussion à un moment, mais je vois en remontant le fil que les travaux ont avancé et que l'essentiel est dit

    J'en tire les conclusions suivantes :
    • Il ne faut pas confondre le relais et le module relais. Ce dernier comprend le relais bien sûr, mais aussi l'électronique de commande avec un transistor, une résistance, une led témoin, et une diode de roue libre, le tout soudé sur un circuit imprimé.
    • En fonctionnement nominal, la bobine du relais doit être alimentée en 5V pour claquer. Si on ne l'alimente qu'en 3,3V, on est en fonctionnement dégradé. Cela veut dire que le relais "peut" claquer... ou pas. (Il existe aussi des relais SRD-03VDC-SL-C)
    • Pour activer le relais du module relais, il faut saturer un transistor pour que le courant puisse circuler dans la bobine. Comme ce module est plutôt prévu pour Arduino, le transistor et la résistance doivent être dimensionnés pour une sortie 5V d'un microcontrôleur. Le but est d'obtenir un courant suffisant sur la base du transistor pour le saturer (et même le "sursaturer"). Avec une sortie GPIO du Pi à 3,3V, apparemment ça passe encore. Avec la sortie AUX du bus Pirate (reliée à une broche GPIO d'un PIC), il n'y a pas assez de courant (on voit d'ailleurs sur la doc du PIC que la tension en sortie vers AUX peut s'effondrer rapidement avec quelques milliampères seulement). Mais apparemment, le bus Pirate est prévu avant tout pour faire de la comunication série.


    Conclusion finale, avec ce genre de modules relais pas chers et peu documentés, quand je vois tous ces tutoriels où pourtant "ça marche"... pfrrrt, je dis "coup de bol"

  3. #63
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut f-leb.

    Ce que vous dites est vrai, mais cela dépend du montage.
    Le bon montage est de récupérer l'alimentation, non pas sur le bus pirate ou sur la raspberry, mais sur une source extérieure, comme je l'ai fait sur ma breadboard en utilisant ce composant :
    --> https://www.gotronic.fr/art-alimenta...w-bb-25638.htm

    Citation Envoyé par f-leb
    Conclusion finale, avec ce genre de modules relais pas chers et peu documentés, quand je vois tous ces tutoriels où pourtant "ça marche"... pfrrrt, je dis "coup de bol"
    Entièrement d'accord.
    C'est en faisant des tests, et en abordant les aspects chiffrés que je me suis rendu compte de la bonne démarche à suivre.
    Je retiendrai de tout cela que ce module relais GT1080 a besoin de :
    --> U = 5Vcc
    --> I = 70mA

    Il reste à préciser que ce relais n'est pas idéal si l'on désire protéger le GPIO de la Raspberry Pi.
    Il faut utiliser un relais optocouplé comme dans le montage ci-après :

    Nom : image.png
Affichages : 218
Taille : 28,8 Ko

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #64
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 619
    Points : 56 854
    Points
    56 854
    Billets dans le blog
    40
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Ce que vous dites est vrai, mais cela dépend du montage.
    Le bon montage est de récupérer l'alimentation, non pas sur le bus pirate ou sur la raspberry, mais sur une source extérieure, comme je l'ai fait sur ma breadboard en utilisant ce composant :
    --> https://www.gotronic.fr/art-alimenta...w-bb-25638.htm
    Pour l'alimentation de la bobine, oui.
    La bobine a une résistance équivalente de 70 Ohms d'après la doc, et en fonctionnement nominal il faut l'alimenter en 5V pour que le relais claque. En régime permanent, la bobine va consommer un courant I=5/70=71 mA que ta source d'alimentation sur breadboard peut fournir largement. (Si la bobine n'est alimentée qu'en 3,3V, la consommation ne sera que de I=3,3/70=47 mA, mais dans ce mode dégradé le relais ne claquera pas à coup sûr).
    Note que la broche 5V du Pi peut aussi fournir ce courant (pour peu que l'alimentation du Pi suffise).
    Je pense que le 5V du busPirate qui tire son alimentation du port USB peut aussi fournir ce courant.

    Le souci vient du transistor du module relais qui n'arrive pas à saturer car le courant en sortie du microcontrôleur PIC du bus Pirate (la broche AUX) est trop faible.

    Le module relais avec octocoupleur est plus sécurisant, mais rien ne dit qu'il fonctionnera encore avec le bus Pirate pour les mêmes raisons.

  5. #65
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut f-leb.

    Citation Envoyé par f-leb
    Pour l'alimentation de la bobine, oui.
    Mais c'est le principale problème que j'ai rencontré.
    Je devais trouver une alimentation suffisante pour enclencher le relais.
    Comme je l'ai constaté, l'alimentation du bus pirate (broche 5Vcc) n'est pas suffisante.
    Alors que celle de la raspberry (broche #4 : 5Vcc ou broche #1 : 3.3Vcc) l'est.

    Citation Envoyé par f-leb
    ... dans ce mode dégradé le relais ne claquera pas à coup sûr).
    C'est juste un test d'apprentissage et non un montage ayant une quelconque vocation à durer dans le temps.
    Je n'ai pas constaté qu'à 3.3Vcc, le relais ne claque pas, même une seule fois.

    Citation Envoyé par f-leb
    Note que la broche 5V du Pi peut aussi fournir ce courant (pour peu que l'alimentation du Pi suffise).
    Comme je l'ai dit précédemment, je déconseille de prendre l'alimentation directement sur la Raspberry Pi car cela risque de la détériorer.

    Citation Envoyé par f-leb
    Je pense que le 5V du Bus Pirate qui tire son alimentation du port USB peut aussi fournir ce courant.
    Je n'en suis pas aussi sûr que toi.
    J'ai branché mon bus pirate sur un hub alimenté, et je n'ai pas vu de changement, hormis une légère élévation de la tension.
    L'intensité (ou courant ou ampère) produite à la sortie de la broche 5Vcc du bus pirate, n'est pas suffisante pour faire claquer le relais, même dans ce cas.

    Citation Envoyé par f-leb
    Le souci vient du transistor du module relais qui n'arrive pas à saturer car le courant en sortie du microcontrôleur PIC du bus Pirate (la broche AUX) est trop faible.
    Le soucis ne vient pas de là, car dans le montage paragraphe 4), j'arrive à faire claquer le relais.
    Autrement dit, la broche AUX du bus pirate n'est pas en cause car elle produit une intensité suffisante, même faible, pour activer le transistor du module relais.

    Citation Envoyé par f-leb
    Le module relais avec octocoupleur est plus sécurisant, mais rien ne dit qu'il fonctionnera encore avec le bus Pirate pour les mêmes raisons.
    Je dis OUI, mais je tiens à préciser que cela dépend du montage que j'utilise.

    Le montage qui pose problème et dont nous parlons depuis longtemps, est celui du paragraphe 3).

    Je pense que le sujet est clos car j'ai un autre sujet à vous proposer, toujours avec le bus pirate.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #66
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Nouveau sujet : le capteur de température one-wire DS18B20.

    Pour ce test, j'utilise deux DS18B20.

    I) Les caractéristiques du capteur de température one-wire DS18B20.

    Résolution numérique avec une précision maximale de 12 bits.
    Température précise au 1/16ième.
    Variation allant de -55°C jusqu'à +125°C.
    Précision +/-0.5°C entre -10°C jusqu'à +85°C.

    On peut monter plusieurs capteurs de température sur le même bus one-wire.

    II) Le montage.

    Pour réaliser le montage, j'ai besoin d'une résistance de 4,7k ohms.
    Comme je n'en ai pas, j'ai utilisé deux résistances de 10k ohms montés en parallèle :
    -->1/R = 1/10000 + 1/10000
    --> R = 5000 ohms.

    En lisant la fiche technique et en faisant ds tests, j'ai trouvé trois montages différents :

    a) en utilisant la résistance pull-up du bus pirate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    +------------+---------+-----------------+
    | Bus Pirate | Montage | Capteur DS18B20 |
    +------------+---------+-----------------+
    |    GND     |  <--->  |       GND       |
    |            |         |                 |
    |  5 Vcc     |  >-+    |                 |
    |            |    |    |                 |
    |    VPU     |  <-+->  |       Vdd       |
    |            |         |                 |
    | OWD (MOSI) |  <--->  |       DQ        |
    +------------+---------+-----------------+
    Pour ce montage, j'ai utilisé la résistance pull-up du bus pirate.
    J'ai relié la sortie VPU et VCC (en 5V) du bus pirate à l'entrée Vdd du DS18B20, comme le schéma ci-dessus le montre.

    b) montage à 3 fils, en utilisant une résistance pull-up externe (de 5k ohms) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    +------------+---------+-----------------+
    | Bus Pirate | Montage | Capteur DS18B20 |
    +------------+---------+-----------------+
    |    GND     |  <--->  |      GND        |
    |            |         |                 |
    |  5 Vcc     |  >-+->  |      Vdd        |
    |            |    |    |                 |
    |            |  +-+-+  |                 |
    |            |  | R |  |                 |
    |            |  +-+-+  |                 |
    |            |    |    |                 |
    | OWD (MOSI) |  <-+->  |      DQ         |
    +------------+---------+         -------+
    Ce montage est dit classique.
    C'est ce montage que j'utilise pour tester les deux capteurs one-wire DS18B20.

    c) montage à 2 fils, en utilisant aussi une résistance pull-up externe (de 5k ohms) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    +------------+---------+-----------------+
    | Bus Pirate | Montage | Capteur DS18B20 |
    +------------+---------+-----------------+
    |    GND     |  >-+->  |      GND        |
    |            |    |    |                 |
    |            |    +->  |      Vdd        |
    |            |         |                 |
    |  5 Vcc     |  >-+    |                 |
    |            |    |    |                 |
    |            |  +-+-+  |                 |
    |            |  | R |  |                 |
    |            |  +-+-+  |                 |
    |            |    |    |                 |
    | OWD (MOSI) |  <-+->  |      DQ         |
    +------------+---------+-----------------+
    Ce montage est dit parasite.
    J'ai aussi testé ce montage sauf qu'il correspond à un mode dégradé du fonctionnement du capteur de température one-wire DS18B20.
    Voir la fiche teechnique pour de plus amples explications.

    Conclusion : J'ai testé ces trois montages et ils fonctionnent tous.

    P.S.: si les tableaux ne sont pas compréhensibles, dites-le !

    III) le programme de pilotage du capteur de température.

    Voici un exemple de son éxecution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
                    +============================+
                    |     Serial Transmission    |
                    |         (Win32 APi)        |
                    +----------------------------+
                    |              Port :   COM5 |
                    |          BaudRate : 115200 |
                    |          ByteSize :      8 |
                    |           StopBit :      0 |
                    |            Parity :      0 |
                    |       fDtrControl :      1 |
                    |       fRtsControl :      1 |
                    +----------------------------+
                    |         DCBlength :     28 |
                    |           fBinary :      1 |
                    |           fParity :      0 |
                    |      fOutxCtsFlow :      0 |
                    |      fOutxDsrFlow :      0 |
                    |   fDsrSensitivity :      0 |
                    | fTXContinueOnXoff :      0 |
                    |             fOutX :      0 |
                    |              fInX :      0 |
                    |        fErrorChar :      0 |
                    |             fNull :      0 |
                    |     fAbortOnError :      0 |
                    |           fDummy2 :      0 |
                    |         wReserved :      0 |
                    |            XonLim :   2048 |
                    |           XoffLim :    512 |
                    |           XonChar :     17 |
                    |          XoffChar :     19 |
                    |         ErrorChar :      0 |
                    |           EofChar :      0 |
                    |           EvtChar :      0 |
                    +============================+
    
    HiZ>#
    RESET
    
    Bus Pirate v3b
    Firmware v5.10 (r559)  Bootloader v4.4
    DEVID:0x0447 REVID:0x3046 (24FJ64GA002 B8)
    http://dangerousprototypes.com
    HiZ>b
    Set serial port speed: (bps)
     1. 300
     2. 1200
     3. 2400
     4. 4800
     5. 9600
     6. 19200
     7. 38400
     8. 57600
     9. 115200
    10. BRG raw value
    
    (9)>9
    Adjust your terminal
    Space to continue
    HiZ>m
    1. HiZ
    2. 1-WIRE
    3. UART
    4. I2C
    5. SPI
    6. 2WIRE
    7. 3WIRE
    8. LCD
    9. DIO
    x. exit(without change)
    
    (1)>2
    1WIRE routines (C) 2000 Michael Pearce GNU GPL
    Ready
    1-WIRE>W
    Power supplies ON
    1-WIRE>P
    Pull-up resistors ON
    1-WIRE>v
    Pinstates:
    1.(BR)  2.(RD)  3.(OR)  4.(YW)  5.(GN)  6.(BL)  7.(PU)  8.(GR)  9.(WT)  0.(Blk)
    GND     3.3V    5.0V    ADC     VPU     AUX     -       OWD     -       -
    P       P       P       I       I       I       I       I       I       I
    GND     3.29V   5.04V   0.00V   2.42V   L       H       H       H       H
    1-WIRE>(0)
     0.Macro menu
    Macro     1WIRE address
    No device, try (ALARM) SEARCH macro first
    1WIRE ROM COMMAND MACROs:
     51.READ ROM (0x33) *for single device bus
     85.MATCH ROM (0x55) *followed by 64bit address
     204.SKIP ROM (0xCC) *followed by command
     236.ALARM SEARCH (0xEC)
     240.SEARCH ROM (0xF0)
    
    1-WIRE>(51)
    BUS RESET  OK
    READ ROM (0x33): 0x28 0x60 0x08 0x9A 0x0B 0x00 0x00 0x20
    DS18B20 Prog Res Dig Therm
    
    1-WIRE>(240)
    SEARCH (0xF0)
    Macro     1WIRE address
     1.0x28 0x68 0x88 0x9A 0x0B 0x00 0x00 0xB2
       *DS18B20 Prog Res Dig Therm
     2.0x28 0xF2 0x1E 0x9B 0x0B 0x00 0x00 0x68
       *DS18B20 Prog Res Dig Therm
    Device IDs are available by MACRO, see (0).
    
    1-WIRE>(0)
     0.Macro menu
    Macro     1WIRE address
     1.0x28 0x68 0x88 0x9A 0x0B 0x00 0x00 0xB2
       *DS18B20 Prog Res Dig Therm
     2.0x28 0xF2 0x1E 0x9B 0x0B 0x00 0x00 0x68
       *DS18B20 Prog Res Dig Therm
    1WIRE ROM COMMAND MACROs:
     51.READ ROM (0x33) *for single device bus
     85.MATCH ROM (0x55) *followed by 64bit address
     204.SKIP ROM (0xCC) *followed by command
     236.ALARM SEARCH (0xEC)
     240.SEARCH ROM (0xF0)
    
    1-WIRE>(85)(1) 0x4E 0 0 0x7F
    BUS RESET  OK
    MATCH ROM (0x55)
    
    ADDRESS MACRO 1: 0x28 0x68 0x88 0x9A 0x0B 0x00 0x00 0xB2
    
    WRITE: 0x4E
    WRITE: 0x00
    WRITE: 0x00
    WRITE: 0x7F
    1-WIRE>(85)(1) 0xBE r:12
    BUS RESET  OK
    MATCH ROM (0x55)
    
    ADDRESS MACRO 1: 0x28 0x68 0x88 0x9A 0x0B 0x00 0x00 0xB2
    
    WRITE: 0xBE
    READ: 0x50 0x05 0x00 0x00 0x7F 0xFF 0x0C 0x10 0xE4 0xFF 0xFF 0xFF
    1-WIRE>(85)(1) 0x44
    BUS RESET  OK
    MATCH ROM (0x55)
    
    ADDRESS MACRO 1: 0x28 0x68 0x88 0x9A 0x0B 0x00 0x00 0xB2
    
    WRITE: 0x44
    1-WIRE>(85)(1) 0xBE r:2
    BUS RESET  OK
    MATCH ROM (0x55)
    
    ADDRESS MACRO 1: 0x28 0x68 0x88 0x9A 0x0B 0x00 0x00 0xB2
    
    WRITE: 0xBE
    READ: 0x2A 0x01
    1-WIRE>
            +------------------------+
            | Température : +18.6250 |
            +------------------------+
    1-WIRE>(85)(2) 0x4E 0 0 0x7F
    BUS RESET  OK
    MATCH ROM (0x55)
    
    ADDRESS MACRO 2: 0x28 0xF2 0x1E 0x9B 0x0B 0x00 0x00 0x68
    
    WRITE: 0x4E
    WRITE: 0x00
    WRITE: 0x00
    WRITE: 0x7F
    1-WIRE>(85)(2) 0xBE r:12
    BUS RESET  OK
    MATCH ROM (0x55)
    
    ADDRESS MACRO 2: 0x28 0xF2 0x1E 0x9B 0x0B 0x00 0x00 0x68
    
    WRITE: 0xBE
    READ: 0x50 0x05 0x00 0x00 0x7F 0xFF 0x0C 0x10 0xE4 0xFF 0xFF 0xFF
    1-WIRE>(85)(2) 0x44
    BUS RESET  OK
    MATCH ROM (0x55)
    
    ADDRESS MACRO 2: 0x28 0xF2 0x1E 0x9B 0x0B 0x00 0x00 0x68
    
    WRITE: 0x44
    1-WIRE>(85)(2) 0xBE r:2
    BUS RESET  OK
    MATCH ROM (0x55)
    
    ADDRESS MACRO 2: 0x28 0xF2 0x1E 0x9B 0x0B 0x00 0x00 0x68
    
    WRITE: 0xBE
    READ: 0x2B 0x01
    1-WIRE>
            +------------------------+
            | Température : +18.6875 |
            +------------------------+
    1-WIRE>#
    RESET
    
    Bus Pirate v3b
    Firmware v5.10 (r559)  Bootloader v4.4
    DEVID:0x0447 REVID:0x3046 (24FJ64GA002 B8)
    http://dangerousprototypes.com
    HiZ>
    Appuyez sur une touche pour continuer...
    Quelques explications :

    a) le tableau au début de l'exécution donne le paramétrage de la liaison UART que j'utilise pour piloter le bus pirate depuis mon ordinateur Windows.
    La première partie est consacré au paramétrage que je me suis imposé. Comme on peut le voir, la liaison fonctionne en 115 200 baud.
    La seconde partie concerne le paramétrage par défaut.

    b) je reconfigure le baudrate de mon bus pirate à 115 200 baud.

    c) je rentre dans le menu et je sélectionne "2. 1-WIRE", la fonction que je vais utiliser.

    d) j'active l'alimentation du bus pirate et je mets en fonction la résistance pull-up. J'affiche le voltage du bus pirate.

    e) j'affiche le sous-menu one wire avant de commencer les tests. Comme on peut le voir, les adresses (1) et (2) des deux DS18B20 ne sont pas encore présentes.

    f) la macro (51) permet d'interroger un seul capteur de température. Dans cet exemple, la fonctionne retourne une adresse quelconque.
    Autrement dit, quand il y a deux capteurs, cette macro ne fonctionne pas correctement.

    g) la macro (240) permet de récupérer toutes les adresses des capteurs qui sont présents sur le bus one-wire.
    On remarque, dans le sous-menu (0), deux nouvelles lignes, celles des adresses (1) t (2) de nos deux capteurs.

    h) la macro (85) associé à l'adresse (1) ou (2) permet d'envoyer des ordres. Nous envoyons "(85)(1) 0x4E" pour dire que nous initialisons le premier capteurs.
    La précision demandée est de 12 bits.

    i) cette fois-ci nous allons lire le contenu du bloc-note mémoire du premier capteur en faisant "(85)(1) 0xBE r:12". Nous lisons douze octets.
    Les deux premiers correspondent à la température. C'est ce que nous allons extraire par la suite de notre traitement.
    Pour plus d'information je vous conseille de lire la fiche technique.

    j) nous effectuons une mesure de la température : "(85)(1) 0x44" Elle est stockée dans les deux premiers octets.

    k) nous effectuons une lecture des deux premiers octets : "(85)(1) 0xBE r:2".
    Nous passons par notre fonction d'extraction et de mise en forme de la température.

    J'ai créé une fonction qui lit les deux premiers octets du premier capteur : "READ: 0x2A 0x01" et du second capteurs : "READ: 0x2B 0x01"
    J'ai dû recomposer la valeur lu sous la forme d'une chaîne de caractères hexadécimal composée de la partie LSB (Least Significant Byte) et de la partie MSB (Most Significant Byte).
    A partir de cette chaîne de caractères hexadécimal, j'ai traduit cela en décimal puis convertit en double précision, en tenant compte de sa représentation négative.
    Et pour terminer, j'affiche le résultat de la température de l'un ou de l'autre capteur.

    l) nous réutilisons les mêmes macros mais sur le second capteur de température one-wire DS18B20.
    Comme les deux capteurs sont sur la même breadboard, les deux températures sont identiques.

    Ce test est facile à faire et j n'ai rencontré aucun problème sur la mesure de la température par ce capteur DS18B20.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #67
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Je n'ai eu aucune difficulté à manipuler le DS18B20.
    Je vous communique le programme que j'ai utilisé pour mesurer la température de ce capteur :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    /*******************************************/
    /*                                         */
    /*     Prise de Controle du Bus Pirate     */
    /*                                         */
    /*-----------------------------------------*/
    /*                                         */
    /*  Capteur de température 1-wire DS18B20  */
    /*                                         */
    /*******************************************/
     
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <libcom.h>
     
    /*==============================*/
    /*                              */
    /*     Procédure Principale     */
    /*                              */
    /*==============================*/
     
    int main(void)
    {
    	if (!COM_Open(50))
    		exit(-1);
     
    	COM_Send("\n");
    	COM_Send("#\n");							/* Reset */
     
    	COM_Send("b\n");
    	COM_Send("9\n");							/* Baudrate */
    	COM_Send(" ");
     
    	COM_Send("m\n");
    	COM_Send("2\n");							/* Menu 1-wire */
     
    	COM_Send("W\n");							/* Power supplies ON */
    	COM_Send("P\n");							/* Pull-up resistors ON */
    	COM_Send("v\n");							/* Show volts/states */
     
    	/*------------------------------------------------------------------*/
    	/*     Recherche des adresses des capteur de température DS18B20     */
    	/*------------------------------------------------------------------*/
     
    	COM_Send("(0)\n");							/* Sous-Menu 1-wire */
    	COM_Send("(51)\n");							/* Détection de l'adresse d'un DS18B20 */
     
    	COM_Send("(240)\n");						/* Macro 1-WIRE address */
    	COM_Send("(0)\n");							/* Sous-menu 1-wire */
     
    	/*-------------------------------------------------------------------*/
    	/*     Initialisation de tous les capteur de température DS18B20     */
    	/*-------------------------------------------------------------------*/
     
    	COM_Send("(204) 0x4E 0 0 0x7F\n");			/* Configurer tous les capteurs */
    	COM_Send("(85)(1) 0xBE r:12\n");			/* Lecture premier capteur */
    	COM_Send("(85)(2) 0xBE r:12\n");			/* Lecture second  capteur */
     
    	/*---------------------------------------------*/
    	/*     Mesure et lecture de la température     */
    	/*---------------------------------------------*/
     
    	COM_Send("(204) 0x44\n");					/* Mesure de tous les capteurs */
    	COM_Delay(800);								/* Temps minimum avant lecture */
     
    	R1W_DS18B20("(85)(1) 0xBE r:2\n");			/* Lecture température premier capteur */
    	R1W_DS18B20("(85)(2) 0xBE r:2\n");			/* Lecture température second  capteur */
     
    	/*----------------------------*/
    	/*     Fin de l'affichage     */
    	/*----------------------------*/
     
    	COM_Delay(1000);
    	getch();  /* Pour marquer une pause durant l'affichage */
     
    	COM_Send("#\n");				/* Reset */
    	COM_Close();
    	exit(0);
    }

    En ce qui me concerne, ce sujet est clos !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  8. #68
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Autre nouveau sujet : le capteur de chez joy-it KY052 plus connu sous le nom BMP280.

    Voici le capteur dont je me suis procuré chez GoTronic :
    --> https://www.gotronic.fr/art-module-b...y052-29155.htm

    I) Les caractéristiques du capteur BMP280.

    Il mesure la température et la pression atmosphérique.
    A l'inverse de ce que l'on peut croire, il ne mesure pas l'altitude car c'est un calcul qui le détermine.

    Variation de la pression de 300 hPa jusqu'à 1100 hPa.
    Variation de la température de -40°C jusqu'à +85°C.

    Mode de communication en I2C et en SPI.

    Fonctionne en 3.3Vcc ou en 5Vcc.

    C'est un peu plus complexe pour la mise au point que le DS18B20.
    Mais en s'aidant de la fiche technique, où il y a un exemple chiffré, le problème de vient plus simple.

    II) Le montage.

    J'ai utilisé la résistance pull-up (VPU) du bus pirate, puisque les échanges se font dans le mode I2C.

    Voici le montage de la fiche technique qu j'ai utilisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    +------------+---------+--------+
    | Bus Pirate | Montage | BMP280 |
    +------------+---------+--------+
    | Vcc + VPU  | --+-->  |  VCC   |
    |            |   |     |        |
    |            |   +-->  |  SDO   |
    |            |   |     |        |
    |            |   +-->  |  CSB   |
    +------------+---------+--------+
    |     GND    | ----->  |  GND   |
    |     CLK    | ----->  |  SCL   |
    |    MOSI    |------>  |  SDA   |
    +------------+---------+--------+
    III) le programme de pilotage du capteur BMP280.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
                    +============================+
                    |     Serial Transmission    |
                    |         (Win32 APi)        |
                    +----------------------------+
                    |              Port :   COM5 |
                    |          BaudRate : 115200 |
                    |          ByteSize :      8 |
                    |           StopBit :      0 |
                    |            Parity :      0 |
                    |       fDtrControl :      1 |
                    |       fRtsControl :      1 |
                    +----------------------------+
                    |         DCBlength :     28 |
                    |           fBinary :      1 |
                    |           fParity :      0 |
                    |      fOutxCtsFlow :      0 |
                    |      fOutxDsrFlow :      0 |
                    |   fDsrSensitivity :      0 |
                    | fTXContinueOnXoff :      0 |
                    |             fOutX :      0 |
                    |              fInX :      0 |
                    |        fErrorChar :      0 |
                    |             fNull :      0 |
                    |     fAbortOnError :      0 |
                    |           fDummy2 :      0 |
                    |         wReserved :      0 |
                    |            XonLim :   2048 |
                    |           XoffLim :    512 |
                    |           XonChar :     17 |
                    |          XoffChar :     19 |
                    |         ErrorChar :      0 |
                    |           EofChar :      0 |
                    |           EvtChar :      0 |
                    +============================+
    
    HiZ>#
    RESET
    
    Bus Pirate v3b
    Firmware v5.10 (r559)  Bootloader v4.4
    DEVID:0x0447 REVID:0x3046 (24FJ64GA002 B8)
    http://dangerousprototypes.com
    HiZ>b
    Set serial port speed: (bps)
     1. 300
     2. 1200
     3. 2400
     4. 4800
     5. 9600
     6. 19200
     7. 38400
     8. 57600
     9. 115200
    10. BRG raw value
    
    (9)>9
    Adjust your terminal
    Space to continue
    HiZ>m
    1. HiZ
    2. 1-WIRE
    3. UART
    4. I2C
    5. SPI
    6. 2WIRE
    7. 3WIRE
    8. LCD
    9. DIO
    x. exit(without change)
    
    (1)>4
    Set speed:
     1. ~5KHz
     2. ~50KHz
     3. ~100KHz
     4. ~400KHz
    
    (1)>3
    Ready
    I2C>W
    Power supplies ON
    I2C>P
    Pull-up resistors ON
    I2C>v
    Pinstates:
    1.(BR)  2.(RD)  3.(OR)  4.(YW)  5.(GN)  6.(BL)  7.(PU)  8.(GR)  9.(WT)  0.(Blk)
    GND     3.3V    5.0V    ADC     VPU     AUX     SCL     SDA     -       -
    P       P       P       I       I       I       I       I       I       I
    GND     3.29V   5.04V   0.00V   5.04V   L       H       H       H       H
    I2C>(0)
     0.Macro menu
     1.7bit address search
     2.I2C sniffer
    I2C>(1)
    Searching I2C address space. Found devices at:
    0xEE(0x77 W) 0xEF(0x77 R)
    
    I2C>[0xEE 0xD0 [0xEF r:1]
    I2C START BIT
    WRITE: 0xEE ACK
    WRITE: 0xD0 ACK
    I2C START BIT
    WRITE: 0xEF ACK
    READ: 0x58
    NACK
    I2C STOP BIT
    I2C>[0xEE 0xE0 0xB6 [0xEF r:1]
    I2C START BIT
    WRITE: 0xEE ACK
    WRITE: 0xE0 ACK
    WRITE: 0xB6 ACK
    I2C START BIT
    WRITE: 0xEF ACK
    READ: 0x00
    NACK
    I2C STOP BIT
    I2C>[0xEE 0x88 [0xEF r:26]
    I2C START BIT
    WRITE: 0xEE ACK
    WRITE: 0x88 ACK
    I2C START BIT
    WRITE: 0xEF ACK
    READ: 0x1D  ACK 0x6F  ACK 0x00  ACK 0x66  ACK 0x32  ACK 0x00  ACK 0xCC  ACK 0x8D  ACK 0x13  ACK 0xD6  ACK 0xD0  ACK 0x0B  ACK 0xF2  ACK 0x22  ACK 0x5B  ACK 0xFF  ACK 0xF9  ACK 0xFF  ACK 0x8C  ACK 0x3C  ACK 0xF8  ACK 0xC6  ACK 0x70  ACK 0x17  ACK 0x00  ACK 0x45
    NACK
    I2C STOP BIT
    I2C>[0xEE 0xF4 0x27]
    I2C START BIT
    WRITE: 0xEE ACK
    WRITE: 0xF4 ACK
    WRITE: 0x27 ACK
    I2C STOP BIT
    I2C>[0xEE 0xF5 0xA0]
    I2C START BIT
    WRITE: 0xEE ACK
    WRITE: 0xF5 ACK
    WRITE: 0xA0 ACK
    I2C STOP BIT
    I2C>[0xEE 0xF7 [0xEF r:8]
    I2C START BIT
    WRITE: 0xEE ACK
    WRITE: 0xF7 ACK
    I2C START BIT
    WRITE: 0xEF ACK
    READ: 0x4E  ACK 0xB7  ACK 0x00  ACK 0x83  ACK 0x25  ACK 0x00  ACK 0x93  ACK 0x70
    NACK
    I2C STOP BIT
    I2C>
            +------------------------+
            |     25.54  Celsius     |
            |     77.98  Fahrenheit  |
            |  100408.68 Pascal      |
            |      76.57 Metres      |
            +------------------------+
    I2C>[0xEE 0xF4 0x00]
    I2C START BIT
    WRITE: 0xEE ACK
    WRITE: 0xF4 ACK
    WRITE: 0x00 ACK
    I2C STOP BIT
    I2C>#
    RESET
    
    Bus Pirate v3b
    Firmware v5.10 (r559)  Bootloader v4.4
    DEVID:0x0447 REVID:0x3046 (24FJ64GA002 B8)
    http://dangerousprototypes.com
    HiZ>
    
    Appuyez sur une touche pour continuer...
    Quelques explications :

    a) le tableau au début de l'exécution donne le paramétrage de la liaison UART que j'utilise pour piloter le bus pirate depuis mon ordinateur Windows.
    La première partie est consacré au paramétrage que je me suis imposé. Comme on peut le voir, la liaison fonctionne en 115 200 baud.
    La seconde partie concerne le paramétrage par défaut.

    b) je reconfigure le baudrate de mon bus pirate à 115 200 baud.

    c) je rentre dans le menu et je sélectionne "4. I2C", la fonction que je vais utiliser.

    d) je sélectionne "3. ~100 KHz".

    e) j'active l'alimentation du bus pirate et je mets en fonction la résistance pull-up. J'affiche le voltage du bus pirate.

    f) j'affiche le sous-menu de l'I2C.

    g) je sélectionne "1.7bit address search".
    Ceci me permet de récupérer les adresses d'écritures ("0xEE") et de lectures ("0xEF") du périphérique I2C (le BMP280).
    Comm j'obtiens ces adresses, je peux considérer que le montage est correcte.

    h) j'envoie la séquence "[0xEE 0xD0 [0xEF r:1]".
    Il s'agit de l'identification de la puce, et comme nous le constatons, retourne "READ: 0x58".

    i) j'envoie la séquence "[0xEE 0xE0 0xB6 [0xEF r:1]".
    Il s'agit d'un RESET. Il me retourne "READ: 0x00", ce qui est conforme à la fiche technique.

    j) j'envoie la séquence "[0xEE 0x88 [0xEF r:26]".
    Il s'agit de l'étalonnage du capteur "BMP280".
    (voir fiche technique "3.11.2 Trimming parameter readout", en particulier le taleau 17).
    Les trois premiers octets concernent la température et les neuf suivants concernent la pression.

    k) j'envoie la séquence "[0xEE 0xF4 0x27]".
    Paramétrage du registre du contrôle de la mesure.
    La valeur 0x27 va se traduire par :
    --> bit 0, 1 : contrôle le mode d'alimentation du périphérique.
    --> bit 2, 3, 4 : contrôle l'échantillonnage des données de pression.
    --> bit 5, 6, 7 : contrôle l'échantillonnage des données de la température.
    (voir la fiche technique pour plus d'information).

    l) j'envoie la séquence "[0xEE 0xF5 0xA0]".
    Paramétrage du registre de configuration.
    Je suis dans le mode normal, avec une attente de 1000mS.

    m) j'envoie la séquence "[0xEE 0xF7 [0xEF r:8]".
    Je récupère la conversion analogie/numérique de la mesure de la température et de la pression.
    Je fais le calcul de cette mesure en fonction de l'étalonnage et de cette conversion.
    J'affiche la température en Celsius et sa conversion en Fahrenheit.
    J'affiche la pression atmosphérique, et je calcul l'altitude en mètre à partir de la pression.
    Je constate que cette altitude est fausse car je me trouve d'après les cartes Michelin à environ 110m.

    n) j'envoie la séquence "[0xEE 0xF4 0x00]"
    Je clôture le traitement.

    o) je sors proprement du bus pirate, en faisant un RESET.

    La mesure de la température et de la pression me semble correcte.
    Je me suis servi de l'exemple de la fiche technique pour vérifier les résultats.
    Sauf en ce qui concerne l'altitude, puisque ce n'est pas unee mesure, mais un calcul.
    Je me suis inspiré de ce wikipedia :
    --> https://fr.wikipedia.org/wiki/Variat...c_l%27altitude
    en particulier, la formule internationale du nivellement barométrique.

    Comme j'ai besoin d'avoir la pression atmosphérique au niveau de la mer et que je ne la connais pas, j'ai pris la référence standard qui est de 101325.0 pascal.
    Cela me donne une valeur approximative mais fausse comme on peut le voir.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  9. #69
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Je vous communique le programme :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    /**************************************************/
    /*                                                */
    /*        Prise de Controle du Bus Pirate         */
    /*                                                */
    /*------------------------------------------------*/
    /*                                                */
    /*  Capteur de température et de pression BMP280  */
    /*                                                */
    /**************************************************/
     
     
    #include <conio.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <libcom.h>
     
    /*==============================*/
    /*                              */
    /*     Procédure Principale     */
    /*                              */
    /*==============================*/
     
    int main(void)
    {
    	if (!COM_Open(100))
    		exit(-1);
     
    	COM_Send("\n");
    	COM_Send("#\n");								/* Reset */
     
    	COM_Send("b\n");
    	COM_Send("9\n");								/* Baudrate */
    	COM_Send(" ");
     
    	COM_Send("m\n");
    	COM_Send("4\n");								/* Menu I2C */
    	COM_Send("3\n");
     
    	COM_Send("W\n");								/* Power supplies ON */
    	COM_Send("P\n");								/* Pull-up resistors ON */
    	COM_Send("v\n");								/* Show volts/states */
     
    	/*---------------------------------------------*/
    	/*     Recherche adresse du capteur BMP280     */
    	/*---------------------------------------------*/
     
    	COM_Send("(0)\n");								/* Sous-Menu I2C */
    	COM_Send("(1)\n");								/* 7bit address search */
     
    	/*------------------------*/
    	/*     Initialisation     */
    	/*------------------------*/
     
    	COM_Send("[0xEE 0xD0 [0xEF r:1]\n");			/* Identification */
    	COM_Send("[0xEE 0xE0 0xB6 [0xEF r:1]\n");		/* Reset */
     
    	/*-----------------------------------------------*/
    	/*     Lecture Température du capteur BMP280     */
    	/*-----------------------------------------------*/
     
    	I2C_BMP280_Calib("[0xEE 0x88 [0xEF r:26]\n");	/* Etalonnage */
    	COM_Send("[0xEE 0xF4 0xA7]\n");					/* Control measure */
    	COM_Send("[0xEE 0xF5 0xA0]\n");					/* Config */
    	I2C_BMP280_Data("[0xEE 0xF7 [0xEF r:8]\n");		/* Registres température et pression */
     
    	/*----------------*/
    	/*     Finish     */
    	/*----------------*/
     
    	COM_Send("[0xEE 0xF4 0x00]\n");					/* Control measure */
     
    	/*----------------------------*/
    	/*     Fin de l'affichage     */
    	/*----------------------------*/
     
    	COM_Delay(1000);
    	getch();  /* Pour marquer une pause durant l'affichage */
     
    	COM_Send("#\n");				/* Reset */
    	COM_Close();
    	exit(0);
    }
    ainsi que la bibliothèque que j'utilise :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    739
    740
    741
    742
    743
    744
    745
    746
    747
    748
    749
    750
    751
    752
    753
    754
    755
    756
    757
    758
    #include <windows.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    #include <math.h>
     
    #include "libcom.h"
     
    /********************************************/
    /*                                          */
    /*     Délais d'attente sur le port COM     */
    /*                                          */
    /********************************************/
     
    COMMTIMEOUTS _ctoParams =
    {							/*=============================*/
    	50,						/* ReadIntervalTimeout         */
    	10,						/* ReadTotalTimeoutMultiplier  */
    	50,						/* ReadTotalTimeoutConstant    */
    	0,						/* WriteTotalTimeoutMultiplier */
    	0						/* WriteTotalTimeoutConstant   */
    };							/*=============================*/
     
     
    /*************************************/
    /*                                   */
    /*     Déclaration des Variables     */
    /*                                   */
    /*************************************/
     
    DCB			_dcbParams;
     
    HANDLE		_hComm=NULL;
    DWORD		_eventMask,_noBytesRead,_noBytesWritten;
    BOOL		_flag;
    int			_timer;
    char		_carac;
    char		_chaine[4096];
    char		_tampon[256];
     
    /*========================*/
    /*     Capteur BMP280     */
    /*========================*/
     
    double	_t1, _t2, _t3, _p1, _p2, _p3, _p4, _p5, _p6, _p7, _p8, _p9, _adc_pres, _adc_temp;
     
     
    /************************************************************/
    /*                                                          */
    /*     Fonctions de communications en mode série (UART)     */
    /*                                                          */
    /************************************************************/
     
    /*===========================*/
    /*     Fermeture du Port     */
    /*===========================*/
     
    void COM_Close(void)
    {
    	/*------------------------------*/
    	/*     On purge les tampons     */
    	/*------------------------------*/
     
    	EscapeCommFunction(_hComm, CLRDTR);
    	PurgeComm(_hComm, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
     
    	/*-------------------*/
    	/*     Fermeture     */
    	/*-------------------*/
     
    	CloseHandle(_hComm);
    	_hComm = NULL;
    }
     
     
    /*===========================*/
    /*     Ouverture du Port     */
    /*===========================*/
     
    int COM_Open(int _val)
    {
    	_hComm = CreateFile("\\\\.\\COM5",
    						GENERIC_READ|GENERIC_WRITE,
    						0,
    						NULL,
    						OPEN_EXISTING,
    						FILE_ATTRIBUTE_SYSTEM,
    						NULL);
     
    /* FILE_FLAG_OVERLAPPED */
     
    	if (_hComm == INVALID_HANDLE_VALUE)
    	{
    		printf("Erreur lors de l'ouverture du port COM5 : ");
     
    		if (GetLastError() == 5)
    				printf("Accès refusé !\n");
    		else	printf("Autre\n");
     
    		return FALSE;
    	}
     
    	/*--------------------------------------------------------------------*/
    	/*     Configuration des Tailles des tampons d'émission/Réception     */
    	/*--------------------------------------------------------------------*/
     
    	SetupComm(_hComm, 4096, 4096);
     
    	/*-----------------------------------------*/
    	/*     Configuration du "COMMTIMEOUTS"     */
    	/*-----------------------------------------*/
     
    	_timer = _val;
     
    	_ctoParams.ReadTotalTimeoutConstant =  _timer;
    	_ctoParams.ReadIntervalTimeout      =  _timer;
     
    	if (!SetCommTimeouts(_hComm, &_ctoParams))
    	{
    		printf("Erreur dans la configuration du 'COMMTIMEOUTS' %d\n", GetLastError());
    		COM_Close();
    		return FALSE;
    	}
     
    	/*--------------------------------------*/
    	/*     Lecture du Paramétrage "DCB"     */
    	/*--------------------------------------*/
     
    	FillMemory(&_dcbParams, sizeof(DCB), 0);
    	_dcbParams.DCBlength  = sizeof(DCB);
     
    	if (!GetCommState(_hComm, &_dcbParams))
    	{
    		printf("Erreur Lecture Paramétrage 'DCB' : %d\n", GetLastError());
    		COM_Close();
    		return FALSE;
    	}
     
    	/*--------------------------------*/
    	/*     Configuration du "DCB"     */
    	/*--------------------------------*/
     
    	_dcbParams.BaudRate    = CBR_115200;
     
    	_dcbParams.ByteSize    = 8;
    	_dcbParams.StopBits    = ONESTOPBIT;
    	_dcbParams.Parity      = NOPARITY;
     
    	_dcbParams.fDtrControl = DTR_CONTROL_ENABLE;
    	_dcbParams.fRtsControl = RTS_CONTROL_ENABLE;
     
    	/*---------------------------------------*/
    	/*     Ecriture du Paramétrage "DCB"     */
    	/*---------------------------------------*/
     
    	if (!SetCommState(_hComm, &_dcbParams))
    	{
    		printf("Erreur dans L'écriture Paramétrage 'DCB' : %d\n", GetLastError());
    		COM_Close();
    		return FALSE;
    	}
     
    	/*----------------------------------*/
    	/*     Affichage du paramétrage     */
    	/*----------------------------------*/
     
    	printf("\t\t+============================+\n");
    	printf("\t\t|     Serial Transmission    |\n");
    	printf("\t\t|         (Win32 APi)        |\n");
    	printf("\t\t+----------------------------+\n");
    	printf("\t\t|              Port :   COM5 |\n");
    	printf("\t\t|          BaudRate : %6d |\n", _dcbParams.BaudRate);
    	printf("\t\t|          ByteSize : %6d |\n", _dcbParams.ByteSize);
    	printf("\t\t|           StopBit : %6d |\n", _dcbParams.StopBits);
    	printf("\t\t|            Parity : %6d |\n", _dcbParams.Parity);
    	printf("\t\t|       fDtrControl : %6d |\n", _dcbParams.fDtrControl);
    	printf("\t\t|       fRtsControl : %6d |\n", _dcbParams.fRtsControl);
    	printf("\t\t+----------------------------+\n");
    	printf("\t\t|         DCBlength : %6d |\n", _dcbParams.DCBlength);
    	printf("\t\t|           fBinary : %6d |\n", _dcbParams.fBinary);
    	printf("\t\t|           fParity : %6d |\n", _dcbParams.fParity);
    	printf("\t\t|      fOutxCtsFlow : %6d |\n", _dcbParams.fOutxCtsFlow);
    	printf("\t\t|      fOutxDsrFlow : %6d |\n", _dcbParams.fOutxDsrFlow);
    	printf("\t\t|   fDsrSensitivity : %6d |\n", _dcbParams.fDsrSensitivity);
    	printf("\t\t| fTXContinueOnXoff : %6d |\n", _dcbParams.fTXContinueOnXoff);
    	printf("\t\t|             fOutX : %6d |\n", _dcbParams.fOutX);
    	printf("\t\t|              fInX : %6d |\n", _dcbParams.fInX);
    	printf("\t\t|        fErrorChar : %6d |\n", _dcbParams.fErrorChar);
    	printf("\t\t|             fNull : %6d |\n", _dcbParams.fNull);
    	printf("\t\t|     fAbortOnError : %6d |\n", _dcbParams.fAbortOnError);
    	printf("\t\t|           fDummy2 : %6d |\n", _dcbParams.fDummy2);
    	printf("\t\t|         wReserved : %6d |\n", _dcbParams.wReserved);
    	printf("\t\t|            XonLim : %6d |\n", _dcbParams.XonLim);
    	printf("\t\t|           XoffLim : %6d |\n", _dcbParams.XoffLim);
    	printf("\t\t|           XonChar : %6d |\n", _dcbParams.XonChar);
    	printf("\t\t|          XoffChar : %6d |\n", _dcbParams.XoffChar);
    	printf("\t\t|         ErrorChar : %6d |\n", _dcbParams.ErrorChar);
    	printf("\t\t|           EofChar : %6d |\n", _dcbParams.EofChar);
    	printf("\t\t|           EvtChar : %6d |\n", _dcbParams.EvtChar);
    	printf("\t\t+============================+\n");
     
    	/*------------------------------*/
    	/*     On purge les tampons     */
    	/*------------------------------*/
     
    	PurgeComm(_hComm, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
    	EscapeCommFunction(_hComm, SETDTR);
     
    	/*----------------------------------------------*/
    	/*     Configuration du masque de réception     */
    	/*----------------------------------------------*/
     
    	if (SetCommMask(_hComm, EV_RXCHAR) == FALSE)
    	{
    		printf("Erreur configuration du masque de réception : %d\n", GetLastError());
    		COM_Close();
    		return FALSE;
    	}
     
    	/*------------------------*/
    	/*     Initialisation     */
    	/*------------------------*/
     
    	_flag = TRUE;
    	return TRUE;
    }
     
     
    /*========================================*/
    /*     Envoie commande avec réception     */
    /*========================================*/
     
    void COM_Send(char *_buffer)
    {
    	int		_index;
     
    	/*------------------------------*/
    	/*     Envoi de la commande     */
    	/*------------------------------*/
     
    	WriteFile(_hComm, _buffer, strlen(_buffer), &_noBytesWritten, NULL);
     
    	/*-----------------------------------------*/
    	/*     Mise en attente de la réception     */
    	/*-----------------------------------------*/
     
    	if (!WaitCommEvent(_hComm, &_eventMask, NULL))
    	{
    		printf("Erreur dans la configuration de la mise en attente de la réception : %d\n", GetLastError());
    		COM_Close();
    		exit(-1);
    	}
     
    	/*--------------------------------*/
    	/*     Réception et Affichage     */
    	/*--------------------------------*/
     
    	_index = 0;
    	_carac = ' ';
     
    	do
    	{
    		ReadFile(_hComm, &_carac, sizeof(_carac), &_noBytesRead, NULL);
     
    		if (_noBytesRead> 0)
    		{
    			if (_flag == TRUE)	printf("%c", _carac);
    			_chaine[_index++] = (char)_carac;
    		}
     
    	} while (_noBytesRead> 0);
     
    	_chaine[_index] = '\0';
    }
     
     
    /*==========================*/
    /*     Affichage On/Off     */
    /*==========================*/
     
    void COM_Display(char *_state)
    {
    	if (strcmp(_state,"on") == 0)
    	{
    		_ctoParams.ReadTotalTimeoutConstant =  _timer;
    		_ctoParams.ReadIntervalTimeout      =  _timer;
     
    		_flag = TRUE;
    	}
    	else
    	{
    		if (strcmp(_state,"off") == 0)
    		{
    			_ctoParams.ReadTotalTimeoutConstant =  50;
    			_ctoParams.ReadIntervalTimeout      =  50;
     
    		_flag = FALSE;
    		}
    		else
    		{
    			printf("Erreur Paramètre Fonction COM_Display(\" %s \")\n", _state);
    			exit(-1);
    		}
    	}
     
    	/*-----------------------------------------*/
    	/*     Modification du délai d'attente     */
    	/*-----------------------------------------*/
     
    	if (!SetCommTimeouts(_hComm, &_ctoParams))
    	{
    		printf("Erreur dans la configuration du 'COMMTIMEOUTS' : %d\n", GetLastError());
    		COM_Close();
    		exit(-1);
    	}
     
    	PurgeComm(_hComm, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
    	EscapeCommFunction(_hComm, SETDTR);
    }
     
     
    /*===============*/
    /*     Delay     */
    /*===============*/
     
    void COM_Delay(int _elapse)
    {
    	Sleep(_elapse);
    }
     
     
    /*********************************************************************/
    /*                                                                   */
    /*     Mode I2C : Afficheur LCD HD44780 (Liquid Crystal Display)     */
    /*                                                                   */
    /*********************************************************************/
     
    /*=============================*/
    /*     Liste des Commandes     */
    /*=============================*/
     
    #define LCD_RESET					0x00
    #define LCD_CLEAR_DISPLAY			0x01
    #define LCD_RETURN_HOME				0x02
    #define LCD_ENTRY_MODE_SET			0x04
    #define LCD_DISPLAY_CONTROL			0x08
    #define LCD_CURSOR_OR_DISPLAY_SHIFT	0x10
    #define LCD_FUNCTION_SET			0x20
    #define LCD_SET_CG_RAM_ADDR			0x40
    #define LCD_SET_DD_RAM_ADDR			0x80
     
     
    /*----------------------------*/
    /* Flags for "entry mode set" */
    /*----------------------------*/
     
    #define LCD_ENTRY_INCREMENT			0x02
    #define LCD_ENTRY_DECREMENT			0x00
     
    #define LCD_ENTRY_SHIFT				0x01
    #define LCD_ENTRY_NO_SHIFT			0x00
     
     
    /*------------------------------------*/
    /* Flags for "display on/off control" */
    /*------------------------------------*/
     
    #define LCD_DISPLAY_ON				0x04
    #define LCD_DISPLAY_OFF				0x00
     
    #define LCD_CURSOR_ON				0x02
    #define LCD_CURSOR_OFF				0x00
     
    #define LCD_BLINK_ON				0x01
    #define LCD_BLINK_OFF				0x00
     
     
    /*------------------------------------*/
    /* Flags for "cursor or display shift */
    /*------------------------------------*/
     
    #define LCD_DISPLAY_SHIFT			0x08
    #define LCD_CURSOR_MOVE				0x00
     
    #define LCD_SHIFT_TO_RIGHT			0x04
    #define LCD_SHIFT_TO_LEFT			0x00
     
     
    /*--------------------------*/
    /* Flags for "function set" */
    /*--------------------------*/
     
    #define LCD_EIGHT_BITS				0x10
    #define LCD_FOUR_BITS				0x00
     
    #define LCD_2LINES					0x08
    #define LCD_1LINE					0x00
     
    #define LCD_5x10DOTS				0x04
    #define LCD_5x8DOTS					0x00
     
     
    /*----------------------*/
    /*     Others Flags     */
    /*----------------------*/
     
    #define LCD_BL				0x08		/* Backlight       bit */
    #define LCD_E				0x04		/* Enable          bit */
    #define LCD_RW				0x02		/* Read/Write      bit */
    #define LCD_RS				0x01		/* Register Select bit */
     
     
    /*================================*/
    /*     Transfert des données      */
    /*================================*/
     
    void LCD_Send(unsigned char _data1, unsigned char _data2, unsigned char _mode)
    {
     
    	sprintf(_tampon,"[0x4E 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X]\n",
    		(_data1|_mode|LCD_BL),((_data1|LCD_E)|_mode|LCD_BL),(((_data1&~LCD_E)|_mode|LCD_BL)),
    		(_data2|_mode|LCD_BL),((_data2|LCD_E)|_mode|LCD_BL),(((_data2&~LCD_E)|_mode|LCD_BL)));
     
    	COM_Send(_tampon);
    	Sleep(1);
    }
     
     
    /*=================================*/
    /*     Ecriture d'une commande     */
    /*=================================*/
     
    void LCD_Command(unsigned char _data)
    {
    	LCD_Send((_data & 0xF0),((_data << 4) & 0xF0), 0x00);
    }
     
     
    /*=================================*/
    /*     Ecriture d'un caractère     */
    /*=================================*/
     
    void LCD_Char(unsigned char _data)
    {
    	LCD_Send((_data & 0xF0),((_data << 4) & 0xF0), LCD_RS);
    }
     
     
    /*=========================*/
    /*      Initialisation     */
    /*=========================*/
     
    void LCD_Init(void)
    {
    	LCD_Command(LCD_FUNCTION_SET    | LCD_EIGHT_BITS      | LCD_2LINES           | LCD_5x8DOTS);
    	LCD_Command(LCD_FUNCTION_SET    | LCD_EIGHT_BITS      | LCD_2LINES           | LCD_5x8DOTS);
    	LCD_Command(LCD_FUNCTION_SET    | LCD_EIGHT_BITS      | LCD_2LINES           | LCD_5x8DOTS);
     
    	LCD_Command(0x02);		/* Four Bits Mode */
     
    	LCD_Command(LCD_FUNCTION_SET    | LCD_FOUR_BITS       | LCD_2LINES           | LCD_5x8DOTS);
    	LCD_Command(LCD_DISPLAY_CONTROL | LCD_DISPLAY_ON      | LCD_CURSOR_OFF       | LCD_BLINK_OFF);
    	LCD_Command(LCD_CLEAR_DISPLAY);
    	LCD_Command(LCD_ENTRY_MODE_SET  | LCD_ENTRY_INCREMENT | LCD_ENTRY_NO_SHIFT);
    	LCD_Command(LCD_RETURN_HOME);
    }
     
     
    /*===============================*/
    /*      Nettoyage de l'écran     */
    /*===============================*/
     
    void LCD_Clear(void)
    {
    	LCD_Command(LCD_CLEAR_DISPLAY);
    	LCD_Command(LCD_RETURN_HOME);
    }
     
     
    /*===================================*/
    /*     Positionnement du curseur     */
    /*===================================*/
     
    void LCD_Setcursor(int _row, int _col)
    {
    	unsigned int pos[04] = {0x00,0x40,0x14,0x54};
     
    	if (_row<=1)	_row=1;
    	if (_row>=4)	_row=4;
    	if (_col>=19)	_col=19;
     
    	LCD_Command(LCD_SET_DD_RAM_ADDR | (pos[_row-1] + _col));
    }
     
     
    /*==============================================*/
    /*     Affichage d'une chaîne de caractères     */
    /*==============================================*/
     
    void LCD_String(char *_array, int _qte)
    {
    	while (_qte-- > 0)
    		LCD_Char(*_array++);
    }
     
     
    /*==========================================*/
    /*     Allumage de l'afficheur (on/off)     */
    /*==========================================*/
     
    void LCD_Display(char *_state)
    {
    	if (strcmp(_state,"on") == 0)
    			LCD_Command(LCD_DISPLAY_CONTROL | LCD_DISPLAY_ON  | LCD_CURSOR_OFF | LCD_BLINK_OFF);
    	else	LCD_Command(LCD_DISPLAY_CONTROL | LCD_DISPLAY_OFF | LCD_CURSOR_OFF | LCD_BLINK_OFF);
    }
     
    /**************************************************************/
    /*                                                            */
    /*     Mode Raw One Wire : Capteur de température DS18B20     */
    /*                                                            */
    /**************************************************************/
     
    /*================================================*/
    /*     Lecture de la température et affichage     */
    /*================================================*/
     
    void R1W_DS18B20(char *_buffer)
    {
    	char	_lsb[5], _msb[5], _hex[5];
    	int		_calc;
     
    	/*-------------------------------------------*/
    	/*     Envoi et réception de la commande     */
    	/*-------------------------------------------*/
     
    	COM_Send(_buffer);
     
    	/*-------------------------------------*/
    	/*     Formatage de la température     */
    	/*-------------------------------------*/
     
    	if (strstr(_chaine,"No device") == NULL)
    	{
    		sscanf(strstr(_chaine,"READ:")+5, "%s %s", _lsb, _msb);
    		sprintf(_hex,"%s%s", _msb+2, _lsb+2);
    		sscanf(_hex, "%X", &_calc);
    		if (_calc >61439)	_calc = _calc - 65536;
     
    		printf("\n\t+------------------------+\n");
    		printf("\t| Température : %+8.4f |\n", (((double)_calc))/16.0);
    		printf("\t+------------------------+\n");
    	}
    	else
    	{
    		printf("\n\t+---------------------+\n");
    		printf("\t| Pas de périphérique |\n");
    		printf("\t+---------------------+\n");
    	}
     
    	printf("1-WIRE>");
    }
     
     
    /*********************************************************************************/
    /*                                                                               */
    /*     mode I2C : Capteur de température et de pression atmosphérique BMP280     */
    /*                                                                               */
    /*********************************************************************************/
     
    /*====================================*/
    /*     Conversion de l'étalonnage     */
    /*====================================*/
     
    double hex1(char *_chaine, int pos, int _signed)
    {
    	char	_1b[5], _2b[5], _3b[5], _hex[5];
    	int		_calc;
     
    	sscanf(strstr(_chaine,"READ:")+pos, "%s %s %s", _1b, _2b, _3b);
    	sprintf(_hex,"%s%s", _3b+2, _1b+2);
    	sscanf(_hex, "%X", &_calc);
     
    	if ((_signed) &&(_calc >32767))	_calc = _calc - 65536;
     
    	return ((double)_calc);
    }
     
     
    /*=========================================*/
    /*     Conversion analogique/numérique     */
    /*=========================================*/
     
    double hex2(char *_chaine, int pos)
    {
    	char	_1b[5], _2b[5], _3b[5], _4b[5], _5b[5], _hex[7];
    	int		_calc;
     
    	sscanf(strstr(_chaine,"READ:")+pos, "%s %s %s %s %s", _1b, _2b, _3b, _4b, _5b);
    	sprintf(_hex,"%s%s%s", _1b+2, _3b+2, _5b+2);
    	sscanf(_hex, "%X", &_calc);
     
    	_calc /= 16;
     
    	return ((double)_calc);
    }
     
     
    /*=================================*/
    /*     Lecture de l'étalonnage     */
    /*=================================*/
     
    void I2C_BMP280_Calib(char *_buffer)
    {
    	/*-------------------------------------------*/
    	/*     Envoi et réception de la commande     */
    	/*-------------------------------------------*/
     
    	COM_Send(_buffer);
     
    	/*--------------------------------------*/
    	/*     Extraction de la température     */
    	/*--------------------------------------*/
     
    	_t1 = hex1(_chaine,   5, 0);
    	_t2 = hex1(_chaine,  25, 1);
    	_t3 = hex1(_chaine,  45, 1);
     
    	/*-----------------------------------*/
    	/*     Extraction de la pression     */
    	/*-----------------------------------*/
     
    	_p1 = hex1(_chaine,  65, 0);
    	_p2 = hex1(_chaine,  85, 1);
    	_p3 = hex1(_chaine, 105, 1);
    	_p4 = hex1(_chaine, 125, 1);
    	_p5 = hex1(_chaine, 145, 1);
    	_p6 = hex1(_chaine, 165, 1);
    	_p7 = hex1(_chaine, 185, 1);
    	_p8 = hex1(_chaine, 205, 1);
    	_p9 = hex1(_chaine, 225, 1);
     
    }
     
     
    /*=====================================================*/
    /*     Lecture de la pression et de la température     */
    /*=====================================================*/
     
    void I2C_BMP280_Data(char *_buffer)
    {
    	double	_calc1, _calc2, _fine, _celsius, _fahrenheit, _pressure, _altitude, _seaLevel;
     
    	/*-------------------------------------------*/
    	/*     Envoi et réception de la commande     */
    	/*-------------------------------------------*/
     
    	COM_Send(_buffer);
     
    	/*----------------------------------------------------------------------------------------*/
    	/*     Convertion analogique/numérique de la pression atmosphérique et de température     */
    	/*----------------------------------------------------------------------------------------*/
     
    	_adc_pres = hex2(_chaine,  5);
    	_adc_temp = hex2(_chaine, 35);
     
    	/*--------------------------------------*/
    	/*     Vérification par Jeu d'essai     */
    	/*--------------------------------------*/
    	/* -Température :      25.08°C          */
    	/* -Pression    : 100 653.27 Pa         */
    	/*--------------------------------------*/
     
    /*
    	_t1       =  +27504.0;
    	_t2       =  +26435.0;
    	_t3       =   -1000.0;
     
    	_p1       =  +36477.0;
    	_p2       =  -10685.0;
    	_p3       =   +3024.0;
    	_p4       =   +2855.0;
    	_p5       =    +140.0;
    	_p6       =      -7.0;
    	_p7       =  +15500.0;
    	_p8       =  -14600.0;
    	_p9       =  + 6000.0;
     
    	_adc_temp = +519888.0;
    	_adc_pres = +415148.0;
    */
     
    	/*----------------------------------*/
    	/*     Calcul de la température     */
    	/*----------------------------------*/
     
    	_calc1      = ((_adc_temp /  16384.0) - (_t1 / 1024.0)) *   _t2;
    	_calc2      = ((_adc_temp / 131072.0) - (_t1 / 8192.0)) * ((_adc_temp / 131072.0) - (_t1 / 8192.0)) * _t3;
    	_fine       = (int)(_calc1 + _calc2);
    	_celsius    =      (_calc1 + _calc2) / 5120.0;
    	_fahrenheit =  _celsius * 1.8 + 32;
     
    	/*-------------------------------*/
    	/*     Calcul de la pression     */
    	/*-------------------------------*/
     
    	_calc1 = (_fine / 2.0) - 64000.0;
    	_calc2 =  (_calc1 *  _calc1 *  _p6) / 32768.0;
    	_calc2 =   _calc2 + (_calc1 *  _p5  *     2.0);
    	_calc2 =  (_calc2 /  4.0)   + (_p4  * 65536.0);
    	_calc1 = (((_p3 * _calc1 * _calc1) / 524288.0) + _p2 * _calc1) / 524288.0;
    	_calc1 = (1.0 + (_calc1 / 32768.0)) * _p1;
     
    	if (_calc1 == 0)
    	{
    		_pressure = 0;
    		_altitude = 0;
    	}
    	else
    	{
    		_pressure = 1048576.0 - _adc_pres;
    		_pressure = ((_pressure - (_calc2 / 4096.0)) * 6250.0) / _calc1;
    		_calc1    = (_p9 * _pressure * _pressure) / 2147483648.0;
    		_calc2    = (_pressure * _p8) / 32768.0;
    		_pressure =  _pressure + ((_calc1 + _calc2 + _p7) / 16.0);
     
    		if ((_pressure >=  30000.0) && (_pressure <= 110000.0))
    		{
     
    			/*------------------------------------*/
    			/*        Calcul de l'altitude        */
    			/*------------------------------------*/
    			/* Niveau de la mer : 101325.0 Pascal */
    			/*------------------------------------*/
     
    			_seaLevel = 101325.0;
    			_altitude =  44330.0 * (1 - pow((_pressure / _seaLevel), (1.0 / 5.255)));
    		}
    		else
    		{
    			_pressure = 0;
    			_altitude = 0;
    		}
    	}
     
    	/*-------------------------------------------------------------------*/
    	/*     Affichage altitude, pression atmosphérique et température     */
    	/*-------------------------------------------------------------------*/
     
    	printf("\n\t+------------------------+\n");
    	printf("\t|     %-6.2f Celsius     |\n", _celsius);
    	printf("\t|     %-6.2f Fahrenheit  |\n", _fahrenheit);
    	printf("\t|  %9.2f Pascal      |\n", _pressure);
    	printf("\t|  %9.2f Metres      |\n", _altitude);
    	printf("\t+------------------------+\n");
     
    	printf("I2C>");
    }

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  10. #70
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    J'ai voulu testé le KY053 de Joy-it :
    --> https://www.gotronic.fr/art-converti...y053-27692.htm

    et je l'ai cassé. Encore une connerie de ma part.
    D'ailleurs ce n'est pas la première fois, après les leds, et le sbc-pow-bb.
    Je n'ai plus qu'à me procurer un nouveau convertisseur !

    J'ai utilisé un potentiomètre de 10k ohms et j'ai oublié de mettre une résistance afin de protéger l'entrée analogique.
    L'intensité sur les entrées analogiques ne doit pas dépasser les 10mA !
    Du coup, la valeur lue passe du minimum au maximum sans passer par des valeurs intermédiaires.

    Je suis quand même arrivé à faire fonctionner ce convertisseur.
    Je n'ai traité que la conversion analogique / digital sur A0, puisque je n'ai besoin que de cela.
    Je vous communique mon programme de test :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    /*******************************************/
    /*                                         */
    /*     Prise de Controle du Bus Pirate     */
    /*                                         */
    /*-----------------------------------------*/
    /*                                         */
    /*              ADC / ADS1115              */
    /*                                         */
    /*******************************************/
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <libcom.h>
     
    int		_addr;
     
    /*==============================*/
    /*                              */
    /*     Procédure Principale     */
    /*                              */
    /*==============================*/
     
    int main(void)
    {
    	if (!COM_Open(50))
    		exit(-1);
     
    	COM_Send("\n");
    	COM_Send("#\n");				/* Reset */
     
    	COM_Send("b\n");				/* Baudrate */
    	COM_Send("9\n");
    	COM_Send(" ");
     
    	COM_Send("m\n");
    	COM_Send("4\n");				/* Menu I2C */
    	COM_Send("3\n");
     
    	COM_Send("W\n");				/* Power supplies ON   */
    	COM_Send("P\n");				/* Pull-up resistors ON */
    	COM_Send("v\n");				/* Show volts/states */
     
    	COM_Send("(0)\n");				/* Sous-menu */
     
    	/*---------------------------------------*/
    	/*     Lecture analogique ./ digital     */
    	/*---------------------------------------*/
     
    	_addr = ADS1115_Addr("(1)\n");
     
    	ADS1115_Ainx(4);
    	ADS1115_Gain(4);
    	ADS1115_Mode(1);
    	ADS1115_Rate(4);
     
    	COM_Display("off");
     
    	for (int i=0; i<5; i++)
    	{
    		ADS1115_Init(_addr);
    		ADS1115_Read(_addr);
    	}
     
    	COM_Display("on");
     
    	/*----------------------------*/
    	/*     Fin de l'affichage     */
    	/*----------------------------*/
     
    	COM_Pause(1000);
     
    	COM_Send("#\n");				/* Reset */
    	COM_Close();
    	exit(0);
    }
    Ainsi que ma bibliothèque personnelle :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
    401
    402
    403
    404
    405
    406
    407
    408
    409
    410
    411
    412
    413
    414
    415
    416
    417
    418
    419
    420
    421
    422
    423
    424
    425
    426
    427
    428
    429
    430
    431
    432
    433
    434
    435
    436
    437
    438
    439
    440
    441
    442
    443
    444
    445
    446
    447
    448
    449
    450
    451
    452
    453
    454
    455
    456
    457
    458
    459
    460
    461
    462
    463
    464
    465
    466
    467
    468
    469
    470
    471
    472
    473
    474
    475
    476
    477
    478
    479
    480
    481
    482
    483
    484
    485
    486
    487
    488
    489
    490
    491
    492
    493
    494
    495
    496
    497
    498
    499
    500
    501
    502
    503
    504
    505
    506
    507
    508
    509
    510
    511
    512
    513
    514
    515
    516
    517
    518
    519
    520
    521
    522
    523
    524
    525
    526
    527
    528
    529
    530
    531
    532
    533
    534
    535
    536
    537
    538
    539
    540
    541
    542
    543
    544
    545
    546
    547
    548
    549
    550
    551
    552
    553
    554
    555
    556
    557
    558
    559
    560
    561
    562
    563
    564
    565
    566
    567
    568
    569
    570
    571
    572
    573
    574
    575
    576
    577
    578
    579
    580
    581
    582
    583
    584
    585
    586
    587
    588
    589
    590
    591
    592
    593
    594
    595
    596
    597
    598
    599
    600
    601
    602
    603
    604
    605
    606
    607
    608
    609
    610
    611
    612
    613
    614
    615
    616
    617
    618
    619
    620
    621
    622
    623
    624
    625
    626
    627
    628
    629
    630
    631
    632
    633
    634
    635
    636
    637
    638
    639
    640
    641
    642
    643
    644
    645
    646
    647
    648
    649
    650
    651
    652
    653
    654
    655
    656
    657
    658
    659
    660
    661
    662
    663
    664
    665
    666
    667
    668
    669
    670
    671
    672
    673
    674
    675
    676
    677
    678
    679
    680
    681
    682
    683
    684
    685
    686
    687
    688
    689
    690
    691
    692
    693
    694
    695
    696
    697
    698
    699
    700
    701
    702
    703
    704
    705
    706
    707
    708
    709
    710
    711
    712
    713
    714
    715
    716
    717
    718
    719
    720
    721
    722
    723
    724
    725
    726
    727
    728
    729
    730
    731
    732
    733
    734
    735
    736
    737
    738
    739
    740
    741
    742
    743
    744
    745
    746
    747
    748
    749
    750
    751
    752
    753
    754
    755
    756
    757
    758
    759
    760
    761
    762
    763
    764
    765
    766
    767
    768
    769
    770
    771
    772
    773
    774
    775
    776
    777
    778
    779
    780
    781
    782
    783
    784
    785
    786
    787
    788
    789
    790
    791
    792
    793
    794
    795
    796
    797
    798
    799
    800
    801
    802
    803
    804
    805
    806
    807
    808
    809
    810
    811
    812
    813
    814
    815
    816
    817
    818
    819
    820
    821
    822
    823
    824
    825
    826
    827
    828
    829
    830
    831
    832
    833
    834
    835
    836
    837
    838
    839
    840
    841
    842
    843
    844
    845
    846
    847
    848
    849
    850
    851
    852
    853
    854
    855
    856
    857
    858
    859
    860
    861
    862
    863
    864
    865
    866
    867
    868
    869
    870
    871
    872
    873
    874
    875
    876
    877
    878
    879
    880
    881
    882
    883
    884
    885
    886
    887
    888
    889
    890
    891
    892
    893
    894
    895
    896
    897
    898
    899
    900
    901
    902
    903
    904
    905
    906
    907
    908
    909
    910
    911
    912
    913
    914
    915
    916
    917
    918
    919
    920
    921
    922
    923
    924
    925
    926
    927
    928
    929
    930
    931
    932
    933
    934
    935
    936
    937
    938
    939
    940
    941
    942
    943
    944
    945
    946
    947
    948
    949
    950
    951
    952
    953
    954
    955
    956
    957
    958
    959
    960
    961
    962
    963
    964
    965
    966
    967
    968
    969
    970
    971
    972
    973
    974
    975
    976
    977
    978
    979
    980
    981
    982
    983
    984
    985
    986
    987
    988
    989
    990
    991
    992
    993
    994
    995
    996
    997
    998
    999
    1000
    1001
    1002
    1003
    1004
    1005
    1006
    1007
    1008
    1009
    1010
    1011
    1012
    1013
    1014
    1015
    1016
    1017
    1018
    1019
    1020
    1021
    1022
    1023
    1024
    1025
    1026
    1027
    1028
    1029
    1030
    1031
    1032
    1033
    1034
    1035
    1036
    1037
    1038
    1039
    1040
    1041
    1042
    1043
    1044
    1045
    1046
    1047
    1048
    1049
    1050
    1051
    1052
    1053
    1054
    1055
    1056
    1057
    1058
    1059
    1060
    1061
    1062
    1063
    1064
    1065
    1066
    1067
    1068
    1069
    1070
    1071
    1072
    1073
    1074
    1075
    1076
    1077
    1078
    1079
    1080
    1081
    1082
    1083
    1084
    1085
    1086
    1087
    1088
    1089
    1090
    1091
    1092
    1093
    1094
    1095
    1096
    1097
    1098
    1099
    1100
    1101
    1102
    1103
    1104
    1105
    1106
    1107
    1108
    1109
    1110
    1111
    1112
    1113
    1114
    1115
    #include <windows.h>
     
    #include <conio.h>
    #include <math.h>
    #include <stdlib.h>
    #include <string.h>
    #include <locale.h>
    #include <stdio.h>
    #include <time.h>
     
    #include "libcom.h"
     
    /********************************************/
    /*                                          */
    /*     Délais d'attente sur le port COM     */
    /*                                          */
    /********************************************/
     
    COMMTIMEOUTS _ctoParams =
    {							/*=============================*/
    	50,						/* ReadIntervalTimeout         */
    	10,						/* ReadTotalTimeoutMultiplier  */
    	50,						/* ReadTotalTimeoutConstant    */
    	0,						/* WriteTotalTimeoutMultiplier */
    	0						/* WriteTotalTimeoutConstant   */
    };							/*=============================*/
     
     
    /*************************************/
    /*                                   */
    /*     Déclaration des Variables     */
    /*                                   */
    /*************************************/
     
    DCB			_dcbParams;
     
    HANDLE		_hComm=NULL;
    DWORD		_eventMask,_noBytesRead,_noBytesWritten;
    BOOL		_flag;
    int			_timer;
    char		_carac;
    char		_chaine[4096];
    char		_tampon[256];
     
    /*========================*/
    /*     Capteur BMP280     */
    /*========================*/
     
    int		_mode, _pos;
    double	_t1, _t2, _t3, _p1, _p2, _p3, _p4, _p5, _p6, _p7, _p8, _p9, _adc_pres, _adc_temp;
     
    /*====================================================*/
    /*     Convertisseur analogique / digital ADS1115     */
    /*====================================================*/
     
    unsigned char	_ADS1115_Muex;
    unsigned char	_ADS1115_Gain;
    unsigned char	_ADS1115_Mode;
    unsigned char	_ADS1115_Rate;
     
    /************************************************************/
    /*                                                          */
    /*     Fonctions de communications en mode série (UART)     */
    /*                                                          */
    /************************************************************/
     
    /*===========================*/
    /*     Fermeture du Port     */
    /*===========================*/
     
    void COM_Close(void)
    {
    	/*------------------------------*/
    	/*     On purge les tampons     */
    	/*------------------------------*/
     
    	EscapeCommFunction(_hComm, CLRDTR);
    	PurgeComm(_hComm, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
     
    	/*-------------------*/
    	/*     Fermeture     */
    	/*-------------------*/
     
    	CloseHandle(_hComm);
    	_hComm = NULL;
    }
     
     
    /*===========================*/
    /*     Ouverture du Port     */
    /*===========================*/
     
    int COM_Open(int _val)
    {
    	_hComm = CreateFile("\\\\.\\COM5",
    						GENERIC_READ|GENERIC_WRITE,
    						0,
    						NULL,
    						OPEN_EXISTING,
    						FILE_ATTRIBUTE_SYSTEM,
    						NULL);
     
    /* FILE_FLAG_OVERLAPPED */
     
    	if (_hComm == INVALID_HANDLE_VALUE)
    	{
    		printf("Erreur lors de l'ouverture du port COM5 : ");
     
    		if (GetLastError() == 5)
    				printf("Accès refusé !\n");
    		else	printf("Autre\n");
     
    		return FALSE;
    	}
     
    	/*--------------------------------------------------------------------*/
    	/*     Configuration des Tailles des tampons d'émission/Réception     */
    	/*--------------------------------------------------------------------*/
     
    	SetupComm(_hComm, 4096, 4096);
     
    	/*-----------------------------------------*/
    	/*     Configuration du "COMMTIMEOUTS"     */
    	/*-----------------------------------------*/
     
    	_timer = _val;
     
    	_ctoParams.ReadTotalTimeoutConstant =  _timer;
    	_ctoParams.ReadIntervalTimeout      =  _timer;
     
    	if (!SetCommTimeouts(_hComm, &_ctoParams))
    	{
    		printf("Erreur dans la configuration du 'COMMTIMEOUTS' %d\n", GetLastError());
    		COM_Close();
    		return FALSE;
    	}
     
    	/*--------------------------------------*/
    	/*     Lecture du Paramétrage "DCB"     */
    	/*--------------------------------------*/
     
    	FillMemory(&_dcbParams, sizeof(DCB), 0);
    	_dcbParams.DCBlength  = sizeof(DCB);
     
    	if (!GetCommState(_hComm, &_dcbParams))
    	{
    		printf("Erreur Lecture Paramétrage 'DCB' : %d\n", GetLastError());
    		COM_Close();
    		return FALSE;
    	}
     
    	/*--------------------------------*/
    	/*     Configuration du "DCB"     */
    	/*--------------------------------*/
     
    	_dcbParams.BaudRate    = CBR_115200;
     
    	_dcbParams.ByteSize    = 8;
    	_dcbParams.StopBits    = ONESTOPBIT;
    	_dcbParams.Parity      = NOPARITY;
     
    	_dcbParams.fDtrControl = DTR_CONTROL_ENABLE;
    	_dcbParams.fRtsControl = RTS_CONTROL_ENABLE;
     
    	/*---------------------------------------*/
    	/*     Ecriture du Paramétrage "DCB"     */
    	/*---------------------------------------*/
     
    	if (!SetCommState(_hComm, &_dcbParams))
    	{
    		printf("Erreur dans L'écriture Paramétrage 'DCB' : %d\n", GetLastError());
    		COM_Close();
    		return FALSE;
    	}
     
    	/*----------------------------------*/
    	/*     Affichage du paramétrage     */
    	/*----------------------------------*/
     
    	printf("\t\t+============================+\n");
    	printf("\t\t|     Serial Transmission    |\n");
    	printf("\t\t|         (Win32 APi)        |\n");
    	printf("\t\t+----------------------------+\n");
    	printf("\t\t|              Port :   COM5 |\n");
    	printf("\t\t|          BaudRate : %6d |\n", _dcbParams.BaudRate);
    	printf("\t\t|          ByteSize : %6d |\n", _dcbParams.ByteSize);
    	printf("\t\t|           StopBit : %6d |\n", _dcbParams.StopBits);
    	printf("\t\t|            Parity : %6d |\n", _dcbParams.Parity);
    	printf("\t\t|       fDtrControl : %6d |\n", _dcbParams.fDtrControl);
    	printf("\t\t|       fRtsControl : %6d |\n", _dcbParams.fRtsControl);
    	printf("\t\t+----------------------------+\n");
    	printf("\t\t|         DCBlength : %6d |\n", _dcbParams.DCBlength);
    	printf("\t\t|           fBinary : %6d |\n", _dcbParams.fBinary);
    	printf("\t\t|           fParity : %6d |\n", _dcbParams.fParity);
    	printf("\t\t|      fOutxCtsFlow : %6d |\n", _dcbParams.fOutxCtsFlow);
    	printf("\t\t|      fOutxDsrFlow : %6d |\n", _dcbParams.fOutxDsrFlow);
    	printf("\t\t|   fDsrSensitivity : %6d |\n", _dcbParams.fDsrSensitivity);
    	printf("\t\t| fTXContinueOnXoff : %6d |\n", _dcbParams.fTXContinueOnXoff);
    	printf("\t\t|             fOutX : %6d |\n", _dcbParams.fOutX);
    	printf("\t\t|              fInX : %6d |\n", _dcbParams.fInX);
    	printf("\t\t|        fErrorChar : %6d |\n", _dcbParams.fErrorChar);
    	printf("\t\t|             fNull : %6d |\n", _dcbParams.fNull);
    	printf("\t\t|     fAbortOnError : %6d |\n", _dcbParams.fAbortOnError);
    	printf("\t\t|           fDummy2 : %6d |\n", _dcbParams.fDummy2);
    	printf("\t\t|         wReserved : %6d |\n", _dcbParams.wReserved);
    	printf("\t\t|            XonLim : %6d |\n", _dcbParams.XonLim);
    	printf("\t\t|           XoffLim : %6d |\n", _dcbParams.XoffLim);
    	printf("\t\t|           XonChar : %6d |\n", _dcbParams.XonChar);
    	printf("\t\t|          XoffChar : %6d |\n", _dcbParams.XoffChar);
    	printf("\t\t|         ErrorChar : %6d |\n", _dcbParams.ErrorChar);
    	printf("\t\t|           EofChar : %6d |\n", _dcbParams.EofChar);
    	printf("\t\t|           EvtChar : %6d |\n", _dcbParams.EvtChar);
    	printf("\t\t+============================+\n");
     
    	/*------------------------------*/
    	/*     On purge les tampons     */
    	/*------------------------------*/
     
    	PurgeComm(_hComm, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
    	EscapeCommFunction(_hComm, SETDTR);
     
    	/*----------------------------------------------*/
    	/*     Configuration du masque de réception     */
    	/*----------------------------------------------*/
     
    	if (SetCommMask(_hComm, EV_RXCHAR) == FALSE)
    	{
    		printf("Erreur configuration du masque de réception : %d\n", GetLastError());
    		COM_Close();
    		return FALSE;
    	}
     
    	/*------------------------*/
    	/*     Initialisation     */
    	/*------------------------*/
     
    	_flag = TRUE;
    	return TRUE;
    }
     
     
    /*========================================*/
    /*     Envoie commande avec réception     */
    /*========================================*/
     
    void COM_Send(char *_buffer)
    {
    	int		_index;
     
    	/*------------------------------*/
    	/*     Envoi de la commande     */
    	/*------------------------------*/
     
    	WriteFile(_hComm, _buffer, strlen(_buffer), &_noBytesWritten, NULL);
     
    	/*-----------------------------------------*/
    	/*     Mise en attente de la réception     */
    	/*-----------------------------------------*/
     
    	if (!WaitCommEvent(_hComm, &_eventMask, NULL))
    	{
    		printf("Erreur dans la configuration de la mise en attente de la réception : %d\n", GetLastError());
    		COM_Close();
    		exit(-1);
    	}
     
    	/*--------------------------------*/
    	/*     Réception et Affichage     */
    	/*--------------------------------*/
     
    	_index = 0;
    	_carac = ' ';
     
    	do
    	{
    		ReadFile(_hComm, &_carac, sizeof(_carac), &_noBytesRead, NULL);
     
    		if (_noBytesRead> 0)
    		{
    			if (_flag == TRUE)	printf("%c", _carac);
    			_chaine[_index++] = (char)_carac;
    		}
     
    	} while (_noBytesRead> 0);
     
    	_chaine[_index] = '\0';
    }
     
     
    /*==========================*/
    /*     Affichage On/Off     */
    /*==========================*/
     
    void COM_Display(char *_state)
    {
    	if (strcmp(_state,"on") == 0)
    	{
    		_ctoParams.ReadTotalTimeoutConstant =  _timer;
    		_ctoParams.ReadIntervalTimeout      =  _timer;
     
    		_flag = TRUE;
    	}
    	else
    	{
    		if (strcmp(_state,"off") == 0)
    		{
    			_ctoParams.ReadTotalTimeoutConstant =  50;
    			_ctoParams.ReadIntervalTimeout      =  50;
     
    		_flag = FALSE;
    		}
    		else
    		{
    			printf("Erreur Paramètre Fonction COM_Display(\" %s \")\n", _state);
    			exit(-1);
    		}
    	}
     
    	/*-----------------------------------------*/
    	/*     Modification du délai d'attente     */
    	/*-----------------------------------------*/
     
    	if (!SetCommTimeouts(_hComm, &_ctoParams))
    	{
    		printf("Erreur dans la configuration du 'COMMTIMEOUTS' : %d\n", GetLastError());
    		COM_Close();
    		exit(-1);
    	}
     
    	PurgeComm(_hComm, PURGE_TXCLEAR|PURGE_RXCLEAR|PURGE_TXABORT|PURGE_RXABORT);
    	EscapeCommFunction(_hComm, SETDTR);
    }
     
     
    /*===============*/
    /*     Delay     */
    /*===============*/
     
    void COM_Delay(int _elapse)
    {
    	Sleep(_elapse);
    }
     
     
    /*===============*/
    /*     Pause     */
    /*===============*/
     
    void COM_Pause(int _elapse)
    {
    	COM_Delay(_elapse);
     
    	printf("\n\t+------------------------------------+");
    	printf("\n\t| Appuyez sur 'ENTER' pour Continuer |");
    	printf("\n\t+------------------------------------+\n");
     
    	getch();  /* Pour marquer une pause durant l'affichage */
    }
     
     
    /**********************************************************/
    /*                                                        */
    /*     Afficheur LCD HD44780 (Liquid Crystal Display)     */
    /*                                                        */
    /**********************************************************/
     
    /*=============================*/
    /*     Liste des Commandes     */
    /*=============================*/
     
    #define LCD_RESET					0x00
    #define LCD_CLEAR_DISPLAY			0x01
    #define LCD_RETURN_HOME				0x02
    #define LCD_ENTRY_MODE_SET			0x04
    #define LCD_DISPLAY_CONTROL			0x08
    #define LCD_CURSOR_OR_DISPLAY_SHIFT	0x10
    #define LCD_FUNCTION_SET			0x20
    #define LCD_SET_CG_RAM_ADDR			0x40
    #define LCD_SET_DD_RAM_ADDR			0x80
     
     
    /*----------------------------*/
    /* Flags for "entry mode set" */
    /*----------------------------*/
     
    #define LCD_ENTRY_INCREMENT			0x02
    #define LCD_ENTRY_DECREMENT			0x00
     
    #define LCD_ENTRY_SHIFT				0x01
    #define LCD_ENTRY_NO_SHIFT			0x00
     
     
    /*------------------------------------*/
    /* Flags for "display on/off control" */
    /*------------------------------------*/
     
    #define LCD_DISPLAY_ON				0x04
    #define LCD_DISPLAY_OFF				0x00
     
    #define LCD_CURSOR_ON				0x02
    #define LCD_CURSOR_OFF				0x00
     
    #define LCD_BLINK_ON				0x01
    #define LCD_BLINK_OFF				0x00
     
     
    /*------------------------------------*/
    /* Flags for "cursor or display shift */
    /*------------------------------------*/
     
    #define LCD_DISPLAY_SHIFT			0x08
    #define LCD_CURSOR_MOVE				0x00
     
    #define LCD_SHIFT_TO_RIGHT			0x04
    #define LCD_SHIFT_TO_LEFT			0x00
     
     
    /*--------------------------*/
    /* Flags for "function set" */
    /*--------------------------*/
     
    #define LCD_EIGHT_BITS				0x10
    #define LCD_FOUR_BITS				0x00
     
    #define LCD_2LINES					0x08
    #define LCD_1LINE					0x00
     
    #define LCD_5x10DOTS				0x04
    #define LCD_5x8DOTS					0x00
     
     
    /*----------------------*/
    /*     Others Flags     */
    /*----------------------*/
     
    #define LCD_BL				0x08		/* Backlight       bit */
    #define LCD_E				0x04		/* Enable          bit */
    #define LCD_RW				0x02		/* Read/Write      bit */
    #define LCD_RS				0x01		/* Register Select bit */
     
     
    /*================================*/
    /*     Transfert des données      */
    /*================================*/
     
    void LCD_Send(unsigned char _data1, unsigned char _data2, unsigned char _mode)
    {
     
    	sprintf(_tampon,"[0x4E 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X]\n",
    		(_data1|_mode|LCD_BL),((_data1|LCD_E)|_mode|LCD_BL),(((_data1&~LCD_E)|_mode|LCD_BL)),
    		(_data2|_mode|LCD_BL),((_data2|LCD_E)|_mode|LCD_BL),(((_data2&~LCD_E)|_mode|LCD_BL)));
     
    	COM_Send(_tampon);
    	Sleep(1);
    }
     
     
    /*=================================*/
    /*     Ecriture d'une commande     */
    /*=================================*/
     
    void LCD_Command(unsigned char _data)
    {
    	LCD_Send((_data & 0xF0),((_data << 4) & 0xF0), 0x00);
    }
     
     
    /*=================================*/
    /*     Ecriture d'un caractère     */
    /*=================================*/
     
    void LCD_Char(unsigned char _data)
    {
    	LCD_Send((_data & 0xF0),((_data << 4) & 0xF0), LCD_RS);
    }
     
     
    /*=========================*/
    /*      Initialisation     */
    /*=========================*/
     
    void LCD_Init(void)
    {
    	LCD_Command(LCD_FUNCTION_SET    | LCD_EIGHT_BITS      | LCD_2LINES           | LCD_5x8DOTS);
    	LCD_Command(LCD_FUNCTION_SET    | LCD_EIGHT_BITS      | LCD_2LINES           | LCD_5x8DOTS);
    	LCD_Command(LCD_FUNCTION_SET    | LCD_EIGHT_BITS      | LCD_2LINES           | LCD_5x8DOTS);
     
    	LCD_Command(0x02);		/* Four Bits Mode */
     
    	LCD_Command(LCD_FUNCTION_SET    | LCD_FOUR_BITS       | LCD_2LINES           | LCD_5x8DOTS);
    	LCD_Command(LCD_DISPLAY_CONTROL | LCD_DISPLAY_ON      | LCD_CURSOR_OFF       | LCD_BLINK_OFF);
    	LCD_Command(LCD_CLEAR_DISPLAY);
    	LCD_Command(LCD_ENTRY_MODE_SET  | LCD_ENTRY_INCREMENT | LCD_ENTRY_NO_SHIFT);
    	LCD_Command(LCD_RETURN_HOME);
    }
     
     
    /*===============================*/
    /*      Nettoyage de l'écran     */
    /*===============================*/
     
    void LCD_Clear(void)
    {
    	LCD_Command(LCD_CLEAR_DISPLAY);
    	LCD_Command(LCD_RETURN_HOME);
    }
     
     
    /*===================================*/
    /*     Positionnement du curseur     */
    /*===================================*/
     
    void LCD_Setcursor(int _row, int _col)
    {
    	unsigned int pos[04] = {0x00,0x40,0x14,0x54};
     
    	if (_row<=1)	_row=1;
    	if (_row>=4)	_row=4;
    	if (_col>=19)	_col=19;
     
    	LCD_Command(LCD_SET_DD_RAM_ADDR | (pos[_row-1] + _col));
    }
     
     
    /*==============================================*/
    /*     Affichage d'une chaîne de caractères     */
    /*==============================================*/
     
    void LCD_String(char *_array, int _qte)
    {
    	while (_qte-- > 0)
    		LCD_Char(*_array++);
    }
     
     
    /*==========================================*/
    /*     Allumage de l'afficheur (on/off)     */
    /*==========================================*/
     
    void LCD_Display(char *_state)
    {
    	if (strcmp(_state,"on") == 0)
    			LCD_Command(LCD_DISPLAY_CONTROL | LCD_DISPLAY_ON  | LCD_CURSOR_OFF | LCD_BLINK_OFF);
    	else	LCD_Command(LCD_DISPLAY_CONTROL | LCD_DISPLAY_OFF | LCD_CURSOR_OFF | LCD_BLINK_OFF);
    }
     
    /******************************************/
    /*                                        */
    /*     Capteur de température DS18B20     */
    /*                                        */
    /******************************************/
     
    /*================================================*/
    /*     Lecture de la température et affichage     */
    /*================================================*/
     
    void DS18B20_Temp(char *_buffer)
    {
    	char	_lsb[5], _msb[5], _hex[5];
    	int		_calc;
     
    	/*-------------------------------------------*/
    	/*     Envoi et réception de la commande     */
    	/*-------------------------------------------*/
     
    	COM_Send(_buffer);
     
    	/*-------------------------------------*/
    	/*     Formatage de la température     */
    	/*-------------------------------------*/
     
    	if (strstr(_chaine,"No device") == NULL)
    	{
    		sscanf(strstr(_chaine,"READ:")+5, "%s %s", _lsb, _msb);
    		sprintf(_hex,"%s%s", _msb+2, _lsb+2);
    		sscanf(_hex, "%X", &_calc);
    		if (_calc >61439)	_calc = _calc - 65536;
     
    		printf("\n\t+------------------------+\n");
    		printf("\t| Température : %+8.4f |\n", (((double)_calc))/16.0);
    		printf("\t+------------------------+\n");
    	}
    	else
    	{
    		printf("\n\t+---------------------+\n");
    		printf("\t| Pas de périphérique |\n");
    		printf("\t+---------------------+\n");
    	}
     
    	printf("1-WIRE>");
    }
     
     
    /**********************************************************************/
    /*                                                                    */
    /*     Capteur de température et de pression atmosphérique BMP280     */
    /*                                                                    */
    /**********************************************************************/
     
    /*====================================*/
    /*     Conversion de l'étalonnage     */
    /*====================================*/
     
    double BMP280_Hex1(char *_chaine, int _signed)
    {
    	char	_1b[5], _2b[5], _3b[5], _hex[5];
    	int		_calc;
     
    	if (_mode == 0)					/* Mode I2C */
    	{
    		sscanf(strstr(_chaine,"READ:")+_pos, "%s %s %s", _1b, _2b, _3b);
    		_pos +=20;
    	}
    	else							/* Mode SPI */
    	{
    		sscanf(strstr(_chaine,"READ:")+_pos, "%s %s", _1b, _3b);
    		_pos +=10;
    	}
     
    	sprintf(_hex,"%s%s", _3b+2, _1b+2);
    	sscanf(_hex, "%X", &_calc);
     
    	if ((_signed) &&(_calc >32767))	_calc = _calc - 65536;
     
    	return ((double)_calc);
    }
     
     
    /*=========================================*/
    /*     Conversion analogique/numérique     */
    /*=========================================*/
     
    double BMP280_Hex2(char *_chaine)
    {
    	char	_1b[5], _2b[5], _3b[5], _4b[5], _5b[5], _hex[7];
    	int		_calc;
     
    	if (_mode == 0)					/* Mode I2C */
    	{
    		sscanf(strstr(_chaine,"READ:")+_pos, "%s %s %s %s %s", _1b, _2b, _3b, _4b, _5b);
    		_pos +=30;
    	}
    	else							/* Mode SPI */
    	{
    		sscanf(strstr(_chaine,"READ:")+_pos, "%s %s %s", _1b, _3b, _5b);
    		_pos +=15;
    	}
     
    	sprintf(_hex,"%s%s%s", _1b+2, _3b+2, _5b+2);
    	sscanf(_hex, "%X", &_calc);
     
    	_calc /= 16;
     
    	return ((double)_calc);
    }
     
     
    /*========================*/
    /*     Mode I2C / SPI     */
    /*========================*/
     
    void BMP280_Mode(char *_buffer)
    {
    	/*--------------------------------------*/
    	/*     Extraction de la température     */
    	/*--------------------------------------*/
     
    	if (strcmp(_buffer,"5\n")  == 0)
    	{
    		_mode = 1;
     
    		printf("\n\t+--------------------+");
    		printf("\n\t|     Mode : SPI     |");
    		printf("\n\t+--------------------+");
    	}
     
    	if (strcmp(_buffer,"4\n") == 0)
    	{
    		_mode = 0;
     
    		printf("\n\t+--------------------+");
    		printf("\n\t|     Mode : I2C     |");
    		printf("\n\t+--------------------+");
    	}
     
    	printf("\n(1)>");
     
    	/*-------------------------------------------*/
    	/*     Envoi et réception de la commande     */
    	/*-------------------------------------------*/
     
    	COM_Send(_buffer);
     
    }
     
    /*=================================*/
    /*     Lecture de l'étalonnage     */
    /*=================================*/
     
    void BMP280_Calib(char *_buffer)
    {
    	/*-------------------------------------------*/
    	/*     Envoi et réception de la commande     */
    	/*-------------------------------------------*/
     
    	COM_Send(_buffer);
     
    	/*--------------------------------------*/
    	/*     Extraction de la température     */
    	/*--------------------------------------*/
     
    	_pos = 5;
    	_t1  = BMP280_Hex1(_chaine, 0);
    	_t2  = BMP280_Hex1(_chaine, 1);
    	_t3  = BMP280_Hex1(_chaine, 1);
     
    	/*-----------------------------------*/
    	/*     Extraction de la pression     */
    	/*-----------------------------------*/
     
    	_p1  = BMP280_Hex1(_chaine, 0);
    	_p2  = BMP280_Hex1(_chaine, 1);
    	_p3  = BMP280_Hex1(_chaine, 1);
    	_p4  = BMP280_Hex1(_chaine, 1);
    	_p5  = BMP280_Hex1(_chaine, 1);
    	_p6  = BMP280_Hex1(_chaine, 1);
    	_p7  = BMP280_Hex1(_chaine, 1);
    	_p8  = BMP280_Hex1(_chaine, 1);
    	_p9  = BMP280_Hex1(_chaine, 1);
    }
     
     
    /*=====================================================*/
    /*     Lecture de la pression et de la température     */
    /*=====================================================*/
     
    void BMP280_Data(char *_buffer)
    {
    	double	_calc1, _calc2, _fine, _celsius, _fahrenheit, _pressure, _altitude, _seaLevel;
     
    	/*-------------------------------------------*/
    	/*     Envoi et réception de la commande     */
    	/*-------------------------------------------*/
     
    	COM_Send(_buffer);
     
    	/*----------------------------------------------------------------------------------------*/
    	/*     Convertion analogique/numérique de la pression atmosphérique et de température     */
    	/*----------------------------------------------------------------------------------------*/
     
    	_pos      = 5;
    	_adc_pres = BMP280_Hex2(_chaine);
    	_adc_temp = BMP280_Hex2(_chaine);
     
    	/*--------------------------------------*/
    	/*     Vérification par Jeu d'essai     */
    	/*--------------------------------------*/
    	/* -Température :      25.08°C          */
    	/* -Pression    : 100 653.27 Pa         */
    	/*--------------------------------------*/
     
    /*
    	_t1       =  +27504.0;
    	_t2       =  +26435.0;
    	_t3       =   -1000.0;
     
    	_p1       =  +36477.0;
    	_p2       =  -10685.0;
    	_p3       =   +3024.0;
    	_p4       =   +2855.0;
    	_p5       =    +140.0;
    	_p6       =      -7.0;
    	_p7       =  +15500.0;
    	_p8       =  -14600.0;
    	_p9       =  + 6000.0;
     
    	_adc_temp = +519888.0;
    	_adc_pres = +415148.0;
    */
     
    	/*----------------------------------*/
    	/*     Calcul de la température     */
    	/*----------------------------------*/
     
    	_calc1      = ((_adc_temp /  16384.0) - (_t1 / 1024.0)) *   _t2;
    	_calc2      = ((_adc_temp / 131072.0) - (_t1 / 8192.0)) * ((_adc_temp / 131072.0) - (_t1 / 8192.0)) * _t3;
    	_fine       = (int)(_calc1 + _calc2);
    	_celsius    =      (_calc1 + _calc2) / 5120.0;
    	_fahrenheit =  _celsius * 1.8 + 32;
     
    	/*-------------------------------*/
    	/*     Calcul de la pression     */
    	/*-------------------------------*/
     
    	_calc1 = (_fine / 2.0) - 64000.0;
    	_calc2 =  (_calc1 *  _calc1 *  _p6) / 32768.0;
    	_calc2 =   _calc2 + (_calc1 *  _p5  *     2.0);
    	_calc2 =  (_calc2 /  4.0)   + (_p4  * 65536.0);
    	_calc1 = (((_p3 * _calc1 * _calc1) / 524288.0) + _p2 * _calc1) / 524288.0;
    	_calc1 = (1.0 + (_calc1 / 32768.0)) * _p1;
     
    	if (_calc1 == 0)
    	{
    		_pressure = 0;
    		_altitude = 0;
    	}
    	else
    	{
    		_pressure = 1048576.0 - _adc_pres;
    		_pressure = ((_pressure - (_calc2 / 4096.0)) * 6250.0) / _calc1;
    		_calc1    = (_p9 * _pressure * _pressure) / 2147483648.0;
    		_calc2    = (_pressure * _p8) / 32768.0;
    		_pressure =  _pressure + ((_calc1 + _calc2 + _p7) / 16.0);
     
    		if ((_pressure >=  30000.0) && (_pressure <= 110000.0))
    		{
     
    			/*------------------------------------*/
    			/*        Calcul de l'altitude        */
    			/*------------------------------------*/
    			/* Niveau de la mer : 101325.0 Pascal */
    			/*------------------------------------*/
     
    			_seaLevel = 101325.0;
    			_altitude =  44330.0 * (1 - pow((_pressure / _seaLevel), (1.0 / 5.255)));
    		}
    		else
    		{
    			_pressure = 0;
    			_altitude = 0;
    		}
    	}
     
    	/*-------------------------------------------------------------------*/
    	/*     Affichage altitude, pression atmosphérique et température     */
    	/*-------------------------------------------------------------------*/
     
    	printf("\n\t+------------------------+\n");
    	printf("\t|    %7-.2f Celsius     |\n", _celsius);
    	printf("\t|    %7-.2f Fahrenheit  |\n", _fahrenheit);
    	printf("\t|  %9.2f Pascal      |\n", _pressure);
    	printf("\t|  %9.2f Metres      |\n", _altitude);
    	printf("\t+------------------------+\n");
     
    	if (_mode == 0)		printf("I2C>");
    	else				printf("SPI>");
     
    }
     
     
    /************************************/
    /*                                  */
    /*     Real Time Clock - DS1307     */
    /*                                  */
    /************************************/
     
    /*=========================================*/
    /*     Conversion Binaire Codé Décimal     */
    /*=========================================*/
     
    int DS1307_Dcb(char *_chaine)
    {
    	int		_calc;
     
    	sscanf(strstr(_chaine,"READ:")+_pos, "%d", &_calc);
    	_pos +=10;
     
    	return ((int)_calc);
    }
     
     
    /*=========================================*/
    /*     Lecture de la Date et d l'heure     */
    /*=========================================*/
     
    void DS1307_Clock(char *_buffer)
    {
    	unsigned short	_seconde, _minute, _heure, _val, _jour, _mois, _annee;
     
    	/*-------------------------------------------*/
    	/*     Envoi et réception de la commande     */
    	/*-------------------------------------------*/
     
    	COM_Send(_buffer);
     
    	/*----------------------------------------------------------------------------------------*/
    	/*     Convertion analogique/numérique de la pression atmosphérique et de température     */
    	/*----------------------------------------------------------------------------------------*/
     
    	_pos     = 8;
    	_seconde = DS1307_Dcb(_chaine);
    	_minute  = DS1307_Dcb(_chaine);
    	_heure   = DS1307_Dcb(_chaine);
    	_val     = DS1307_Dcb(_chaine);
    	_jour    = DS1307_Dcb(_chaine);
    	_mois    = DS1307_Dcb(_chaine);
    	_annee   = DS1307_Dcb(_chaine);
     
    	_heure += 2;
     
    	/*--------------------------------------------*/
    	/*     Affichage de la date et de l'heure     */
    	/*--------------------------------------------*/
     
    	printf("\n\t+--------------+\n");
    	printf("\t|  20%02d/%02d/%02d  |\n", _annee, _mois, _jour);
    	printf("\t|   %02d:%02d:%02d   |\n", _heure, _minute, _seconde);
    	printf("\t+--------------+\n");
    	printf("I2C>");
     
    }
     
     
    /*=================================================*/
    /*     Ecriture Local de la Date et de l'heure     */
    /*=================================================*/
     
    void DS1307_Local(void)
    {
    	char		_buffer[256];
    	time_t		_clock;
    	struct tm	*_gmt;
     
    //	setlocale(LC_TIME, "");
    	time(&_clock);
     
    	_gmt = gmtime(&_clock);
    	sprintf(_buffer, "[0xD0 0x00 0x%02d 0x%02d 0x%02d 0x%02d 0x%02d 0x%02d 0x%02d 0x00]\n",_gmt->tm_sec, _gmt->tm_min, _gmt->tm_hour, _gmt->tm_wday+1, _gmt->tm_mday, _gmt->tm_mon+1, _gmt->tm_year-100);
     
    	/*-------------------------------------------*/
    	/*     Envoi et réception de la commande     */
    	/*-------------------------------------------*/
     
    	COM_Send(_buffer);
     
    }
     
    /*************************************************/
    /*                                               */
    /*     analog-to-digital converter - ADS1115     */
    /*                                               */
    /*************************************************/
     
    /*========================================================*/
    /*     Récupération de l'adresse I2C du convertisseur     */
    /*========================================================*/
     
    int ADS1115_Addr(char *_buffer)
    {
    	char	_hex[7];
    	int		_calc;
     
    	/*-------------------------------------------*/
    	/*     Envoi et réception de la commande     */
    	/*-------------------------------------------*/
     
    	COM_Send(_buffer);
     
    	/*--------------------------------*/
    	/*     xtraction de l'adresse     */
    	/*--------------------------------*/
     
    	sscanf(strstr(_chaine,"at:")+20, "%s", _hex);
    	sscanf(_hex, "%X", &_calc);
     
    	return (_calc);
    }
     
    /*=====================================*/
    /*     Configuration : Multiplexer     */
    /*=====================================*/
     
    void ADS1115_Ainx(unsigned char _out)
    {
    	switch(_out)
    	{
    		case 2:		_ADS1115_Muex = 0x05;
    					break;
     
    		case 3:		_ADS1115_Muex = 0x06;
    					break;
     
    		case 4:		_ADS1115_Muex = 0x07;
    					break;
     
    		default:	_ADS1115_Muex = 0x04;
    					break;
    	}
    }
     
    /*==============================*/
    /*     Configuration : Gain     */
    /*==============================*/
     
    void ADS1115_Gain(unsigned char _gain)
    {
    	switch(_gain)
    	{
    		case 0:		_ADS1115_Gain = 0x00;
    					break;
     
    		case 1:		_ADS1115_Gain = 0x01;
    					break;
     
    		case 3:		_ADS1115_Gain = 0x03;
    					break;
     
    		case 4:		_ADS1115_Gain = 0x04;
    					break;
     
    		case 5:		_ADS1115_Gain = 0x05;
    					break;
     
    		case 6:		_ADS1115_Gain = 0x06;
    					break;
     
    		case 7:		_ADS1115_Gain = 0x07;
    					break;
     
    		default:	_ADS1115_Muex = 0x02;
    					break;
    	}
    }
     
    /*==============================*/
    /*     Configuration : Mode     */
    /*==============================*/
     
    void ADS1115_Mode(unsigned char _mode)
    {
    	switch(_mode)
    	{
    		case 0:		_ADS1115_Mode = 0x00;
    					break;
     
    		default:	_ADS1115_Mode = 0x01;
    					break;
    	}
    }
     
    /*==============================*/
    /*     Configuration : Rate     */
    /*==============================*/
     
    void ADS1115_Rate(unsigned char _rate)
    {
    	switch(_rate)
    	{
    		case 0:		_ADS1115_Rate = 0x00;
    					break;
     
    		case 1:		_ADS1115_Rate = 0x01;
    					break;
     
    		case 2:		_ADS1115_Rate = 0x02;
    					break;
     
    		case 3:		_ADS1115_Rate = 0x03;
    					break;
     
    		case 5:		_ADS1115_Rate = 0x05;
    					break;
     
    		case 6:		_ADS1115_Rate = 0x06;
    					break;
     
    		case 7:		_ADS1115_Rate = 0x07;
    					break;
     
    		default:	_ADS1115_Rate = 0x04;
    					break;
    	}
    }
     
    /*========================*/
    /*     Initialisation     */
    /*========================*/
     
    void ADS1115_Init(int _addr)
    {
    	unsigned char _val1, _val2;
    	_val1 =              (0x01);
    	_val1 = (_val1<<3) | (_ADS1115_Muex);
    	_val1 = (_val1<<3) | (_ADS1115_Gain);
    	_val1 = (_val1<<1) | (_ADS1115_Mode);
     
    	_val2 =              (_ADS1115_Rate);
    	_val2 = (_val2<<5) | (0x03);
     
    	sprintf(_tampon, "[0x%02X 0x01 0x%02X 0x%02X]\n", _addr, _val1, _val2);
    	COM_Send(_tampon);
    	COM_Delay(500);
    }
     
    /*========================================*/
    /*     Lecture de la valeur numérique     */
    /*========================================*/
     
    void ADS1115_Read(int _addr)
    {
    	char			_1b[5], _2b[5], _3b[5], _hex[7];
    	unsigned int	_i, _calc;
     
    	sprintf(_tampon, "[0x%02X 0x00 [0x%02X r:2]\n", _addr, _addr+1);
    	COM_Send(_tampon);
     
    	sscanf(strstr(_chaine,"READ:")+6, "%s %s %s", _1b, _2b, _3b);
    	sprintf(_hex,"%s%s", _1b+2, _3b+2);
    	sscanf(_hex, "%X", &_calc);
     
    	printf("\n\t+-------+\n");
    	printf("\t| %5d |\n",_calc);
    	printf("\t+-------+\n");
    	printf("I2C>");
    }

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  11. #71
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Voici une exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
                    +============================+
                    |     Serial Transmission    |
                    |         (Win32 APi)        |
                    +----------------------------+
                    |              Port :   COM5 |
                    |          BaudRate : 115200 |
                    |          ByteSize :      8 |
                    |           StopBit :      0 |
                    |            Parity :      0 |
                    |       fDtrControl :      1 |
                    |       fRtsControl :      1 |
                    +----------------------------+
                    |         DCBlength :     28 |
                    |           fBinary :      1 |
                    |           fParity :      0 |
                    |      fOutxCtsFlow :      0 |
                    |      fOutxDsrFlow :      0 |
                    |   fDsrSensitivity :      0 |
                    | fTXContinueOnXoff :      0 |
                    |             fOutX :      0 |
                    |              fInX :      0 |
                    |        fErrorChar :      0 |
                    |             fNull :      0 |
                    |     fAbortOnError :      0 |
                    |           fDummy2 :      0 |
                    |         wReserved :      0 |
                    |            XonLim :   2048 |
                    |           XoffLim :    512 |
                    |           XonChar :     17 |
                    |          XoffChar :     19 |
                    |         ErrorChar :      0 |
                    |           EofChar :      0 |
                    |           EvtChar :      0 |
                    +============================+
    
    HiZ>#
    RESET
    
    Bus Pirate v3b
    Firmware v5.10 (r559)  Bootloader v4.4
    DEVID:0x0447 REVID:0x3046 (24FJ64GA002 B8)
    http://dangerousprototypes.com
    HiZ>b
    Set serial port speed: (bps)
     1. 300
     2. 1200
     3. 2400
     4. 4800
     5. 9600
     6. 19200
     7. 38400
     8. 57600
     9. 115200
    10. BRG raw value
    
    (9)>9
    Adjust your terminal
    Space to continue
    HiZ>m
    1. HiZ
    2. 1-WIRE
    3. UART
    4. I2C
    5. SPI
    6. 2WIRE
    7. 3WIRE
    8. LCD
    9. DIO
    x. exit(without change)
    
    (1)>4
    Set speed:
     1. ~5KHz
     2. ~50KHz
     3. ~100KHz
     4. ~400KHz
    
    (1)>3
    Ready
    I2C>W
    Power supplies ON
    I2C>P
    Pull-up resistors ON
    I2C>v
    Pinstates:
    1.(BR)  2.(RD)  3.(OR)  4.(YW)  5.(GN)  6.(BL)  7.(PU)  8.(GR)  9.(WT)  0.(Blk)
    GND     3.3V    5.0V    ADC     VPU     AUX     SCL     SDA     -       -
    P       P       P       I       I       I       I       I       I       I
    GND     3.28V   5.04V   0.00V   5.04V   L       H       H       H       H
    I2C>(0)
     0.Macro menu
     1.7bit address search
     2.I2C sniffer
    I2C>(1)
    Searching I2C address space. Found devices at:
    0x00(0x00 W) 0x90(0x48 W) 0x91(0x48 R)
    
    I2C>
            +----------------------+
            | +14420    +2.704 Vcc |
            +----------------------+
    I2C>
            +----------------------+
            | +14419    +2.704 Vcc |
            +----------------------+
    I2C>
            +----------------------+
            | +14421    +2.704 Vcc |
            +----------------------+
    I2C>
            +----------------------+
            | +14421    +2.704 Vcc |
            +----------------------+
    I2C>
            +----------------------+
            | +14421    +2.704 Vcc |
            +----------------------+
    I2C>
            +----------------------+
            | +14420    +2.704 Vcc |
            +----------------------+
    I2C>
            +----------------------+
            | +14420    +2.704 Vcc |
            +----------------------+
    I2C>
            +----------------------+
            | +14421    +2.704 Vcc |
            +----------------------+
    I2C>
            +----------------------+
            | +14422    +2.704 Vcc |
            +----------------------+
    I2C>
            +------------------------------------+
            | Appuyez sur 'ENTER' pour Continuer |
            +------------------------------------+
    #
    RESET
    
    Bus Pirate v3b
    Firmware v5.10 (r559)  Bootloader v4.4
    DEVID:0x0447 REVID:0x3046 (24FJ64GA002 B8)
    http://dangerousprototypes.com
    HiZ>
    
    Appuyez sur une touche pour continuer...
    Bon, il n'est pas cassé mon convertisseur, mais j'ai juste fait une erreur de calibrage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	ADS1115_Ainx(1);	/* entrée analogique N°1			*/
    	ADS1115_Gain(0);	/* +/- 6.144 Vcc				*/
    	ADS1115_Mode(0);	/* en rafale					*/
    	ADS1115_Rate(4);	/* 4 = 128 SPS (samples per second)		*/

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  12. #72
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut à tous.

    Je clôture ce sujet.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

+ Répondre à la discussion
Cette discussion est résolue.
Page 4 sur 4 PremièrePremière 1234

Discussions similaires

  1. [MFC] Gestion d'un bus GPIB
    Par angeromudelparis dans le forum MFC
    Réponses: 8
    Dernier message: 04/10/2005, 12h25
  2. Programmation du bus PCI
    Par mikevador02 dans le forum Assembleur
    Réponses: 8
    Dernier message: 11/03/2004, 14h56
  3. [Windows CE] Gestion du bus ISA
    Par Guilhem dans le forum MFC
    Réponses: 7
    Dernier message: 10/03/2004, 15h36
  4. [TP] Gestion des bus PCI en pascal
    Par prodexys dans le forum Turbo Pascal
    Réponses: 12
    Dernier message: 18/04/2003, 22h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo