ESP32 ve Arduino

ESP32 Pilli Sensör Tasarımı: Kartlar, Regülatörler ve MQTT Yayın Aralıkları

ESP32 pilli sensör için pratik bir tasarım rehberi: kart seçimi, düşük boşta akımlı regülatörler, pil voltajı izleme, hızlı Wi-Fi yeniden bağlanması ve pil ömrünü uzatan MQTT yayın aralıkları.

LiPo hücreli ve voltaj bölücülü, MQTT ölçümlerini buluta gönderen ESP32 pilli sensör düğümü
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Bir ESP32 pilli sensör tek bir hücreyle aylarca çalışabilir; ancak yalnızca donanım ve firmware birlikte tasarlanırsa. Bu rehber kart seçimini, regülatörleri, pil izlemeyi ve yayın döngüsünü adım adım ele alır; böylece MQTT düğümünüz mümkün olan en az enerjiyle uyanır, raporlar ve yeniden uykuya geçer.

Pil Ömrü Neden Büyük Ölçüde Bir Tasarım Kararıdır?

ESP32, radyosu olmayan bir mikrodenetleyici kadar düşük güçlü bir çip değildir. Wi-Fi etkinken yüksek miktarda akım çeker ve iletim darbeleri ömrünün en pahalı anlarıdır. Deep sleep'te çipin kendisi mikroamper seviyesine düşer. Bir hafta dayanan bir düğümle bir mevsim dayanan bir düğüm arasındaki fark, her durumda ne kadar zaman geçirdiği ve çip uyurken çevresindeki devrenin ne kadar enerji harcadığıdır.

Bu size üç kaldıraç verir: uyku akımı (genellikle ESP32'nin değil, regülatör, USB-seri çip ve LED'lerin belirlediği), uyanık kalma süresi (açılış, Wi-Fi, DHCP, MQTT bağlantısı, yayın) ve uyanma sıklığı (aralığı yarıya indirmek radyo enerjisini kabaca ikiye katlar). Genellikle en büyük kaldıraç karttır, bu yüzden oradan başlayın.

ESP32 Pilli Sensör İçin Kart Seçimi

Geliştirme kartları masada kolaylık sağlamak için üretilir. Genellikle sürekli açık bir USB-UART köprüsü, bir güç LED'i ve boşta akımından çok fiyatına göre seçilmiş lineer bir regülatör içerirler. Bunların her biri uykuda ESP32'den çok daha fazla akım çekebilir.

Seçenek Uyku davranışı Uygun olduğu durum
Genel DevKit (ESP32-WROOM + AMS1117 + USB köprüsü) Kötü: regülatör ve USB çipi sürekli miliamperler çeker Yalnızca firmware prototipleme
Düşük güçlü olarak pazarlanan kartlar (LiPo şarj devresi, düşük Iq LDO, kapatılabilir USB) İyi: deep sleep için tasarlanmış, çoğunlukla pil konnektörlü Küçük üretimler ve saha pilotları
Kendi PCB'nizde çıplak modül (ESP32-WROOM / ESP32-C3 / ESP32-C6) En iyi: her parçayı siz seçersiniz Ürünler ve uzun süreli kurulumlar
ESP32-C3 veya C6 tabanlı kartlar İyi, tek çekirdek, birçok iş yükünde klasik ESP32'den düşük aktif akım Yalnızca Wi-Fi gerektiren basit sensörler

Bir kartı değerlendirirken güç LED'ini sökün, USB-seri çipin 3,3 V hattında olup olmadığını kontrol edin ve regülatörün boşta akımına bakın. Ardından uyku akımını pile seri bağlı bir multimetre veya bir akım profilleyici ile ölçün; USB güç ölçer yeterince hassas değildir.

Regülatörler ve Pil Kimyası

ESP32 yaklaşık 3,0–3,6 V'a ihtiyaç duyar ve Wi-Fi iletimi sırasında birkaç yüz miliamperlik kısa tepeler çekebilir. Güç yolunuz bu tepeleri brownout olmadan karşılamalı ve boştayken neredeyse hiç enerji harcamamalıdır.

Tek LiPo / Li-ion hücre (3,0–4,2 V). En yaygın tercihtir. Boşta akımı düşük mikroamper aralığında olan ve iletim tepeleri için yeterli payı bulunan bir low-dropout regülatör kullanın. Hücre 3,3 V'a doğru boşaldıkça LDO dropout'a girer; bu yüzden düğümün yaklaşık 3,4–3,5 V hücre voltajında güvenilir şekilde raporlamayı bırakacağını hesaba katın ve bundan çok önce düşük pil uyarısı verin.

LiFePO4 hücre (yaklaşık 3,2–3,3 V nominal). Voltajı deşarj eğrisinin büyük bölümünde ESP32'nin çalışma aralığında kalır; bu yüzden bazı tasarımlar regülatörü atlar. Önce maksimum şarj voltajını mutlak maksimum değerlerle karşılaştırın.

AA piller. Alkalin piller iletim tepelerinde, özellikle soğukta, voltaj düşürür. Bunları düşük boşta akımlı bir buck-boost dönüştürücüyle eşleştirin veya lityum birincil piller kullanın.

Modülün yakınına bir toplu kondansatör (birkaç yüz mikrofarad) ekleyin. İletim darbelerini karşılar ve brownout dedektörünün çipi sıfırlamasını önler; bu da pilli düğümlerdeki gizemli yeniden başlatma döngülerinin en yaygın nedenlerinden biridir.

Pil Voltajını İzlemek

Sessizce ölen bir sensör, uyarı vererek ölen bir sensörden daha kötüdür. Hücreyi bir ADC pinine giden voltaj bölücüyle ölçün ve her MQTT payload'ına ekleyin.

Eşit değerli iki yüksek değerli dirençten oluşan bir bölücü (örneğin 2 × 1 MΩ), yalnızca mikroamperler çekerek hücre voltajını ADC aralığına yarıya indirir. Yüksek değerli bölücülerin kaynak empedansı yüksektir; bu yüzden ADC'ye kararlı bir örnek sağlamak için ADC pininden toprağa küçük bir kondansatör (yaklaşık 100 nF) ekleyin. Bu sızıntı bile önemliyse, bölücünün alt tarafını bir GPIO ile sürülen bir MOSFET ile anahtarlayın.

ESP32 Arduino core 2.x ve 3.x'te analogReadMilliVolts() fabrika kalibrasyonunu uygular ve doğrudan milivolt döndürür; bu da ham analogRead() değerlerini kendiniz ölçeklemekten çok daha doğrudur. Tek ölçümler gürültülü olduğu için birkaç örneğin ortalamasını alın. Klasik ESP32'de ADC1 pini (GPIO 32–39) kullanın, çünkü Wi-Fi etkinken ADC2 kullanılamaz.

Uyan–Yayınla–Uyu Firmware Kalıbı

Aşağıdaki firmware, pilli bir düğüm için eksiksiz bir Arduino sketch'idir. Deep sleep'ten uyanır, RTC belleğinde önbelleğe alınmış kanal ve BSSID'yi kullanarak Wi-Fi'a yeniden bağlanır, pil voltajını içeren tek bir JSON mesajı yayınlar, bağlantıyı düzgünce keser ve yeniden uyur. broker.connectmq.com'un ücretsiz public alanını kullanır; bu yüzden benzersiz bir topic öneki seçin ve hassas hiçbir şey göndermeyin.

#include <WiFi.h>
#include <PubSubClient.h>

const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";
const char* MQTT_HOST = "broker.connectmq.com";
const uint16_t MQTT_PORT = 1883;
const char* TOPIC = "connectmq/demo/7f3a91/garden-node/telemetry";

const uint64_t SLEEP_SECONDS = 600;     // publish every 10 minutes
const int BATTERY_PIN = 34;             // ADC1 pin, divider 2 x 1 MOhm
const float DIVIDER_RATIO = 2.0;

RTC_DATA_ATTR uint32_t bootCount = 0;
RTC_DATA_ATTR uint8_t savedBssid[6];
RTC_DATA_ATTR int32_t savedChannel = 0;

WiFiClient net;
PubSubClient mqtt(net);

float readBatteryVolts() {
  uint32_t sum = 0;
  for (int i = 0; i < 16; i++) sum += analogReadMilliVolts(BATTERY_PIN);
  return (sum / 16.0f) * DIVIDER_RATIO / 1000.0f;
}

bool connectWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.persistent(false);
  if (savedChannel > 0) {
    WiFi.begin(WIFI_SSID, WIFI_PASS, savedChannel, savedBssid);
  } else {
    WiFi.begin(WIFI_SSID, WIFI_PASS);
  }
  unsigned long start = millis();
  while (WiFi.status() != WL_CONNECTED) {
    if (millis() - start > 10000) {
      savedChannel = 0;                 // force a full scan next time
      return false;
    }
    delay(20);
  }
  savedChannel = WiFi.channel();
  memcpy(savedBssid, WiFi.BSSID(), 6);
  return true;
}

void goToSleep() {
  mqtt.disconnect();
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
  esp_sleep_enable_timer_wakeup(SLEEP_SECONDS * 1000000ULL);
  esp_deep_sleep_start();
}

void setup() {
  bootCount++;
  float battery = readBatteryVolts();   // read before the radio loads the cell

  if (!connectWifi()) goToSleep();

  String clientId = "esp32-batt-" + String((uint32_t)ESP.getEfuseMac(), HEX);
  mqtt.setServer(MQTT_HOST, MQTT_PORT);
  mqtt.setSocketTimeout(5);
  if (!mqtt.connect(clientId.c_str())) goToSleep();

  char payload[96];
  snprintf(payload, sizeof(payload),
           "{\"battery\":%.2f,\"boot\":%lu,\"rssi\":%d}",
           battery, (unsigned long)bootCount, WiFi.RSSI());
  mqtt.publish(TOPIC, payload);
  mqtt.loop();
  delay(50);                            // let the TCP stack flush
  goToSleep();
}

void loop() {}

Burada birkaç ayrıntı önemlidir:

  • Pil, Wi-Fi başlamadan önce okunur. İletim yükü altında hücre voltajı düşer; bu yüzden sonradan alınan bir ölçüm gerçekte olduğundan daha düşük görünür.
  • Her hata yolu uykuyla biter. Wi-Fi'a veya broker'a ulaşılamıyorsa düğüm sonsuza kadar yeniden deneyip hücreyi tüketmez. Bir sonraki uyanmada tekrar dener.
  • Önbelleğe alınmış kanal ve BSSID, radyonun tam taramayı atlamasını sağlar ve her uyanmayı kısaltır. Erişim noktası değişirse zaman aşımı önbelleği temizler ve bir sonraki açılış normal şekilde tarama yapar.
  • Statik IP (WiFi.config() ile) DHCP gidiş-dönüşünü de ortadan kaldırır. Ağı siz kontrol ediyorsanız kullanın.

Uyku modlarına, uyanma kaynaklarına ve uyanmalar arasında durumu korumaya daha derinlemesine bakmak için ESP32 deep sleep MQTT rehberine göz atın.

Yayın Aralığını Seçmek

Doğru aralık, değerin ne kadar hızlı değiştiğine ve bir ölçümün ne kadar eskiyebileceğine bağlıdır.

Ölçüm Tipik kullanışlı aralık Notlar
Oda veya sera sıcaklığı 5–15 dakika Yavaş değişir; uyanma başına birkaç örneğin ortalamasını alın
Toprak nemi 30–60 dakika Çok yavaş; daha sık örnekleyip yalnızca değiştiğinde yayınlamayı düşünün
Su deposu seviyesi 10–30 dakika Bir eşik aşıldığında anında yayın ekleyin
Kapı veya hareket Olay güdümlü Zamanlayıcıyla değil, GPIO ile uyandırın (ext0/ext1)
Pil voltajı Her uyanmada Eklemesi ucuz; bakım için vazgeçilmez

İki teknik bütçeyi daha da uzatır. Toplu gönderim: Wi-Fi olmadan kısa süreliğine uyanıp bir ölçüm alın, RTC belleğinde saklayın ve yalnızca her N uyanmada bir bağlanarak toplu veriyi tek bir JSON dizisi olarak yayınlayın. Değişimde raporlama: yeni değeri RTC belleğindeki son yayınlanan değerle karşılaştırın ve değer bir ölü bandın ötesine geçmediyse radyoyu tamamen atlayın. Sessiz bir sensörü ölü bir sensörden ayırabilmek için her zaman en azından periyodik bir heartbeat yayınlayın.

Enerji Tasarrufu Sağlayan MQTT Ayarları

Cihaz tarafındaki protokol tercihlerinin yayın süresi açısından doğrudan bir maliyeti vardır:

  • Rutin telemetri için QoS 0. QoS 1 bir PUBACK gidiş-dönüşü ekler ve radyoyu daha uzun süre açık tutar. Yalnızca kaybetmeyi göze alamayacağınız ölçümler için kullanın; MQTT QoS seviyeleri yazısı bu dengeyi ele alır.
  • En son değer için retained mesajlar. Telemetriyi retain bayrağıyla yayınlayın; uyanmalar arasında bağlanan bir dashboard son ölçümü yine anında görür.
  • Temiz, kısa oturumlar. Uyuyan bir düğümün kalıcı bir aboneliğe ihtiyacı yoktur. Clean session ile bağlanın, yayınlayın ve bağlantıyı kesin.
  • Kompakt payload'lar. Saatte birkaç ölçüm için kısa JSON anahtarları yeterlidir.
  • TLS bir el sıkışmaya mal olur. 8883 portundaki şifreli bağlantıların kurulması 1883'teki düz TCP'den belirgin şekilde daha uzun sürer ve radyoyu daha uzun süre açık tutar. Üretimde bu bedel buna değer; SSL/TLS üzerinden ESP32 MQTT yazısı el sıkışmayı olabildiğince ucuz tutmanın yolunu gösterir.

Kurulum Öncesi Saha Kontrol Listesi

  1. Bitmiş kartın deep sleep akımını ölçün.
  2. Döngü başına uyanık kalma süresini loglayın ve Wi-Fi yeniden deneme kaynaklı aykırı değerlere bakın.
  3. Düğümün beklenen en düşük hücre voltajında brownout döngülerine girmeden soğuk başlatmayı atlattığını doğrulayın.
  4. Her mesajda pil voltajını ve bir açılış sayacını yayınlayın.
  5. Düşük pil voltajı ve eksik mesajlar için bir dashboard uyarısı tanımlayın.
  6. Muhafazayı kapatın, ancak anteni metal ve pillerden uzak tutun.
  7. Masanızın dışına herhangi bir şey kurmadan önce public test alanından özel kimlik bilgilerine geçin.

Test Broker'ından Üretime Geçiş

broker.connectmq.com'daki ücretsiz public MQTT broker, aralıkları ayarlarken idealdir; çünkü kaydolmadan mosquitto_sub ile mesajların gelişini izleyebilirsiniz. Gerçek kurulumlar için başka kimsenin verilerinizi okuyamaması adına özel bir broker'a geçin. ConnectMQ her broker'a oluşturulmuş kimlik bilgileri ve bunlara bağlı bir client ID verir; yalnızca bağlantı çağrısı değişir:

mqtt.setServer("broker.connectmq.com", 8883);   // with WiFiClientSecure and the ISRG Root X1 CA
mqtt.connect("YOUR_CLIENT_ID", "YOUR_USERNAME", "YOUR_PASSWORD");

ConnectMQ portalında canlı topic gezgini ve eşik uyarı kuralları, filo genelinde pil voltajını izlemenizi ve bir düğüm değiştirme eşiğinizin altına düştüğünde bildirim almanızı sağlar. Çok sayıda düğüm yapıyorsanız daha kapsamlı ESP32 IoT eğitimi cihaz tarafının eksiksiz bir projeye nasıl oturduğunu gösterir; bulut MQTT broker rehberi de barındırılan bir broker'ın sizi nelerden kurtardığını açıklar.

ConnectMQ ile Başlayın

Pilli düğümünüzün prototipini bugün broker.connectmq.com üzerinde yapın, ardından app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz Serverless planında özel bir broker oluşturun. Bu tamamen yönetilen bir MQTT servisi olduğu için zamanınızı broker bakımına değil güç bütçelerine harcarsınız.

Sık Sorulan Sorular

Bir ESP32 pilli sensör tek bir LiPo hücreyle ne kadar çalışabilir?

Bu, kartın uyku akımına, her uyanmanın süresine ve yayın aralığına bağlıdır. Düşük boşta akımlı regülatörü olan ve sürekli açık USB çipi bulunmayan, birkaç dakikada bir kısa bir yayın için uyanan bir kart aylarca çalışabilir; aynı hücreyle standart bir DevKit ise yalnızca birkaç gün dayanabilir.

Bir MQTT sensörü için deep sleep mi, light sleep mi kullanmalıyım?

Düğüm periyodik olarak raporluyor ve bir bağlantıyı açık tutması gerekmiyorsa deep sleep kullanın. Light sleep RAM'i korur ve bir Wi-Fi ilişkisini sürdürebilir, ancak boşta akımı çok daha yüksektir; bu yüzden komutlara hızlı tepki vermesi gereken düğümlere uygundur.

Pilli ESP32'm Wi-Fi başladığında neden sürekli yeniden başlıyor?

Bu genellikle brownout dedektörünün iletim darbeleri sırasındaki voltaj düşüşüne tepki vermesidir. Modülün yakınına bir toplu kondansatör ekleyin, tepe akımı karşılayabilen bir regülatör kullanın ve özellikle soğukta pilin iç direncini kontrol edin.

Pil voltajını akım israf etmeden ölçebilir miyim?

Evet. ADC pininde küçük bir kondansatörle yüksek değerli bir bölücü kullanın veya ölçümler arasında bölücüyü bir MOSFET ile kapatın ve bir ADC1 pininde analogReadMilliVolts() ile okuyun.

İlgili yazılar

ESP32 NTP MQTT Zaman Damgası: Her Mesaja Doğru Zaman Ekleyin

ESP32 saatini NTP ile eşitleyin, ISO 8601 ve epoch milisaniye zaman damgalarını biçimlendirin ve bunları MQTT payload'larına ekleyin; böylece ölçümler geç yayınlansa bile gerçek alınma zamanlarını korur.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.