lib_SHT11

Dependents:   lib_SHT11_example libs_YSI_example

Files at this revision

API Documentation at this revision

Comitter:
YSI
Date:
Tue Jun 06 14:08:27 2017 +0000
Commit message:
lib_SHT11

Changed in this revision

lib_SHT11.cpp Show annotated file Show diff for this revision Revisions of this file
lib_SHT11.h Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 6b657f74b4e4 lib_SHT11.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib_SHT11.cpp	Tue Jun 06 14:08:27 2017 +0000
@@ -0,0 +1,299 @@
+/** 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;
+}
diff -r 000000000000 -r 6b657f74b4e4 lib_SHT11.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib_SHT11.h	Tue Jun 06 14:08:27 2017 +0000
@@ -0,0 +1,126 @@
+/** 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.h 
+* @date          Jun 2012
+* @author        Yannic Simon
+*/
+
+#ifndef DEF_lib_SHT11_H
+#define DEF_lib_SHT11_H
+
+#include "mbed.h"
+
+/** SHT11 class
+ */
+class SHT11 : public Ticker
+{
+public:
+    /** Creer une instance SHT11
+    * sur les pins data, sck avec une periode de mesure de minimum 2sec
+    *
+    * @param pin_DATA par defaut p30
+    * @param pin_SCK par defaut p29
+    * @param T_C_mesure par defaut 2.0
+    */
+    SHT11(PinName pin_DATA = p30, PinName pin_SCK = p29, float T_C_mesure = 2.0);
+
+    /** renvoie la derniere temperature mesuree
+    *
+    * @param aucun
+    * @returns la temperature en degres Celsius
+    */  
+    float lire_T(void);
+    
+    /** renvoie la derniere humidite mesuree
+    *
+    * @param aucun
+    * @returns l'humidite relative
+    */ 
+    float lire_H(void);
+    
+    /** donne les derniere humidite et temperature mesuree
+    *
+    * @param T variable qui sera actualisee avec la temperature
+    * @param H variable qui sera actualisee avec l'humidite
+    * @returns aucun
+    */ 
+    void lire_T_H(float *T, float *H);
+    
+    /** change la periode de mesure du capteur
+    *
+    * @param new_Temps_cycle_mesure (minimum 2sec)
+    * @returns aucun
+    */
+    void changer_timer_cycle(float new_Temps_cycle_mesure);
+    
+    /** initialisation du capteur
+    *
+    * @param aucun
+    * @returns aucun
+    */
+    void init(void);
+    
+    /** desactivation de la mesure du capteur
+    *
+    * @param aucun
+    * @returns aucun
+    */
+    void desactiver(void);
+    
+private:
+    
+    void start(void);
+    void gestion_HT(void);
+    void demande_mesure(short octet_de_commande);
+    void mesure_T(void);
+    void mesure_H(void);
+    void mesure_T_H(void);
+    void reception_mesure_T(void);
+    void reception_mesure_H(void);
+    void calcul_Temperature_Humidite(void);
+
+    DigitalInOut DATA_HT;
+    DigitalOut SCK_HT;
+    Ticker Timer_cycle_mesure;
+
+    unsigned int Temperature;
+    unsigned int Humidite;
+    unsigned int etat_sht11;
+    unsigned int etat_cycle;
+    float Temperature_mesuree;
+    float Humidite_mesuree;
+    float Temps_cycle_mesure;
+};
+
+#endif