جدول المحتويات:

مراقب فاتورة الطاقة: 4 خطوات
مراقب فاتورة الطاقة: 4 خطوات

فيديو: مراقب فاتورة الطاقة: 4 خطوات

فيديو: مراقب فاتورة الطاقة: 4 خطوات
فيديو: برمجة واي فاي انفيرتر فولترولنك الجيل الرابع Voltronic Axpert - VM IV WiFi configuration 2024, يوليو
Anonim
مراقب فاتورة الطاقة الخاص بك
مراقب فاتورة الطاقة الخاص بك

حول هذا المشروع

إذا كنت ترغب حقًا في جعل منزلك أكثر ذكاءً ، فربما تريد أن تبدأ من فواتيرك الشهرية (مثل الطاقة والغاز وما إلى ذلك …). كما يقول البعض ، Good for Planet و The Wallet و The Bottom Line. الأجهزة مفتوحة المصدر هي طريقنا للوصول إلى الاستدامة في بيئة المنزل! دفعتنا هذه الفكرة إلى بناء حل بسيط وآمن ، يسهل دمجه مع أي برنامج أتمتة منزلية لأنه يعرض البيانات عبر MQTT (في حالتنا سنعرض لك كيفية دمجه في Home Assistant).

ملخص

من أجل قياس استهلاك الطاقة الكهربائية ، اخترنا استخدام Finder Energy Meter ، لأنه مصمم لاستخدام سكة DIN ويتناسب تمامًا مع الخزانة الرئيسية لمنزلنا. الشيء الرائع في هذا المنتج هو أنه يحتوي على واجهة RS485 Modbus ، وهو بروتوكول اتصال قياسي صناعي يجعل التحدث إلى Arduino أمرًا سهلاً حقًا. في الواقع ، أصدرت Arduino درعًا رسميًا ، MKR485 ومكتبتين لفك تشفير البروتوكول. بصفتنا اللوحة الرئيسية ، اخترنا Arduino MKR WiFi 1010 ، نظرًا لأنه يشترك في عامل الشكل MKR ولديه اتصال WiFi.

الإعداد: تحذير! تحقق من لوائح بلدك بشأن التعامل مع النظام الكهربائي في منزلك وكن حذرًا للغاية لأنه قد يكون مميتًا! إذا كنت لا تعرف كيف ، فاتصل بفني كهربائي. الخطوة الأولى هي تثبيت العداد في الخزانة الكهربائية. للتأكد من أنك تعمل في بيئة آمنة ، قم بإيقاف تشغيل الطاقة من الطرف الكهربائي قبل النظام الخاص بك وتحقق مرة أخرى باستخدام جهاز القياس المتعدد من عدم وجود جهد كهربائي بين المحطات. ثم ضع عداد الطاقة داخل الخزانة الخاصة بك وقم بتوصيل الأسلاك الحية والمحايدة من القاطع الرئيسي إلى مدخل العداد ، وتذكر استخدام اصطلاح اللون (الأزرق للمحايد والبني / الأسود / الرمادي للعيش في الاتحاد الأوروبي). يجب توصيل الإخراج ببقية النظام.

توصيلات الجهد الرئيسية. الأسلاك أعلاه هي المدخلات ، والأسلاك الخارجة هي المخرجات.

الخطوة 1: الأجزاء المطلوبة

الأجزاء المطلوبة
الأجزاء المطلوبة

الخطوة 2: احتياجات البرامج

احتياجات البرمجيات
احتياجات البرمجيات

برمجة

ابدأ تشغيل الكمبيوتر وافتح IDE الخاص بك. يمكنك استخدام Arduino IDE أو Arduino Create Editor. يفي الكود بالطلبات التالية: اتصال Modbus ، إدارة WiFi ، بروتوكول MQTT Modbus هو بروتوكول مفتوح المصدر لأجهزة الاستشعار والآلات الصناعية. لجعل Arduino يتحدث Modbus ، سنستخدم مكتبة Arduino Modbus. تحزم هذه المكتبة جميع المعالجات وتجعل توصيل أي جهاز Modbus سريعًا حقًا. نظرًا لأننا سنقرأ السجلات ، باتباع ورقة بيانات العداد ، يمكننا العثور على جميع المعلومات التي نحتاجها مثل رموز الوظائف وعنوان السجل وحجم السجل بالكلمات. ولكن لتوضيح الأمر ، دعنا نوضح كيفية عمل Modbus: تتبع رسائل Modbus بنية بسيطة: 01 03 04 00 16 00 02 25 C7 0x01 هو عنوان الجهاز 0x03 هو رمز الوظيفة الذي يخبر الجهاز إذا كنا نريد قراءة البيانات أو كتابتها * ، في هذه الحالة ، اقرأ سجلات الاحتفاظ 0x04 لـ Byte Count00 16 - نرسل 4 بايت من عنوان السجل (00 16) الذي يخبر الجهاز بما نريد قراءته 00 02- ثم حجم السجل (00 02) بالكلمات (كل كلمة بطول 2 بايت) آخر 4 بايت هي رمز CRC. يتم إنشاء هذا الرمز من دالة حسابية على وحدات البايت السابقة ، وهذا يضمن استلام الرسالة بشكل صحيح.

يعد Home Assistant Integration إضافة العداد إلى Home Assistant أمرًا سهلاً للغاية. بافتراض أن لديك وسيط MQTT تم تكوينه (هنا هو الدليل) ، كل ما عليك فعله هو إضافة تعريفات جديدة ضمن ملف config.yaml. المستشعر: - المنصة: mqtt name: "Main Voltage" state_topic: "energy / main / voltage" unit_of_measurement: "V" هنا عليك وضع اسم القياس وموضوع MQTT المراد قراءته ووحدة قياس الكمية. احفظ الملف ، وتحقق من التكوين وأعد تحميل Home Assistant ، الآن ستظهر القياسات على الصفحة الرئيسية.

لوحة استهلاك Home Assistant تظهر القراءات الحالية

سيهتم Home Assistant بإنشاء الرسوم البيانية وأتمتة العمليات التي يتم تشغيلها بواسطة قراءاتك. انتهى هذا البرنامج التعليمي ، والآن يعود الأمر لك لإضافة ميزات وتخصيصها لأغراضك الخاصة!

الخطوة 3: التجميع

جمعيه
جمعيه
جمعيه
جمعيه

منتهي؟ حان الوقت لربط اتصال RS485! سنستخدم كبلًا مزدوجًا ملتويًا مع الأرض ، وعادةً ما يستخدم لخطوط الهاتف. باستخدام هذا الكابل ، يمكنك الإرسال لمسافة طويلة (1.2 كم). ومع ذلك ، فإننا نستخدم فقط كبلًا طويلًا بما يكفي للخروج من الخزانة ووضع Arduino في مكان يسهل الوصول إليه.

اتصال مكتشف RS485

تقوم واجهة RS485 بتسمية المحطات الطرفية A و B و COM. المعيار الواقعي الشائع هو استخدام TX + / RX + أو D + كبديل لـ B (مرتفع لـ MARK أي الخمول) ، TX- / RX- أو D- كبديل لـ A (منخفض لـ MARK أي الخمول) منذ يدعم درع MKR أيضًا Full Duplex ، سترى محطتين أخريين ، Y و Z. هنا سنقوم بربط الطرف الآخر من الكبل لأننا نعلم من ورقة البيانات أن الاتصال أحادي الاتجاه يحدث فقط على طرفي Y و Z. يجب توصيل طرف COM بـ ISOGND. نظرًا لأننا نستخدم اتصالًا أحادي الاتجاه ونظرًا لأن الكبلات هي نظير إلى نظير ، فيجب علينا إعداد المفاتيح على درع MKR485 لتتناسب مع إعدادنا: قمنا بتعيين HALF (2 إلى إيقاف التشغيل) والإنهاء على YZ (3 إلى تشغيل)؛ الأول لا يهم. الإنهاء هو مقاومة تربط بين طرفي البيانات ، من أجل تخفيف التداخلات.

هذه هي. الآن يمكنك إغلاق الخزانة والتركيز على جانب البرنامج!

الخطوة 4: الكود

الشفرة
الشفرة

#يشمل

#include #include #include // بيانات اعتماد wifi الخاصة بك const char ssid = "**********" ؛ تمرير حرف الثابت = "**********" ؛

شبكة WiFiClient عميل MQTTClient ؛ سعر طويل بدون توقيع = 60000 ؛ // معدل التحديث الافتراضي بالمللي ثانية بدون توقيع long lastMillis = 0 ؛

// connect function void connect () {Serial.print ("check wifi…") ؛ while (WiFi.status ()! = WL_CONNECTED) {Serial.print (".") ؛ تأخير (1000) ؛ } Serial.print ("\ n اتصال…")؛ while (! client.connect ("device_name"، "user_name"، "user_pw")) {// قم بالتغيير لمطابقة إعدادك Serial.print (".") ؛ تأخير (1000) ؛ } Serial.println ("\ n متصل!")؛ client.subscribe ("الطاقة / الرئيسية / التحديث") ؛ // موضوع لتعيين معدل التحديث عن بعد} // تلقي mqtt وظيفة رد الاتصال void messageReceived (String & topic، String & payload) {Serial.println ("الواردة:" + topic + "-" + payload) ؛ إذا (الموضوع == "الطاقة / الرئيسي / التحديث") {// معدل معالج معدل التحديث = payload.toInt () * 1000 ؛ Serial.println ("معدل جديد" + سلسلة (معدل)) ؛ }}

إعداد باطل () {Serial.begin (115200) ؛ WiFi.begin (ssid ، تمرير) ؛ بينما (! المسلسل) ؛ client.begin ("broker_ip"، net) ؛ // التغيير لمطابقة عميل الإعداد الخاص بك. onMessage (تم استلام الرسالة) ؛ // بدء عميل Modbus RTU إذا (! ModbusRTUClient.begin (9600)) {Serial.println ("فشل بدء تشغيل Modbus RTU Client!") ؛ بينما (1) ؛ }}

حلقة باطلة () {client.loop () ، إذا (! client.connected ()) {// check network connection connect () ؛ } // نشر رسالة بعد انقضاء التحديث (روتين بدون حظر) إذا (millis () - lastMillis> rate) {lastMillis = millis ()؛ // اجعل جميع استدعاءات القراءة تطفو فولت = readVoltage () ؛ تأخير (100) ؛ تعويم amp = readCurrent () ؛ تأخير (100) ؛ مزدوج واط = readPower () ؛ تأخير (100) ؛ تعويم hz = readFreq () ؛ تأخير (100) ؛ مزدوج wh = readEnergy () ؛ // نشر النتائج تحت الموضوعات ذات الصلة client.publish ("الطاقة / الرئيسي / الجهد" ، السلسلة (فولت ، 3)) ؛ client.publish ("طاقة / رئيسية / تيار" ، سلسلة (أمبير ، 3)) ؛ client.publish ("الطاقة / الرئيسي / الطاقة" ، السلسلة (واط ، 3)) ؛ client.publish ("الطاقة / الرئيسي / التردد" ، السلسلة (هرتز ، 3)) ؛ client.publish ("الطاقة / الرئيسي / الطاقة" ، سلسلة (wh ، 3)) ؛ Serial.print (String (volt، 3) + "V" + String (amp، 3) + "A" + String (watt، 3) + "W") ؛ Serial.println (String (hz، 3) + "Hz" + String (wh، 3) + "kWh") ؛ تأخير (100) ؛ }}

/ * وظائف لقراءة سجلات Finder Energy Meter * * تحقق من دليل بروتوكول modbus لفهم الكود * https://gfinder.findernet.com/public/attachments/7E/EN/PRT_Modbus_7E_64_68_78_86EN.pdf * / float readVoltage () {float فولت = 0 ؛ if (! ModbusRTUClient.requestFrom (0x01، HOLDING_REGISTERS، 0x000C، 2)) {// قم بإجراء المكالمة إلى السجل Serial.print ("فشل في قراءة الجهد!") ؛ Serial.println (ModbusRTUClient.lastError ()) ، // معالج الخطأ} else {uint16_t word1 = ModbusRTUClient.read () ؛ // قراءة البيانات من المخزن المؤقت uint16_t word2 = ModbusRTUClient.read () ؛ uint32_t millivolt = word1 << 16 | كلمة 2 ؛ // bit math volt = millivolt / 1000.0 ؛ } عودة فولت؛ } تعويم readCurrent () {float ampere = 0.؛ if (! ModbusRTUClient.requestFrom (0x01، HOLDING_REGISTERS، 0x0016، 2)) {Serial.print ("فشل في قراءة الحالي!") ؛ Serial.println (ModbusRTUClient.lastError ()) ، } else {uint16_t word1 = ModbusRTUClient.read () ؛ uint16_t word2 = ModbusRTUClient.read () ، int32_t مللي أمبير = word1 << 16 | كلمة 2 ؛ أمبير = ملي أمبير / 1000.0 ؛ } عائد أمبير؛ }

readPower مزدوج () {double watt = 0.؛ if (! ModbusRTUClient.requestFrom (0x01، HOLDING_REGISTERS، 0x0025، 3)) {Serial.print ("فشل في قراءة الطاقة!") ؛ Serial.println (ModbusRTUClient.lastError ()) ، } else {uint16_t word1 = ModbusRTUClient.read () ؛ uint16_t word2 = ModbusRTUClient.read () ، uint16_t word3 = ModbusRTUClient.read () ، uint64_t ملي واط ؛ إذا (word1 >> 7 == 0) {ملي وات = word1

موصى به: