SHTC3 - Sıcaklık ve Nem Takip Asistanı

Merhabalar maker dostlar! Bugün HYCoreX™'in yeni nesil SHTC3 sıcaklık ve nem sensörünü kullanarak, OLED ekranlı kompakt bir ortam takip cihazı yapacağız. Bu proje hem başlangıç seviyesi için uygun. Bu proje sayesinde animasyonlu arayüzüyle tatlı bir asistana sahip oluyorsunuz!

Projenin Özellikleri


Gerekli Kütüphaneler

İlk olarak projemiz için gerekli kütüphaneleri import ediyoruz:

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "Adafruit_SHTC3.h"

Bu kütüphaneler Arduino IDE'nin Library Manager'ından kolayca kurulabilir.


Pin Tanımlamaları ve Ekran Ayarları

Ekranımızın boyutlarını ve I2C adresini belirliyoruz:

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C

#define LeftButton D2
#define MiddleButton D1
#define RightButton D3

Not: I2C hattında birden fazla cihaz varsa adres çakışmalarına dikkat! 0x3C veya 0x3D genellikle OLED ekranlar için kullanılır. Bu projede 0x3C kullanıyoruz.


Animasyon Frame'leri

Projemizin en eğlenceli kısmı! Maskot karakterimiz için iki kare hazırladık. Bu kareler arasında geçiş yaparak el sallama efekti oluşturuyoruz:

const unsigned char frame1 [] PROGMEM = {
  0x1f, 0xe0, 0x00,
  0x20, 0x10, 0x00,
  // ... 17x17px bitmap verisi
};

const unsigned char frame2 [] PROGMEM = {
  0x1f, 0xe0, 0x00,
  0x20, 0x10, 0x00,
  // ... 17x17px bitmap verisi
};

İpucu: Bitmap görsellerini oluşturmak için online araçlar kullanabilirsiniz (image2cpp gibi).


Setup Fonksiyonu: Her Şeyin Başladığı Yer

Burada pinleri, ekranı ve sensörü başlatıyoruz:

void setup() {
  Serial.begin(115200);
  
  pinMode(LeftButton, INPUT_PULLDOWN);
  pinMode(MiddleButton, INPUT_PULLDOWN);
  pinMode(RightButton, INPUT_PULLDOWN);

  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 Atama başarısız oldu"));
    for(;;);
  }
  
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(23, 20);
  display.println("HYCoreX");
  display.display();
  
  delay(2500);

  if (shtc3.begin()) {
    Serial.println("HYCoreX™ SHTC3 Sensör bulundu");
  }
}

Screenshot 2025-11-28 at 18.59.57.png
(Sensör takılı değilse, böyle bir yazı gösterilecek.)


Ana Döngü: Buton Kontrolü

Loop fonksiyonumuz sürekli butonları kontrol ediyor ve basılan butona göre ilgili ekranı gösteriyor:

void loop() {
  if(digitalRead(LeftButton) == HIGH) {
    Temperature();
  }
  else if(digitalRead(MiddleButton) == HIGH) {
    Condition();
  }
  else if(digitalRead(RightButton) == HIGH) {
    Humidity();
  }
  else {
    showIdleScreen();
  }
}

Ana Menü Fonksiyonu

Home() fonksiyonu, kullanıcıyı karşılayan ve buton seçeneklerini gösteren menü ekranını oluşturuyor:

void Home() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(20, 0);
  display.println("HEY SEN! MERHABA..");
  display.setCursor(20, 12);
  display.println("NASIL YARDIMCI");
  display.setCursor(20, 24);
  display.println("OLABILIRIM?");
  display.setCursor(0, 55);
  display.println("DERECE KONDISYON  NEM");
}

Idle Ekranı: Animasyonlu Karşılama

Hiçbir buton basılı değilken çalışan fonksiyon. Home() menüsünü çağırıyor ve frame'ler arasında geçiş yapıyor:

void showIdleScreen() {
  Home();
  display.drawBitmap(0, 0, frame1, 17, 17, WHITE);
  display.display();
  delay(200);
  
  Home();
  display.drawBitmap(0, 0, frame2, 17, 17, WHITE);
  display.display();
  delay(200);
}

IMG_1666.jpg


Sıcaklık Ekranı

Sol butona basıldığında HYCoreX™ SHTC3 sensöründen sıcaklık değerini okuyup ekrana yazdırıyoruz:

void Temperature() {
  sensors_event_t humidity, temp;
  shtc3.getEvent(&humidity, &temp);
  
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(30, 20);
  display.println(String(temp.temperature) + "C");
  display.display();
  delay(100);
}

IMG_1665.jpg


Nem Ekranı

Sağ butona basıldığında nem değerini gösteriyoruz:

void Humidity() {
  sensors_event_t humidity, temp;
  shtc3.getEvent(&humidity, &temp);
  
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(30, 20);
  display.println("%" + String(humidity.relative_humidity));
  display.display();
  delay(100);
}

IMG_1663.jpg


Kondisyon Ekranı (Geliştirme Aşamasında)

Orta buton şu an için sadece bir gülen yüz gösteriyor ama gelecek güncellemelerde buraya ortam konfor skoru algoritması eklenecek:

void Condition() {
  sensors_event_t humidity, temp;
  shtc3.getEvent(&humidity, &temp);
  
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(50, 20);
  display.println(":)");
  display.display();
  delay(100);
}

IMG_1664.jpg


Bu sensör ilginizi çekebilir!!

HYCoreX™ SHTC3 sensörü sayesinde hassas ölçümler yapabilen, animasyonlu arayüzüyle kullanıcı dostu bir ortam takip cihazı yaptık. Projeyi istediğiniz gibi geliştirebilir, veri loglama ekleyebilir veya WiFi modülü ile IoT projesi haline getirebilirsiniz!

Neden HYCoreX™ SHTC3?


Tam Kod

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "Adafruit_SHTC3.h"

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64 // - 32 piksellik versiyon içinde çalışır fakat alttaki menü kısmını 32 piksele göre ayarlamalı - //
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C // - i2c kullanırken eğer tek hattan başka cihazların da bağlandığı bir durum var ise adreslerin farklı olduğundan emin olunmalı - //

#define LeftButton D2
#define MiddleButton D1
#define RightButton D3

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_SHTC3 shtc3 = Adafruit_SHTC3();

// - KÜÇÜK MASKOT - EL SALLAMA 1. kare - 17x17px - //
const unsigned char frame1 [] PROGMEM = {
  0x1f, 0xe0, 0x00,
  0x20, 0x10, 0x00,
  0x40, 0x08, 0x00,
  0x40, 0x08, 0x00,
  0x40, 0x08, 0x00,
  0x40, 0x08, 0x00,
  0x40, 0x08, 0x00,
  0x5c, 0xe8, 0x00,
  0x54, 0xb8, 0x00,
  0x40, 0x24, 0x00,
  0x30, 0x24, 0x00,
  0x4f, 0xc8, 0x00,
  0x90, 0x08, 0x00,
  0x90, 0x10, 0x00,
  0x63, 0x10, 0x00,
  0x24, 0x90, 0x00,
  0x1c, 0xe0, 0x00
};

// - KÜÇÜK MASKOT - EL SALLAMA 2. kare - 17x17px - // 
const unsigned char frame2 [] PROGMEM = {
  0x1f, 0xe0, 0x00,
  0x20, 0x10, 0x00,
  0x40, 0x08, 0x00,
  0x40, 0x08, 0x00,
  0x40, 0x08, 0x00,
  0x40, 0x08, 0x00,
  0x40, 0x08, 0x00,
  0x5c, 0xe8, 0x00,
  0x54, 0xac, 0x00,
  0x40, 0x12, 0x00,
  0x30, 0x22, 0x00,
  0x4f, 0xc4, 0x00,
  0x90, 0x08, 0x00,
  0x90, 0x10, 0x00,
  0x63, 0x10, 0x00,
  0x24, 0x90, 0x00,
  0x1c, 0xe0, 0x00
};

void setup() {
  Serial.begin(115200);
  
  pinMode(LeftButton, INPUT_PULLDOWN);
  pinMode(MiddleButton, INPUT_PULLDOWN);
  pinMode(RightButton, INPUT_PULLDOWN);
  // - İsterseniz, pull down direnç olmadan kullanabilirsiniz ;) - //
  //pinMode(LeftButton, INPUT);
  //pinMode(MiddleButton, INPUT);
  //pinMode(RightButton, INPUT);

  // Ekranı başlatıyoruz
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 Atama başarısız oldu"));
    for(;;);
  }
  
  // Splash screen atlanarak doğrudan ana menüye geçiliyor
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(23, 20);
  display.println("HYCoreX");
  display.display();
  
  delay(2500);

  // Sensör başlatılıyor (hata olsa bile devam eder)
  Serial.println("HYCoreX™ SHTC3 Testi");
  if (shtc3.begin()) {
    Serial.println("HYCoreX™ SHTC3 Sensör bulundu");
  } else {
    Serial.println("HYCoreX™ SHTC3 Sensör bulunamadı");
  }
}

void loop() {
  if(digitalRead(LeftButton) == HIGH) {
    Temperature();
  }
  else if(digitalRead(MiddleButton) == HIGH) {
    Condition();
  }
  else if(digitalRead(RightButton) == HIGH) {
    Humidity();
  }
  else {
    showIdleScreen();
  }
}

void Home() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(20, 0);
  display.println("HEY SEN! MERHABA..");
  display.setCursor(20, 12);
  display.println("NASIL YARDIMCI");
  display.setCursor(20, 24);
  display.println("OLABILIRIM?");
  display.setCursor(0, 55);
  display.println("DERECE KONDISYON  NEM");
}

void showIdleScreen() {
  // KARE 1
  Home();
  display.drawBitmap(0, 0, frame1, 17, 17, WHITE);
  display.display();
  delay(200);
  
  // KARE 2
  Home();
  display.drawBitmap(0, 0, frame2, 17, 17, WHITE);
  display.display();
  delay(200);
}

void Temperature() {
  sensors_event_t humidity, temp;
  shtc3.getEvent(&humidity, &temp);
  
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(2);
  display.setCursor(30, 20);
  display.println(String(temp.temperature) + "C"); // Santigrat cinsi değer verir.
  display.display();
  delay(100);
}

void Condition() {
  sensors_event_t humidity, temp;
  shtc3.getEvent(&humidity, &temp);
  
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setTextSize(2);
  display.setCursor(50, 20);
  display.println(":)"); // Gelecek haftalarda bu kısma detaylı algoritma gelecek rss bildirimlerinizi açmayı unutmayın!!
  display.display();
  delay(100);
}

void Humidity() {
  sensors_event_t humidity, temp;
  shtc3.getEvent(&humidity, &temp);
  
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(30, 20);
  display.println("%" + String(humidity.relative_humidity));
  display.display();
  delay(100);
}

Keyifli projeler dileriz! 🛠️

Not: Kondisyon algoritması için güncellemeleri kaçırmamak için bizi takipte kalın!