Projet à microcontrôleur PIC 16F628A

Thermomètre numérique à capteur numérique DS1620


Il s'agit d'un thermomètre électronique avec affichage de la température sur un module LCD alphanumérique.

La température ambiante est mesurée toutes les 840 ms avec un capteur numérique DS1620, de la société Analog devices (à l'origine Dallas Semiconductor).

Un bouton poussoir permet de passer à un deuxième écran qui indique les températures maximale et minimale :

Ecran n°1 :

Ecran n°2 :

Un second bouton poussoir réinitialise la fonction température min/max.

 

En option, on peut connecter la carte sur un ordinateur (via une liaison RS232).

La température est transférée vers l'ordinateur (c'est un microcontrôleur 16F628A qui gère les communications côté carte).

Une application Windows affiche la température en temps réel et fournit un graphe déroulant de la température.

D'autre part, l'application Windows permet de programmer les deux températures de seuil de la fonction thermostat du DS1620.

 

Version n°1 : sans liaison RS232

Version n°2 : avec l'option liaison RS232

N.B. Le code source du microcontrôleur est le même, avec ou sans liaison RS232.

 

5-1- Sans liaison RS232

A la mise sous tension, le microcontrôleur 16F628A configure le capteur de température DS1620 (instruction Write Config avec CPU = 1 et 1SHOT = 0, puis instruction Start Convert T) et configure le module LCD alphanumérique (instruction Set Function pour une utilisation en mode d'interface 4 bits).

Le module Timer1 (16 bits) du microcontrôleur 16F628A est activé, ce qui donne lieu à une interruption toutes les 105 ms environ.

A chaque interruption du Timer1, l'état du bouton poussoir SELECTION ECRAN et du bouton poussoir RESET MIN/MAX est testé.

Toutes les 8 interruptions du Timer1 (soit environ 840 ms), une lecture de la température est effectuée, et l'affichage du module LCD alphanumérique est mis à jour :

Ecran n°1 :

Ecran n°2 :

 

5-2- Avec liaison RS232

Par rapport au fonctionnement sans liaison RS232, deux interruptions s'ajoutent :

- L'interruption de réception de l'UART (qui signale au microcontrôleur 16F628A qu'il a reçu des données de l'ordinateur via la liaison RS232)

- L'interruption d'émission de l'UART (qui signale au microcontrôleur 16F628A que l'UART est prêt à émettre des données vers l'ordinateur)

Il faut bien sûr un ordinateur qui possède un port COM, reconnaissable par son connecteur SubD 9 broches mâle.

Il faut brancher un câble "null-modem" (câble croisé) entre l'ordinateur et la carte.

Si vous n'en avez pas, vous pouvez facilement en faire un (il faut 3 fils et 2 connecteurs SubD 9 broches femelle).

 

 

Instruction

DS1620

1er octet (code instruction)
2ème octet (données)
3ème octet (données)
Read Temperature (toutes les 1000 ms)
0xAA
0x00 (non utilisé)
0x00 (non utilisé)
Read TH (lecture de la température haute du thermostat)
0xA1
0x00 (non utilisé)
0x00 (non utilisé)
Read TL (lecture de la température basse du thermostat)
0xA2
0x00 (non utilisé)
0x00 (non utilisé)
Write TH (écriture de la température haute du thermostat)
0x01
(0000000 D8)
(D7 ... D0)
Write TL (écriture de la température basse du thermostat)
0x02
(0000000 D8)
(D7 ... D0)

 

Une fois reçus, le PIC transmet l'instruction vers le DS1620 (via les 3 fils du port série synchrone).

Dans le cas d'une instruction de lecture (Read Temperature, Read TH, Read TL) le thermomètre DS1620 renvoie les données vers le PIC (température sous la forme d'un nombre binaire 9 bits, codé en complément à 2).

Ce nombre est envoyé tel quel vers l'ordinateur sous la forme de 2 octets :

D0 = bit de poids faible

Pour les autres instructions, le PIC envoie deux octets 0x00 à l'ordinateur (via la liaison RS232).

Instruction

DS1620

1er octet (données)
2ème octet (données)
Read Temperature (toutes les 1000 ms)
(0000000 D8)
(D7 ... D0)
Read TH (lecture de la température haute du thermostat)
(0000000 D8)
(D7 ... D0)
Read TL (lecture de la température basse du thermostat)
(0000000 D8)
(D7 ... D0)
Write TH (écriture de la température haute du thermostat)
0x00 (non utilisé)
0x00 (non utilisé)
Write TL (écriture de la température basse du thermostat)
0x00 (non utilisé)
0x00 (non utilisé)

 

0xAA = code de l'instruction Read Temperature

0x00 0x2D = 0 0010 1101 = 45 = +22,5 °C

10101010 = 0xAA = code de l'instruction Read Temperature

0 00101101 = 0x2D = 45 = +22,5 °C

 


Procédure d'utilisation

-> Brancher le câble "null-modem" entre l'ordinateur et la carte (hors tension)

Attention : l'utilisation d'un adaptateur USB <-> port COM semble poser problème !

-> Mettre la carte sous tension

-> Ouvrir l'application DS1620_104.exe

-> Configurer les paramètres de la liaison RS232C :

-> Ouvrir le port

La température actuelle doit s'afficher (avec une mise à jour toutes les 1000 ms).

 

Il y a la possibilité de sauvegarder les données dans un fichier texte :

Ce fichier peut ensuite être exploité avec un tableur...


Code source de l'application

Cette application a été écrite en C++ avec l'environnement de développement Borland Builder 5.

L'application fonctionne sous Windows XP (au moment de l'écriture du code), et plus récemment sous Windows 10.

N.B. Borland Builder 5 nécessite l'installation du composant TComPort (la version 2.64 est suffisante) pour la gestion de la liaison RS232 :

  • Télécharger le code source de l'application DS1620_104.exe 224 ko
  •  

     

    Voici deux VI que j'ai écrit avec LabVIEW 5 :

    Notez que ces VI fonctionnent également avec la version 6 de LabVIEW.

     




    Version de Python : 2.7
    Testé avec Windows et Linux/Ubuntu
    Le script nécessite le package pyserial  (téléchargement et procédure d'installation ici).

    Code source :
    # (C) Fabrice Sincere
    # python 2.7

    # communication RS232 avec un thermomètre numérique à capteur numérique DS1620
    # http://fabrice.sincere.free.fr/cm_electronique/projet_pic/thermometreLCD_DS1620htm/thermometreLCD_DS1620.htm

    # test : OK (linux/ubuntu + winXP)

    import time
    import serial # librairie externe pyserial

    print 'Communication avec le port COM'

    filename = 'temperature.txt'
    print '\nFichier de sauvegarde : '+filename
    Fichier = open(filename,'a')

    # biblio pyserial :
    # http://pyserial.sourceforge.net/shortintro.html
    # http://pyserial.sourceforge.net/pyserial_api.html

    Port = serial.Serial()

    Port.baudrate = 9600
    Port.bytesize=8
    Port.parities=0
    Port.stopbits=1
    Port.xonxoff=0
    Port.rtscts=0
    Port.timeout=0.1 # en seconde

    print """
    # Sous Windows :
    # COM1 -> 0 (ou COM1)
    # COM2 -> 1 (ou COM2)

    # Sous Linux :
    # COM1 -> 0 (ou /dev/ttyS0)
    # COM2 -> 1 (ou /dev/ttyS1)
    """

    nomport = raw_input('Nom du port COM ? ')
    try:
    int(nomport)
    Port.port = int(nomport)
    except:
    Port.port = nomport

    print 'Port ->',Port.portstr,'\n'

    Port.open()

    try:
    while True:
    # écriture
    Port.write('\xAA\x00\x00')

    # lecture
    MSB = Port.read() # octet de poids fort
    LSB = Port.read() # octet de poids faible

    if (MSB !='' and LSB != ''):
    temperature = ord(LSB) + 256* ord(MSB)
    if temperature >= 256:
    temperature = temperature - 512
    temperature *= 0.5
    affichage = time.strftime('%H:%M:%S',time.localtime()) + ' '+ str(temperature) +' °C'
    print affichage
    Fichier.write(affichage+'\n')

    # pause 1 seconde
    time.sleep(1.0)

    except KeyboardInterrupt:
    # CTRL + C
    print "\nCTRL+C\nFermeture du port",Port.portstr
    Port.close()
    Fichier.close()

    Exécution du script :

    >>> 
    Communication avec le port COM

    Fichier de sauvegarde : temperature.txt

    # Sous Windows :
    # COM1 -> 0 (ou COM1)
    # COM2 -> 1 (ou COM2)

    # Sous Linux :
    # COM1 -> 0 (ou /dev/ttyS0)
    # COM2 -> 1 (ou /dev/ttyS1)

    Nom du port COM ? 0
    Port -> COM1

    09:15:28 19.5 °C
    09:15:29 19.5 °C
    09:15:30 19.5 °C
    09:15:31 19.5 °C
    09:15:32 19.5 °C
    09:15:33 19.5 °C
    09:15:34 20.0 °C
    09:15:35 20.0 °C
    09:15:36 20.0 °C
    09:15:37 20.0 °C
    09:15:38 20.0 °C
    09:15:39 20.0 °C

    CTRL+C
    Fermeture du port COM1
    >>>

    Télécharger le script Python 2.7

    Télécharger le script Python 3



    La communication entre la carte à microcontrôleur et l'ordinateur (équipé du système d'exploitation GNU/Linux) peut se faire simplement avec la console de commande (le shell de Linux).
    Pour cela, nous allons utiliser deux scripts bash :
    Ces scripts ont été testés avec succès avec plusieurs distributions Linux : Ubuntu, Mandriva et Puppy.
    Ces scripts sont élémentaires : on peut faire des choses beaucoup plus puissantes !



    1er script bash
    (fichier DS1620_reception.sh) :

    #!/bin/bash
    # script bash pour Linux
    # (C) Fabrice Sincère ; Révision 1.0.1
    # communication RS232 (port COM) entre un ordinateur et une carte à microcontrôleur PIC

    clear

    # détection des ports COM de l'ordinateur
    message='Commande : dmesg | grep tty'
    echo -e "$message\n"

    dmesg | grep tty

    # on configure le port COM1 :
    # 9600 bits/s
    # 8 bits de données
    # pas de bit de parité
    # 1 bit de stop
    # pas de contrôle de flux

    message='Commande : stty -F /dev/ttyS0 9600 cs8 -parenb -parodd -cstopb -ixon cread clocal -crtscts -icanon'
    echo -e "\n$message\n"

    stty -F /dev/ttyS0 9600 cs8 -parenb -parodd -cstopb -ixon cread clocal -crtscts -icanon

    # on affiche les paramètres du port COM1
    message='Commande : stty -a -F /dev/ttyS0'
    echo -e "$message\n"

    stty -a -F /dev/ttyS0

    message='Dans une deuxième console, exécuter le script DS1620_emission.sh'
    echo -e "\n*****************************************************************"
    echo -e "$message"
    echo -e "*****************************************************************\n"

    # les données reçues par l'ordinateur sont enregistrées en temps réel dans un fichier
    message='Commande : cat /dev/ttyS0 > temperature.dat'
    echo -e "$message\n"

    cat  /dev/ttyS0 > temperature.dat


    Dans la console, l'exécution de ce script bash donne :

    $    ./DS1620_reception.sh
    Commande : dmesg | grep tty

    [    0.000000] console [tty0] enabled
    [    0.573305] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
    [    0.573406] serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
    [    0.573739] 00:09: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
    [    0.573872] 00:0a: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A

    Commande : stty -F /dev/ttyS0 9600 cs8 -parenb -parodd -cstopb -ixon cread clocal -crtscts -icanon

    Commande : stty -a -F /dev/ttyS0

    speed 9600 baud; rows 0; columns 0; line = 0;
    intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
    eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
    werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
    -parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
    -ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff
    -iuclc -ixany -imaxbel -iutf8
    -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
    -isig -icanon iexten echo echoe -echok -echonl -noflsh -xcase -tostop -echoprt
    echoctl echoke

    *****************************************************************
    Dans une deuxième console, exécuter le script DS1620_emission.sh
    *****************************************************************

    Commande : cat /dev/ttyS0 > temperature.dat



    2ème script bash
    (fichier DS1620_emission.sh) :

    #!/bin/bash
    # script bash pour Linux
    # (C) Fabrice Sincère ; Révision 1.0.1
    # communication RS232 (port COM) entre un ordinateur et une carte à microcontrôleur PIC


    clear

    message='Dans une autre console, exécuter en premier le script DS1620_reception.sh'
    echo -e "\n**************************************************************************"
    echo -e "$message"
    echo -e "**************************************************************************\n"

    # boucle infinie
    # on envoie 3 octets (0xAA 0x00 0x00) vers le PIC
    # on répète l'opération toutes les 5 secondes
    while [ 1 ]
    do
        message='Emission : echo -e -n  "\xAA\x00\x00" > /dev/ttyS0'
        echo "$message"
        echo -e -n  "\xAA\x00\x00" > /dev/ttyS0

        sleep 5s  
        # on affiche le contenu du fichier de données reçu par l'ordinateur (en hexadécimal)
        echo -e "Réception"
        od -t x1  temperature.dat
    done



    Dans la console, l'exécution de ce script bash donne :


    $    ./DS1620_emission.sh

    **************************************************************************
    Dans une autre console, exécuter en premier le script DS1620_reception.sh
    **************************************************************************

    Emission : echo -e -n  "\xAA\x00\x00" > /dev/ttyS0
    Réception
    0000000 00 32
    0000002
    Emission : echo -e -n  "\xAA\x00\x00" > /dev/ttyS0
    Réception
    0000000 00 32 00 32
    0000004
    Emission : echo -e -n  "\xAA\x00\x00" > /dev/ttyS0
    Réception
    0000000 00 32 00 32 00 32
    0000006
    Emission : echo -e -n  "\xAA\x00\x00" > /dev/ttyS0
    Réception
    0000000 00 32 00 32 00 32 00 33
    0000010
    ...
    ...
    ...

    Les deux derniers octets reçus sont 0x00 et 0x33, ce qui correspond à une température de +25,5 °C.






    Il vous faut un hébergeur Internet, avec services PHP et base de données MySQL.



    11-1- L'application
    locale web_temperature.exe

    supervision de température depuis Internet

    Cette application est exécutée sur la machine locale, où est connectée la carte d'acquisition de température (via le port RS232).
    Elle permet :

    L'application est constituée de deux fichiers :
    Télécharger web_temperature.exe (263 ko)
    Télécharger libmysql.dll (1,0 Mo)



    Cette application a été écrite avec C++ Borland Builder 5.

    Télécharger le code source (222 ko)

    N.B. La communication avec le port COM (RS232) nécessite l'installation du composant TComPort (dont j'ai déjà parlé ci-dessus).

    La communication avec la base de données MySQL nécessite la librairie C libmysql, que vous pouvez télécharger librement sur le site officiel www.mysql.com :

    Rubrique : Downloads
    -> mysql-connector-c-noinstall-6.0.2-win32.zip

    Pour utiliser cette librairie avec C++ Borland Builder 5, voici un lien externe :
    Tutorial : Utilisation de l'API MySQL avec Borland C++ Builder
    Un petit oubli dans ce tutorial : il faudra ajouter libmysql.lib au projet (Projet -> Ajouter  au projet -> libmysql.lib)

    Lien utile : http://fabrice.sincere.free.fr/application_builder5/client_mysql/mysql_client_builder.html


    11-2- Lecture de la température depuis Internet : le script PHP


    Dans votre navigateur Web préféré, la température est disponible en temps réel sur une page Web en php.


    Le script PHP se connecte à la base de données MySQL (
    via le réseau Internet).
    Il
    lit et affiche les informations précédemment écrites par l'application locale (mise à jour toutes les 5 minutes).
    Télécharger le code source du script PHP






    Il vous faut un hébergeur Internet.


    12-1- L'application
    locale web_temperature_ftp.exe


    supervision de température par Internet

    Cette application est exécutée sur la machine locale, où est connectée la carte d'acquisition de température (via le port RS232).
    Elle permet :

    Télécharger web_temperature_ftp.exe (292 ko)

    Cette application a été écrite avec C++ Borland Builder 5.

    Télécharger le code source (15 ko)


    12-2- Lecture de la température depuis Internet


    Dans votre navigateur Web préféré, la température est disponible en temps réel à l'URL :


    http://monsiteweb.fr/web_temperature.txt




     

    Avec liaison RS232 : composants supplémentaires

     

    Dimension : 62 x 100 mm

    Simple face.

    Télécharger le typon

    Remarque :

    On n'oubliera pas les 9 straps (à souder en premier).

     

    Le code source a été écrit en langage assembleur avec l'environnement de développement gratuit MPLAB IDE de Microchip.


    © Fabrice Sincère ; révision 2.4.12
    Contenu sous licence CC BY-NC-SA 3.0