ESP32 ve MQTT ile Yerel Ortam İzleme Sistemi Tasarımı

Piyasadaki akıllı ev sensörlerinin büyük çoğunluğu üreticinin uzak bulut sunucularına bağlanarak çalışır. Bu durum internet kesintilerinde veri kaybına, veri gizliliği endişelerine ve üreticinin sunucuları kapattığında cihazın işlevsiz kalmasına yol açar. Kendi yaşam alanımda sıcaklık, nem ve hava kalitesi gibi verileri takip etmek için tamamen yerel ağda (LAN) çalışan, dış internete bağımlı olmayan bir mimari kurmayı tercih ettim.

Bu yazıda; bir ESP32 geliştirme kartı, BME280 çevresel sensörü ve yerel ağdaki bir Mosquitto MQTT sunucusu ile hayata geçirdiğim ortam izleme düğümünün tasarım detaylarını inceliyorum.


1. Mimari Genel Bakış

Sistem üç ana bileşenden meydana geliyor:

  1. Uç Düğüm (ESP32 + BME280): Her 60 saniyede bir ortam sıcaklığını ve bağıl nemi ölçer.
  2. Mesaj Aracısı (Mosquitto MQTT Broker): Ev sunucusunda (Orange Pi veya yerel PC) çalışan hafif haberleşme sunucusu.
  3. Tüketici / Kayıt Birimi: Gelen MQTT verilerini kaydeden ve grafikleyen servis (Home Assistant veya basit bir SQLite veritabanı).
[ESP32 Düğümü] --(Wi-Fi / MQTT Topic: home/livingroom/env)--> [Mosquitto Broker] --> [Yerel Veri Tabanı]

Bu modelde ESP32 doğrudan bir veritabanına bağlanmaz; sadece tanımlı bir konuya (topic) JSON formatında hafif bir yük bırakır.


2. Donanım ve Pin Bağlantıları

BME280 sensörü I2C veri yolu üzerinden ESP32 ile haberleşir:

BME280 PiniESP32 GPIOAçıklama
VCC3.3V3.3V Besleme
GNDGNDToprak
SCLGPIO 22I2C Saat Hattı
SDAGPIO 21I2C Veri Hattı

3. ESP-IDF Tarafında Veri Okuma ve MQTT Yayını

Sensörden okunan değerlerin JSON formatında biçimlendirilip yerel broker’a gönderilmesini sağlayan C fonksiyonu:

#include <stdio.h>
#include <string.h>
#include "esp_log.h"
#include "mqtt_client.h"

static const char *TAG = "ENV_NODE";
extern esp_mqtt_client_handle_t s_mqtt_client;

void publish_telemetry(float temperature, float humidity, float pressure) {
    char payload[128];
    // JSON dizesi oluştur
    snprintf(payload, sizeof(payload),
             "{\"temp\": %.2f, \"hum\": %.2f, \"press\": %.1f}",
             temperature, humidity, pressure);

    // QoS 1 seviyesinde, retain bayrağı true olacak şekilde yayınla
    int msg_id = esp_mqtt_client_publish(
        s_mqtt_client,
        "home/livingroom/env",
        payload,
        0,   // uzunluk (0 = strlen ile otomatik hesapla)
        1,   // QoS 1 (En az bir kez iletim garantisi)
        1    // Retain = 1 (Yeni bağlanan istemciler son durumu hemen görsün)
    );

    ESP_LOGI(TAG, "Telemetri gönderildi (Msg ID: %d): %s", msg_id, payload);
}

4. Güç Tüketimi Optimizasyonu: Deep Sleep Modu

Sürekli açık duran bir mikrodentleyici yaklaşık 80-120 mA akım çeker. Eğer cihazı pille veya küçük bir powerbank ile çalıştırmak isterseniz Deep Sleep modu zorunludur:

#include "esp_sleep.h"

void enter_deep_sleep_for_interval(uint64_t seconds) {
    ESP_LOGI(TAG, "%llu saniye derin uyku moduna geçiliyor...", seconds);
    esp_sleep_enable_timer_wakeup(seconds * 1000000ULL);
    esp_deep_sleep_start();
}
  • Cihaz uyanır (~1.5 saniye sürer), Wi-Fi’a bağlanır, sensörü okur, MQTT paketini yollar ve tekrar uykuya dalar.
  • Uyku esnasında akım tüketimi 15-20 µA seviyesine düşer. Bu sayede standart bir 18650 lityum pil ile cihaz aylarca kesintisiz çalışabilir.

5. Yerel Mosquitto Sunucusunu Dinlemek

Gelen veriyi yerel ağdaki herhangi bir Linux makinesinden test etmek için:

# Tüm ortam konularını anlık dinle
mosquitto_sub -h 192.168.1.150 -t "home/+/env" -v

Çıktı:

home/livingroom/env {"temp": 22.40, "hum": 45.20, "press": 1013.2}

6. Değerlendirme

Yerel bir IoT ağı kurmak, internet altyapısındaki arızalardan etkilenmeyen, yanıt süresi birkaç milisaniyeyi geçmeyen ve tamamen kendi kontrolünüzde olan bir altyapı sağlar. Gömülü C kodunun sunduğu bellek ve güç verimliliği ise bu tip projelerin uzun ömürlü çalışmasında belirleyici bir faktördür.