Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

mcp9808



  1. #1
    daniblue_08

    mcp9808

    Bonjour , actuellement je travail avec un Mbed et un capteur de temperature mcp9808.mais j'arrive pas a comprendre son datasheet pour en faire ma propre librairie en c++et vu que je maitrise pas bien l'anglais j'aimerai savoir si vous pourviez m'aider. merci

    -----


  2. Publicité
  3. #2
    Yoruk

    Re : mcp9808

    Nous donner la fameuse datasheet serait un plus...
    La robotique, c'est fantastique !

  4. #3
    daniblue_08

    Re : mcp9808

    voila la datasheet . merci a vous
    Fichiers attachés Fichiers attachés

  5. #4
    Yoruk

    Re : mcp9808

    C'est un simple protocole i2c.... Les librairies existent toutes faites normalement.
    La robotique, c'est fantastique !

  6. #5
    daniblue_08

    Re : mcp9808

    bonjour yoruk , oui elle existe et fonctione en I2C mais j'aimerais creer moi meme ma propre librairie enfin de comprendre comment le capteur fonctionne pour l'expliquer dans mon projet de fin d'etude car actuellemnt je suis en stage .merci je compte sur vous pour m'eclaisir plus .

  7. A voir en vidéo sur Futura
  8. #6
    Yoruk

    Re : mcp9808

    Bin... trouve de la doc sur le protocole i2c ?? Après la datasheet donne des exemples de code, et elle indique également comment l'info est transmise (quels bits en premier...)
    La robotique, c'est fantastique !

  9. Publicité
  10. #7
    daniblue_08

    Re : mcp9808

    voila un exemple de code ..j'aimerais bien que vous m'epliquer car jai deja un petit apercu:

    Code:
    #include "mbed.h"
    #include "I2C.h"
     
    /* MCP9808 high accuracy temp sensor from adafruit (no address pins pulled up) */ 
    #define MCP9808_REG_TEMP (0x05) // Temperature Register
    #define MCP9808_REG_CONF (0x01) // Configuration Register
    #define MCP9808_ADDR     (0x30) // MCP9808 base address 0x18<<1
     
    I2C i2c(I2C_SDA, I2C_SCL);
     
    DigitalOut myled(LED1);
     
    Serial pc(SERIAL_TX, SERIAL_RX);
     
    volatile char TempCelsiusDisplay[] = "+abc.dd C";
     
    int main()
    {
     
        char data_write[3];
        char data_read[2];
        int tempval;
        
        wait(3);
        pc.printf("PumpHouse mcp9808 test! March 2, 2015  1450\n\r");
        i2c.frequency(10000); // default is 100000
        
        /* Configure the Temperature sensor device MCP9808:
        - Thermostat mode Interrupt not used
        - Fault tolerance: 0
        */
        data_write[0] = MCP9808_REG_CONF;
        data_write[1] = 0x00;  // config msb
        data_write[2] = 0x00;  // config lsb
        int status = i2c.write(MCP9808_ADDR, data_write, 3, 0);
        if (status != 0) { // Error
            pc.printf("  error status = 0x%08x\r\n", status);
            while (1) {
                myled = !myled;
                wait(0.2);
            }
        }
     
        pc.printf("enter forever loop\r\n");
        while (1) {
            // Read temperature register
            data_write[0] = MCP9808_REG_TEMP;
            i2c.write(MCP9808_ADDR, data_write, 1, 1); // no stop
            i2c.read(MCP9808_ADDR, data_read, 2, 0);
     
     // check Ta vs Tcrit
            if((data_read[0] & 0x80)  == 0x80) {
                pc.printf(" temp >= critical ");
            }
            if((data_read[0] & 0x40) == 0x40) {
                pc.printf("   temp > upper limit ");
            }
            if((data_read[0] & 0x20) == 0x20) {
                pc.printf(" temp < lower limit  ");
            }
            if(data_read[0] & 0xE0) {
                pc.printf("\r\n");   
                data_read[0] = data_read[0] & 0x1F;  // clear flag bits
            }
            if((data_read[0] & 0x10) == 0x10) { 
                data_read[0] = data_read[0] & 0x0F;
                TempCelsiusDisplay[0] = '-';
                tempval = 256 - (data_read[0] << 4) + (data_read[1] >> 4);
            } else {
                TempCelsiusDisplay[0] = '+';
                tempval = (data_read[0] << 4) + (data_read[1] >> 4);
            }
     
            // fractional part (0.25°C precision)
            if (data_read[1] & 0x08) {
                if(data_read[1] & 0x04) {
                    TempCelsiusDisplay[5] = '7';
                    TempCelsiusDisplay[6] = '5';
                } else {
                    TempCelsiusDisplay[5] = '5';
                    TempCelsiusDisplay[6] = '0';
                }
            } else {
                if(data_read[1] & 0x04) {
                    TempCelsiusDisplay[5] = '2';
                    TempCelsiusDisplay[6] = '5';
                }else{
                    TempCelsiusDisplay[5] = '0';
                    TempCelsiusDisplay[6] = '0';
                }
            }
     
            // Integer part
            TempCelsiusDisplay[1] = (tempval / 100) + 0x30;
            TempCelsiusDisplay[2] = ((tempval % 100) / 10) + 0x30;
            TempCelsiusDisplay[3] = ((tempval % 100) % 10) + 0x30;
     
            // Display result
            pc.printf("temp = %s\r\n", TempCelsiusDisplay);
            myled = !myled;
            wait(1.0);
        }
     
    }
    Fichiers attachés Fichiers attachés
    Dernière modification par Antoane ; 11/04/2016 à 09h47. Motif: Intégration du code au corps du message

  11. #8
    Yoruk

    Re : mcp9808

    T'expliquer quoi ? Tout ce code ?

    Tu sais programmer en C ou pas ?
    La robotique, c'est fantastique !

  12. #9
    daniblue_08

    Re : mcp9808

    ouppp desolé je n'ai pas été precis pas tout le code mais juste conversion pour obtenir la valeur de la temperature .

  13. #10
    Yoruk

    Re : mcp9808

    La formule pour convertir et récupérer la température est donnée dans la datasheet (page 25)
    La robotique, c'est fantastique !

Sur le même thème :