Su Geçirmez Termometre (Akvaryum / Çay)
Başlangıç30 dkSu geçirmez bir DS18B20 probuyla suyun sıcaklığını ölçen ve 4 haneli ekranda "24°C" diye gösteren bir termometre. Sıcaklık izin verilen aralığın dışına çıkınca buzzer öter ve ekran yanıp söner: çok sıcakta hızlı ve tiz üç bip, çok soğukta yavaş ve pes bip, böylece hangisi olduğu sesten bile anlaşılır. Akvaryum için 23-28 °C hazır gelir; çay için alt sınırı 60 °C yapınca çay içilecek sıcaklığa inince öter. 1-Wire haberleşmeyi ve çekme (pull-up) direncini, ölçüm sürerken programı bekletmemeyi ve alarmın sınırda gidip gelmemesi için pay bırakmayı öğretir. DallasTemperature ve TM1637 kitaplıkları Kitaplık Yöneticisi'nden kurulur.
Uygulamada adım adım yapGerekli malzemeler
1 × Arduino Uno R3
1 × Breadboard 830 Pin (MB-102)
1 × DS18B20 Su Geçirmez Sıcaklık Sensörü
1 × 4 Haneli 7 Segment Ekran Modülü (TM1637)
1 × Pasif Buzzer (Piezo)
1 × Direnç 4.7 kΩ (1/4W)
10 × Jumper Kablo - Erkek/Erkek
4 × Jumper Kablo - Erkek/Dişi
Bağlantı adımları
- 1
Güç sıralarını bağla ve birleştir

Siyah erkek-erkek kabloyla Arduino'nun güç başlığındaki GND pinlerinden birini breadboard'un alttaki mavi çizgili (−) sırasına, kırmızı kabloyla aynı başlıktaki 5V pinini alttaki kırmızı çizgili (+) sıraya bağla. Breadboard'un üstteki ve alttaki güç sıraları birbirine bağlı değildir: sağ uçta kırmızı bir kabloyla alttaki (+) sırayı üstteki (+) sıraya, siyah bir kabloyla alttaki (−) sırayı üstteki (−) sıraya bağla. Prob alttaki sıralardan, ekran ve buzzer üsttekilerden beslenecek.
- Arduino GND → alttaki mavi çizgili (−) sıra (siyah kablo)
- Arduino 5V → alttaki kırmızı çizgili (+) sıra (kırmızı kablo)
- alttaki kırmızı çizgili (+) sıra → üstteki kırmızı çizgili (+) sıra (kırmızı kablo)
- alttaki mavi çizgili (−) sıra → üstteki mavi çizgili (−) sıra (siyah kablo)
- 2
Ekranı bağla

Ekran modülünün dört pinine erkek-dişi kabloların dişi uçlarını tak; pinlerin adları kartın üstünde yazar: CLK, DIO, VCC, GND. CLK'yi Arduino'nun 7, DIO'yu 6 numaralı pinine bağla (DISPLAY_CLK, DISPLAY_DIO). VCC'yi üstteki (+) sıraya, GND'yi üstteki (−) sıraya bağla. Bazı modüllerde pinlerin sırası farklıdır; kabloları sıraya göre değil, pinlerin yanında yazan adlara göre bağla.
- Arduino pin 7 → ekran CLK (yeşil kablo)
- Arduino pin 6 → ekran DIO (mavi kablo)
- ekran VCC → üstteki kırmızı çizgili (+) sıra (kırmızı kablo)
- ekran GND → üstteki mavi çizgili (−) sıra (siyah kablo)
- 3
Buzzer'ı tak ve bağla

Pasif buzzer'ın + bacağını üst yarıda 21. sütuna, öbür bacağını 22. sütuna tak; + bacak genelde daha uzundur ve gövdesinde + işareti vardır. Mor kabloyla Arduino'nun 5 numaralı pinini 21. sütuna bağla (BUZZER_PIN 5). Kısa siyah bir kabloyla 22. sütunu üstteki (−) sıraya bağla.
- buzzer + bacak → 21. sütun, üst yarı
- buzzer − bacak → 22. sütun, üst yarı
- Arduino pin 5 → 21. sütun, üst yarı (mor kablo)
- 22. sütun, üst yarı → üstteki mavi çizgili (−) sıra (siyah kablo)
- 4
Sıcaklık probunu tak ve bağla

Probun kablosunun ucundaki üç teli breadboard'un alt yarısında E sırasına tak: kırmızı (VCC) 52., sarı (DATA) 53., siyah (GND) 54. sütuna gelsin. Tel renkleri üreticiye göre değişebilir; probun etiketine ya da satıcının sayfasına bak (bazılarında DATA beyaz ya da mavidir). Teller yumuşaksa uçlarını parmaklarınla bükerek sertleştir ya da birer erkek pin lehimle. Kısa kırmızı bir kabloyla 52. sütunu alttaki (+) sıraya, kısa siyah bir kabloyla 54. sütunu alttaki (−) sıraya bağla. Sarı kabloyla Arduino'nun A0 pinini 53. sütuna bağla (PROBE_PIN A0): analog pinler dijital pin olarak da çalışır. Yalnızca prob ve kablosu su geçirmezdir; breadboard'u ve kablonun ucunu sudan uzak tut.
- sıcaklık probu kırmızı kablo (VCC) → 52. sütun, alt yarı
- sıcaklık probu sarı kablo (DATA) → 53. sütun, alt yarı
- sıcaklık probu siyah kablo (GND) → 54. sütun, alt yarı
- 52. sütun, alt yarı → alttaki kırmızı çizgili (+) sıra (kırmızı kablo)
- 54. sütun, alt yarı → alttaki mavi çizgili (−) sıra (siyah kablo)
- Arduino A0 → 53. sütun, alt yarı (sarı kablo)
- 5
4,7 kΩ çekme direncini tak

4,7 kΩ direnci (sarı - mor - kırmızı - altın) alt yarıda C sırasına yatay tak: bir ucu 53. sütuna (probun DATA'sı), öbür ucu 57. sütuna gelsin. Kısa kırmızı bir kabloyla 57. sütunu alttaki (+) sıraya bağla. Böylece direnç DATA hattı ile 5V arasında durur. 1-Wire hattı boştayken bu direnç onu 5V'ta tutar; o olmazsa prob hiç bulunamaz ya da Seri Monitörde -127 okunur.
- 4,7 kΩ direnç → 53. ve 57. sütunlar, alt yarı
- 57. sütun, alt yarı → alttaki kırmızı çizgili (+) sıra (kırmızı kablo)
Arduino kodu
// Kitaplık Yöneticisi'nden kurulacak:
// "DallasTemperature" (Miles Burton;
// OneWire'ı da kurar) ve "TM1637"
// (Avishay Orpaz)
#include <OneWire.h>
#include <DallasTemperature.h>
#include <TM1637Display.h>
// Probun sarı (DATA) kablosu: analog
// pinler dijital pin olarak da çalışır
const int PROBE_PIN = A0;
// Ekran modülünün CLK ve DIO pinleri
const int DISPLAY_CLK = 7;
const int DISPLAY_DIO = 6;
const int BUZZER_PIN = 5;
// İzin verilen aralık (°C). Akvaryum:
// 23-28. Çay soğuyunca ötsün: TOO_COLD
// 60, TOO_HOT 110 (hiç aşılmaz)
const float TOO_COLD = 23.0;
const float TOO_HOT = 28.0;
// true: alarm, sıcaklık bir kez aralığa
// girince kurulur (çayda prob havada
// soğuk başlar). Akvaryumda false kalsın
const bool WAIT_UNTIL_IN_RANGE = false;
// Alarm susması için sınırın bu kadar
// içine dönmeli: sınırda gidip gelmez
const float MARGIN = 0.5;
// Ölçümler arası süre (ms)
const unsigned long MEASURE_EVERY = 1000;
// 12 bitlik ölçümün süresi (ms)
const unsigned long CONVERSION_TIME = 750;
// Ekranda derece işareti ve C harfi
const uint8_t SEG_DEGREE = SEG_A | SEG_B | SEG_F | SEG_G;
const uint8_t SEG_LETTER_C = SEG_A | SEG_D | SEG_E | SEG_F;
const uint8_t SEG_DASH = SEG_G;
OneWire oneWire(PROBE_PIN);
DallasTemperature probe(&oneWire);
TM1637Display display(DISPLAY_CLK, DISPLAY_DIO);
// Alarm yok, çok soğuk ya da çok sıcak
enum AlarmState { NONE, COLD, HOT };
AlarmState alarmState = NONE;
unsigned long alarmStart = 0;
bool beeping = false;
bool armed = !WAIT_UNTIL_IN_RANGE;
// Son ölçüm; okunamadıysa probeOk false
float temperature = 0;
bool probeOk = false;
bool measured = false;
unsigned long requestedAt = 0;
bool waiting = false;
// Ekrandaki: bir sıcaklık, BLANK ya da
// DASHES; yalnızca değişince yazılır
const int BLANK = -1000;
const int DASHES = -2000;
int shown = BLANK;
// Sıcaklığı ekrana yazar: "24°C", "-5°C",
// 100 ve üstünde "100C"
void showTemperature(unsigned long now) {
if (!measured) return;
int next = round(temperature);
if (!probeOk) next = DASHES;
// Alarmda saniyede bir yanıp söner
bool off = (now - alarmStart) % 1000 >= 600;
if (probeOk && alarmState != NONE && off) next = BLANK;
if (next == shown) return;
shown = next;
if (shown == BLANK) {
display.clear();
return;
}
if (shown == DASHES) {
uint8_t dashes[] = { SEG_DASH, SEG_DASH, SEG_DASH, SEG_DASH };
display.setSegments(dashes);
return;
}
int whole = shown;
if (whole >= -9 && whole <= 99) {
display.showNumberDec(whole, false, 2, 0);
uint8_t unit[] = { SEG_DEGREE, SEG_LETTER_C };
display.setSegments(unit, 2, 2);
} else {
display.showNumberDec(whole, false, 3, 0);
uint8_t unit[] = { SEG_LETTER_C };
display.setSegments(unit, 1, 3);
}
}
// Sıcakta hızlı ve tiz, soğukta yavaş ve
// pes öter: hangisi olduğu sesten belli
void updateBuzzer(unsigned long now) {
bool beep = false;
int hz = 0;
unsigned long t = now - alarmStart;
if (alarmState == HOT) {
// 3 kısa bip, sonra 1 sn sessizlik
t %= 2000;
beep = t < 900 && (t / 150) % 2 == 0;
hz = 2500;
} else if (alarmState == COLD) {
// 1,5 sn'de bir uzun bip
beep = t % 1500 < 400;
hz = 700;
}
// tone()'u yalnızca ses değişince çağır
if (beep != beeping) {
beeping = beep;
if (beep) {
tone(BUZZER_PIN, hz);
} else {
noTone(BUZZER_PIN);
}
}
}
void checkLimits(unsigned long now) {
if (!armed) {
if (temperature < TOO_COLD || temperature > TOO_HOT) return;
armed = true;
Serial.println("Aralığa girdi, alarm kuruldu.");
}
AlarmState next = alarmState;
if (alarmState == NONE) {
if (temperature > TOO_HOT) next = HOT;
if (temperature < TOO_COLD) next = COLD;
} else if (alarmState == HOT && temperature <= TOO_HOT - MARGIN) {
next = NONE;
} else if (alarmState == COLD && temperature >= TOO_COLD + MARGIN) {
next = NONE;
}
if (next == alarmState) return;
alarmState = next;
alarmStart = now;
if (alarmState == HOT) Serial.println("ALARM: çok sıcak!");
if (alarmState == COLD) Serial.println("ALARM: çok soğuk!");
if (alarmState == NONE) Serial.println("Sıcaklık yeniden aralıkta.");
}
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
Serial.begin(9600);
display.setBrightness(5);
probe.begin();
// Ölçüm beklenirken ekran ve ses
// durmasın: sonuç sonra okunur
probe.setWaitForConversion(false);
Serial.print("Bulunan prob: ");
Serial.println(probe.getDeviceCount());
Serial.print("Aralık: ");
Serial.print(TOO_COLD, 1);
Serial.print(" - ");
Serial.print(TOO_HOT, 1);
Serial.println(" °C");
}
void loop() {
unsigned long now = millis();
if (!waiting && now - requestedAt >= MEASURE_EVERY) {
probe.requestTemperatures();
requestedAt = now;
waiting = true;
}
if (waiting && now - requestedAt >= CONVERSION_TIME) {
waiting = false;
measured = true;
float reading = probe.getTempCByIndex(0);
// -127: prob yok ya da kablo kopuk
probeOk = reading != DEVICE_DISCONNECTED_C;
if (probeOk) {
temperature = reading;
Serial.print("Sıcaklık: ");
Serial.print(temperature, 1);
Serial.println(" °C");
checkLimits(now);
} else {
Serial.println("Prob okunamıyor: kabloları ve 4,7 kΩ direnci kontrol et.");
// Ölçülemeyen sıcaklık için ötmez
alarmState = NONE;
}
}
showTemperature(now);
updateBuzzer(now);
}
Seri Monitörde göreceğin
Bulunan prob: 1 Aralık: 23.0 - 28.0 °C Sıcaklık: 25.4 °C Sıcaklık: 25.5 °C Sıcaklık: 28.1 °C ALARM: çok sıcak! Sıcaklık: 28.3 °C Sıcaklık: 27.4 °C Sıcaklık yeniden aralıkta.
Bir kablo yerinde değilse
Bulunan prob: 0 Aralık: 23.0 - 28.0 °C Prob okunamıyor: kabloları ve 4,7 kΩ direnci kontrol et. Prob okunamıyor: kabloları ve 4,7 kΩ direnci kontrol et.
Sonuç
Kodu yüklemeden önce Kitaplık Yöneticisi'nden "DallasTemperature" (Miles Burton; OneWire'ı da kurar) ve "TM1637" (Avishay Orpaz) kitaplıklarını kur. Kodu yükleyince ekran bir saniye içinde sıcaklığı "25°C" gibi gösterir ve her saniye yeniler; Seri Monitörde ondalığıyla yazılır. Denemek için probu avucunda sıkıca tut: sıcaklık 28 °C'yi geçince buzzer hızlı ve tiz üç bip çalar, ekran yanıp söner. Probu bırakınca sıcaklık 27,5 °C'ye inince alarm susar. Probu soğuk suya daldır: 23 °C'nin altında yavaş ve pes bir bip duyulur. Çay için koddaki TOO_COLD'u 60, TOO_HOT'u 110 yap, WAIT_UNTIL_IN_RANGE'i true yap: alarm prob sıcak çaya girince kurulur ve çay 60 °C'nin altına inince öter. Ekranda "----" görünüyorsa ya da Seri Monitörde "Prob okunamıyor" yazıyorsa probun üç telinin doğru sütunlarda olduğuna ve 4,7 kΩ direncin 53. ve 57. sütunlarda takılı olduğuna bak. Ekran hiç yanmıyorsa CLK ve DIO kablolarını kontrol et. Probun ucu paslanmaz çeliktir ama gıdaya uygunluğu üreticiye göre değişir: çaya kısa süre daldırıp ölçüm sonrası yıka, uzun süre içecekte bırakma.
Uygulamada her bağlantıyı tek tek işaretle, envanterindeki parçalarla eşleştir ve kaldığın yerden devam et.
Uygulamada adım adım yap