สารบัญ:

การตรวจสอบค่าพลังงานของคุณ: 4 ขั้นตอน
การตรวจสอบค่าพลังงานของคุณ: 4 ขั้นตอน

วีดีโอ: การตรวจสอบค่าพลังงานของคุณ: 4 ขั้นตอน

วีดีโอ: การตรวจสอบค่าพลังงานของคุณ: 4 ขั้นตอน
วีดีโอ: ขั้นตอนที่ 5 ของระบบการจัดการพลังงาน 8 ขั้นตอน คือ การกำหนดเป้าหมายและแผนอนุรักษ์พลังาน 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 0x01is the Device Address 0x03 คือ Function Code ที่บอกอุปกรณ์ว่าเราต้องการอ่านหรือเขียนข้อมูล * ในกรณีนี้อ่านการลงทะเบียนการถือ 0x04 สำหรับ Byte Count00 16 - เราส่งที่อยู่ลงทะเบียน 4 ไบต์ (00 16) ที่บอกอุปกรณ์ว่าเราต้องการอ่านอะไร 00 02- จากนั้นขนาดของการลงทะเบียน (00 02) เป็นคำพูด (ทุกคำมีความยาว 2 ไบต์) 4 ไบต์สุดท้ายคือรหัส CRC รหัสนี้สร้างจากฟังก์ชันทางคณิตศาสตร์บนไบต์ก่อนหน้า ซึ่งช่วยให้มั่นใจว่าได้รับข้อความอย่างถูกต้อง

Home Assistant Integration การเพิ่มมิเตอร์ลงใน Home Assistant นั้นค่อนข้างตรงไปตรงมา สมมติว่าคุณมีโบรกเกอร์ MQTT ที่กำหนดค่าไว้ (นี่คือคำแนะนำ) สิ่งที่คุณต้องทำคือเพิ่มคำจำกัดความใหม่ภายใต้ไฟล์ configuration.yaml เซ็นเซอร์: - แพลตฟอร์ม: mqtt ชื่อ: "แรงดันหลัก" state_topic: "พลังงาน/หลัก/แรงดันไฟฟ้า" unit_of_measurement: "V" คุณต้องใส่ชื่อของการวัด หัวข้อ MQTT เพื่ออ่าน และหน่วยวัดของปริมาณ บันทึกไฟล์ ตรวจสอบการกำหนดค่า และโหลด Home Assistant อีกครั้ง ตอนนี้การวัดจะปรากฏในหน้าหลัก

แผงการบริโภคของ Home Assistant แสดงการอ่านปัจจุบัน

Home Assistant จะดูแลการสร้างกราฟและกระบวนการอัตโนมัติที่เกิดจากการอ่านของคุณ บทช่วยสอนนี้เสร็จสิ้นแล้ว ตอนนี้ก็ขึ้นอยู่กับคุณแล้วที่จะเพิ่มคุณสมบัติและปรับแต่งเพื่อวัตถุประสงค์ของคุณเอง!

ขั้นตอนที่ 3: ประกอบ

ประกอบ
ประกอบ
ประกอบ
ประกอบ

เสร็จแล้ว? ถึงเวลาที่จะขันในการเชื่อมต่อ RS485! เราจะใช้สายคู่บิดเกลียวกับกราวด์ ซึ่งโดยทั่วไปจะใช้สำหรับสายโทรศัพท์ ด้วยสายเคเบิลนี้ คุณสามารถส่งได้ไกล (1.2 กม.) อย่างไรก็ตาม เราใช้สายเคเบิลที่ยาวพอที่จะออกจากตู้และวาง Arduino ไว้ในที่ที่เข้าถึงได้

การเชื่อมต่อ Finder RS485

อินเทอร์เฟซ RS485 ตั้งชื่อเทอร์มินัล A, B และ COM มาตรฐานโดยพฤตินัยทั่วไปคือการใช้ TX+/RX+ หรือ D+ เป็นทางเลือกสำหรับ B (สูงสำหรับ MARK เช่น idle), TX-/RX- หรือ D- เป็นทางเลือกสำหรับ A (ต่ำสำหรับ MARK เช่น idle) เนื่องจาก MKR Shield รองรับ Full Duplex เช่นกัน คุณจะเห็นเทอร์มินัลอีกสองขั้วคือ Y และ Z ที่นี่เราจะขันปลายอีกด้านของสายเคเบิลเนื่องจากเราทราบจากแผ่นข้อมูลว่าการสื่อสารแบบ half-duplex เกิดขึ้นเฉพาะบนเทอร์มินัล Y และ Z เท่านั้น เทอร์มินัล COM ต้องเชื่อมต่อกับ ISOGND เนื่องจากเราใช้การเชื่อมต่อแบบ half-duplex และเนื่องจากสายเคเบิลเป็นแบบเพียร์ทูเพียร์ เราจึงต้องตั้งค่าสวิตช์บนแผงป้องกัน MKR485 เพื่อให้ตรงกับการตั้งค่าของเรา: เราตั้งค่า HALF (2 เป็นปิด) และการยกเลิกบน YZ (3 ถึง บน); คนแรกไม่สำคัญ ขั้วปลายสายคือความต้านทานที่เชื่อมต่อขั้วข้อมูลทั้งสองขั้วเพื่อกันการรบกวน

นี่ไง. ตอนนี้คุณสามารถปิดตู้และเน้นด้านซอฟต์แวร์ได้แล้ว!

ขั้นตอนที่ 4: รหัส

รหัส
รหัส

#รวม

#include #include #include // ข้อมูลรับรอง wifi ของคุณ const char ssid = "************"; const char pass = "**********";

WiFiClient สุทธิ; ลูกค้า MQTTClient; อัตราระยะยาวที่ไม่ได้ลงนาม = 60000; // อัตราการรีเฟรชเริ่มต้นในหน่วย ms ที่ไม่ได้ลงชื่อแบบยาว LastMillis = 0;

// ฟังก์ชันเชื่อมต่อเป็นโมฆะเชื่อมต่อ () { Serial.print ("กำลังตรวจสอบ wifi …"); ในขณะที่ (WiFi.status() != WL_CONNECTED) { Serial.print("."); ล่าช้า (1000); } Serial.print("\nกำลังเชื่อมต่อ…"); ในขณะที่ (!client.connect("device_name", "user_name", "user_pw")) { //CHANGE TO MATCH TO MATCH YOUR SETUP Serial.print("."); ล่าช้า (1000); } Serial.println("\nเชื่อมต่อแล้ว!"); client.subscribe("พลังงาน/หลัก/รีเฟรช"); //topic เพื่อกำหนดอัตราการรีเฟรชจากระยะไกล } //mqtt รับฟังก์ชันการโทรกลับ void messageReceived (สตริง & หัวข้อ สตริง &เพย์โหลด) { Serial.println ("ขาเข้า: " + หัวข้อ + " - " + เพย์โหลด); if(topic == "energy/main/refreshrate") { //refresh rate handler rate = payload.toInt()*1000; Serial.println("อัตราใหม่"+สตริง(อัตรา)); } }

การตั้งค่าเป็นโมฆะ () { Serial.begin (115200); WiFi.begin(ssid, ผ่าน); ในขณะที่ (!ซีเรียล); client.begin("broker_ip", สุทธิ); //เปลี่ยนเพื่อให้ตรงกับการตั้งค่าของคุณ client.onMessage(messageReceived); // เริ่มไคลเอนต์ Modbus RTU ถ้า (!ModbusRTUClient.begin (9600)) { Serial.println ("ไม่สามารถเริ่มไคลเอนต์ Modbus RTU!"); ในขณะที่ (1); } }

วงเป็นโมฆะ () { client.loop (); if (!client.connected()) {// ตรวจสอบการเชื่อมต่อเครือข่ายเชื่อมต่อ (); } // เผยแพร่ข้อความหลังจากการรีเฟรชที่ผ่านไปแล้ว (รูทีนที่ไม่บล็อก) ถ้า (มิลลิวินาที () - lastMillis > อัตรา) { lastMillis = millis (); // ทำการเรียกการอ่านทั้งหมด float volt = readVoltage(); ล่าช้า (100); แอมป์ลอย = readCurrent(); ล่าช้า (100); ดับเบิลวัตต์ = readPower(); ล่าช้า (100); float hz = readFreq(); ล่าช้า (100); ดับเบิ้ล wh = readEnergy (); //เผยแพร่ผลลัพธ์ภายใต้หัวข้อที่เกี่ยวข้อง client.publish("energy/main/voltage", String(volt, 3)); client.publish("energy/main/current", String(amp, 3)); client.publish("energy/main/power", สตริง(วัตต์, 3)); client.publish("energy/main/frequency", สตริง(hz, 3)); client.publish("energy/main/energy", สตริง (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()); // ตัวจัดการข้อผิดพลาด } อื่น { uint16_t word1 = ModbusRTUClient.read (); //อ่านข้อมูลจากบัฟเฟอร์ uint16_t word2 = ModbusRTUClient.read(); uint32_t มิลลิโวลต์ = word1 << 16 | คำ2; //บิตคณิตศาสตร์โวลต์ = มิลลิโวลต์/1000.0; } คืนค่าโวลต์; } float readCurrent(){ แอมแปร์ลอย = 0.; if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0016, 2)) { Serial.print("ไม่สามารถอ่านข้อมูลปัจจุบันได้!"); Serial.println(ModbusRTUClient.lastError()); }อื่น{ uint16_t word1 = ModbusRTUClient.read(); uint16_t word2 = ModbusRTUClient.read(); int32_t milliamp = word1 << 16 | คำ2; แอมแปร์ = มิลลิแอมป์/1000.0; } แอมแปร์คืน; }

double readPower () { วัตต์คู่ = 0.; if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0025, 3)) { Serial.print("ไม่สามารถอ่านพลังงานได้!"); Serial.println(ModbusRTUClient.lastError()); }อื่น{ uint16_t word1 = ModbusRTUClient.read(); uint16_t word2 = ModbusRTUClient.read(); uint16_t word3 = ModbusRTUClient.read(); uint64_t มิลลิวัตต์; if(word1 >> 7 == 0){ มิลลิวัตต์ = word1

แนะนำ: