2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-13 06:58
HTS221, bağıl nem ve sıcaklık için ultra kompakt kapasitif bir dijital sensördür. Dijital seri arabirimler aracılığıyla ölçüm bilgilerini sağlamak için bir algılama elemanı ve karma sinyal uygulamasına özel entegre devre (ASIC) içerir. Pek çok özellikle entegre edilmiş bu sensör, kritik nem ve sıcaklık ölçümleri için en uygun sensörlerden biridir. İşte arduino nano ile yapılan gösteri.
Adım 1: İhtiyacınız Olan Şey..!
1. Arduino Nano
2. HTS221
3. I²C Kablosu
4. Arduino Nano için I²C Kalkanı
Adım 2: Bağlantılar:
Arduino Nano için bir I2C kalkanı alın ve yavaşça Nano'nun pimlerinin üzerine itin.
Ardından I2C kablosunun bir ucunu HTS221 sensörüne ve diğer ucunu I2C blendajına bağlayın.
Bağlantılar yukarıdaki resimde gösterilmiştir.
Adım 3: Kod:
HTS221 için arduino kodu, github depomuz DCUBE Topluluğundan indirilebilir.
İşte aynısı için bağlantı:
github.com/DcubeTechVentures/HTS221/blob/master/Arduino/HTS221.ino
Sensörün Arduino kartı ile I2c iletişimini kolaylaştırmak için Wire.h kitaplığını ekledik.
Kodu buradan da kopyalayabilirsiniz, aşağıdaki şekilde verilmiştir:
// Özgür irade lisansıyla dağıtılır.
// İlişkili çalışmalarının lisanslarına uyması koşuluyla, istediğiniz şekilde, kârlı veya ücretsiz olarak kullanın.
// HTS221
// Bu kod, HTS221_I2CS I2C Mini Modülü ile çalışmak üzere tasarlanmıştır.
#Dahil etmek
// HTS221 I2C adresi 0x5F
#define Addr 0x5F
geçersiz kurulum()
{
// I2C iletişimini MASTER olarak başlat
Wire.begin();
// Seri iletişimi başlat, baud hızını ayarla = 9600
Seri.başla(9600);
// I2C İletimini Başlat
Wire.beginTransmission(Adr);
// Ortalama konfigürasyon kaydı seç
Wire.write(0x10);
// Sıcaklık ortalama örnekleri = 256, Nem ortalama örnekleri = 512
Wire.write(0x1B);
// I2C İletimini Durdur
Wire.endTransmission();
// I2C İletimini Başlat
Wire.beginTransmission(Adr);
// Kontrol kaydı1'i seç
Wire.write(0x20);
// Güç AÇIK, Sürekli güncelleme, Veri çıkış hızı = 1 Hz
Wire.write(0x85);
// I2C İletimini Durdur
Wire.endTransmission();
gecikme(300);
}
boşluk döngüsü()
{
imzasız int veri[2];
imzasız int val[4];
unsigned int H0, H1, H2, H3, T0, T1, T2, T3, ham;
// Nem kalibrasyon değerleri
for(int i = 0; i < 2; i++)
{
// I2C İletimini Başlat
Wire.beginTransmission(Adr);
// Veri kaydı gönder
Wire.write((48 + i));
// I2C İletimini Durdur
Wire.endTransmission();
// 1 bayt veri iste
Wire.requestFrom(Adr, 1);
// 1 bayt veri oku
if(Wire.available() == 1)
{
data = Wire.read();
}
}
// Nem verilerini dönüştür
H0 = veri[0] / 2;
H1 = veri[1] / 2;
for(int i = 0; i < 2; i++)
{
// I2C İletimini Başlat
Wire.beginTransmission(Adr);
// Veri kaydı gönder
Wire.write((54 + i));
// I2C İletimini Durdur
Wire.endTransmission();
// 1 bayt veri iste
Wire.requestFrom(Adr, 1);
// 1 bayt veri oku
if(Wire.available() == 1)
{
data = Wire.read();
}
}
// Nem verilerini dönüştür
H2 = (veri[1] * 256.0) + veri[0];
for(int i = 0; i < 2; i++)
{
// I2C İletimini Başlat
Wire.beginTransmission(Adr);
// Veri kaydı gönder
Wire.write((58 + i));
// I2C İletimini Durdur
Wire.endTransmission();
// 1 bayt veri iste
Wire.requestFrom(Adr, 1);
// 1 bayt veri oku
if(Wire.available() == 1)
{
data = Wire.read();
}
}
// Nem verilerini dönüştür
H3 = (veri[1] * 256.0) + veri[0];
// Sıcaklık kalibrasyon değerleri
// I2C İletimini Başlat
Wire.beginTransmission(Adr);
// Veri kaydı gönder
Wire.write(0x32);
// I2C İletimini Durdur
Wire.endTransmission();
// 1 bayt veri iste
Wire.requestFrom(Adr, 1);
// 1 bayt veri oku
if(Wire.available() == 1)
{
T0 = Tel.read();
}
// I2C İletimini Başlat
Wire.beginTransmission(Adr);
// Veri kaydı gönder
Wire.write(0x33);
// I2C İletimini Durdur
Wire.endTransmission();
// 1 bayt veri iste
Wire.requestFrom(Adr, 1);
// 1 bayt veri oku
if(Wire.available() == 1)
{
T1 = Tel.read();
}
// I2C İletimini Başlat
Wire.beginTransmission(Adr);
// Veri kaydı gönder
Wire.write(0x35);
// I2C İletimini Durdur
Wire.endTransmission();
// 1 bayt veri iste
Wire.requestFrom(Adr, 1);
// 1 bayt veri oku
if(Wire.available() == 1)
{
ham = Wire.read();
}
ham = ham & 0x0F;
// Sıcaklık kalibrasyon değerlerini 10 bit'e çevir
T0 = ((ham & 0x03) * 256) + T0;
T1 = ((ham & 0x0C) * 64) + T1;
for(int i = 0; i < 2; i++)
{
// I2C İletimini Başlat
Wire.beginTransmission(Adr);
// Veri kaydı gönder
Wire.write((60 + i));
// I2C İletimini Durdur
Wire.endTransmission();
// 1 bayt veri iste
Wire.requestFrom(Adr, 1);
// 1 bayt veri oku
if(Wire.available() == 1)
{
data = Wire.read();
}
}
// Verileri dönüştür
T2 = (veri[1] * 256.0) + veri[0];
for(int i = 0; i < 2; i++)
{
// I2C İletimini Başlat
Wire.beginTransmission(Adr);
// Veri kaydı gönder
Wire.write((62 + i));
// I2C İletimini Durdur
Wire.endTransmission();
// 1 bayt veri iste
Wire.requestFrom(Adr, 1);
// 1 bayt veri oku
if(Wire.available() == 1)
{
data = Wire.read();
}
}
// Verileri dönüştür
T3 = (veri[1] * 256.0) + veri[0];
// I2C İletimini Başlat
Wire.beginTransmission(Adr);
// Veri kaydı gönder
Wire.write(0x28 | 0x80);
// I2C İletimini Durdur
Wire.endTransmission();
// 4 bayt veri iste
Wire.requestFrom(Adr, 4);
// 4 bayt veri oku
// nem msb, nem lsb, temp msb, temp lsb
if(Wire.available() == 4)
{
val[0] = Tel.read();
val[1] = Tel.read();
val[2] = Wire.read();
val[3] = Wire.read();
}
// Verileri dönüştür
float nem = (val[1] * 256.0) + val[0];
nem = ((1.0 * H1) - (1.0 * H0)) * (1.0 * nem - 1.0 * H2) / (1.0 * H3 - 1.0 * H2) + (1.0 * H0);
int sıcaklık = (değer[3] * 256) + değer[2];
float cTemp = (((T1 - T0) / 8.0) * (sıcaklık - T2)) / (T3 - T2) + (T0 / 8.0);
float fTemp = (cTemp * 1.8) + 32;
// Verileri seri monitöre çıkar
Serial.print("Bağıl nem: ");
Seri.print(nem);
Serial.println(" %RH");
Serial.print("Sıcaklık Santigrat Olarak: ");
Seri.print(cTemp); Serial.println("C");
Serial.print("Sıcaklık Fahrenhayt Olarak: ");
Seri.print(fTemp);
Serial.println("F");
gecikme(500);
}
Adım 4: Uygulamalar:
HTS221, hava nemlendiriciler ve buzdolapları vb. gibi çeşitli tüketici ürünlerinde kullanılabilir. Bu sensör ayrıca Akıllı ev otomasyonu, Endüstriyel otomasyon, solunum ekipmanları, varlık ve mal takibi dahil olmak üzere daha geniş bir alanda uygulamasını bulur.