ผู้แต่ง: Peter Jensen
นี่เป็นความพยายามครั้งแรกของฉันในโครงการ IoT 'มีประโยชน์' ฉันมี arduino uno มาระยะหนึ่งแล้ว แต่ไม่ได้ใช้อะไรเลยยกเว้นการสอน LED ที่กระพริบ ถึงเวลาที่จะต้องใช้ ฉันพบว่ามันคุ้มค่าที่จะคิดแนวคิดโครงการแล้วค้นหาข้อมูลที่คุณต้องการเมื่อคุณต้องการ แน่นอนว่าบ่อยครั้งที่คุณพบว่าคนอื่นทำสิ่งที่คล้ายกัน แต่ก็โอเคคุณยังคงเรียนรู้จากกระบวนการ
ฉันต้องการอุปกรณ์ในการวัดการใช้พลังงานในบ้านของฉันและให้มันรายงานถึงบริการ 'คลาวด์' เมื่อสิ่งต่าง ๆ เปลี่ยนไป ไฟเปิด/ปิด ฯลฯ นอกจากนี้ฉันต้องการแสดงผลบนกล่องดังนั้นฉันจึงสามารถอ่านได้ว่าการใช้พลังงานในปัจจุบันคืออะไร
ฉันเริ่มต้นด้วยการเชื่อมต่อเซ็นเซอร์ปัจจุบันกับพินอินพุตแบบอะนาล็อก แบบนี้:
ที่มา: openenergymonitor.org
สำหรับการสอบเทียบฉันใช้มัลติมิเตอร์ที่สามารถวัดได้สูงถึง 10A และเชื่อมต่อกับลวดที่ให้กำลังไฟหลอดไฟสามหลอด หลอดไฟแต่ละหลอดสามารถเปิดและปิดเป็นรายบุคคลได้ ด้วยหลอดไฟ 60W ในซ็อกเก็ตฉันสามารถรับตัวอย่างสำหรับ 60W, 120W และ 180W
หมายเหตุเซ็นเซอร์ปัจจุบันจะต้องไปรอบ ๆ สายเดียวเพื่อให้กระแส AC ผ่านลวดนั้นเพื่อกระตุ้นกระแสไฟฟ้าในเซ็นเซอร์
กระแสที่วัดได้คือกระแสที่ผ่านสายไฟที่เซ็นเซอร์ปัจจุบันล้อมรอบ
หากสิ่งที่คุณทำในฟังก์ชั่น loop() ในภาพร่าง Arduino ของคุณคือการโทรหา analogRead() และเก็บผลลัพธ์ไว้ในบัฟเฟอร์หน่วยความจำคุณจะสามารถรับตัวอย่างได้ประมาณ 100 ตัวอย่างในช่วงหนึ่งรอบ (60Hz - 16.7ms) Arduino ทำงานที่ 16MHz นั่นควรจะเพียงพอที่จะคำนวณค่ารูท--แควนสแควร์ (RMS) ของอินพุตได้อย่างแม่นยำ
ทำไมคุณถึงต้องการค่า RMS? อินพุตบนพินอินพุตแบบอะนาล็อกคือแรงดันไฟฟ้าลดลงเหนือตัวต้านทานโหลด/ภาระ แรงดันไฟฟ้าที่ลดลงนั้นเป็นสัดส่วนโดยตรงกับกระแสไฟฟ้าที่ผ่านสายไฟที่ถูกวัดในเวลาที่วัด
เมื่อกระแสและแรงดันไฟฟ้าแตกต่างกันไปตามกาลเวลาพลังงานจะถูกคำนวณเป็นพลังงานเฉลี่ยในช่วงระยะเวลาของคลื่นไซนัส 60Hz โดยใช้ค่า RMS ของ I และ V:
ส่วนประกอบ V RMS นั้นคงที่โดย บริษัท พลังงานที่ 120V ดังนั้นสิ่งที่น่าสนใจคือค่า I RMS ตัวแปลงอะนาล็อกเป็นดิจิตอล Arduino เป็น 10 บิตและวงจรได้รับการออกแบบเพื่อให้จุดกึ่งกลางของอินพุตไซนัสคือ 2.5V ซึ่งควรส่งผลให้อ่าน ~ 511 หากการอ่านมีระยะห่างเท่ากันในเวลานั้นค่า i rms สามารถคำนวณได้เป็น:
โดยที่ n คือจำนวนตัวอย่างที่ใช้ในการครอบคลุมช่วงเวลาเต็มของคลื่นไซนัส 60Hz, k คือค่าคงที่การสอบเทียบที่จะถูกกำหนดหลังจากการวัดค่า i rms ที่แท้จริงด้วยมัลติมิเตอร์และ v ฉัน เป็นค่าที่ส่งคืนโดยการเรียกไปยัง analogRead()
ข้อมูลเพิ่มเติมเกี่ยวกับคณิตศาสตร์สามารถพบได้ที่นี่: Wikipedia
<TODO: แทรกรูปภาพของการตั้งค่าการวัดการทดสอบ>
ฉันซื้อทุกอย่างที่ฉันต้องการใน Amazon Prime หากคุณไม่ใช่สมาชิกชั้นนำคุณอาจต้องจ่ายเงินเพิ่มอีกเล็กน้อย สำหรับบางรายการมันสมเหตุสมผลที่จะซื้อมากกว่าหนึ่งหน่วยเนื่องจากมีเพียงไม่กี่ดอลลาร์และมันก็ดีเสมอที่จะมีอะไหล่ในกรณีที่คุณทอด นอกจากนี้หากคุณต้องการสร้างหน่วยที่สอง (หรือสาม) คุณมีสิ่งที่คุณต้องการอยู่แล้ว
| รายการ | ค่าใช้จ่ายทั้งหมด | ค่าใช้จ่ายต่อหน่วย |
|---|---|---|
| Arduino Pro Mini (3 แพ็ค) | $ 11 | $ 4 |
| โมดูลแหล่งจ่ายไฟ 3.3V/5V (5 แพ็ค) | $ 9 | $ 2 |
| ESP8266 ESP-01 (4-pack) | $ 14 | $ 4 |
| 2X SCT-013-000 เซ็นเซอร์กระแส AC แบบไม่รุกราน | $ 26 | $ 13 |
| โมดูลจอแสดงผล LCD 16x2 | $ 6 | $ 6 |
| 110VAC-> 9V อะแดปเตอร์ | $ 6 | $ 6 |
| 10pcs 4x6cm ต้นแบบสองด้าน PCB | $ 7 | $ 1 |
| แจ็ค PCB ที่ติดตั้ง 10pcs 3.5 มม. | $ 8 | $ 2 |
| MISC: ตัวเก็บประจุ, ตัวต้านทาน, ปุ่ม, สายไฟ | ~ $ 2 | $ 2 |
| ทั้งหมด | $ 89 | $ 40 |
นี่คือวิธีที่ฉันเชื่อมต่อทุกอย่างด้วยกัน:
ฉันใช้ซอฟต์แวร์ Digikey Scheme-IT เพื่อสร้างแผนภาพการเดินสายฮาร์ดแวร์ด้านบน มันทำงานในเบราว์เซอร์!
มีบางสิ่งที่จะชี้ให้เห็น:
ข้อมูลที่แสดงในวงจร LCD 2 บรรทัดผ่านข้อมูลนี้เมื่อกดปุ่ม:
หากตรวจพบการกดยาวเมื่อ 'ตัวเลือกขั้นสูง' แสดงหน้าจอเพิ่มเติมเหล่านี้จะรวมอยู่ในการหมุน:
ในการเปลี่ยนสถานะเปิด/ปิดหรือรีเซ็ตข้อมูลที่ต้องกดปุ่มยาวบนปุ่ม
พลังงานทั้งหมด | พลังสาย |
สายไฟ | การใช้พลังงานทั้งหมดตั้งแต่รีเซ็ตล่าสุด |
ที่อยู่ IP ท้องถิ่น | กดยาวสำหรับตัวเลือกขั้นสูง |
เปิด/ปิดการส่ง WiFi | ส่งแต่ละค่าตัวอย่าง |
กำลังดำเนินการ |
ขณะนี้การแสดงผล/อินเทอร์เฟซของเบราว์เซอร์มีลักษณะเช่นนี้:

เส้นสีดำและสีแดงแสดงถึงพลังที่ดึงมาจากแต่ละเฟสทั้งสองที่เข้ามาในบ้าน ปุ่มลูกศรซ้ายและขวาที่อยู่ด้านบนจะไปที่วันก่อนหน้าหรือวันถัดไป หากคุณอยู่ในวันนี้ข้อมูลใหม่จะถูกนำมาใช้ ไม่จำเป็นต้องตี 'รีเฟรช'!
นี่คือบางสิ่งที่สามารถได้มาจากสิ่งนี้:
การบริโภคสแตนด์บาย 'ดำ' ประมาณ 125W และ 'สีแดง' คือ 25W นี่คือการวาดกาฝากโดยอุปกรณ์ทั้งหมดที่อยู่ในโหมดสแตนด์บาย (ทีวีไมโครเวฟคอมพิวเตอร์เว็บแคม ฯลฯ )
รูปแบบสี่เหลี่ยมขึ้น/ลงบนเส้น 'ดำ' คือคอมเพรสเซอร์ในตู้เย็นเปิดและปิด
ฉันตื่นขึ้นมาประมาณ 6 โมงเช้าและเริ่มเปิดไฟและเปิดทีวี ทีวีวาดจากบรรทัด 'ดำ'
สไปค์ใน 'สีแดง' เป็นแฟนคาร์บอนไดออกไซด์ของฉันบนเครื่องทำน้ำอุ่น เครื่องทำน้ำอุ่นใช้เวลาประมาณ 10 นาที
เข็มที่เล็กลงหลังจากที่สไปค์เครื่องทำน้ำอุ่นคือการเปิดประตูโรงรถ
ฉันใช้ OpenScad เพื่อออกแบบกล่อง ไฟล์. sscad และไฟล์. stl ที่แสดงผลอยู่ใน repo นี้ กล่องที่มี cutouts สำหรับการแสดงผลปุ่มและตัวเชื่อมต่อต่างๆมีลักษณะเช่นนี้:

แหล่งจ่ายไฟที่ไม่สม่ำเสมอ
การพึ่งพาแหล่งจ่ายไฟจาก USB ทำให้เกิดความไม่พอใจในการอ่านพินอะนาล็อก นอกจากนี้เพื่อให้พลังงานแก่ ESP-01 ฉันต้องการอุปทาน 3.3V Arduino Pro Mini ไม่มีตัวควบคุมแรงดันไฟฟ้า 3.3V เช่นเดียวกับที่ UNO ทำ โมดูลแหล่งจ่ายไฟราคาไม่แพงมากพอดีกับการเรียกเก็บเงินและดูเหมือนว่าจะให้พลังงานที่มั่นคงเพียงพอเพื่อให้แน่ใจว่าการอ่านที่มั่นคง
อัตราการรับส่งข้อมูลของ ESP8266 ESP-01
ฉันต้องใช้หมุด I/O ดิจิตอลสองสามตัวบน Arduino สำหรับการสื่อสารแบบอนุกรมระหว่าง Arduino และโมดูล ESP-01 ต้องใช้หมุด TX/RX ปกติสำหรับการกะพริบซอฟต์แวร์ไปยัง Arduino เมื่อใช้โมดูลซอฟต์แวร์กับหมุด I/O ดิจิตอลมันเป็นไปไม่ได้ที่จะได้รับลิงก์การสื่อสารที่เชื่อถือได้ไปยัง ESP-01 ในอัตราเริ่มต้น 115200 Baud เนื่องจากจำนวนการแลกเปลี่ยนข้อมูลระหว่าง Arduino และ ESP-01 นั้นค่อนข้าง จำกัด ฉันจึงกำหนดอัตราการรับส่งข้อมูลเป็น 9600 Baud ที่ปลอดภัย
หน่วยความจำหมดใน Arduino
Arduino มีหน่วยความจำ RAM มูลค่าเพียง 2K RAM ใช้สำหรับข้อมูลทั่วโลกทั้งหมดข้อมูลสแต็กและแม้แต่ข้อมูลสตริงคงที่ คอมไพเลอร์ ATMEL 328 GCC ทำงานได้ดีในการกำจัดรหัสและข้อมูลที่ตายแล้วทั้งหมดและฉันค่อนข้างประหลาดใจที่คุณสามารถเรียกใช้โปรแกรม C ++ ได้มากกว่า 1,000 บรรทัดใน RAM จำนวนเล็กน้อย ต้องใช้เล่นซอเพื่อให้พอดี
new เพื่อจัดสรรวัตถุ:String : มุมมองด้านบน | ขั้วต่อแหล่งจ่ายไฟ |
ตัวเชื่อมต่อ CT | เสาอากาศส่วนหนึ่งของ ESP8266 |
มุมมองด้านล่าง | มุมมองด้านล่างโดยไม่ต้อง Arduino |
มุมมองด้านล่างโดยไม่มี Arduino และ ESP8266 | ![]() |
ปุ่มและแอลซีดีติดอยู่ด้านบน | ![]() |
ด้านล่าง PCB | กล่องพร้อมฝา |
here's some code
นี่คือตาราง:
| 1 | 2 | - - - | ADADF | ADFADF |