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.
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
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
- Dünyanın En Görkemli 10 Güneş Tarlası
- Dünyanın En Büyük 10 Makinesi
- 2020’nin En İyi 10 Kişisel Robotu
- Programlamaya Erken Yaşta Başlayan 7 Ünlü Bilgisayar Programcısı
- Üretimin Geleceğinde Etkili Olacak 10 Beceri
- Olağan Üstü Tasarıma Sahip 5 Köprü
- Dünyanın En İyi Bilim ve Teknoloji Müzeleri
- En İyi 5 Tıbbi Robot
- Dünyanın En Zengin 10 Mühendisi
- Üretim için 6 Fabrikasyon İşlemi
- DrivePro Yaşam Döngüsü Hizmetleri
- Batarya Testinin Temelleri
- Enerji Yönetiminde Ölçümün Rolü: Verimliliğe Giden Yol
- HVAC Sistemlerinde Kullanılan EC Fan, Sürücü ve EC+ Fan Teknolojisi
- Su İşleme, Dağıtım ve Atık Su Yönetim Tesislerinde Sürücü Kullanımı
- Röle ve Trafo Merkezi Testlerinin Temelleri | Webinar
- Chint Elektrik Temel DIN Ray Ürünleri Tanıtımı
- Sigma Termik Manyetik Şalterler ile Elektrik Devrelerinde Koruma
- Elektrik Panoları ve Üretim Teknikleri
- Teknik Servis | Megger Türkiye