İçindekiler:

Enerji Faturası Monitörünüz: 4 Adım
Enerji Faturası Monitörünüz: 4 Adım

Video: Enerji Faturası Monitörünüz: 4 Adım

Video: Enerji Faturası Monitörünüz: 4 Adım
Video: Monitör Sinyal Yok Lütfen Girişinizi Kontrol Edin %💯Çözüm #teknohat 2024, Temmuz
Anonim
Enerji Faturası Monitörünüz
Enerji Faturası Monitörünüz

BU PROJE HAKKINDA

Evinizi gerçekten daha akıllı hale getirmek istiyorsanız, muhtemelen aylık faturalarınızdan (yani enerji, gaz vb.) başlamak isteyeceksiniz. Bazılarının dediği gibi, Good for Planet, The Wallet ve The Bottom Line. Açık kaynaklı donanım, ev ortamında sürdürülebilirliğe ulaşmanın yolu! Bu fikir bizi, MQTT üzerinden veri gösterdiği için herhangi bir ev otomasyon yazılımıyla entegrasyonu kolay, basit ve güvenli bir çözüm oluşturmamızı sağladı (bizim durumumuzda size bunu Home Assistant'a nasıl entegre edeceğinizi göstereceğiz).

genel bakış

Elektrik enerjisi tüketimini ölçmek için DIN rayı kullanımına uygun olarak tasarlandığından ve evimizin ana dolabına mükemmel şekilde oturduğundan Finder Energy Meter'ı kullanmayı tercih ettik. Bu ürünle ilgili harika olan şey, Arduino ile konuşmayı gerçekten kolaylaştıran endüstriyel standart bir iletişim protokolü olan RS485 Modbus arayüzüne sahip olmasıdır. Aslında Arduino, protokolün kodunu çözmek için resmi bir kalkan, MKR485 ve iki kitaplık yayınladı. Anakart olarak, MKR form faktörünü paylaştığı ve WiFi bağlantısına sahip olduğu için Arduino MKR WiFi 1010'u seçtik.

KurulumUyarı! Evinizin elektrik sistemiyle ilgili olarak ülkenizdeki düzenlemeleri kontrol edin ve ölümcül olabileceğinden son derece dikkatli olun! Bilmiyorsanız bir elektrikçi çağırın. İlk adım, sayacı elektrik dolabınıza monte etmektir. Güvenli bir ortamda çalıştığınızdan emin olmak için sisteminizin önündeki elektrik terminalinden gelen gücü kapatın ve multimetre ile terminaller arasında voltaj olmadığını iki kez kontrol edin. Ardından enerji sayacını kabininizin içine yerleştirin ve ana kesiciden gelen canlı ve nötr kabloları sayacın girişine bağlayın, renk kuralını kullanmayı unutmayın (nötr için mavi ve AB'de canlı için kahverengi/siyah/gri). Çıkış, sistemin geri kalanına bağlanmalıdır.

Ana voltaj bağlantıları. Yukarıdaki teller giriş, ötesindeki teller çıkışlardır.

Adım 1: Gerekli Parçalar

Gerekli Parçalar
Gerekli Parçalar

2. Adım: Yazılım İhtiyaçları

Yazılım İhtiyaçları
Yazılım İhtiyaçları

Yazılım

Bilgisayarınızı başlatın ve IDE'nizi açın. Arduino IDE veya Arduino Oluşturma Düzenleyicisini kullanabilirsiniz. Kod aşağıdaki istekleri karşılamaktadır: Modbus iletişimi, WiFi yönetimiMQTT protokolü Modbus, endüstriyel sensörler ve makineler için açık kaynaklı bir protokoldür. Arduino'yu Modbus'u konuşturmak için Arduino Modbus kütüphanesini kullanacağız. Bu kitaplık, tüm işleyicileri bir araya getirir ve herhangi bir Modbus cihazının gerçekten hızlı bir şekilde bağlanmasını sağlar. Kayıtları okuyacağımız için sayacın datasheetini takip ederek fonksiyon kodları, register adresi ve register boyutu gibi ihtiyacımız olan tüm bilgileri kelimelerle bulabiliriz. Ancak daha açık hale getirmek için Modbus'un nasıl çalıştığını açıklayalım: Modbus mesajları basit bir yapı izler: 01 03 04 00 16 00 02 25 C7 0x01 Cihaz Adresi 0x03, cihaza veri okumak veya yazmak isteyip istemediğimizi söyleyen Fonksiyon Kodudur. *, bu durumda, Byte Count00 16 için 0x04 tutma kayıtlarını oku - Cihaza ne okumak istediğimizi söyleyen 4 baytlık kayıt adresi (00 16) gönderiyoruz 00 02- ardından kaydın boyutunu (00 02) kelimelerle (her kelime 2 bayt uzunluğundadır) Son 4 bayt CRC kodudur. Bu kod, bir matematik işlevinden önceki baytlar üzerinden oluşturulur, bu, mesajın doğru bir şekilde alınmasını sağlar.

Home Assistant EntegrasyonuSayacı Home Assistant'a eklemek oldukça basittir. Konfigüre edilmiş bir MQTT aracınız olduğunu varsayarsak (İşte kılavuz), tek yapmanız gereken configuration.yaml dosyası altına yeni tanımlar eklemektir. sensör: - platform: mqtt adı: "Ana Gerilim" state_topic: "enerji/ana/gerilim" ölçü_birimi: "V" Burada ölçümün adını, okunacak MQTT konusunu ve miktarın ölçü birimini girmelisiniz. Dosyayı kaydedin, konfigürasyonu kontrol edin ve Home Assistant'ı yeniden yükleyin, şimdi ölçümler ana sayfada görünecektir.

Mevcut okumaları gösteren Ev Asistanı tüketim paneli

Home Assistant, grafikler oluşturmaya özen gösterecek ve okumalarınız tarafından tetiklenen süreçleri otomatikleştirecektir. Bu eğitim sona erdi, şimdi özellikler eklemek ve kendi amaçlarınız için özelleştirmek size kalmış!

Adım 3: Birleştirin

Birleştirmek
Birleştirmek
Birleştirmek
Birleştirmek

Tamamlandı? RS485 bağlantısını vidalamanın zamanı geldi! Genellikle telefon hatları için kullanılan, topraklamalı bükümlü tek çift kablo kullanacağız. Bu kablo ile uzun mesafelerde (1,2 km) iletim yapabilirsiniz. Ancak biz sadece kabinden çıkıp Arduino'yu erişilebilir bir yere yerleştirmek için yeterince uzun bir kablo kullanıyoruz.

Bulucu RS485 bağlantısı

RS485 arabirimi A, B ve COM terminallerini adlandırır. Yaygın bir fiili standart, B'ye alternatif olarak TX+/RX+ veya D+'nın (MARK yani boşta için yüksek), A'ya alternatif olarak TX-/RX- veya D-'nin (MARK yani boşta için düşük) kullanılmasıdır. MKR kalkanı ayrıca Tam Dubleks'i de destekler, diğer iki terminali göreceksiniz, Y ve Z. Burada kablonun diğer ucunu vidalayacağız, çünkü veri sayfasından yarı dubleks iletişimin sadece Y ve Z terminallerinde gerçekleştiğini biliyoruz. COM terminali ISOGND'ye bağlanmalıdır. Yarım çift yönlü bağlantı kullandığımız ve kablolama eşler arası olduğu için, MKR485 kalkanındaki anahtarları kurulumumuza uyacak şekilde ayarlamamız gerekiyor: YZ'de YARIM (2'yi kapalı) ve sonlandırmayı (3 ila 3'ü) ayarladık. ÜZERİNDE); ilki farketmez. Sonlandırma, parazitleri azaltmak için iki veri terminalini birbirine bağlayan bir dirençtir.

Budur. Artık kabini kapatabilir ve yazılım tarafına odaklanabilirsiniz!

4. Adım: Kod

kod
kod

#Dahil etmek

#include #include #include //wifi kimlik bilgileriniz const char ssid = "**********"; const karakter geçişi = "**********";

WiFiClient ağı; MQTTClient istemcisi; imzasız uzun oran = 60000; // ms cinsinden varsayılan yenileme hızı unsigned long lastMillis = 0;

//connect function void connect() { Serial.print("wifi kontrol ediliyor…"); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); gecikme(1000); } Serial.print("\nbağlanıyor…"); while (!client.connect("aygıt_adı", "kullanıcı_adı", "kullanıcı_pw")) { //AYARINIZA UYMAK İÇİN DEĞİŞTİRİN Serial.print("."); gecikme(1000); } Serial.println("\nbağlandı!"); client.subscribe("enerji/ana/yenileme hızı"); //yenileme hızını uzaktan ayarlamak için konu } //mqtt geri arama alma işlevi void messageReceived(Dize &konu, Dize &payload) { Serial.println("gelen: " + konu + " - " + payload); if(konu == "enerji/ana/yenileme hızı"){ //yenileme hızı işleyici hızı = payload.toInt()*1000; Serial.println("yeni oran"+String(oran)); } }

geçersiz kurulum() { Serial.begin(115200); WiFi.begin(ssid, pass); while (!Seri); client.begin("broker_ip", net); // KURULUMUNUZU EŞLEŞTİRMEK İÇİN DEĞİŞTİRİN client.onMessage(messageReceived); // Modbus RTU istemcisini başlat if (!ModbusRTUClient.begin(9600)) { Serial.println("Modbus RTU İstemcisi başlatılamadı!"); iken (1); } }

geçersiz döngü() { client.loop(); if (!client.connected()) { //ağ bağlantısını kontrol edin connect(); } // yenileme geçtikten sonra bir mesaj yayınla (engellemeyen rutin) if (millis() - lastMillis > oran) { lastMillis = millis(); //tüm okuma çağrılarını float volt = readVoltage(); gecikme(100); float amp = readCurrent(); gecikme(100); çift watt = readPower(); gecikme(100); float hz = readFreq(); gecikme(100); double wh = readEnergy(); //sonuçları ilgili başlıklar altında yayınla client.publish("enerji/ana/gerilim", String(volt, 3)); client.publish("enerji/ana/akım", String(amp, 3)); client.publish("enerji/ana/güç", String(watt, 3)); client.publish("enerji/ana/frekans", String(hz, 3)); client.publish("enerji/ana/enerji", String(wh, 3)); Serial.print(Dize(volt, 3)+"V "+Dize(amp, 3)+"A "+Dize(watt, 3)+"W "); Serial.println(Dize(hz, 3)+"Hz "+Dize(wh, 3)+"kWh"); gecikme(100); } }

/* Finder Energy Meter kayıtlarını okuma fonksiyonları * * Kodu anlamak için modbus protokol kılavuzunu kontrol edin * https://gfinder.findernet.com/public/attachments/7E/EN/PRT_Modbus_7E_64_68_78_86EN.pdf */ float readVoltage(){ float volt = 0.; if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x000C, 2)) { // Serial.print("voltaj okunamadı! "); Serial.println(ModbusRTUClient.lastError()); //hata işleyici }else{ uint16_t word1 = ModbusRTUClient.read(); // arabellekteki verileri oku uint16_t word2 = ModbusRTUClient.read(); uint32_t millivolt = kelime1 << 16 | kelime2; //bit matematik volt = milivolt/1000.0; } dönüş voltajı; } float readCurrent(){ float amper = 0.; if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0016, 2)) { Serial.print("akım okunamadı! "); Serial.println(ModbusRTUClient.lastError()); }else{ uint16_t word1 = ModbusRTUClient.read(); uint16_t word2 = ModbusRTUClient.read(); int32_t miliamper = kelime1 << 16 | kelime2; amper = miliamper/1000.0; } dönüş amperi; }

double readPower(){ double watt = 0.; if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0025, 3)) { Serial.print("güç okunamadı! "); Serial.println(ModbusRTUClient.lastError()); }else{ uint16_t word1 = ModbusRTUClient.read(); uint16_t word2 = ModbusRTUClient.read(); uint16_t word3 = ModbusRTUClient.read(); uint64_t miliwatt; if(kelime1 >> 7 == 0){ miliwatt = kelime1

Önerilen: