Raspberry Pi

MQTT ile Raspberry Pi Enerji İzleme: Voltaj, Akım ve Enerji Ölçün

Bir Raspberry Pi ve INA219 ile voltaj, akım, güç ve biriken enerjiyi ölçün, okumaları MQTT üzerinden JSON olarak yayınlayın ve AC şebeke devreleri için ne zaman CT pens HAT kullanmanız gerektiğini öğrenin.

Güneş enerjili akü devresini ölçen INA219 akım sensörüne bağlı, verileri buluta yayınlayan bir raspberry pi enerji izleme düzeneği
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 Raspberry Pi enerji izleme düzeneği, bir devrenin tam olarak ne kadar çektiğini, bir akünün ne kadar dolduğunu ve bir cihazın gün boyunca ne kadar enerji kullandığını size söyler. Bu eğitimde INA219 ile DC voltaj, akım ve gücü ölçecek, bunları watt-saate entegre edecek ve bir panelin veya otomasyonun kullanabilmesi için her şeyi MQTT üzerinden JSON olarak yayınlayacaksınız. Ayrıca CT pens HAT'lerin aynı fikri AC şebeke devrelerine nasıl genişlettiğini de göreceksiniz.

Sensör Seçimi: INA219 veya CT Pens

INA219 breakout CT pens HAT
Ölçtükleri DC voltaj (26 V'a kadar), akım, güç Pens üzerinden AC akım; bazı kartlar AC voltajı da algılar
Bağlantı Yükle seri, bir şönt direnç üzerinden Temassız, tek bir iletkenin etrafına kenetlenir
Tipik kullanım Güneş panelleri, 12 V aküler, LED şeritler, robotlar, Pi'nin kendisi Ev devreleri, cihazlar, makineler
Arayüz I2C Genellikle HAT üzerinde SPI veya I2C ADC
Güvenlik Yalnızca düşük voltaj Pens yalıtımlıdır, ancak şebeke yakınında kurulum yetkin biri tarafından yapılmalıdır

Bu eğitim, ucuz, düşük voltajlı DC için hassas ve deney yapmak için güvenli olduğundan INA219 sürümünü baştan sona oluşturur. AC'ye ihtiyacınız varsa, bir CT pens HAT kendi Python kütüphanesiyle gelir; değerlerini okuyun ve betiğin MQTT kısmını değiştirmeden yeniden kullanın. Şebeke için ESP32 karşılığı ESP32 SCT-013 akım sensörü rehberinde ele alınır.

INA219 Nasıl Çalışır

INA219, yükünüzle seri bağlı 0,1 ohm'luk bir şönt direnç üzerindeki küçük voltaj düşümünü ve yük tarafındaki hat (bus) voltajını ölçer. Bu iki değerden akımı ve gücü dahili olarak hesaplar. Standart breakout hat üzerinde 26 V'a kadar ve varsayılan kalibrasyonla yaklaşık 3,2 A'e kadar dayanır. Şönt seri bağlı olduğundan tüm yük akımı breakout üzerinden akar; bu yüzden değerlerinin içinde kalın ve akım için yeterince kalın kablolar kullanın.

Kablolama

INA219 pini Bağlantı
VCC Pi 3,3 V (fiziksel pin 1)
GND Pi GND (fiziksel pin 6) ve yük beslemesinin toprağı
SDA GPIO2 (fiziksel pin 3)
SCL GPIO3 (fiziksel pin 5)
VIN+ Güç kaynağının pozitif ucu
VIN- Yükün pozitif girişi

Ölçülen devrenin toprağı Pi'nin toprağıyla ortak olmalıdır; aksi halde hat voltajı okuması anlamsızdır. I2C'yi sudo raspi-config nonint do_i2c 0 ile etkinleştirin ve sensörün 0x40 adresinde göründüğünü i2cdetect -y 1 ile doğrulayın.

Yazılımın Kurulumu

sudo apt update
sudo apt install -y python3-venv i2c-tools
mkdir -p ~/power-monitor && cd ~/power-monitor
python3 -m venv .venv
source .venv/bin/activate
pip install "paho-mqtt>=2.0" adafruit-circuitpython-ina219

Topic'ler ve Payload

Topic İçerik Retained
connectmq/demo/8d20f6/solar/power Her 5 saniyede voltaj, akım, güç Hayır
connectmq/demo/8d20f6/solar/energy Biriken Wh, her dakika Evet
connectmq/demo/8d20f6/solar/status online / offline Evet

Bir güç mesajı şöyle görünür:

{"voltage": 12.84, "current_ma": 412.6, "power_w": 5.3, "ts": 1792161000}

Enerji topic'i retained'dır; böylece sonradan açılan bir panel bugünün toplamını hemen görür.

Raspberry Pi Enerji İzleme Betiği

Betik saniyede bir örnek alır, gürültüyü yumuşatmak için yayın aralığı boyunca ortalama alır ve gücü zaman içinde watt-saate entegre eder. Enerji sayacını her on dakikada bir diske kaydeder; böylece her örnekte SD karta yazmadan, yeniden başlatma sayacı sıfırlamaz. power_monitor.py olarak kaydedin:

#!/usr/bin/env python3
"""INA219 power monitor publishing to MQTT."""
import json
import os
import time
import uuid
from pathlib import Path

import board
import paho.mqtt.client as mqtt
from adafruit_ina219 import INA219

BROKER = os.getenv("MQTT_HOST", "broker.connectmq.com")
PORT = int(os.getenv("MQTT_PORT", "1883"))
USERNAME = os.getenv("MQTT_USERNAME")
PASSWORD = os.getenv("MQTT_PASSWORD")
CLIENT_ID = os.getenv("MQTT_CLIENT_ID", f"power-{uuid.uuid4().hex[:8]}")
PREFIX = os.getenv("MQTT_PREFIX", "connectmq/demo/8d20f6/solar")
PUBLISH_EVERY = 5      # seconds
ENERGY_EVERY = 60      # seconds
SAVE_EVERY = 600       # seconds
STATE_FILE = Path(os.getenv("STATE_FILE", "energy_wh.txt"))

ina = INA219(board.I2C())  # default calibration: 32 V, 2 A range


def load_energy():
    try:
        return float(STATE_FILE.read_text())
    except (OSError, ValueError):
        return 0.0


def save_energy(wh):
    tmp = STATE_FILE.with_suffix(".tmp")
    tmp.write_text(f"{wh:.4f}")
    tmp.replace(STATE_FILE)  # atomic rename avoids half-written files


def on_connect(client, userdata, flags, reason_code, properties):
    if reason_code.is_failure:
        print(f"Connection refused: {reason_code}")
        return
    print(f"Connected as {CLIENT_ID}")
    client.publish(f"{PREFIX}/status", "online", qos=1, retain=True)


client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=CLIENT_ID)
client.on_connect = on_connect
client.will_set(f"{PREFIX}/status", "offline", qos=1, retain=True)
client.reconnect_delay_set(min_delay=1, max_delay=60)
if USERNAME:
    client.username_pw_set(USERNAME, PASSWORD)
if PORT == 8883:
    client.tls_set()
client.connect(BROKER, PORT, keepalive=30)
client.loop_start()

energy_wh = load_energy()
samples = []
last_sample = time.monotonic()
last_publish = last_energy = last_save = last_sample

try:
    while True:
        time.sleep(1)
        now = time.monotonic()
        voltage = ina.bus_voltage + ina.shunt_voltage  # supply-side voltage
        current_ma = ina.current
        power_w = ina.power
        if ina.overflow:
            print("Warning: INA219 overflow, current exceeds calibrated range")

        energy_wh += power_w * (now - last_sample) / 3600.0
        last_sample = now
        samples.append((voltage, current_ma, power_w))

        if now - last_publish >= PUBLISH_EVERY:
            n = len(samples)
            payload = {
                "voltage": round(sum(s[0] for s in samples) / n, 2),
                "current_ma": round(sum(s[1] for s in samples) / n, 1),
                "power_w": round(sum(s[2] for s in samples) / n, 2),
                "ts": int(time.time()),
            }
            client.publish(f"{PREFIX}/power", json.dumps(payload), qos=0)
            samples.clear()
            last_publish = now

        if now - last_energy >= ENERGY_EVERY:
            energy = {"energy_wh": round(energy_wh, 3), "ts": int(time.time())}
            client.publish(f"{PREFIX}/energy", json.dumps(energy), qos=1, retain=True)
            last_energy = now

        if now - last_save >= SAVE_EVERY:
            save_energy(energy_wh)
            last_save = now
except KeyboardInterrupt:
    pass
finally:
    save_energy(energy_wh)
    client.publish(f"{PREFIX}/status", "offline", qos=1, retain=True).wait_for_publish(2)
    client.loop_stop()
    client.disconnect()

python power_monitor.py ile çalıştırın ve başka bir makineden abone olun:

mosquitto_sub -h broker.connectmq.com -p 1883 -i watch-8d20f6 \
  -t 'connectmq/demo/8d20f6/solar/#' -v

Yükü açıp kapatın ve current_ma ile power_w değerlerinin beş saniye içinde tepki verdiğini izleyin.

Kalibrasyon ve Doğruluk

Varsayılan kalibrasyon makul bir çözünürlükle 32 V ve 2 A'i kapsar. Yükünüz küçükse, örneğin onlarca miliamper çeken bir mikrodenetleyici ise, daha ince çözünürlük için sensörü oluşturduktan sonra ina.set_calibration_16V_400mA() çağırın. Breakout'un aralığından fazlasına ihtiyacınız varsa şöntü daha düşük değerli biriyle değiştirip kendi kalibrasyonunuzu yazın veya daha yüksek akımlar için tasarlanmış bir sensöre geçin.

Yükle seri bağlı bir multimetreyle karşılaştırarak doğrulayın. Küçük sapmalar normaldir; tutarlı bir yüzdesel hata genellikle şönt toleransına işaret eder ve bunu yazılımda bir ölçek faktörüyle düzeltebilirsiniz. Negatif akım, VIN+ ile VIN-'in yer değiştirdiği anlamına gelir; bu aslında faydalı olabilir: bir akü izleyicisi işareti kullanarak şarj ile deşarjı ayırt edebilir.

Kullanım Alanları

Aynı betik, yalnızca topic öneki ve kalibrasyon değiştirilerek birçok projeye uyar. Aboneler yalnızca voltaj, akım, güç ve enerji alanları içeren JSON gördüğünden, sensörü daha sonra değiştirebilir veya başka bir devre için 0x41 adresinde ikinci bir INA219 ekleyebilirsiniz; veriyi tüketen panele veya otomasyona dokunmanız gerekmez.

  1. Güneş enerjisi ve akü sistemleri: panel çıkışını ve akü voltajını izleyin ve akü güvenli seviyenin altına düştüğünde bir uyarı yayınlayın.
  2. Kendi Pi veya ESP32 projelerinizi ölçmek: Wi-Fi patlamaları ve uyku sırasında gerçek tüketimi görmek için INA219'u besleme ile cihaz arasına yerleştirin.
  3. Robotlar ve araçlar: takılmaları tespit etmek için motor akımını izleyin.
  4. 12 V aydınlatma ve pompalar: yalnızca bir rölenin tıkladığını değil, bir yükün gerçekten açıldığını doğrulayın.

CT pensler ve uzun vadeli grafiklerle tüm evi izlemek için MQTT ile ev enerji izleme makalemiz abone tarafını gösterir; Raspberry Pi Grafana ve InfluxDB rehberi de okumaları aylarca saklar. Düşük güç bütçelerinde aynı betik bir Raspberry Pi Zero 2 W MQTT düğümü üzerinde de iyi çalışır.

Tezgahtan Kalıcı Kuruluma

broker.connectmq.com adresindeki genel test broker'ında topic'lerinizi herkes okuyabilir; bu bir tezgah testi için sorun değildir, ancak gerçek bir evde veya atölyede kullanım alışkanlıklarını ortaya çıkarır. İzleyiciyi kalıcı olarak kurmadan önce TLS'li özel bir broker'a geçin. ConnectMQ ile cihaz başına oluşturulan kimlik bilgileri alırsınız; bir systemd ortam dosyasında MQTT_PORT=8883 ile birlikte MQTT_USERNAME=YOUR_USERNAME, MQTT_PASSWORD=YOUR_PASSWORD ve MQTT_CLIENT_ID=YOUR_CLIENT_ID değerlerini ayarlayın ve yeniden başlatın. Ardından ConnectMQ portalında bir eşik uyarı kuralı ekleyin, örneğin güç topic'inde 11,8 V'un altındaki voltaj için; böylece bir akü zarar görmeden önce uyarılırsınız.

Bir MQTT broker'ın ne yaptığı veya bir betiğin servis olarak nasıl çalıştırılacağı konusunda yeniyseniz, Raspberry Pi MQTT eğitimi ile başlayın ve ardından bu projeye dönün.

Sorun Giderme

  • ValueError: No I2C device at address: 0x40: SDA ve SCL'yi kontrol edin, I2C'yi etkinleştirin ve i2cdetect -y 1 çalıştırın.
  • Voltaj sıfıra yakın okunuyor: VIN+ veya VIN- ölçülen devreye bağlı değil ya da topraklar ortak değil.
  • Akım okumaları gürültülü: betiğin yaptığı gibi yayın aralığı boyunca ortalama alın ve şönt kablolarını kısa tutun.
  • Enerji toplamı yeniden başlatmadan sonra sıfırlanıyor: durum dosyası yazılabilir değil veya betik kaydetmeden önce sonlandırıldı; çalışma dizininin izinlerini kontrol edin.

ConnectMQ ile Başlayın

Güç verilerinizi, panellerin ve uyarıların her yerden erişebileceği bir bulut MQTT broker'a gönderin. Serverless planda kredi kartı gerekmeden ücretsiz ConnectMQ broker'ınızı oluşturun ve MQTT 3.1.1 veya 5.0 ile TLS üzerinden bağlanın. Canlı topic gezgini her okumayı geldiği anda gösterir.

Sık Sorulan Sorular

INA219 AC şebeke gücünü ölçebilir mi?

Hayır. INA219, 26 V'a kadar bir DC sensörüdür. AC devreler için bir CT pens HAT veya sertifikalı bir enerji sayacı kullanın ve şebeke işlerini yetkin birine yaptırın.

INA219'lu bir Raspberry Pi enerji izleme düzeneği ne kadar doğrudur?

Bir multimetreyle kontrol edildikten sonra çoğu hobi ve izleme işi için yeterince doğrudur. Ana hata kaynağı şönt toleransıdır ve bir ölçek faktörüyle düzeltilebilir.

Enerji neden retained mesaj olarak yayınlanıyor?

Böylece sonradan bağlanan her panel veya abone, bir sonraki güncelleme için bir dakikaya kadar beklemek yerine güncel toplamı hemen alır.

Güç okumalarını ne sıklıkla yayınlamalıyım?

Paneller için birkaç saniyede bir yeterlidir. Trafiği düşük tutmak için yerelde daha hızlı örnekleyin, ortalama alın ve ortalamayı yayınlayın.

İlgili yazılar

RC522 Okuyucu ile Raspberry Pi RFID MQTT Erişim Kaydı

Bir RC522 RFID okuyucuyu Raspberry Pi'ye bağlayın, etiketleri Python ile okuyun, yerel bir izin listesiyle karşılaştırın ve her erişim denemesini kayıt araçlarının, panellerin ve uyarı araçlarının tüketebileceği bir MQTT olayı olarak yayınlayın.

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.