Soğuk depo sıcaklık izleme, bir dondurucu veya soğuk oda arızalandığında birkaç saat içinde kaybedilebilecek gıdaları, hammaddeleri, ilaçları ve numuneleri korur. Bu kullanım senaryosu, dondurucu ve soğuk odalara MQTT sensörlerinin nasıl yerleştirileceğini, gerçek sıcaklık sapmalarının zararsız kapı açılmalarından nasıl ayırt edileceğini, çevrimdışı kalan sensörlerin nasıl tespit edileceğini ve bir denetçiye gösterebileceğiniz bir sapma kaydının nasıl tutulacağını gösteriyor.
Soğuk Depoda Neler Ters Gidebilir?
Soğuk depo kayıplarının çoğu dramatik arızalardan kaynaklanmaz. Kimsenin zamanında fark etmediği sıradan olaylardan kaynaklanır:
- Gece teslimatından sonra aralık bırakılan bir kapı.
- Sıcak bir öğleden sonra atan ve yeniden çalışmayan bir kompresör.
- Buzlanan bir evaporatör; oda saatler içinde yavaş yavaş ısınır.
- Hafta sonu yaşanan bir elektrik kesintisi.
- Bir kontrolör değişikliğinden sonra gereğinden uzun süren bir defrost çevrimi.
Vardiyada iki kez doldurulan manuel bir sıcaklık kaydı, okumalar arasında bunların hiçbirini yakalamaz. Uyarılı sürekli izleme bu boşluğu kapatır. Aynı ilkeler soğutmalı taşımacılık için de geçerlidir ve bu konu soğuk zincir izleme yazısında ele alınıyor; bu yazı ise bir tesis, depo veya mutfaktaki sabit dondurucu ve soğuk odalara odaklanıyor.
Kurulum
| Bileşen | Rol | Örnek seçim |
|---|---|---|
| Sıcaklık probu | Hava veya ürün sıcaklığını ölçer | Kapı contasından geçen yassı kablolu su geçirmez DS18B20 |
| Kapı kontağı | Kısa sıcaklık artışlarını açıklar | Kapı kasasında reed switch |
| Sensör düğümü | Probu ve kapıyı okur, yayınlar | Dondurucunun dışına monte edilmiş, şebekeden beslenen ESP32 |
| MQTT broker | Okumaları ve uyarıları alır | ConnectMQ yönetilen broker |
| Uyarı mantığı | Sapma ve çevrimdışı tespiti | Portal eşik kuralları artı bir Python servisi |
| Sapma kaydı | Denetimler ve talepler için kanıt | Uyarı servisinin yazdığı veritabanı |
ESP32'yi soğuk alanın dışında tutun. Elektronik ve piller dondurucu sıcaklıklarında zorlanır, Wi-Fi sinyalleri de bir soğuk odanın metal duvarlarından geçmez. İçeriye yalnızca prob kablosu girer.
Prob nereye konmalı?
Evaporatöre yakın hava sıcaklığı hızla değişir ve her kapı açılmasını abartır. Ürün sıcaklığı yavaş değişir ve gerçekten önemli olanı yansıtır. Yaygın bir uzlaşma, probu evaporatör çıkışından uzakta, odanın en sıcak bölgesine yerleştirmek ve isteğe bağlı olarak onu tamponlayan küçük bir glikol şişesinin veya ürün simülantının içine koymaktır; böylece okumalar hava akımlarını değil ürün sıcaklığını takip eder. Kalıcı konumu seçmeden önce sıcak noktayı bulmak için odayı birkaç probla bir kez haritalayın.
Sensör Yazılımı
Aşağıdaki sketch sıcaklığı ve kapı durumunu her 30 saniyede bir ve kapı durumu değiştiğinde hemen yayınlar. Bir Last Will mesajı ayarlar; böylece sensör kaybolursa broker onu çevrimdışı olarak duyurur. PubSubClient, OneWire ve DallasTemperature kütüphanelerini kurun. Sensör bağlantı ayrıntıları için ESP32 DS18B20 MQTT eğitimine bakın.
#include <WiFi.h>
#include <PubSubClient.h>
#include <OneWire.h>
#include <DallasTemperature.h>
const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";
const char* CLIENT_ID = "freezer2-6c0f3b";
const char* BASE = "connectmq/demo/6c0f3b/warehouse/freezer2";
const int PROBE_PIN = 4;
const int DOOR_PIN = 27; // GND'ye bağlı reed switch, kapı kapalı = LOW
const uint32_t PERIOD_MS = 30000;
OneWire oneWire(PROBE_PIN);
DallasTemperature probe(&oneWire);
WiFiClient net;
PubSubClient mqtt(net);
char topicTelemetry[96], topicStatus[96];
int lastDoor = -1;
uint32_t lastPub = 0;
void connectAll() {
if (WiFi.status() != WL_CONNECTED) {
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) delay(250);
}
while (!mqtt.connected()) {
if (mqtt.connect(CLIENT_ID, topicStatus, 1, true, "offline")) {
mqtt.publish(topicStatus, "online", true);
} else {
delay(3000);
}
}
}
void publishReading(bool doorOpen) {
probe.requestTemperatures();
float t = probe.getTempCByIndex(0);
char payload[128];
if (t == DEVICE_DISCONNECTED_C) {
snprintf(payload, sizeof(payload), "{\"temp_c\":null,\"door_open\":%s,\"fault\":\"probe\"}",
doorOpen ? "true" : "false");
} else {
snprintf(payload, sizeof(payload), "{\"temp_c\":%.2f,\"door_open\":%s,\"rssi\":%d}",
t, doorOpen ? "true" : "false", WiFi.RSSI());
}
mqtt.publish(topicTelemetry, payload, true);
}
void setup() {
pinMode(DOOR_PIN, INPUT_PULLUP);
snprintf(topicTelemetry, sizeof(topicTelemetry), "%s/telemetry", BASE);
snprintf(topicStatus, sizeof(topicStatus), "%s/status", BASE);
probe.begin();
WiFi.mode(WIFI_STA);
mqtt.setServer("broker.connectmq.com", 1883);
connectAll();
}
void loop() {
connectAll();
mqtt.loop();
int door = digitalRead(DOOR_PIN) == HIGH; // HIGH = mıknatıs uzakta = açık
if (door != lastDoor || millis() - lastPub >= PERIOD_MS) {
publishReading(door);
lastDoor = door;
lastPub = millis();
}
delay(200);
}
Last Will, manuel bir kaydın hiçbir zaman sahip olmadığı güvenlik ağıdır: düğüm gücünü veya Wi-Fi bağlantısını kaybederse broker, keepalive zaman aşımından sonra durum topic'inde offline yayınlar. ESP32 MQTT Last Will rehberi bu mekanizmayı açıklar.
Gereksiz Alarmlar Olmadan Sapma Mantığı
Sıcaklık limiti aştığında alarm vermek gibi naif bir yaklaşım bir gün içinde çöker. Her teslimat kapıyı açar, hava sıcaklığı sıçrar ve personel alarmı görmezden gelmeyi öğrenir. İyi bir soğuk depo sıcaklık izleme birkaç kuralı birlikte kullanır:
- Limit artı gecikme. Sapmayı yalnızca sıcaklık belirli bir süre boyunca limitin üzerinde kalırsa üretin; örneğin bir dondurucu için 15 dakika.
- Kapı farkındalıklı gecikme. Kapı açıkken daha uzun bir tolerans süresi tanıyın, ancak kapı çok uzun süre açık kalırsa ayrı bir kapı açık uyarısı üretin.
- Kesin limit. Çok daha yüksek bir sıcaklık, gecikmeden bağımsız olarak hemen tetikler.
- Çevrimdışı ve prob arızaları. Sessizleşen bir sensör veya bağlantısı kopan bir prob başlı başına bir uyarıdır.
- Sapma kaydı. Her sapma bir başlangıç zamanı, bitiş zamanı, tepe sıcaklık ve süre alır.
Limitlerin kendisi ürünlerinizden ve gıda güvenliği veya kalite planınızdan gelir. Genel sayılar yerine bu dokümanları kullanın.
Python ile sapma servisi
import json
import sqlite3
import time
import paho.mqtt.client as mqtt
PREFIX = "connectmq/demo/6c0f3b/warehouse"
LIMIT_C = -15.0 # ürün gereksinimlerinizden
HARD_LIMIT_C = -5.0
DELAY_S = 15 * 60
DOOR_MAX_S = 5 * 60
STALE_S = 3 * 60
db = sqlite3.connect("excursions.db", check_same_thread=False)
db.execute("""CREATE TABLE IF NOT EXISTS excursions (
unit TEXT, start_ts INTEGER, end_ts INTEGER, peak_c REAL, reason TEXT)""")
units = {}
def alert(client, unit, kind, detail):
msg = {"ts": int(time.time()), "unit": unit, "kind": kind, **detail}
client.publish(f"{PREFIX}/{unit}/alert", json.dumps(msg), qos=1, retain=True)
print("ALERT", msg)
def on_connect(client, userdata, flags, reason_code, properties):
client.subscribe(f"{PREFIX}/+/telemetry", qos=1)
client.subscribe(f"{PREFIX}/+/status", qos=1)
def on_message(client, userdata, msg):
unit = msg.topic.split("/")[4]
now = time.time()
u = units.setdefault(unit, {"above_since": None, "door_since": None,
"excursion": None, "seen": now})
if msg.topic.endswith("/status"):
if msg.payload == b"offline":
alert(client, unit, "offline", {})
return
d = json.loads(msg.payload)
u["seen"] = now
if d.get("temp_c") is None:
alert(client, unit, "probe_fault", {})
return
t = d["temp_c"]
u["door_since"] = (u["door_since"] or now) if d["door_open"] else None
if u["door_since"] and now - u["door_since"] > DOOR_MAX_S:
alert(client, unit, "door_open_too_long", {"seconds": int(now - u["door_since"])})
u["door_since"] = now
if t > LIMIT_C:
u["above_since"] = u["above_since"] or now
delay = DELAY_S * (2 if d["door_open"] else 1)
exc = u["excursion"]
if exc:
exc["peak"] = max(exc["peak"], t)
elif t > HARD_LIMIT_C or now - u["above_since"] > delay:
u["excursion"] = {"start": u["above_since"], "peak": t}
alert(client, unit, "excursion_start", {"temp_c": t, "limit_c": LIMIT_C})
else:
exc = u["excursion"]
if exc:
db.execute("INSERT INTO excursions VALUES (?,?,?,?,?)",
(unit, int(exc["start"]), int(now), exc["peak"], "above_limit"))
db.commit()
alert(client, unit, "excursion_end",
{"duration_min": round((now - exc["start"]) / 60, 1), "peak_c": exc["peak"]})
u["above_since"] = None
u["excursion"] = None
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="cold-alerts-6c0f3b")
client.on_connect = on_connect
client.on_message = on_message
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_start()
while True:
time.sleep(30)
for unit, u in units.items():
if time.time() - u["seen"] > STALE_S:
alert(client, unit, "stale", {"seconds_silent": int(time.time() - u["seen"])})
u["seen"] = time.time()
Sapma başlangıç zamanı, gecikmenin dolduğu an olarak değil, sıcaklığın limiti ilk aştığı an olarak kaydedilir; böylece kayıt gerçek süreyi gösterir. En basit durumlar için temp_c alanında doğrudan ConnectMQ portalında eşik tabanlı uyarı kuralları da oluşturabilir ve her aşımı uyarı kaydında inceleyebilirsiniz; gecikme ve kapı mantığı için Python servisini koruyun.
Uyarıların İnsanlara Ulaşması
Servis uyarıları MQTT'ye yayınlar; yine de bir şeyin gece saat üçte bir telefona ulaşması gerekir. ConnectMQ kendisi e-posta veya SMS göndermediği için dürüst desen, uyarı topic'lerine abone olan harici bir araçtır: e-posta veya mesajlaşma düğümlü bir Node-RED akışı, küçük sahalar için Home Assistant bildirimleri ya da Python servisine bildirim sağlayıcınızı çağıran birkaç ek satır. Bir eskalasyon yolu tanımlayın: önce vardiya amiri, ardından nöbetçi bakım personeli, kimse onaylamazsa saha müdürü.
Defrost Çevrimlerini Yönetmek
Otomatik defrost, yanlış alarmların diğer sık kaynağıdır. Defrost sırasında evaporatör ısınır ve yakınındaki hava sıcaklığı kısa bir süre yükselir; bu normaldir. Üç önlem, bunun sapma tetiklemesini önler. Birincisi, yukarıda anlatıldığı gibi probu evaporatörden uzak tutun. İkincisi, sapma gecikmesinin o ünitedeki normal defrost süresinden uzun olduğundan emin olun; bunu bir günlük kayıtlı veride net olarak görebilirsiniz. Üçüncüsü, soğutma kontrolörü bir defrost sinyali sunuyorsa bunu sıcaklıkla birlikte yayınlayın ve servisin kapı açılmalarında yaptığı gibi defrost aktifken gecikmeyi uzatın. Normalden çok daha uzun süren bir defrost başlı başına bir uyarıyı hak eder, çünkü çoğu zaman arızalanan bir ısıtıcıya, sensöre veya kontrolör ayarına işaret eder.
Devreye Alma Kontrol Listesi
- Sıcak noktayı bulmak için her odayı bir gün boyunca birkaç probla haritalayın.
- Her üniteye bir düğüm kurun; elektronik dışarıda, prob sıcak noktada.
- Limitleri ve gecikmeleri ürün gereksinimlerinize ve kalite planınıza göre belirleyin.
- Alarmları test edin: kapıyı açın, bir düğümün fişini çekin, bir probu sökün ve her uyarının geldiğini doğrulayın.
- Probları bir referans termometreye göre kalibre edin ve kontrolü kaydedin.
- Sapma kaydını haftalık inceleyin ve sık açık bırakılan bir kapı gibi tekrar eden sorunlara müdahale edin.
- Canlıya geçmeden önce portaldan alınan kimlik bilgileri ve 8883 portunda TLS ile özel bir broker'a geçin.
Demodan Üretime
Eğitim, tüm topic'lerin herkese görünür olduğu genel MQTT test broker üzerinde çalışır; bu test için uygundur ama operasyonel veriler için değildir. Üretim için bir bulut MQTT broker, her dondurucu düğümüne şifreli ve kimlik doğrulamalı bir bağlantı sağlar ve uyarı servisinin, panoların ve kalite ekibinin her yerden abone olmasına imkan tanır. Sapma pencereleri o sırada depolanan lotlara bağlanabildiği için sıcaklık kayıtları üretimde IoT kalite kontrol ve parti bazlı üretim izlenebilirliği çalışmalarını da tamamlar. Akıllı üretim rehberi tüm bunları tesis çapında bir mimariye yerleştirir.
Soğuk Deponuzu ConnectMQ ile İzleyin
ConnectMQ; TLS, Last Will desteği, retained message, canlı pano ve portalda eşik tabanlı uyarı kuralları sunan özel bir MQTT broker sağlar. Kredi kartı gerekmeden app.connectmq.com adresinde ücretsiz Serverless planında bir broker oluşturun ve ilk dondurucunuzu bugün bağlayın.
Sık Sorulan Sorular
Soğuk depo sıcaklığı ne sıklıkla kaydedilmeli?
Sürekli izleme için 30 saniye ile 5 dakika arası tipiktir. Daha sık raporlama daha hızlı uyarı sağlarken sapma gecikmesi gereksiz alarmları önler.
Kapı her açıldığında alarm almaktan nasıl kaçınırım?
Uyarı vermeden önce sıcaklığın bir gecikme süresi boyunca limitin üzerinde kalmasını şart koşun, kapı açıkken bu gecikmeyi uzatın ve kapı çok uzun süre açık kalırsa ayrıca uyarı verin.
Bir sensörün gücü kesilirse ne olur?
Bir Last Will mesajıyla broker, keepalive zaman aşımından sonra çevrimdışı durumunu yayınlar ve uyarı servisi bunu bir alarm olarak değerlendirir.
Prob hava sıcaklığını mı yoksa ürün sıcaklığını mı ölçmeli?
En önemli olan ürün sıcaklığıdır. Probu en sıcak noktada glikol şişesi gibi bir tamponun içine yerleştirmek, ürün sıcaklığını takip eden ve kısa hava sıçramalarını yok sayan okumalar verir.



