DHT22 Sıcaklık Nem Sensörü ile Arduino Uygulması

Daha önce DHT22 Sıcaklık Nem sensörünü kullanarak Arduino ile sıcaklık ve nem bilgisini okumuştuk. Şimdi bu uygulamamızda 2 dijit 7 segmentli display ile bu sıcaklık bilgisini bilgisayardan bağımsız olarak görmeyi deniyeceğiz. Buna ek olarak da belirlediğimiz üst limit sıcaklık değerini aştığında uyarı vermesini sağlayacağız.

Devre şemasını merak edenler için daha önceki yazılarımızda kullandığımız 2 dijitli 7 segmentli display devresinin aynısı. Sadece buna ek olarak bir BDX53C transistörlü çıkış daha ekledim. Uyarıyı +24VDC olarak alabilmek için. Siren veya Buzzer bağlayabilirsiniz.

Arduino Double Segmentli Display Devre Şeması
Arduino Double Segmentli Display Devre Şeması

Bu uygulamada Arduino Uno kullandığımız için uno’ ya uygun bir shield tasarladım. Aşağıda baskı devresini görebilirsiniz.

DHT11 sensorü için Arduino Shield Baskı Devresi
DHT22 sensorü için Arduino Shield Baskı Devresi

Arduino Programını incelediğinizde 3 blok göreceksiniz. İlk blok sensörden gelen bilgilerin okunduğu blok belirli bir zaman aralığında okunuyor. İkinci blokta üst limit sıcaklık değerimiz kontrol ediliyor. Üçüncü blokta ise sıcaklık bilgisini displaylere yazmak için tarama sisteminde segmentlerin ledleri ve displayler truth table‘ a göre yakıp söndürülmektedir.

/* 
www.kaizen40.com

2 digit 7 segmentli display

alt soldan başlayarak
1: c
2: dp(nokta)
3: e
4: d
5: g
6: f
7: ds1 (1.digit ortak katot)
8: ds2 (2.digit ortak katot)
9: b
10: a

// Sensor library https://github.com/adafruit/Adafruit_Sensor
// DHT22 library https://playground.arduino.cc/Main/DHTLib

// datasheet https://learn.adafruit.com/dht/downloads

*/

//**************** SENSOR ATAMALARI *****************//
#include "DHT.h"              // kütüphaneyi ekle

#define DHTPIN 2              // haberleşme pini
#define DHTTYPE DHT22         // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);     // Initialize DHT sensor for normal 16mhz Arduino

String number = "00";

float hum;                    // nem bilgisi
float temp;                   // sıcaklık bilgisi

//**************** DISPLAY ATAMALARI *****************//
// 7 segmentli dipslay Arduino pin bağlantıları
//                         a, b, c, d, e, f, g
const int segmentPin[7] = {7, 8, 3, 5, 6, 9, 4};
const int nDisplayPin[2] = {11, 10}; // dipslay ortak katodu

// a, b, c, d, e, f, g
int sayi[10][7] = {    // satır, sutun
  {1, 1, 1, 1, 1, 1, 0}, // 0
  {0, 1, 1, 0, 0, 0, 0}, // 1
  {1, 1, 0, 1, 1, 0, 1}, // 2
  {1, 1, 1, 1, 0, 0, 1}, // 3
  {0, 1, 1, 0, 0, 1, 1}, // 4
  {1, 0, 1, 1, 0, 1, 1}, // 5
  {0, 0, 1, 1, 1, 1, 1}, // 6
  {1, 1, 1, 0, 0, 0, 0}, // 7
  {1, 1, 1, 1, 1, 1, 1}, // 8
  {1, 1, 1, 0, 0, 1, 1}  // 9
};

//***************** DIGER ATAMALARI ******************//
unsigned long oldTime;
const int siren = 12;
float upperLimit = 28;                                // üst limit sıcaklık değeri

//****************** EKRANI TEMİZLE ******************//
void ekrani_temizle()
{
  for (int i = 0; i <= 7; i++)
  {
    digitalWrite(segmentPin[i], LOW);
  }
  
  for (int i = 0; i <= 2; i++)
  {
    digitalWrite(nDisplayPin[i], LOW);
  }
}

//***************** KONFİGURASYONLAR *****************//
void setup()
{
  Serial.begin(9600);
  delay(500);
  dht.begin();
  
  // pinleri çıkış olarak ayarla
  for (int i = 0; i <= 7; i++)
  {
    pinMode(segmentPin[i], OUTPUT);
  }
  
  for (int i = 0; i <= 2; i++)
  {
    pinMode(nDisplayPin[i], OUTPUT);
  }

  pinMode(siren, OUTPUT);
  pinMode(13, OUTPUT);

  digitalWrite(siren, LOW);
  digitalWrite(13, LOW);
}

//********************* ANA PROGRAM ******************//
void loop()
{
  if((millis() - oldTime) > 3000)                   // 3 sn de bir sensoru okuma yap
  { 
    oldTime = millis();
    
    hum = dht.readHumidity();                       // nem bilgisini oku
    temp = dht.readTemperature();                   // sıcaklık bilgisini oku
    
    number = (String)(round(temp));                 // yuvarla ve kırpmak için stringe çevir
    
    //Serial.println("Sıcaklık: " + (String)temp + " Celcius" + ", Nem: %" + (String)hum);
  }
  
  // sıcaklık değeri üst limitten fazla ise
  if (round(temp) >= upperLimit)
  {
    digitalWrite(siren, HIGH);                      // sireni çal
    delay(250);
    digitalWrite(siren, LOW);
    delay(250);
    digitalWrite(siren, HIGH);
    delay(250);
    digitalWrite(siren, LOW);
    delay(250);
  }
  else
  {
    digitalWrite(siren, LOW);                       // sireni kapat
  }

  // tarama yap, toplam tarama süresi 0,5 sn
  for ( int t = 0; t < 25; t++)
  {
    // 1. dijiti göster
    digitalWrite(nDisplayPin[0], LOW);              // 1. dipslay pasif
    digitalWrite(nDisplayPin[1], HIGH);             // 2. dipslay aktif
      
    for (int j = 0; j <= 7; j++)                    // segmentler
    {
      // sıcaklık bilgisinin ilk dijitini ilk displayde göster
      digitalWrite(segmentPin[j], sayi[((String)number[0]).toInt()][j]);
    }
    delay(9);
    ekrani_temizle();                               // çıkışları sıfırla
    delay(1);
    
    // 2. dijiti göster
    digitalWrite(nDisplayPin[0], HIGH);             // 1. dipslay aktif
    digitalWrite(nDisplayPin[1], LOW);              // 2. dipslay pasif
      
    for (int j = 0; j <= 7; j++)                    // segmentler
    {
      // sıcaklık bilgisinin ikinci dijitini ikinci displayde göster
      digitalWrite(segmentPin[j], sayi[((String)number[1]).toInt()][j]);
    }
    delay(9);
    ekrani_temizle();                               // çıkışları sıfırla
    delay(1);
  }
}

Bol kodlamalar,

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.