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;
}
Y SI