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.
- 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.
- 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.
- Robotlar ve araçlar: takılmaları tespit etmek için motor akımını izleyin.
- 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 vei2cdetect -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.



