lib_SHT11
Dependents: lib_SHT11_example libs_YSI_example
Revision 0:6b657f74b4e4, committed 2017-06-06
- 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