Close

Senzor vlhkosti a teploty SHT15

V tomto návodu si představíme, jak se dá použít senzor SHT15 s Arduinem.

SHT15 je jednoduchý senzor, který v sobě kombinuje teploměr a vlhkoměr. Příjemně překvapí svojí přesností a nízkou spotřebou, je však poměrně drahý. Podobný senzor s daleko lepší cenou je snímač teploty a vlhkosti DHT22.

SHT15

SHT15

Ke komunikaci s Arduinem používá two-wire sběrnici (podobná I2C). Na rozdíl od I2C je o něco pomalejší, na druhou stranu můžete pro připojení použít libovolné dva piny, a ne pouze vyhrazené (jak tomu je u I2C). Arduino se senzorem propojíme podle obrázku.

Připojení SHT15 k Arduinu

Připojení SHT15 k Arduinu

Pozor!
Pro správné určení vlhkosti by neměl senzor přijít do styku s vodou.
Podle dokumentace by měl být po připájení pinů senzor minimálně 12 hodin v prostředí s vlhkostí větší než 75%, aby se polymer, který se používá k určování vlhkosti, stihl rehydratovat. V opačném případě může být měření nepřesné. Dané vlhkosti by se mělo dát dosáhnout tak, že umístíte navlhčený kapesník do pytlíku se senzorem. Pozor ale, aby se senzor kapesníku NEDOTÝKAL. Druhou možností je nechat senzor na déle než pět dní v prostředí s vlhkostí větší než 40%.

//Based of the wiring code at http://wiring.org.co/learning/basics/humiditytemperaturesht15.html

int SHT_clockPin = 3;  // pin used for clock
int SHT_dataPin  = 2;  // pin used for data

void setup(){
  Serial.begin(9600); // open serial at 9600 bps
}

void loop(){
  //these can take a bit to get the values (100ms or so)
  float temperature = getTemperature();
  float humidity = getHumidity();

  Serial.print(temperature);
  Serial.print(" | ");
  Serial.println(humidity);

}

float getTemperature(){
  //Return Temperature in Celsius
  SHT_sendCommand(B00000011, SHT_dataPin, SHT_clockPin);
  SHT_waitForResult(SHT_dataPin);

  int val = SHT_getData(SHT_dataPin, SHT_clockPin);
  SHT_skipCrc(SHT_dataPin, SHT_clockPin);
  return (float)val * 0.01 - 40; //convert to celsius
}

float getHumidity(){
  //Return  Relative Humidity
  SHT_sendCommand(B00000101, SHT_dataPin, SHT_clockPin);
  SHT_waitForResult(SHT_dataPin);
  int val = SHT_getData(SHT_dataPin, SHT_clockPin);
  SHT_skipCrc(SHT_dataPin, SHT_clockPin);
  return -4.0 + 0.0405 * val + -0.0000028 * val * val; 
}


void SHT_sendCommand(int command, int dataPin, int clockPin){
  // send a command to the SHTx sensor
  // transmission start
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  digitalWrite(dataPin, HIGH);
  digitalWrite(clockPin, HIGH);
  digitalWrite(dataPin, LOW);
  digitalWrite(clockPin, LOW);
  digitalWrite(clockPin, HIGH);
  digitalWrite(dataPin, HIGH);
  digitalWrite(clockPin, LOW);

  // shift out the command (the 3 MSB are address and must be 000, the last 5 bits are the command)
  shiftOut(dataPin, clockPin, MSBFIRST, command);

  // verify we get the right ACK
  digitalWrite(clockPin, HIGH);
  pinMode(dataPin, INPUT);

  if (digitalRead(dataPin)) Serial.println("ACK error 0");
  digitalWrite(clockPin, LOW);
  if (!digitalRead(dataPin)) Serial.println("ACK error 1");
}


void SHT_waitForResult(int dataPin){
  // wait for the SHTx answer
  pinMode(dataPin, INPUT);

  int ack; //acknowledgement

  //need to wait up to 2 seconds for the value
  for (int i = 0; i < 1000; ++i){
    delay(2);
    ack = digitalRead(dataPin);
    if (ack == LOW) break;
  }

  if (ack == HIGH) Serial.println("ACK error 2");
}

int SHT_getData(int dataPin, int clockPin){
  // get data from the SHTx sensor

  // get the MSB (most significant bits)
  pinMode(dataPin, INPUT);
  pinMode(clockPin, OUTPUT);
  byte MSB = shiftIn(dataPin, clockPin, MSBFIRST);

  // send the required ACK
  pinMode(dataPin, OUTPUT);
  digitalWrite(dataPin, HIGH);
  digitalWrite(dataPin, LOW);
  digitalWrite(clockPin, HIGH);
  digitalWrite(clockPin, LOW);

  // get the LSB (less significant bits)
  pinMode(dataPin, INPUT);
  byte LSB = shiftIn(dataPin, clockPin, MSBFIRST);
  return ((MSB << 8) | LSB); //combine bits
}

void SHT_skipCrc(int dataPin, int clockPin){
  // skip CRC data from the SHTx sensor
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  digitalWrite(dataPin, HIGH);
  digitalWrite(clockPin, HIGH);
  digitalWrite(clockPin, LOW);
}

Článek byl převzat z webu bildr.com a mírně upraven.
Senzor SHT15 můžete zakoupit zde.

Dále by se také mohlo hodit:
Arduino UNO Rev3
Mini Breadboard
Vodiče k Breadboardu

Zbyšek Voda

2 Comments on “Senzor vlhkosti a teploty SHT15

Oldřich Horáček
22.2.2015 at 17:48

Zdravím Radime,

souhlasím s tím, že cena modulu SHT15 není bohužel zrovna příznivá. Je to hlavně proto, že přesnost tohoto snímače teploty a vlhkosti je opravdu slušná a taky je to Sparkfun kvalita. Pokud se člověk spokojí s běžnou přesností, pak mohu doporučit kombinovaný snímač teploty a vlhkosti RHT03.
http://www.hwkitchen.com/products/humidity-and-temperature-sensor-dht22-/
Cena je oproti SHT15 skoro čtvrtinová.
Ohledně snímače, který doporučujete se jedná o zajímavou alternativu.
Pokoušeli jsme se v katalogu hwkitchen dříve nabízet zboží z DX, ale měli jsme problém s kvalitou zboží. Kvalita hodně kolísala a zboží se vracelo v záruční době. Zboží mělo také více problémů s ESD.
Proto se na eshopu http://www.hwkitchen.com orientujeme především na originální Arduino komponenty a součástky od firem jako Sparkfun, Seeedstudio, Elecfreaks, Secret Labs, Mbed, Linksprite. Pokud máme opravdu garantovat záruku 2 roky, což samozřejmě garantujeme, tak je pro nás výběr kvalitních dodavatelů základ.
Samozřejmě když něco stojí na DX zlomek ceny a chci si s tím jen pohrát a je mi jedno jestli to shoří, tak to může být z hlediska ceny zajímavé :-).

S pozdravem
Oldřich

Radim
20.2.2015 at 17:13

Napsat komentář