LM35 Arduino Sıcaklık Sensörü: Bağlantı, Formül, ESP32 ve Pico
LM35 Arduino bağlantısı ve bacak sırası, analogRead'den °C formülü, 1,1 V referansla 0,1 °C hassasiyet, ortalama, ESP32 ve Pico kodu, DS18B20 ve DHT11 farkı.
LM35, sıcaklığı doğrudan santigrat derece cinsinden gerilime çeviren, üç bacaklı ve çok ucuz bir analog sıcaklık sensörüdür. LM35'i Arduino ile kullanmak için ne kütüphane ne de karmaşık bir protokol gerekir: orta bacağı bir analog pine bağlarsın, analogRead() ile okursun ve tek satırlık bir formülle sıcaklığı bulursun. Çıkışı her 1 °C için tam 10 mV artar; yani 25 °C'de 250 mV, 100 °C'de 1 V verir.
Bu yazıda LM35'in nasıl çalıştığını, bacak sırasını ve neredeyse herkesin bir kez yaptığı ters bağlama hatasını, analogRead değerinden °C hesaplamayı, Arduino Uno'nun 1,1 V'luk dahili referansıyla ölçüm hassasiyetini dört kattan fazla artırmayı ve ortalama alarak titreyen değerleri sakinleştirmeyi öğreneceksin. Ardından 3,3 V ile çalışan ESP32 ve Raspberry Pi Pico'da nelere dikkat etmen gerektiğini, eksi sıcaklıkların nasıl ölçüldüğünü ve LM35'i DS18B20 ile DHT11'e göre ne zaman seçmen gerektiğini göreceksin.
LM35 nedir, nasıl çalışır?
LM35'in içinde, farklı akım yoğunluklarında çalışan iki transistör vardır. Bu transistörlerin baz-emiter gerilimleri arasındaki fark mutlak sıcaklıkla doğru orantılı olarak değişir; bu yönteme delta-VBE denir. Yonganın içindeki yükselteç bu küçük farkı büyütür ve 0 °C'de 0 V verecek şekilde ayarlar. Kelvin cinsinden çalışan LM335'te sıcaklığı bulmak için çıkıştan 2,73 V'luk sabit bir gerilimi çıkarman gerekir; LM35'te buna gerek yoktur: sıcaklık (°C) = çıkış gerilimi (mV) / 10. Sensör üretim sırasında yonga seviyesinde kalibre edildiği için ek ayar istemez ve çıkış eğrisi neredeyse dümdüzdür; doğrusallıktan sapması tipik olarak yalnızca ±0,25 °C'dir.
| Özellik | Değer |
|---|---|
| Çıkış | 10 mV/°C, 0 °C'de 0 V (25 °C'de 250 mV, 100 °C'de 1000 mV) |
| Besleme gerilimi | 4–30 V |
| Çektiği akım | 60 µA'den az (5 V'ta tipik 56 µA) |
| Kendi kendini ısıtma | Durgun havada yaklaşık 0,08 °C |
| Doğrusallık hatası | Tipik ±0,25 °C |
| Çıkış empedansı | 1 mA yükte 0,1 Ω |
| Kapasitif yük | Ek önlem olmadan en fazla 50 pF |
| Kılıf | TO-92 (en yaygın), TO-220, SOIC-8 ve metal TO-46 |
LM35 tek bir parça değil, bir ailedir. Harf eki ölçüm aralığını ve garanti edilen doğruluğu belirler; sondaki Z ise plastik TO-92 kılıfı gösterir. Veri sayfasına göre plastik TO-92 kılıfta LM35C, LM35CA ve LM35D bulunur; hobi mağazalarında "LM35" adıyla satılan parçaların büyük çoğunluğu LM35DZ'dir. Yani elindeki sensör büyük ihtimalle yalnızca 0–100 °C için garanti edilir ve 25 °C'de ±1,5 °C'ye kadar hata yapabilir; tipik hatası ise ±0,6 °C civarındadır. Parçanın üzerindeki yazıyı okuyarak hangisine sahip olduğunu öğrenebilirsin.
| Model | Ölçüm aralığı | 25 °C'de garanti doğruluk | Aralık uçlarında en kötü durum |
|---|---|---|---|
| LM35A | −55 … +150 °C | ±0,5 °C | ±1 °C |
| LM35 | −55 … +150 °C | ±1 °C | ±1,5 °C |
| LM35CA | −40 … +110 °C | ±0,5 °C | ±1,5 °C |
| LM35C | −40 … +110 °C | ±1 °C | ±2 °C |
| LM35D (LM35DZ) | 0 … +100 °C | ±1,5 °C | ±2 °C |
LM35 bacak sırası ve en sık yapılan ters bağlama hatası
LM35'in düz yüzü sana bakarken ve bacakları aşağıdayken soldan sağa sıralama şöyledir: 1. bacak +Vs (besleme), 2. bacak Vout (çıkış) ve 3. bacak GND (toprak). Veri sayfasındaki çizim alttan görünüş olduğu için birçok kişi şemayı aklında ters çevirip yanlış bağlar. Küçük bir kartın üzerinde satılan LM35 modüllerinde ise pinler genellikle VCC (ya da +), OUT (ya da S) ve GND (ya da −) diye yazılıdır; o durumda kartın üzerindeki yazıya güven.
LM35 Arduino bağlantısı: Uno, ESP32 ve Pico
| LM35 bacağı | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| 1 · +Vs (sol) | 5V | 5V / VIN (USB'den gelen 5 V) | VBUS, pin 40 (USB'den gelen 5 V) |
| 2 · Vout (orta) | A0 | GPIO 34 (ADC1) | GP26 / ADC0, pin 31 |
| 3 · GND (sağ) | GND | GND | AGND pin 33 ya da GND pin 38 |
| 0,1 µF kondansatör | +Vs ile GND arasına, sensöre yakın | +Vs ile GND arasına, sensöre yakın | +Vs ile GND arasına, sensöre yakın |
analogRead değerinden °C'ye: LM35 formülü
Arduino Uno'nun analog-dijital dönüştürücüsü (ADC) 10 bitliktir: 0 V ile referans gerilimi arasını 1024 basamağa böler ve sana 0–1023 arası bir sayı verir. Referans varsayılan olarak 5 V olduğundan her basamak 5 / 1024 = 4,88 mV eder. Önce ham değeri gerilime, sonra gerilimi sıcaklığa çevirirsin: gerilim = ham × 5,0 / 1024 ve sıcaklık = gerilim × 100. İkisini birleştirince sıcaklık ≈ ham × 0,488 olur. Bazı örneklerde 1024 yerine 1023 görürsün; aradaki fark binde birdir ve LM35'in kendi hatası yanında önemsizdir, ama doğrusu 1024'tür. ADC'nin mantığını daha ayrıntılı merak ediyorsan analog-dijital dönüşüm (ADC) yazısına bakabilirsin.
| analogRead değeri | Gerilim (5 V referans) | Sıcaklık |
|---|---|---|
| 41 | 0,200 V | 20,0 °C |
| 51 | 0,249 V | 24,9 °C |
| 52 | 0,254 V | 25,4 °C |
| 61 | 0,298 V | 29,8 °C |
| 205 | 1,001 V | 100,1 °C |
Tabloya dikkat et: oda sıcaklığında ADC'nin ürettiği sayı yalnızca 50 civarındadır ve bir basamaklık değişim sıcaklığı yaklaşık 0,5 °C oynatır. Okuduğun değerin 24,9 ile 25,4 arasında gidip gelmesi bu yüzdendir; sensör bozuk değildir, 5 V referansın çözünürlüğü bu kadardır. Bunu birazdan dahili referansla düzelteceğiz.
Adım adım ilk ölçüm
- LM35'i breadboard'a tak; düz yüzü sana bakarken sol bacağı 5V'a, sağ bacağı GND'ye bağla.
- Orta bacağı (Vout) bir jumper kabloyla A0'a bağla. Elinde varsa +Vs ile GND arasına 0,1 µF kondansatör ekle.
- Arduino'yu USB ile bağla ve birkaç saniye sonra sensöre dokun: oda sıcaklığındaysa her şey yolunda, sıcaksa bağlantı terstir.
- Aşağıdaki kodu yükle ve Seri Monitör'ü 9600 baud hızında aç.
- Sensörü parmaklarının arasına al; değerin yavaşça yükseldiğini, bıraktığında ise geri indiğini görmelisin.
1const int LM35_PIN = A0; // LM35 orta bacak (Vout) / LM35 middle leg (Vout)
2
3void setup() {
4 Serial.begin(9600);
5}
6
7void loop() {
8 int raw = analogRead(LM35_PIN); // 0–1023 ham değer / raw value 0–1023
9 float voltage = raw * 5.0 / 1024.0; // 5 V referansla volta çevir / convert to volts (5 V reference)
10 float tempC = voltage * 100.0; // 10 mV/°C: 0,25 V = 25 °C / 0.25 V = 25 °C
11
12 Serial.print(F("Ham / Raw: "));
13 Serial.print(raw);
14 Serial.print(F(" Gerilim / Voltage: "));
15 Serial.print(voltage, 3);
16 Serial.print(F(" V Sicaklik / Temp: "));
17 Serial.print(tempC, 1);
18 Serial.println(F(" C"));
19 delay(1000);
20}Kod her saniye A0'daki ham değeri okur, önce gerilime sonra sıcaklığa çevirir ve üçünü birlikte Seri Monitör'e yazar. Ham değeri de yazdırmak hata ayıklarken çok işe yarar: değer sürekli 0 ise Vout'tan hiç gerilim gelmiyordur, 1023'e yakınsa analog pin yanlışlıkla 5 V'a bağlanmıştır, rastgele zıplıyorsa A0 boşta kalmıştır. Sabit metinleri F() makrosuyla yazmak, Uno'nun 2 KB'lık RAM'inden tasarruf ettirir. Seri Monitör'ün diğer inceliklerini Arduino Serial Monitor kullanımı yazısında bulabilirsin.
1,1 V dahili referansla hassasiyeti artırmak
5 V referansın iki sorunu vardır. Birincisi az önce gördüğün kaba çözünürlüktür. İkincisi daha sinsidir: USB'den gelen 5 V çoğu zaman 4,7 ile 5,1 V arasında bir yerdedir ve sen kodda 5,0 yazdığın için aradaki fark doğrudan sıcaklığa yansır. Örneğin kartın gerçekte 4,8 V ile çalışıyorsa 25 °C'yi 26 °C olarak görürsün; bilgisayarın USB portu yük altında düştükçe sıcaklık da kendiliğinden değişiyormuş gibi görünür. Çözüm, Arduino Uno ve Nano'daki ATmega328P'nin içindeki 1,1 V'luk dahili referansı kullanmaktır. analogReference(INTERNAL) komutundan sonra her basamak 1,1 / 1024 = 1,07 mV, yani yaklaşık 0,11 °C olur. Karşılığında en fazla 1,1 V, yani 110 °C ölçebilirsin; LM35DZ'nin 0–100 °C aralığı için bu zaten yeterlidir.
| Referans | Komut | Bir basamak | Sıcaklık adımı | Ölçülebilen en yüksek değer |
|---|---|---|---|---|
| 5 V (varsayılan) | analogReference(DEFAULT) | 4,88 mV | 0,49 °C | 150 °C (sensör sınırı) |
| 3,3 V (AREF pinine bağlı) | analogReference(EXTERNAL) | 3,22 mV | 0,32 °C | 150 °C (sensör sınırı) |
| 1,1 V dahili | analogReference(INTERNAL) | 1,07 mV | 0,11 °C | 110 °C |
1,1 V'luk referans her yongada tam 1,1 V değildir; ATmega328P'nin veri sayfasına göre 1,0 ile 1,2 V arasında olabilir. Kalibrasyon yapmazsan bu, %9'a varan bir ölçek hatası demektir. Düzeltmesi kolaydır: aşağıdaki kodu yükle, multimetreyle AREF pini ile GND arasındaki gerilimi ölç ve bulduğun değeri koddaki VREF sabitine yaz (ör. const float VREF = 1.083;). Bu ölçüm her kart için bir kez yapılır ve sonuç kalıcıdır. Kod ayrıca her okumada 32 ölçümün ortalamasını alır:
1const int LM35_PIN = A0;
2const float VREF = 1.1; // AREF'te ölçtüğün değeri yaz (ör. 1.083) / write the voltage you measured on AREF (e.g. 1.083)
3const int SAMPLES = 32; // ortalama için ölçüm sayısı / number of samples to average
4
5void setup() {
6 Serial.begin(9600);
7 analogReference(INTERNAL); // Uno/Nano: 1,1 V dahili referans / 1.1 V internal reference
8 for (int i = 0; i < 5; i++) { // referans değişti, ilk okumaları at / discard the first readings after switching
9 analogRead(LM35_PIN);
10 delay(10);
11 }
12}
13
14float readTempC() {
15 long sum = 0;
16 for (int i = 0; i < SAMPLES; i++) {
17 sum += analogRead(LM35_PIN);
18 delay(2);
19 }
20 float raw = sum / (float)SAMPLES; // ortalama ham değer / average raw value
21 return raw * VREF / 1024.0 * 100.0; // her basamak ~0,107 °C / each step is ~0.107 °C
22}
23
24void loop() {
25 float t = readTempC();
26 Serial.print(F("Sicaklik / Temp: "));
27 Serial.print(t, 2);
28 Serial.println(F(" C"));
29 if (t > 108.0) {
30 Serial.println(F("Uyari: 1,1 V sinirina yakin / Warning: close to the 1.1 V limit"));
31 }
32 delay(1000);
33}Ortalama alma ve gürültüyü azaltma
Tek bir analogRead ölçümü, kablolardaki parazit ve besleme dalgalanması yüzünden bir iki basamak oynayabilir. En basit ve en etkili çözüm birden fazla ölçümün ortalamasını almaktır: rastgele gürültü, örnek sayısının kareköküyle azalır; yani 16 ölçümün ortalaması gürültüyü dörtte birine, 64 ölçüm sekizde birine indirir. Sıcaklık yavaş değişen bir büyüklük olduğu için birkaç milisaniyede alınan onlarca ölçüm sana zaman kaybettirmez. Daha yumuşak bir eğri istersen üstel filtre kullanabilirsin: filtreli = filtreli + 0,1 × (yeni − filtreli). Bu filtre her yeni ölçümün yalnızca yüzde 10'unu hesaba katar ve hafızada tek bir değişken tutar. Hareketli ortalama ve medyan gibi diğer yöntemleri sensör verisini filtreleme yazısında karşılaştırdık.
- Kanal değiştirince ilk okumayı at: Birden fazla analog sensör okuyorsan ADC'nin örnekleme kondansatörü bir önceki kanalın gerilimini bir süre taşır; aynı pini iki kez oku ve ilk sonucu kullanma.
- Sensör GND'sini doğrudan Arduino'nun GND pinine götür: Röle, motor ya da LED şeridin akımı aynı toprak kablosundan geçerse milivoltluk kaymalar oluşur; LM35'te her 10 mV bir dereceye eşittir.
- Kabloyu kısa tut ve güç kablolarından uzak geçir: Uzun ve açık kablolar anten gibi çalışır; gerekirse bükümlü ya da blendajlı kablo kullan.
- Sensörü ısı kaynaklarından uzaklaştır: Voltaj regülatörünün, ESP32 modülünün ya da bir rölenin hemen yanındaki LM35 ortamı değil, kartın sıcaklığını ölçer.
- Bir kez ofset kalibrasyonu yap: LM35'i güvenilir bir termometreyle aynı yerde bekletip aradaki sabit farkı kodda çıkar.
ESP32 ile LM35: 3,3 V besleme ve ADC doğrusallığı
ESP32 3,3 V ile çalışır ama LM35'in veri sayfası en az 4 V besleme ister. 3,3 V ile beslenen bir LM35 oda sıcaklığında çalışıyormuş gibi görünse de doğruluğu garanti edilmez. Doğru yol, sensörü kartın 5V (bazı kartlarda VIN) pininden, yani USB'den gelen 5 V'tan beslemektir. Bu ESP32'ye zarar vermez, çünkü LM35'in çıkışı en sıcak durumda bile (150 °C) 1,5 V'u geçmez. Çıkışı mutlaka bir ADC1 pinine (GPIO 32–39) bağla, çünkü ADC2 pinleri Wi-Fi açıkken kullanılamaz. Kartının ayrıntılı pin haritası için Pinout aracına, ESP32'ye yeni başlıyorsan ESP32 nedir yazısına bakabilirsin.
İkinci konu ESP32 ADC'sinin doğrusallığıdır. ESP32'nin ADC'si 12 bittir (0–4095), ancak uçlarda doğrusal değildir: 100 mV'un altındaki gerilimleri neredeyse ayırt edemez ve sapması karttan karta değişir. LM35 oda sıcaklığında yalnızca 200–300 mV verdiği için bu sorun seni doğrudan ilgilendirir. Çözüm iki adımdır: zayıflatmayı (attenuation) LM35'in gerilim aralığına göre seç ve ham değer yerine, üretimde yongaya yazılmış kalibrasyon verisini kullanan analogReadMilliVolts() fonksiyonunu kullan. Bu fonksiyon doğrudan milivolt döndürdüğü için sıcaklığı bulmak için sonucu 10'a bölmen yeter.
| Zayıflatma | Doğru ölçülen aralık | LM35 için karşılığı |
|---|---|---|
| ADC_0db | 100–950 mV | 10–95 °C |
| ADC_2_5db | 100–1250 mV | 10–125 °C |
| ADC_6db | 150–1750 mV | 15–150 °C |
| ADC_11db (varsayılan) | 150–2450 mV | 15–150 °C, en kaba çözünürlük |
1const int LM35_PIN = 34; // ADC1_CH6, Wi-Fi açıkken de çalışır / works while Wi-Fi is on
2const int SAMPLES = 64; // ortalama için ölçüm sayısı / number of samples to average
3
4void setup() {
5 Serial.begin(115200);
6 analogReadResolution(12); // 0–4095
7 analogSetPinAttenuation(LM35_PIN, ADC_2_5db); // ~100–1250 mV, yani 10–125 °C / i.e. 10–125 °C
8}
9
10void loop() {
11 uint32_t sum = 0;
12 for (int i = 0; i < SAMPLES; i++) {
13 sum += analogReadMilliVolts(LM35_PIN); // kalibre edilmiş mV / calibrated millivolts
14 delay(1);
15 }
16 float mv = sum / (float)SAMPLES;
17 float tempC = mv / 10.0; // 10 mV = 1 °C
18 Serial.printf("Gerilim / Voltage: %.1f mV Sicaklik / Temp: %.2f C\n", mv, tempC);
19 delay(1000);
20}Raspberry Pi Pico ve MicroPython ile LM35
Pico'nun 12 bitlik ADC'si GP26, GP27 ve GP28 pinlerindedir; referans olarak 3,3 V hattından süzülerek elde edilen ADC_VREF gerilimini kullanır. MicroPython'da read_u16() fonksiyonu sonucu 0–65535 aralığına ölçekleyerek verir, bu yüzden gerilim = ham × 3,3 / 65535 olur. Teorik çözünürlük 0,8 mV, yani yaklaşık 0,08 °C'dir; ama Pico'nun ADC'si gerçekte biraz gürültülüdür ve bazı değerlerde küçük sıçramalar yapar, bu yüzden burada da ortalama almak şarttır. LM35'i USB'den gelen 5 V'u taşıyan VBUS (pin 40) pininden besle; Pico'yu USB yerine pille çalıştırıyorsan VSYS pinindeki gerilimin 4 V'un üzerinde olduğundan emin ol ve sensörü oradan besle. Pico'yu ilk kez kullanıyorsan MicroPython kurulumunu Raspberry Pi Pico nedir yazısında bulabilirsin.
1from machine import ADC, Pin
2import time
3
4# Pin(23, Pin.OUT, value=1) # yalnız Pico (W değil): regülatör PWM modu, daha az gürültü / Pico (not W) only: SMPS PWM mode, less noise
5lm35 = ADC(26) # GP26 = ADC0, fiziksel pin 31 / physical pin 31
6VREF = 3.3 # ADC_VREF'i multimetreyle ölçüp yaz / measure ADC_VREF with a multimeter
7SAMPLES = 64 # ortalama için ölçüm sayısı / number of samples to average
8
9
10def read_temp_c():
11 total = 0
12 for _ in range(SAMPLES):
13 total += lm35.read_u16() # 0–65535, 12 bit sonuç 16 bite ölçeklenir / 12-bit result scaled to 16 bits
14 raw = total / SAMPLES
15 volts = raw * VREF / 65535
16 return volts * 100 # 10 mV/°C
17
18
19while True:
20 t = read_temp_c()
21 print("Sicaklik / Temp: {:.2f} C".format(t))
22 time.sleep(1)Pico'nun çipinde de bir sıcaklık sensörü vardır (ADC(4)), ama o ortamı değil yonganın kendi sıcaklığını ölçer ve çalışırken genellikle birkaç derece yüksek gösterir; oda sıcaklığı için LM35 gibi harici bir sensör gerekir. Daha temiz sonuç için standart Pico'da GP23'ü HIGH yaparak kartın güç regülatörünü PWM moduna alabilirsin; bu, ADC_VREF'teki dalgalanmayı azaltır ama boşta biraz daha fazla akım harcatır. Pico W'de bu pin kablosuz yongaya ayrıldığı için kodda o satır yorum olarak bırakıldı.
LM35 ile eksi sıcaklık ölçmek
Temel bağlantıda LM35 yalnızca 2 °C ile 150 °C arasını ölçer, çünkü çıkış katı akım verebilir ama neredeyse hiç akım çekemez; bu yüzden çıkış toprağın altına inemez. Eksi dereceler için veri sayfası iki yol gösterir. Birincisi, çıkışı bir dirençle eksi beslemeye bağlamaktır (R = Vs / 50 µA; −5 V için 100 kΩ); Arduino projelerinde eksi besleme olmadığı için pek kullanılmaz. İkincisi tek beslemeli yöntemdir: LM35'in GND bacağını seri iki diyotla (ör. 1N4148) toprağın yaklaşık 1 V üzerine kaldırırsın, çıkış ile toprak arasına 18 kΩ direnç bağlarsın ve çıkışı A0'dan, LM35'in GND bacağını A1'den okursun. Sıcaklık = (A0 gerilimi − A1 gerilimi) × 100 olur. Bu devrede LM35'in kendi bacakları arasında en az 4 V kalması için +Vs'yi 5 V yerine VIN'den (ör. 9 V adaptör) beslemen ve 5 V referansı kullanman gerekir. Unutma: yaygın LM35DZ 0 °C'nin altı için garanti verilmez; sık sık eksi ölçeceksen DS18B20 çok daha zahmetsizdir.
LM35, DS18B20 ve DHT11 karşılaştırması


| Özellik | LM35 (LM35DZ) | DS18B20 | DHT11 |
|---|---|---|---|
| Çıkış | Analog, 10 mV/°C | Dijital (1-Wire) | Dijital (tek hat) |
| Ölçüm aralığı | 0 … +100 °C (LM35: −55 … +150 °C) | −55 … +125 °C | 0 … +50 °C |
| Doğruluk | Tipik ±0,6 °C, 25 °C'de en fazla ±1,5 °C | ±0,5 °C (−10 … +85 °C) | ±2 °C |
| Besleme | 4–30 V | 3,0–5,5 V | 3–5,5 V |
| Nem ölçümü | Yok | Yok | Var |
| Kütüphane | Gerekmez | OneWire + DallasTemperature | DHT sensor library |
| Okuma süresi | Anında, sürekli çıkış | 12 bitte 750 ms'ye kadar | Saniyede en fazla 1 ölçüm |
| ESP32 ve Pico ile | 5 V beslemeyle; ADC sınırlarına dikkat | Doğrudan 3,3 V ile | Doğrudan 3,3 V ile |
| Aynı pinde birden fazla sensör | Hayır, her biri ayrı analog pin | Evet | Hayır |
| Su geçirmez sürüm | Yok, kendin yalıtmalısın | Paslanmaz çelik prob | Yok |
Kısacası: hızlı tepki veren, kütüphanesiz, tek analog pinle okunan ve 5 V'luk bir Arduino'da çalışan basit bir termometre istiyorsan LM35 idealdir; analog okumayı ve ADC referansını öğrenmek için de en öğretici sensördür. Kablo uzunsa, eksi derece ölçeceksen, sensörü sıvının içine sokacaksan ya da ESP32 ve Pico gibi 3,3 V'luk kartlarla çalışıyorsan DS18B20 daha doğru seçimdir. Nemi de ölçmek istiyorsan DHT11 ya da daha hassas kardeşi DHT22'yi kullan. NTC termistör, BME280 ve diğerlerini de kapsayan geniş bir karşılaştırma için Arduino sıcaklık sensörleri karşılaştırması yazısına göz at.
LM35 ile proje fikirleri
En çok yapılan LM35 projesi, sıcaklık belli bir değeri geçince fan çalıştıran bir termostattır. Burada önemli olan histerezis kullanmaktır: fan 30 °C'de açılıp 28 °C'de kapanırsa, sıcaklık tam eşik değerinde gidip geldiğinde röle saniyede bir açılıp kapanmaz ve kontakları yıpranmaz. Fanı D7'ye bağlı bir röle modülüyle sürebilirsin:
1const int LM35_PIN = A0;
2const int RELAY_PIN = 7; // röle modülünün IN pini / relay module IN pin
3const float ON_TEMP = 30.0; // bu değerde fan açılır / fan turns on here
4const float OFF_TEMP = 28.0; // bu değerde fan kapanır / fan turns off here
5const float VREF = 1.1; // ölçtüğün AREF değeri / your measured AREF value
6bool fanOn = false;
7
8float readTempC() {
9 long sum = 0;
10 for (int i = 0; i < 32; i++) {
11 sum += analogRead(LM35_PIN);
12 }
13 return (sum / 32.0) * VREF / 1024.0 * 100.0;
14}
15
16void setup() {
17 Serial.begin(9600);
18 pinMode(RELAY_PIN, OUTPUT);
19 digitalWrite(RELAY_PIN, LOW);
20 analogReference(INTERNAL); // 1,1 V referans / 1.1 V reference
21 analogRead(LM35_PIN); // ilk okumayı at / discard the first reading
22 delay(10);
23}
24
25void loop() {
26 float t = readTempC();
27 if (!fanOn && t >= ON_TEMP) fanOn = true; // eşik aşıldı / threshold exceeded
28 if (fanOn && t <= OFF_TEMP) fanOn = false; // yeterince soğudu / cooled down enough
29 digitalWrite(RELAY_PIN, fanOn ? HIGH : LOW); // aktif-HIGH röle varsayıldı / assumes an active-HIGH relay
30 Serial.print(t, 1);
31 Serial.println(fanOn ? " C fan ON" : " C fan OFF");
32 delay(1000);
33}- Ayarlanabilir fan termostatı: Yukarıdaki kodu bir DC fan ve röleyle birleştir, eşik değerini iki butonla artırıp azalt.
- LCD'li dijital termometre: Sıcaklığı I2C LCD ekranda ya da OLED ekranda günün en düşük ve en yüksek değeriyle birlikte göster.
- Aşırı ısınma alarmı: Bir güç kaynağının, akü şarj devresinin ya da 3D yazıcı motorunun sıcaklığı sınırı geçince buzzer çalsın ve LED yansın.
- Wi-Fi'li oda termometresi: ESP32 ile ölçtüğün sıcaklığı telefonundan açılan bir web sayfasında göster.
- Sera ve kuluçka makinesi kontrolü: Isıtıcıyı ve fanı sıcaklığa göre yöneten bir sistem kur; ayrıntılar akıllı sera projesi yazısında.
- Sıcaklık kaydedici: Ölçümleri dakikada bir SD karta yaz ve günlük sıcaklık eğrisini Excel'de çiz.
Sık yapılan hatalar ve çözümleri
| Belirti | Olası sebep | Çözüm |
|---|---|---|
| Sensör elle tutulamayacak kadar ısınıyor | +Vs ile GND ters bağlanmış | Gücü hemen kes; düz yüz sana bakarken sıra +Vs, Vout, GND olmalı |
| Değer sürekli 0 | Sensöre besleme gelmiyor ya da Vout koddakinden farklı bir pine bağlı | +Vs ile GND arasında multimetreyle 5 V ölç, Vout'un A0'a gittiğini doğrula |
| Değerler rastgele zıplıyor | A0 boşta kalmış ya da breadboard teması kötü | Jumper kabloyu değiştir, sensörü breadboard'da başka bir sıraya tak |
| Değer 0,5 °C adımlarla gidip geliyor | 5 V referansın çözünürlüğü | analogReference(INTERNAL) kullan ve ortalama al |
| Röle ya da motor çalışınca değer sıçrıyor | Ortak toprak hattında gerilim düşümü ve parazit | Sensör GND'sini doğrudan Arduino'ya götür, 0,1 µF kondansatör ekle |
| Gerçek sıcaklıktan 2–3 °C yüksek | Sensör regülatörün ya da ESP32 modülünün yanında | Sensörü kabloyla karttan uzaklaştır |
| Diğer analog sensörler 1023 okuyor | INTERNAL referans tüm analog girişleri 1,1 V'a sınırlar | Diğer sensörleri 5 V referansla oku ya da gerilimlerini böl |
| ESP32'de soğukta saçma değerler | ESP32 ADC'si 100 mV'un altını doğru ölçemez | 10 °C altı için DS18B20 kullan |
LM35, analog sensör okumayı, ADC referansını ve sinyal filtrelemeyi öğrenmek için mükemmel bir başlangıç parçasıdır: tek bir formülle başlarsın, sonra doğru referans, ortalama ve kalibrasyonla ölçümünü bir termometre kadar güvenilir hale getirirsin. Aynı mantığı NTC termistör gibi diğer analog sensörlerde de kullanacaksın. BlueGrays uygulamasında NTC ve LCD ile sıcaklık ölçümü, DHT11 ile sıcaklık ve nem, ESP32 ile LCD ekranlı sıcaklık istasyonu ve sıcaklık kaydedici gibi projeleri adım adım devre şemaları ve hazır kodlarıyla bulabilirsin.
Sıkça sorulan sorular
LM35 kaç volt ile çalışır, 3,3 V ile kullanılabilir mi?
LM35'in veri sayfasındaki besleme aralığı 4–30 V'tur. 3,3 V ile beslendiğinde oda sıcaklığında çoğu zaman bir değer verir ama doğruluğu garanti edilmez. ESP32 ve Pico'da sensörü 5 V (VIN ya da VBUS) pininden besle; çıkışı 1,5 V'u geçmediği için 3,3 V'luk analog girişe doğrudan bağlanabilir.
LM35 neden ısınıyor?
Normal çalışmada LM35 yalnızca yaklaşık 60 µA çeker ve kendini 0,1 °C'den az ısıtır; eline sıcak geliyorsa neredeyse her zaman besleme ve GND bacakları ters bağlanmıştır. Düz yüz sana bakarken doğru sıra soldan sağa +Vs, Vout, GND'dir. Gücü hemen kes; uzun süre ters kalan sensör kalıcı olarak bozulabilir.
LM35 sıcaklık formülü nedir?
Arduino Uno'da 5 V referansla sıcaklık (°C) = analogRead × 5,0 / 1024 × 100, yani yaklaşık analogRead × 0,488'dir. 1,1 V dahili referans kullanıyorsan çarpan 1,1 / 1024 × 100 ≈ 0,107 olur. ESP32'de analogReadMilliVolts() sonucunu 10'a bölmen yeterlidir.
LM35 ile eksi sıcaklık ölçülebilir mi?
Temel bağlantıda LM35 yalnızca 2 °C ile 150 °C arasını ölçer. Eksi değerler için çıkışı bir dirençle eksi beslemeye bağlaman ya da GND bacağını iki diyotla yükseltip farkı iki analog girişle ölçmen gerekir; ayrıca sensörün LM35 ya da LM35C gibi eksi dereceler için garanti edilen bir sürüm olması gerekir. Pratikte eksi dereceler için DS18B20 çok daha kolaydır.
LM35 mi DS18B20 mi daha iyi?
Kısa kablolu, 5 V'luk bir Arduino projesinde LM35 kütüphanesiz ve anında okunduğu için çok pratiktir. Uzun kablo, eksi sıcaklık, sıvı içinde ölçüm, aynı pinde birden fazla sensör ya da 3,3 V'luk kartlar söz konusuysa dijital çıkışlı DS18B20 daha doğru ve güvenilir sonuç verir. Oda sıcaklığında LM35A ile DS18B20'nin doğruluğu birbirine yakındır, yaygın LM35DZ ise biraz geride kalır.
LM35 değeri neden sürekli değişiyor?
5 V referansla her ADC basamağı yaklaşık 0,5 °C'ye denk geldiği için değer iki basamak arasında gidip gelir; USB geriliminin dalgalanması da sonucu etkiler. analogReference(INTERNAL) ile 1,1 V referansa geç, 16–64 ölçümün ortalamasını al ve sensörün besleme bacakları arasına 0,1 µF kondansatör ekle. Röle ya da motor varsa sensörün GND'sini doğrudan Arduino'ya götür.
Bu yazıdan sonra yapabileceğin projeler
Tüm projeleri gör
DHT11 İle Sıcaklık Ve Nem
Odan kaç derece, hava nemli mi, kuru mu? DHT11 sensörü sıcaklığı ve nemi ölçer, Arduino da bu değerleri iki satırlık LCD ekrana yazar ve birkaç saniyede bir yeniler. Sensöre bir şey olursa ekranda hat

Ldr İle Işık Şiddeti Okuma
Odanın ne kadar aydınlık olduğunu sayıyla görmek ister misin? Işığa duyarlı küçük bir parça olan LDR ortam ışığını ölçer ve Arduino bu değeri yarım saniyede bir bilgisayar ekranına yazar. Elinle üstün

ESP32 LDR Modülü ile Işık Şiddeti Okuma
LDR modülünün ham ADC değerini ve karanlık/aydınlık referanslarına göre hesaplanan göreli ışık yüzdesini Serial Monitor'da gerçek zamanlı izleme. Bu yüzde lux ölçümü değildir. Modülün kalibrasyon mantığını öğretir. Proje 10'un öncesinde yapılması ideal; çünkü eşik değerini belirlemek için kullanılır.

NTC ve 2x16 Lcd Ekran İle Sıcaklık Ölçümü
Ortamın sıcaklığını küçük bir boncuk gibi görünen sensörle ölç. NTC adlı bu parça ısındıkça elektriği daha kolay geçirir; Arduino bu değişimi okuyup bir formülle santigrat dereceye çevirir ve iki satı

LCD Ekran ile Dijital Voltmetre
Pilin ya da adaptörün ne kadar gerilim verdiğini kendi yaptığın ölçü aletiyle öğren. İki dirençten oluşan bir bölücü yüksek gerilimi kartın okuyabileceği seviyeye indirir, Arduino da gerçek değeri hes

ESP32 DHT22 Sıcaklık ve Nem (LCD Ekranlı)
DHT22 sensörü ile ortam sıcaklığını ve nem oranını ölçüp 16x2 I2C LCD ekranda gerçek zamanlı olarak gösteren bir projedir. Adafruit DHT kütüphanesi kullanılarak tek kablo (one-wire) protokolü ile sensörden veri okunur. Bu proje, IoT hava istasyonu, akıllı ev otomasyonu veya seralarda ortam takip sistemlerinin temelini oluşturur. ESP32'nin GPIO 4 pini üzerinden DHT22 ile haberleşme sağlanır.

ESP32 Sıcaklık Loglayıcı (DHT22 + DS1307 RTC + microSD + OLED)
ESP32 ile zamanlı sıcaklık ve nem kayıt sistemi kur! Bu projede DHT22 sensörü ile dakikada bir sıcaklık/nem okuyup DS1307 RTC modülünden aldığın gerçek zaman etiketiyle microSD karta CSV formatında kaydediyoruz. OLED ekranda büyük font ile son sıcaklık değeri, nem yüzdesi, timestamp ve toplam kayıt sayısı canlı gösterilir. SD kart üzerindeki /temp_log.csv dosyası Excel/Google Sheets/Python pandas ile açılıp analiz edilebilir — sera monitörü, ev/oda sıcaklık takibi, laboratuvar veri toplama,

I2C İle LCD Ekran Kullanımı
Arduino'ya kendi ekranını kazandır ve ilk mesajını yazdır. İki satırlık LCD ekran yalnızca birkaç kabloyla bağlanır; önce üst satıra bir selam, ardından alt satıra ikinci bir yazı gelir, ekran temizle
Diğer yazılar
BlueGrays uygulaması
Bu devreyi telefonunda adım adım kur
Devre şeması, kod ve parça listesi tek ekranda. 200'den fazla Arduino, ESP32 ve Pico projesi seni bekliyor.
Telefonunla tara
Kamerayı koda tut; telefonunun uygulama mağazası açılır.
ya da mağazada aç

