Arduino ile programlama - 7: Meteoroloji istasyonu

Seviye: resimresimresim

Bu uygulamada DHT 11 sensöründen aldığımız sıcaklık ve nem değerlerini Arduino sensor kartı üzerinde bulunan OLED ekrana yazdıracağız. Böylelikle ortama ait sıcaklık ve nem verilerinin ekran üzerinden izlenebildiği küçük bir meteoroloji istasyonu oluşturacağız.

Gerekli malzemeler

  • Arduino sensor kartı

  • DHT-11 ısı ve nem sensoru

SSD1306 128x32 Display

Arduino sensor kartı üzerinde bulunan display ekran 128x32 çözünürlüğe sahiptir. I2C haberleşme protokolü ile Arduino ile haberleşir.
resim

I2C haberleşme protokolü nedir?

Arduino, diğer Arduino veya sensörlerle haberleşmek için bazı haberleşme protokolleri kullanır. Bu protokollerden birisi de I2C’dir. I2C (Inter-Integrated Circuit) protokolü bir ana (master) ve çoklu bağımlı (slave) cihazlardan oluşmaktadır. Böylelikle bir cihaz 1024 cihaz ile haberleşebilir. Bu nedenle Arduino dâhil bir çok mikrodenetleyici tarafından kullanılmaktadır. Bir diğer avantajı ise haberleşme sırasında sadece 2 pin (SDA ve SCL) kullanmasıdır.
resim

I2C iletişiminde her cihazın önceden ayarlanmış bir kimliği veya benzersiz bir cihaz adresi vardır, böylece master hangi cihazlarla iletişim kuracağını seçebilir. Bunun için SDA ve SCL pinlerini kullanır. SCL (Seri saat) hattı, I2C veri yolundaki cihazlar ile ana cihaz tarafından üretilen veri aktarımı arasında senkronize olan saat sinyalidir. Verileri taşıyan hat ise SDA hattıdır. Master ve slave cihazların aynı besleme hattına bağlanmasına gerek yoktur. Fakat iletişimin sağlanması için toprak hatlarının aynı olması gerekir.

Devre kurulumu

Uygulama için aşağıda verilen şekilde devreyi kuruyoruz.
resim

Programlama

Program satırında #include komutu ile başlayan kütüphaneleri ekleyin. Bu kütüphaneleri aşağıdaki linklerden edinebilirsiniz.

Ardından program kodunu Arduino sensor kartına yükleyin. Nem ve sıcaklık değerlerini OLED ekranda göreceksiniz.

/* Meteoroloji istasyonu.
   Kaynak: Adafruit industries
   Gerekli kütüphaneleri aşağıdaki linklerden indirebilirsiniz:
   DHT Sensor Library: https://github.com/adafruit/DHT-sensor-library
   Adafruit Unified Sensor Lib: https://github.com/adafruit/Adafruit_Sensor
   Adafruit_BusIO Lib: https://github.com/adafruit/Adafruit_BusIO
   Adafruit-GFX-Library Lib: https://github.com/adafruit/Adafruit-GFX-Library
   Adafruit_SSD1306 Lib: https://github.com/adafruit/Adafruit_SSD1306
*/

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

#define DHTPIN 2   // DHT sensörün bağlandığı dijital pin
#define DHTTYPE  DHT11   // DHT sensör tipi
DHT_Unified dht(DHTPIN, DHTTYPE);
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &Wire);

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //I2C display adresi burada belirtilir.
  dht.begin(); // sensörü başlatma komutu
  display.clearDisplay(); // Ekranı temizler
  display.setTextSize(1,2); // karakter büyüklüğü bu komut ile belirlenir.
  display.setTextColor(SSD1306_WHITE); // Karakter rengi bu komut ile belirlenir.
}

void loop() {  
  delay(2000); //Ölçüm aralığındaki gecikme süresi
  display.clearDisplay();
  display.display();
  display.setCursor(0,0);
  // Sıcaklık ölçümü ve ekrana yazdırma
  sensors_event_t event;
  dht.temperature().getEvent(&event);
 
  if (isnan(event.temperature)) {
    display.println(F("Sicaklik olcumunde hata!"));
  }  else {
    display.print(F("Sicaklik: "));
    display.print(event.temperature);
    display.println(F("C"));
  }
  // Nem ölçümü ve ekrana yazdırma
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    display.println(F("Nem olcumunde hata!"));
  }  else {
    display.print(F("Nem: "));
    display.print(event.relative_humidity);
    display.println(F("%"));
  }
  display.display();
}