Bir titreşim izleme sensörü, dönen bir makineye takabileceğiniz en ucuz erken uyarı sistemidir. Bu rehberde bir ESP32 ve bir ivmeölçerle bir tane kuracak, RMS, tepe değeri ve crest faktörünü cihaz üzerinde hesaplayacak, sonuçları MQTT ile yayınlayacak ve titreşim öğrenilmiş bir referans değerin üzerine çıktığında alarmları tetikleyeceksiniz.
Titreşim Neden Ölçülmeye Değer İlk Sinyaldir
Dönen ekipmanlardaki neredeyse her mekanik arıza, başka bir şeyi değiştirmeden önce makinenin nasıl sallandığını değiştirir. Dengesizlik, eksen kaçıklığı, gevşek montaj cıvataları, aşınmış rulmanlar ve kavitasyon; bir motor atmadan veya bir rulman kilitlenmeden çok önce karakteristik frekanslarda enerji ekler. Sıcaklık genellikle daha sonra yükselir ve bir teknisyen sesi duyduğunda hasar çoğu zaman epey ilerlemiştir.
Bu yüzden titreşim çoğu kestirimci bakım programının merkezinde yer alır. IoT ile kestirimci bakım genel bakışı stratejinin tamamını açıklar; bu yazı ise pratik kısma odaklanır: bir makineden güvenilir bir titreşim değeri almak ve onu buna göre harekete geçebilecek bir sisteme aktarmak.
İlk günden bir spektrum analizörüne ihtiyacınız yok. Makine başına iki veya üç basit istatistiği her saniye veya her dakika trend olarak izlemek, gelişmekte olan arızaların büyük bir kısmını yakalar. Anahtar tutarlılıktır: aynı montaj noktası, aynı eksen, aynı hesaplama ve karşılaştırma yapılacak bir geçmiş.
Bir Titreşim İzleme Sensörü Seçmek
Sensörler hobi amaçlı MEMS kartlarından endüstriyel piezoelektrik ivmeölçerlere kadar uzanır. Doğru seçim neyi tespit etmek istediğinize bağlıdır.
| Sensör türü | Tipik kullanım | Güçlü yönleri | Sınırlamaları |
|---|---|---|---|
| MEMS ivmeölçer (MPU6050, ADXL345) | Prototipler, fanlar, pompalar, konveyörler | Çok ucuz, dijital I2C/SPI çıkışı, ESP32 ile kolay | Sınırlı bant genişliği ve daha yüksek gürültü tabanı |
| Endüstriyel MEMS titreşim sensörü | Motor ve pompaların kalıcı izlenmesi | Daha geniş bant genişliği, dayanıklı gövde, çoğu zaman Modbus veya IO-Link | MQTT'ye ulaşmak için bir gateway gerekir |
| IEPE / piezoelektrik ivmeölçer | Rulmanlar, dişli kutuları, yüksek hızlı iş milleri | Geniş frekans aralığı, düşük gürültü, endüstri standardı | Sabit akım beslemesi ve hızlı bir ADC gerekir |
| Kablosuz titreşim sensörü | Erişimi zor veya dönen varlıklar | Kablo yok, pille çalışır | Ham dalga formlarını değil, özetleri gönderir |
Bu rehberde çok ucuz olduğu ve ihtiyacınız olan her kavramı öğrettiği için bir MPU6050 kullanıyoruz. Daha iyi bir ivmeölçere geçtiğinizde de aynı firmware yapısı geçerlidir: bir pencere örnekleyin, DC ofseti çıkarın, özellikleri hesaplayın, yayınlayın.
Montaj yongadan daha önemlidir
İnce bir koruma sacına yapıştırılan bir sensör, koruma sacını ölçer. Kartı rulman yuvasına mümkün olduğunca yakın, rijit bir yüzeye bir saplama, güçlü bir mıknatıs veya endüstriyel epoksi ile monte edin. Hangi eksenin radyal, hangisinin eksenel yönü gösterdiğini kaydedin ve bir referans değer topladıktan sonra sensörü asla yerinden oynatmayın; çünkü yeni bir konum yeni bir referans değer demektir.
Donanım ve Bağlantılar
İhtiyacınız olanlar:
- Bir ESP32 geliştirme kartı.
- Bir MPU6050 breakout kartı (GY-521 veya benzeri).
- Dört jumper kablo ve bir USB kablosu.
VCC'yi 3.3 V'a, GND'yi GND'ye, SDA'yı GPIO 21'e ve SCL'yi GPIO 22'ye bağlayın. ESP32 I2C referansında belgelendiği gibi bunlar çoğu ESP32 DevKit kartındaki varsayılan I2C pinleridir.
Sensör Neyi Hesaplar
Saniyede 800 örnekle ham ivme, makine başına saniyede 2.400 sayı demektir. Bunu MQTT üzerinden göndermek mümkündür, ancak trend izleme için nadiren faydalıdır. Bunun yerine ESP32 her bir saniyelik pencereyi birkaç özelliğe indirger:
- RMS (karesel ortalama): titreşimin toplam enerjisi. En faydalı tek trend değeri.
- Tepe (peak): penceredeki ortalamadan en büyük mutlak sapma. Darbelere duyarlıdır.
- Crest faktörü: tepe değerinin RMS'e bölümü. Kararlı RMS ile birlikte yükselen bir crest faktörü, rulman hatalarının klasik bir erken işaretidir; çünkü kısa darbeler fazla enerji eklemeden tepe değerini yükseltir.
Bunları hesaplamadan önce firmware her eksenin ortalamasını çıkarır. Bu, yerçekimini ve sensör ofsetini ortadan kaldırır; böylece hareketsiz duran bir makine sıfıra yakın değer okur.
Firmware: ESP32 Titreşim İzleme Sensörü
Aşağıdaki sketch, MPU6050 register'larını doğrudan Wire ile okur; bu yüzden ek bir sensör kütüphanesi bağımlılığı yoktur. Arduino Library Manager'dan PubSubClient kurun. Topic'lerinizin genel broker'daki başkalarınınkiyle çakışmaması için rastgele 7f3a91 sonekini kendinizinkiyle değiştirin.
#include <WiFi.h>
#include <Wire.h>
#include <PubSubClient.h>
#include <math.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* CLIENT_ID = "vib-sensor-7f3a91";
const char* TOPIC = "connectmq/demo/7f3a91/line1/pump1/vibration";
const uint8_t MPU_ADDR = 0x68;
const int SAMPLE_HZ = 800;
const int N = SAMPLE_HZ; // bir saniyelik pencere
const uint32_t PERIOD_US = 1000000UL / SAMPLE_HZ;
const float LSB_PER_G = 4096.0f; // +/-8 g aralığı
WiFiClient net;
PubSubClient mqtt(net);
float bufX[N], bufY[N], bufZ[N];
void mpuWrite(uint8_t reg, uint8_t val) {
Wire.beginTransmission(MPU_ADDR);
Wire.write(reg);
Wire.write(val);
Wire.endTransmission();
}
bool readAccel(float &x, float &y, float &z) {
Wire.beginTransmission(MPU_ADDR);
Wire.write(0x3B);
if (Wire.endTransmission(false) != 0) return false;
if (Wire.requestFrom(MPU_ADDR, (uint8_t)6) != 6) return false;
int16_t rx = (Wire.read() << 8) | Wire.read();
int16_t ry = (Wire.read() << 8) | Wire.read();
int16_t rz = (Wire.read() << 8) | Wire.read();
x = rx / LSB_PER_G;
y = ry / LSB_PER_G;
z = rz / LSB_PER_G;
return true;
}
void stats(const float* b, float &rms, float &peak) {
double mean = 0;
for (int i = 0; i < N; i++) mean += b[i];
mean /= N;
double sumSq = 0;
peak = 0;
for (int i = 0; i < N; i++) {
double d = b[i] - mean;
sumSq += d * d;
if (fabs(d) > peak) peak = fabs(d);
}
rms = sqrt(sumSq / N);
}
void connectWifi() {
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) delay(250);
}
void connectMqtt() {
while (!mqtt.connected()) {
if (!mqtt.connect(CLIENT_ID)) delay(2000);
}
}
void setup() {
Serial.begin(115200);
Wire.begin(21, 22);
Wire.setClock(400000);
mpuWrite(0x6B, 0x00); // uyandır
mpuWrite(0x1A, 0x01); // DLPF ~184 Hz ivme bant genişliği
mpuWrite(0x1C, 0x10); // +/-8 g tam ölçek
connectWifi();
mqtt.setServer(MQTT_HOST, MQTT_PORT);
mqtt.setBufferSize(512);
}
void loop() {
if (WiFi.status() != WL_CONNECTED) connectWifi();
if (!mqtt.connected()) connectMqtt();
mqtt.loop();
uint32_t next = micros();
for (int i = 0; i < N; i++) {
while ((int32_t)(micros() - next) < 0) { }
next += PERIOD_US;
if (!readAccel(bufX[i], bufY[i], bufZ[i])) {
bufX[i] = bufY[i] = bufZ[i] = 0;
}
}
float rx, px, ry, py, rz, pz;
stats(bufX, rx, px);
stats(bufY, ry, py);
stats(bufZ, rz, pz);
float rmsMax = fmaxf(rx, fmaxf(ry, rz));
float peakMax = fmaxf(px, fmaxf(py, pz));
float crest = rmsMax > 0.0001f ? peakMax / rmsMax : 0;
char payload[256];
snprintf(payload, sizeof(payload),
"{\"rms_g\":{\"x\":%.4f,\"y\":%.4f,\"z\":%.4f},"
"\"peak_g\":%.4f,\"crest\":%.2f,\"fs\":%d,\"n\":%d}",
rx, ry, rz, peakMax, crest, SAMPLE_HZ, N);
mqtt.publish(TOPIC, payload);
Serial.println(payload);
}
Bir terminal açın ve değerlerin gelişini izleyin:
mosquitto_sub -h broker.connectmq.com -p 1883 -i viewer-7f3a91 -t "connectmq/demo/7f3a91/#" -v
Sensörün yanındaki masaya hafifçe vurun; RMS neredeyse hiç değişmezken tepe değeri ve crest faktörünün sıçradığını göreceksiniz. Sensörü çalışan bir fanın üzerine koyun; RMS sabit bir banda oturur. Bu sabit bant sizin referans değerinizdir.
Ölçümleri Alarmlara Dönüştürmek
Bir veri sayfasından kopyalanan sabit bir eşik kötü bir başlangıç noktasıdır, çünkü her makinenin kendine ait bir normali vardır. Daha iyi bir yaklaşım, her varlık için referans değeri öğrenmek ve onun bir katında alarm üretmektir. Aşağıdaki Python abonesi bunu paho-mqtt 2.x ile tam olarak yapar. İlk 300 ölçümü referans olarak toplar, ardından RMS birkaç ardışık pencere boyunca bu referansın 2 katını veya 3 katını aştığında bir uyarı veya alarm yayınlar.
import json
import statistics
import paho.mqtt.client as mqtt
BROKER = "broker.connectmq.com"
PREFIX = "connectmq/demo/7f3a91"
BASELINE_SAMPLES = 300
WARN_FACTOR, ALARM_FACTOR = 2.0, 3.0
CONSECUTIVE = 5
state = {} # varlık başına: örnekler, referans, seri, seviye
def on_connect(client, userdata, flags, reason_code, properties):
print("connected:", reason_code)
client.subscribe(f"{PREFIX}/+/+/vibration", qos=1)
def on_message(client, userdata, msg):
data = json.loads(msg.payload)
rms = max(data["rms_g"].values())
asset = "/".join(msg.topic.split("/")[3:5])
s = state.setdefault(asset, {"samples": [], "baseline": None, "streak": 0, "level": "ok"})
if s["baseline"] is None:
s["samples"].append(rms)
if len(s["samples"]) >= BASELINE_SAMPLES:
s["baseline"] = statistics.median(s["samples"])
print(f"{asset} baseline RMS = {s['baseline']:.4f} g")
return
ratio = rms / s["baseline"]
level = "alarm" if ratio >= ALARM_FACTOR else "warning" if ratio >= WARN_FACTOR else "ok"
s["streak"] = s["streak"] + 1 if level != "ok" else 0
if level != s["level"] and (level == "ok" or s["streak"] >= CONSECUTIVE):
s["level"] = level
alert = {"asset": asset, "level": level, "rms_g": round(rms, 4),
"baseline_g": round(s["baseline"], 4), "ratio": round(ratio, 2)}
client.publish(f"{PREFIX}/{asset}/alert", json.dumps(alert), qos=1, retain=True)
print("ALERT", alert)
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="vib-alerts-7f3a91")
client.on_connect = on_connect
client.on_message = on_message
client.connect(BROKER, 1883, keepalive=60)
client.loop_forever()
Üç ayrıntı bunu pratikte sağlam kılar. Medyan referans, öğrenme sırasındaki ara sıra oluşan darbeleri yok sayar. Ardışık pencere şartı, yere düşen tek bir alet veya geçen bir forkliftin kimseyi alarma geçirmesini önler. Ve alarm bir retained mesaj olarak yayınlanır; böylece daha sonra bağlanan bir dashboard her varlığın güncel alarm durumunu hemen görür.
Temel eşikler için kod çalıştırmamayı tercih ederseniz, ConnectMQ portalı eşik alarm kuralları ve bir alarm kaydı içerir. Bir kuralı titreşim topic'inizin RMS alanına yönlendirebilir ve her sapmayı portalda görebilir, referansa göreli mantık için de Python servisini tutabilirsiniz.
Demodan Üretime Geçiş
Genel MQTT test broker'ı bu deney için mükemmeldir, ancak üzerindeki her şey herkes tarafından okunabilir ve istemcileri saniyede 10 mesajla sınırlar. Gerçek makineler için özel bir broker'a geçin:
- ConnectMQ portalına kaydolun ve bir broker oluşturun. Oluşturulmuş bir kullanıcı adı, parola ve client ID alırsınız.
- ESP32'yi 8883 portunda
WiFiClientSecurekullanacak şekilde değiştirin ve kimlik bilgilerinimqtt.connect(CLIENT_ID, USER, PASS)çağrısına verin. - Portalın tanıdığı ve cihazlar görünümünde grupladığı
acme/plant1/assembly/line1/pump1/vibrationgibi ISA-95 tarzı bir topic ağacı benimseyin. - Alarm servisini otomatik olarak yeniden başlaması için bir süreç yöneticisi altında çalıştırın.
Bir yönetilen MQTT broker, yama, sertifika ve kapasite planlama işini ortadan kaldırır; bu da her saniye yayın yapan düzinelerce sensörünüz olduğunda önem kazanır.
Sorun Giderme Kontrol Listesi
- Tüm ölçümler sıfır: I2C adresini bir tarayıcı sketch'iyle kontrol edin. Bazı kartlar AD0 yüksekken 0x69 kullanır.
- Makine kapalıyken RMS çok yüksek görünüyor: elektriksel gürültü veya gevşek montaj. Sensörü yeniden yerleştirin ve kabloyu motor güç kablolarından uzak tutun.
- MQTT birkaç saniyede bir kopuyor: başka bir istemci aynı client ID'yi kullanıyor. Benzersiz yapın.
- Değerler sınırlanmış görünüyor: kırpılma (clipping) yaşıyorsunuz. Tam ölçek aralığını 8 g'den 16 g'ye yükseltin (
0x1Cregister'ında0x18ve g başına 2048 LSB). - Yüksek frekanstaki arızalar kaçırılıyor: MPU6050'nin bant genişliği sınırlıdır. Rulman ve dişli kutusu çalışmaları için endüstriyel bir ivmeölçer kullanın.
Sonraki Adımlar
RMS ve crest faktörü güvenilir şekilde akmaya başladığında ikinci bir sinyal ekleyin. Titreşimi motor akımı izleme veya rulman sıcaklığı izleme ile birleştirmek elektriksel sorunları mekanik sorunlardan ayırır ve alarmları iki bağımsız kaynaktan doğrular. Verileri tüm tesis genelinde bağlama oturtmaya hazır olduğunuzda akıllı üretim rehberi, titreşimin daha büyük veri omurgasına nasıl oturduğunu gösterir.
ConnectMQ ile Titreşimi İzlemeye Başlayın
ConnectMQ her sensöre TLS'li, güvenli ve özel bir MQTT uç noktası, tarayıcı içi bir istemci, canlı bir topic gezgini ve yerleşik eşik alarmları sunar. Kredi kartı gerekmeden app.connectmq.com adresinde ücretsiz Serverless planında bir broker oluşturun ve titreşim monitörünüzü dakikalar içinde demo topic'inden üretime taşıyın.
Sık Sorulan Sorular
Başlangıç projesi için en iyi titreşim izleme sensörü hangisidir?
Bir ESP32 üzerinde MPU6050 veya ADXL345 gibi bir MEMS ivmeölçer en kolay başlangıç noktasıdır. Ucuzdur, I2C kullanır ve fanlar, pompalar ve konveyörlerde genel titreşimi trend olarak izlemek için yeterince iyidir.
Ham titreşim dalga formlarını MQTT üzerinden göndermeli miyim?
Sürekli izleme için genellikle hayır. RMS, tepe değeri ve crest faktörü gibi özet özellikleri her saniye gönderin ve kısa ham veri patlamalarını yalnızca spektral analize ihtiyaç duyduğunuzda yakalayın.
Titreşim alarm eşiklerini nasıl belirlerim?
Her makine normal çalışırken bir referans değer öğrenin, ardından bu referansın katlarında alarm üretin. Gereksiz alarmlardan kaçınmak için sınırın üzerinde birkaç ardışık pencere şartı koyun.
broker.connectmq.com'u gerçek makineler için kullanabilir miyim?
Genel broker'ı yalnızca test için kullanın, çünkü topic'leri herkes tarafından okunabilir. Üretim için ConnectMQ portalında kendi kimlik bilgilerinizle özel bir broker oluşturun.



