lib_SHT11

Dependents:   lib_SHT11_example libs_YSI_example

lib_SHT11.cpp

Committer:
YSI
Date:
2017-06-06
Revision:
0:6b657f74b4e4

File content as of revision 0:6b657f74b4e4:

/** SHT11 class
*
* @purpose       library for SHT11 humidity and temperature sensor
*
* Utilisée pour mesurer la temperature et l'humidite
*
* https://www.sensirion.com/products/humidity-sensor/
*
* Copyright (c) 2012, cstyles (http://mbed.org)
*
* Exemple:
* @code
* #include "mbed.h"
* #include "lib_SHT11.h" 
* 
* SHT11 capteur_HT;
* //SHT11 capteur_HT(p30, p29, 2.0);   //data, sck, periode_cycle_mesure
* Serial pc(USBTX, USBRX);
* 
* int main()
* {
*     float Temperature_mesuree=0.0, Humidite_mesuree=0.0;
* 
*     while(1)
*     {
*         if((Temperature_mesuree != capteur_HT.lire_T()) || (Humidite_mesuree != capteur_HT.lire_H()))
*         {
*             capteur_HT.lire_T_H(&Temperature_mesuree, &Humidite_mesuree);
*             pc.printf("T=%f\tH=%f\r\n", Temperature_mesuree, Humidite_mesuree);
*         }
*     }
* }
* @endcode
* @file          lib_SHT11.cpp 
* @date          Jun 2012
* @author        Yannic Simon
*/

#include "lib_SHT11.h"


SHT11::SHT11(PinName pin_DATA, PinName pin_SCK, float T_C_mesure) : DATA_HT(pin_DATA), SCK_HT(pin_SCK), Temps_cycle_mesure(T_C_mesure)
{
    if(Temps_cycle_mesure < 2)  Temps_cycle_mesure = 2;
    init();
}

void SHT11::start(void)
{
    DATA_HT.output();
    DATA_HT=1;
    SCK_HT=0;
    wait_us(1);
    SCK_HT=1;
    wait_us(1);
    DATA_HT=0;
    wait_us(1);
    SCK_HT=0;
    wait_us(1);
    SCK_HT=1;
    wait_us(1);
    DATA_HT=1;
    wait_us(1);
    SCK_HT=0;
    wait_us(1);
    DATA_HT=0;
}

void SHT11::changer_timer_cycle(float new_Temps_cycle_mesure)
{
    if(new_Temps_cycle_mesure < 2)  Temps_cycle_mesure = 2;
    else Temps_cycle_mesure = new_Temps_cycle_mesure;
    if(etat_cycle)  desactiver();   init();
}

void SHT11::init(void)
{
//          ____________________________________________  
// DATA_HT                                              |__
//            __   __   __   __   __   __   __   __   __
// SCK_HT   _|  |_|  |_|  |_|  |_|  |_|  |_|  |_|  |_|  |_
    unsigned char i;
    DATA_HT.output();
    DATA_HT=1;
    SCK_HT=0;
    for (i=0;i<9;i++)
    {
        SCK_HT=1;
        wait_us(1);
        SCK_HT=0;
        wait_us(1);
    }
        etat_sht11=0;
        etat_cycle=1;
        Timer_cycle_mesure.attach(callback(this, &SHT11::gestion_HT), Temps_cycle_mesure);
}

void SHT11::desactiver(void)
{
        etat_cycle=0;
        Timer_cycle_mesure.detach();
}

void SHT11::demande_mesure(short octet_de_commande)
{
    unsigned int i;

    DATA_HT.output();
    for(i=0;i<8;i++)
    {              
        if ((octet_de_commande)&(0x80)) DATA_HT=1;
        else DATA_HT=0;
        wait_us(1);
        SCK_HT=1;
        wait_us(1);
        SCK_HT=0;
        octet_de_commande=octet_de_commande*2;
    }
    DATA_HT.input();
    wait_us(1);
    SCK_HT=1;
    wait_us(1);
    SCK_HT=0;
    wait_us(1);
    DATA_HT.output();
    DATA_HT=1;
    DATA_HT.input();
}

void SHT11::mesure_T(void)
{
    start();
    demande_mesure(3);
}

void SHT11::mesure_H(void)
{
    start();
    demande_mesure(5);
}

void SHT11::calcul_Temperature_Humidite(void)
{
    Temperature_mesuree=(Temperature*0.01-40);
    Humidite_mesuree=((float)Temperature_mesuree-25.0)*(0.01+(0.00008*Humidite))-4+0.0405*Humidite-0.0000028*Humidite*Humidite;
}

void SHT11::reception_mesure_T(void)
{
    unsigned int i;
    Temperature=0;

        DATA_HT.input();
    for (i=0;i<8;i++)
    {
        SCK_HT=1;
        wait_us(1);
        Temperature *=2;
        if (DATA_HT==1) Temperature++;
        SCK_HT=0;
        wait_us(1);
    }
    DATA_HT.output();
    DATA_HT=0;
    SCK_HT=1;
    wait_us(1);
    SCK_HT=0;
    wait_us(1);
    DATA_HT.input();
    for (i=0;i<8;i++)
    {
        SCK_HT=1;
        wait_us(1);
        Temperature *=2;
        if (DATA_HT==1) Temperature++;
        SCK_HT=0;
        wait_us(1);
    }
    DATA_HT.output();
    DATA_HT=1;
    SCK_HT=1;
    wait_us(1);
    SCK_HT=0;
    wait_us(1);
}

void SHT11::reception_mesure_H(void)
{
    unsigned int i;
    Humidite=0;

        DATA_HT.input();
    for (i=0;i<8;i++)
    {
        SCK_HT=1;
        wait_us(1);
        Humidite *=2;
        if (DATA_HT==1) Humidite++;
        SCK_HT=0;
        wait_us(1);
    }
    DATA_HT.output();
    DATA_HT=0;
    SCK_HT=1;
    wait_us(1);
    SCK_HT=0;
    wait_us(1);
    DATA_HT.input();
    for (i=0;i<8;i++)
    {
        SCK_HT=1;
        wait_us(1);
        Humidite *=2;
        if (DATA_HT==1) Humidite++;
        SCK_HT=0;
        wait_us(1);
    }
    DATA_HT.output();
    DATA_HT=1;
    SCK_HT=1;
    wait_us(1);
    SCK_HT=0;
    wait_us(1);
}

void SHT11::gestion_HT(void)
{   
    switch (etat_sht11)
    {
        case 0:
        Timer_cycle_mesure.detach();
        mesure_T();
        etat_sht11=1;
        Timer_cycle_mesure.attach_us(callback(this, &SHT11::gestion_HT), 10000);
        break;
        
        case 1:
        DATA_HT.input();
        if (DATA_HT==0)
        {
            Timer_cycle_mesure.detach();
            etat_sht11=2;
            Timer_cycle_mesure.attach_us(callback(this, &SHT11::gestion_HT), 1);
        }
        break;
        
        case 2:
        Timer_cycle_mesure.detach();
        reception_mesure_T();
        etat_sht11=3;
        Timer_cycle_mesure.attach_us(callback(this, &SHT11::gestion_HT), 1);
        break;
        
        case 3:
        Timer_cycle_mesure.detach();
        mesure_H();
        etat_sht11=4;
        Timer_cycle_mesure.attach_us(callback(this, &SHT11::gestion_HT), 10000);
        break;
        
        case 4:
        DATA_HT.input();
        if (DATA_HT==0)
        {
            Timer_cycle_mesure.detach();
            etat_sht11=5;
            Timer_cycle_mesure.attach_us(callback(this, &SHT11::gestion_HT), 1);
        }
        break;

        case 5:
        Timer_cycle_mesure.detach();
        reception_mesure_H();
        calcul_Temperature_Humidite();
        etat_sht11=0;
        Timer_cycle_mesure.attach(callback(this, &SHT11::gestion_HT), Temps_cycle_mesure);
        break;

        default:
        etat_sht11=0;
        break;
    }
}

float SHT11::lire_T(void)
{
    return Temperature_mesuree;
}

float SHT11::lire_H(void)
{
    return Humidite_mesuree;
}

void SHT11::lire_T_H(float *pointeur_Temperature, float *pointeur_Humidite)
{
    *pointeur_Temperature = Temperature_mesuree;
    *pointeur_Humidite = Humidite_mesuree;
}