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
- 128x64 OLED ekran ile şık ve düşük enerji kullanıcı arayüzü
- Üç buton kontrol sistemi (Sıcaklık/Kondisyon/Nem)
- Animasyonlu maskot karakteri - Evet, size el sallayan bir arkadaş!
- HYCoreX™ SHTC3 sensörü ile hassas ölçümler

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");
}
}

(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);
}

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);
}

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);
}

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);
}

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?
- Düşük güç tüketimi
- Hızlı ölçüm süreleri
- Kompakt boyut
- Arduino kütüphanesi desteği
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!