elektrik port üyelik servisleri elektrik port üyelik servisleri

Arduino ile SHT15 Nem Sensörü

SHT15 tümüyle nem ölçümü için ayarlanmış dijital bir nem sensörüdür. Aslında burada sıcaklıkla bağlantılı olarak bağıl nem ölçümü yapıyoruz. SHT15 sensörü kendi içinde yerleşik bir dijital termometreye sahip. Bu özelliğinden dolayı içinde yerleşik termometre bulundurmayan sensörlere göre kullanması daha kolay.



A- A+
14.02.2015 tarihli yazı 2872 kez okunmuştur.
Devre Tasarımı
 

SHT15 iletişim için I2C ile benzerlik bulunan iki kablolu bir bağlantı kullanır. Dolayısıyla bunu için Arduinomuzun bölmelerini kullanmayacağız. Artı ve eksi özelliklerine de değinecek olursak, artı tarafı herhangi 2 dijital pine bağlayabiliyor olmamız, eksi tarafı ise sensörün değerleri okunmasının biraz uzun sürmesi. Biz bu bağlantıyı kurarken Arduinomuzda bulunan pin 2 ve 3 ü kullanacağız.
 



Ayarlamalar
 

Lehimlemeden Önce:
 

Bu board kesinlikle yıkanmamalı. Yani eğer flaks ya da normalde temizleyebildiğiniz lehim kullanıyorsanız kesinlikle bu proje için kullanmayın.( Temizlemeye gerek olmayan lehim kullanmanız her bakımdan daha iyi olacaktır.) Ve kesinlikle boardunuzu ıslatmamaya özen gösterin.

 

Lehimledikten Sonra:


Sensörden daha net değerler alabilmek için en az 12 saat % 75 nem bulunan bir ortamda muhafaza etmelisiniz böylece polimerlere Rehidre olmasına izin vermiş olursunuz. Eğer bu işlemi es geçerseniz SHT15 sensörünüz çevre koşullarına maruz kaldığında yavaşça kaybolan ofset bir değer okuyabilir. Rehidrasyon işlemini başka şekillerde de gerçekleştirebilirsiniz örneğin nem oranı %40 dan fazla bir ortamda 5 gün ya da daha fazla bekleterek de bu işlemi sağlayabilirsiniz.

 

 İlginizi Çekebilir : Arduino İle AVR Programlama


 

Programlama


Bu uygulama için kodumuz dijital sensörlerin büyük çoğunluğunda olduğu gibi biraz karışık, fakat kodun kısımları güzel ayrılmış ve okuması olabildiğince kolaylaştırılmış.


Not: Sensörün okuduğu değerleri döndürmesi biraz uzun sürüyor (100+ ms kadar).


İşte kodumuz:

 

//http://wiring.org.co/learning/basics/humiditytemperaturesht15.htm sitesindeki kablo bağlantı kodu esas alınmıştır.

 

int SHT_clockPin = 3;  // saat için kullanılan pin

int SHT_dataPin  = 2;  // veri için kullanılan pin

 

void setup(){

  Serial.begin(9600); // seriyi 9600 bps de açın

}

 

void loop(){

  //bunlar değerleri almamızı biraz uzatıyor  (100ms civarı)

  float temperature = getTemperature();

  float humidity = getHumidity();

 

  Serial.print(temperature);

  Serial.print(" | ");

  Serial.println(humidity);

 

}

 

float getTemperature(){

  //Santigrat cinsinden sıcaklığı geri döndürür

  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; //Santigrata dönüştürür

}

 

float getHumidity(){

  //Bağıl Nemi döndürür

  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){

  // SHTx sensörüne komutu gönderir

  // iletimi başlatır.

  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);

 

  // komutu dışarıya kaydırır (3 MSB adreslerdir ve 000 olmalı, son 5 bit komutlardır)

  shiftOut(dataPin, clockPin, MSBFIRST, command);

 

  // doğru ACK yı aldığımız tasdikler

  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){

  // SHTx in cevap vermesi için bekler

  pinMode(dataPin, INPUT);

 

  int ack; //acknowledgement

 

  //değer için 2 saniye kadar bekler

  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){

  // SHTx sensöründen veriyi alır

 

  // MSB (çok önemli bitleri) yi alır

  pinMode(dataPin, INPUT);

  pinMode(clockPin, OUTPUT);

  byte MSB = shiftIn(dataPin, clockPin, MSBFIRST);

 

  // gerekli ACK yı gönderir

  pinMode(dataPin, OUTPUT);

  digitalWrite(dataPin, HIGH);

  digitalWrite(dataPin, LOW);

  digitalWrite(clockPin, HIGH);

  digitalWrite(clockPin, LOW);

 

  //  LSB (az önemli bitleri) yi alır

  pinMode(dataPin, INPUT);

  byte LSB = shiftIn(dataPin, clockPin, MSBFIRST);

  return ((MSB << 8) | LSB); // bitleri birleştirir

}

 

void SHT_skipCrc(int dataPin, int clockPin){

  // SHTx sensöründen alınan CRC veriyi es geçer

  pinMode(dataPin, OUTPUT);

  pinMode(clockPin, OUTPUT);

  digitalWrite(dataPin, HIGH);

  digitalWrite(clockPin, HIGH);

  digitalWrite(clockPin, LOW);

}


Kaynak:

►bildr.org

Fatih YÖRÜK Fatih YÖRÜK Yazar Hakkında Tüm yazıları Mesaj gönder Yazdır



ANKET
Endüstri 4.0 için En Hazır Sektör Hangisidir

Sonuçlar