Y SI / lib_SHT11

Dependents:   lib_SHT11_example libs_YSI_example

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers lib_SHT11.cpp Source File

lib_SHT11.cpp

Go to the documentation of this file.
00001 /** SHT11 class
00002 *
00003 * @purpose       library for SHT11 humidity and temperature sensor
00004 *
00005 * Utilisée pour mesurer la temperature et l'humidite
00006 *
00007 * https://www.sensirion.com/products/humidity-sensor/
00008 *
00009 * Copyright (c) 2012, cstyles (http://mbed.org)
00010 *
00011 * Exemple:
00012 * @code
00013 * #include "mbed.h"
00014 * #include "lib_SHT11.h" 
00015 * 
00016 * SHT11 capteur_HT;
00017 * //SHT11 capteur_HT(p30, p29, 2.0);   //data, sck, periode_cycle_mesure
00018 * Serial pc(USBTX, USBRX);
00019 * 
00020 * int main()
00021 * {
00022 *     float Temperature_mesuree=0.0, Humidite_mesuree=0.0;
00023 * 
00024 *     while(1)
00025 *     {
00026 *         if((Temperature_mesuree != capteur_HT.lire_T()) || (Humidite_mesuree != capteur_HT.lire_H()))
00027 *         {
00028 *             capteur_HT.lire_T_H(&Temperature_mesuree, &Humidite_mesuree);
00029 *             pc.printf("T=%f\tH=%f\r\n", Temperature_mesuree, Humidite_mesuree);
00030 *         }
00031 *     }
00032 * }
00033 * @endcode
00034 * @file          lib_SHT11.cpp 
00035 * @date          Jun 2012
00036 * @author        Yannic Simon
00037 */
00038 
00039 #include "lib_SHT11.h"
00040 
00041 
00042 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)
00043 {
00044     if(Temps_cycle_mesure < 2)  Temps_cycle_mesure = 2;
00045     init();
00046 }
00047 
00048 void SHT11::start(void)
00049 {
00050     DATA_HT.output();
00051     DATA_HT=1;
00052     SCK_HT=0;
00053     wait_us(1);
00054     SCK_HT=1;
00055     wait_us(1);
00056     DATA_HT=0;
00057     wait_us(1);
00058     SCK_HT=0;
00059     wait_us(1);
00060     SCK_HT=1;
00061     wait_us(1);
00062     DATA_HT=1;
00063     wait_us(1);
00064     SCK_HT=0;
00065     wait_us(1);
00066     DATA_HT=0;
00067 }
00068 
00069 void SHT11::changer_timer_cycle(float new_Temps_cycle_mesure)
00070 {
00071     if(new_Temps_cycle_mesure < 2)  Temps_cycle_mesure = 2;
00072     else Temps_cycle_mesure = new_Temps_cycle_mesure;
00073     if(etat_cycle)  desactiver();   init();
00074 }
00075 
00076 void SHT11::init(void)
00077 {
00078 //          ____________________________________________  
00079 // DATA_HT                                              |__
00080 //            __   __   __   __   __   __   __   __   __
00081 // SCK_HT   _|  |_|  |_|  |_|  |_|  |_|  |_|  |_|  |_|  |_
00082     unsigned char i;
00083     DATA_HT.output();
00084     DATA_HT=1;
00085     SCK_HT=0;
00086     for (i=0;i<9;i++)
00087     {
00088         SCK_HT=1;
00089         wait_us(1);
00090         SCK_HT=0;
00091         wait_us(1);
00092     }
00093         etat_sht11=0;
00094         etat_cycle=1;
00095         Timer_cycle_mesure.attach(callback(this, &SHT11::gestion_HT), Temps_cycle_mesure);
00096 }
00097 
00098 void SHT11::desactiver(void)
00099 {
00100         etat_cycle=0;
00101         Timer_cycle_mesure.detach();
00102 }
00103 
00104 void SHT11::demande_mesure(short octet_de_commande)
00105 {
00106     unsigned int i;
00107 
00108     DATA_HT.output();
00109     for(i=0;i<8;i++)
00110     {              
00111         if ((octet_de_commande)&(0x80)) DATA_HT=1;
00112         else DATA_HT=0;
00113         wait_us(1);
00114         SCK_HT=1;
00115         wait_us(1);
00116         SCK_HT=0;
00117         octet_de_commande=octet_de_commande*2;
00118     }
00119     DATA_HT.input();
00120     wait_us(1);
00121     SCK_HT=1;
00122     wait_us(1);
00123     SCK_HT=0;
00124     wait_us(1);
00125     DATA_HT.output();
00126     DATA_HT=1;
00127     DATA_HT.input();
00128 }
00129 
00130 void SHT11::mesure_T(void)
00131 {
00132     start();
00133     demande_mesure(3);
00134 }
00135 
00136 void SHT11::mesure_H(void)
00137 {
00138     start();
00139     demande_mesure(5);
00140 }
00141 
00142 void SHT11::calcul_Temperature_Humidite(void)
00143 {
00144     Temperature_mesuree=(Temperature*0.01-40);
00145     Humidite_mesuree=((float)Temperature_mesuree-25.0)*(0.01+(0.00008*Humidite))-4+0.0405*Humidite-0.0000028*Humidite*Humidite;
00146 }
00147 
00148 void SHT11::reception_mesure_T(void)
00149 {
00150     unsigned int i;
00151     Temperature=0;
00152 
00153         DATA_HT.input();
00154     for (i=0;i<8;i++)
00155     {
00156         SCK_HT=1;
00157         wait_us(1);
00158         Temperature *=2;
00159         if (DATA_HT==1) Temperature++;
00160         SCK_HT=0;
00161         wait_us(1);
00162     }
00163     DATA_HT.output();
00164     DATA_HT=0;
00165     SCK_HT=1;
00166     wait_us(1);
00167     SCK_HT=0;
00168     wait_us(1);
00169     DATA_HT.input();
00170     for (i=0;i<8;i++)
00171     {
00172         SCK_HT=1;
00173         wait_us(1);
00174         Temperature *=2;
00175         if (DATA_HT==1) Temperature++;
00176         SCK_HT=0;
00177         wait_us(1);
00178     }
00179     DATA_HT.output();
00180     DATA_HT=1;
00181     SCK_HT=1;
00182     wait_us(1);
00183     SCK_HT=0;
00184     wait_us(1);
00185 }
00186 
00187 void SHT11::reception_mesure_H(void)
00188 {
00189     unsigned int i;
00190     Humidite=0;
00191 
00192         DATA_HT.input();
00193     for (i=0;i<8;i++)
00194     {
00195         SCK_HT=1;
00196         wait_us(1);
00197         Humidite *=2;
00198         if (DATA_HT==1) Humidite++;
00199         SCK_HT=0;
00200         wait_us(1);
00201     }
00202     DATA_HT.output();
00203     DATA_HT=0;
00204     SCK_HT=1;
00205     wait_us(1);
00206     SCK_HT=0;
00207     wait_us(1);
00208     DATA_HT.input();
00209     for (i=0;i<8;i++)
00210     {
00211         SCK_HT=1;
00212         wait_us(1);
00213         Humidite *=2;
00214         if (DATA_HT==1) Humidite++;
00215         SCK_HT=0;
00216         wait_us(1);
00217     }
00218     DATA_HT.output();
00219     DATA_HT=1;
00220     SCK_HT=1;
00221     wait_us(1);
00222     SCK_HT=0;
00223     wait_us(1);
00224 }
00225 
00226 void SHT11::gestion_HT(void)
00227 {   
00228     switch (etat_sht11)
00229     {
00230         case 0:
00231         Timer_cycle_mesure.detach();
00232         mesure_T();
00233         etat_sht11=1;
00234         Timer_cycle_mesure.attach_us(callback(this, &SHT11::gestion_HT), 10000);
00235         break;
00236         
00237         case 1:
00238         DATA_HT.input();
00239         if (DATA_HT==0)
00240         {
00241             Timer_cycle_mesure.detach();
00242             etat_sht11=2;
00243             Timer_cycle_mesure.attach_us(callback(this, &SHT11::gestion_HT), 1);
00244         }
00245         break;
00246         
00247         case 2:
00248         Timer_cycle_mesure.detach();
00249         reception_mesure_T();
00250         etat_sht11=3;
00251         Timer_cycle_mesure.attach_us(callback(this, &SHT11::gestion_HT), 1);
00252         break;
00253         
00254         case 3:
00255         Timer_cycle_mesure.detach();
00256         mesure_H();
00257         etat_sht11=4;
00258         Timer_cycle_mesure.attach_us(callback(this, &SHT11::gestion_HT), 10000);
00259         break;
00260         
00261         case 4:
00262         DATA_HT.input();
00263         if (DATA_HT==0)
00264         {
00265             Timer_cycle_mesure.detach();
00266             etat_sht11=5;
00267             Timer_cycle_mesure.attach_us(callback(this, &SHT11::gestion_HT), 1);
00268         }
00269         break;
00270 
00271         case 5:
00272         Timer_cycle_mesure.detach();
00273         reception_mesure_H();
00274         calcul_Temperature_Humidite();
00275         etat_sht11=0;
00276         Timer_cycle_mesure.attach(callback(this, &SHT11::gestion_HT), Temps_cycle_mesure);
00277         break;
00278 
00279         default:
00280         etat_sht11=0;
00281         break;
00282     }
00283 }
00284 
00285 float SHT11::lire_T(void)
00286 {
00287     return Temperature_mesuree;
00288 }
00289 
00290 float SHT11::lire_H(void)
00291 {
00292     return Humidite_mesuree;
00293 }
00294 
00295 void SHT11::lire_T_H(float *pointeur_Temperature, float *pointeur_Humidite)
00296 {
00297     *pointeur_Temperature = Temperature_mesuree;
00298     *pointeur_Humidite = Humidite_mesuree;
00299 }