- Vật liệu cần thiết cho đồng hồ đo công suất ESP32
- Máy đo hiệu quả dựa trên Arduino và ESP32 - Sơ đồ mạch
- Thiết kế PCB cho Arduino và Máy đo hiệu quả dựa trên ESP32
- Máy đo hiệu quả dựa trên Arduino và ESP32 - Mã
- Kiểm tra Máy đo hiệu quả dựa trên Arduino và ESP32
- Cải tiến hơn nữa
Tất cả chúng ta đều biết vôn kế, ampe kế và oát kế cơ bản, ba thứ cơ bản bạn cần để đo giá trị trên bất kỳ dự án hoặc mạch điện tử nào. Đo điện áp và dòng điện với sự trợ giúp của đồng hồ vạn năng có thể là một cách tốt để bắt đầu, nhưng một trong những vấn đề lớn nhất tôi gặp phải khi kiểm tra mạch là đo hiệu suất nguồn. Vì vậy, hôm nay chúng ta sẽ giải quyết vấn đề đó bằng cách xây dựng một máy đo hiệu suất dựa trên Arduino và ESP32 có thể đo điện áp đầu vào, dòng điện đầu vào, điện áp đầu ra và dòng điện đầu ra. Do đó, nó có thể đo công suất đầu vào và công suất đầu ra cùng một lúc, và với các giá trị này, chúng ta có thể đo lường hiệu quả một cách dễ dàng. Trước đây, chúng tôi cũng đã thực hiện một việc tương tự trong dự án Công suất kế dựa trên Arduino của mình, nhưng ở đây chúng tôi sẽ đo cả công suất đầu vào và công suất đầu ra để tính toán hiệu suất của nguồn điện.
Thay vì mua bốn mét cho công việc, chúng tôi sẽ có thể giải quyết vấn đề này bằng cách kết hợp khả năng của tất cả bốn mét vào một. Việc xây dựng đồng hồ kỹ thuật số của bạn không chỉ giảm chi phí mà còn mang lại cho bạn không gian phù hợp để nâng cấp và cải tiến. Vì chúng tôi đang sử dụng ESP32 để xây dựng dự án này, chúng tôi có thể dễ dàng kích hoạt IoT cho đồng hồ đo này và ghi dữ liệu qua web, đây là chủ đề cho dự án tương lai. Với tất cả những điều cơ bản đã được giải đáp, hãy bắt đầu ngay với nó.
Lưu ý: Đồng hồ đo điện này được thiết kế cho mạch DC. Nếu bạn đang tìm cách đo dòng điện xoay chiều để tính toán hiệu suất điện xoay chiều, bạn có thể tham khảo Dự án Đồng hồ đo năng lượng điện và Đồng hồ đo năng lượng trả trước dựa trên IoT.
Vật liệu cần thiết cho đồng hồ đo công suất ESP32
Hình ảnh dưới đây cho thấy các vật liệu được sử dụng để xây dựng mạch. Vì nó được làm bằng các thành phần rất chung chung, bạn sẽ có thể tìm thấy tất cả các vật liệu được liệt kê trong cửa hàng sở thích tại địa phương của bạn.
Tôi cũng đã liệt kê các thành phần bên dưới cùng với số lượng cần thiết. Nếu bạn đang tự xây dựng mạch, bạn nên lấy tất cả các tài liệu từ danh sách dưới đây.
- Bảng ESP32 - 1
- 128X64 OLED - 1
- IC ACS712-20 - 2
- Giắc cắm thùng DC - 1
- Tụ điện 100uF - 2
- 104pF - 2
- 102pF - 2
- 10 nghìn, 1% - 4
- 68 nghìn, 1% - 2
- 6,8 nghìn, 1% - 2
Máy đo hiệu quả dựa trên Arduino và ESP32 - Sơ đồ mạch
Sơ đồ cho Máy đo hiệu quả dựa trên Arduino và ESP32 được hiển thị bên dưới. Tạo mạch này rất đơn giản và sử dụng các thành phần chung.
Hoạt động của mạch rất đơn giản. Chúng tôi sẽ đo điện áp và dòng điện trong dự án này nhưng theo một cách riêng. Chúng tôi đang đo điện áp và dòng điện cho cả đầu vào và đầu ra, do đó chúng tôi có thể thấy hiệu suất của mạch. Điều này rất hữu ích cho một số dự án. Một ví dụ có thể là bộ chuyển đổi DC sang DC trong đó việc đo hiệu quả trở nên bắt buộc. Cách thức hoạt động của mạch này được mô tả dưới đây.
IC cảm biến dòng ACS712:
Như bạn có thể thấy trong hình trên, chúng tôi đang sử dụng IC cảm biến dòng ACS712 để đo dòng điện. Đây là một vi mạch rất thú vị vì nó sử dụng hiệu ứng Hall để đo dòng điện, có ba biến thể của vi mạch này có thể được tìm thấy trên thị trường f (hoặc 5A, 20A và 30A). Chúng tôi đang sử dụng biến thể 20A của cái này và nó được gắn nhãn là ACS712-20.
Bảng dữ liệu ACS712 khuyến nghị dải điện áp từ 4,5 - 5,5 để hoạt động trơn tru. Và khi chúng ta sẽ đo dòng điện bằng ESP32, nó chỉ chịu được 3,3V, đó là lý do tại sao tôi đã sử dụng bộ chia điện áp với hai điện trở 10K để giảm điện áp đầu ra của IC ACS712. Khi không có dòng điện chạy qua IC, nó sẽ xuất ra 2,5V và khi một lượng dòng điện chạy qua IC, nó sẽ làm giảm điện áp hoặc tăng điện áp tùy thuộc vào hướng dòng điện. Chúng tôi đã sử dụng hai trong số các IC này để đo dòng điện đầu vào và đầu ra. Kiểm tra các dự án trước đây của chúng tôi (bên dưới) mà chúng tôi đã sử dụng Cảm biến ACS712 này.
- Đồng hồ đo năng lượng điện dựa trên IoT sử dụng Arduino và mô-đun Wi-Fi ESP8266
- Mạch Ampe kế kỹ thuật số sử dụng Vi điều khiển PIC và ACS712
Nơi chúng tôi đã thảo luận chi tiết về hoạt động của các cảm biến này. Bạn có thể kiểm tra những điều đó nếu bạn muốn biết thêm về các cảm biến này.
Bộ chia điện áp:
Để đo điện áp đầu vào và đầu ra, ta có hai đầu phân áp ở đầu vào và đầu ra của mạch. Hiệu điện thế lớn nhất mà mạch có thể đo được là 35V, nhưng nó có thể dễ dàng thay đổi bằng cách thay đổi các giá trị điện trở đối với bộ phân áp.
Bộ điều chỉnh điện áp:
Bộ điều chỉnh điện áp LM7805 chung được sử dụng để cấp nguồn cho các IC ESP32, OLED và ACS712. Khi chúng tôi cấp nguồn cho nó với nguồn điện khá sạch, không có tụ điện tách rời nào được sử dụng, nhưng chúng tôi đã sử dụng tụ điện 100uF ở cả đầu vào và đầu ra để ổn định IC.
IC ESP32 và màn hình OLED:
Chúng tôi đã sử dụng ESP32 làm bộ xử lý chính, chịu trách nhiệm cho tất cả các phép đọc, tính toán, đầu vào và đầu ra. Ngoài ra, chúng tôi đã sử dụng màn hình OLED 128X64 để biết các giá trị.
Thiết kế PCB cho Arduino và Máy đo hiệu quả dựa trên ESP32
PCB cho Máy đo hiệu quả dựa trên Arduino và ESP32 của chúng tôi được thiết kế trên một bảng một mặt. Tôi đã sử dụng Eagle để thiết kế PCB của mình nhưng bạn có thể sử dụng bất kỳ phần mềm thiết kế nào bạn chọn. Hình ảnh 2D của thiết kế bảng của tôi được hiển thị bên dưới.
Dấu vết nối đất đầy đủ được sử dụng để tạo kết nối đất thích hợp giữa tất cả các bộ phận. Ngoài ra, chúng tôi đảm bảo sử dụng các đường 5V và 3.3V thích hợp để giảm nhiễu và nâng cao hiệu quả.
- Tải xuống các tệp Thiết kế PCB và GERBER Máy đo hiệu quả dựa trên Arduino và ESP32
PCB thủ công:
Để thuận tiện và thử nghiệm, tôi đã làm phiên bản PCB thủ công của mình và nó được hiển thị bên dưới. Trong phiên bản đầu tiên, tôi đã mắc một số lỗi, tôi đã sửa lại bằng một số dây nối. Nhưng trong phiên bản cuối cùng, tôi đã sửa những lỗi đó, bạn chỉ có thể tải xuống các tệp và sử dụng chúng.
Máy đo hiệu quả dựa trên Arduino và ESP32 - Mã
Bây giờ, chúng ta đã hiểu rõ về khía cạnh phần cứng của mọi thứ, chúng ta có thể mở Arduino IDE và bắt đầu viết mã của mình. Mục đích của mã là để đọc điện áp tương tự từ chân 35 và 33 của bảng ESP32. Ngoài ra, chúng tôi đọc điện áp từ chân 32 và 34 là giá trị hiện tại. Khi chúng ta làm điều này, chúng ta có thể nhân chúng để có được công suất đầu vào và công suất đầu ra, và đưa nó vào công thức hiệu suất, chúng ta có thể nhận được hiệu suất.
Cuối cùng, chúng tôi hiển thị nó trên màn hình LCD. Chương trình hoàn chỉnh để làm điều tương tự được đưa ra ở cuối, có thể được sử dụng như vậy cho phần cứng được thảo luận ở trên. Hơn nữa, mã được chia thành các đoạn nhỏ và được giải thích.
Vì chúng tôi đang sử dụng màn hình OLED 128X64, chúng tôi cần thư viện Adafruit_GFX và thư viện Adafruit_SSD1306 để giao tiếp với màn hình. Bạn có thể tải xuống cả hai từ thiết bị đầu cuối quản lý bảng mặc định của Arduino; nếu bạn đang gặp bất kỳ vấn đề nào với phần quản lý hội đồng quản trị, bạn cũng có thể tải xuống và bao gồm các thư viện từ kho lưu trữ GitHub được liên kết của nó, được cung cấp bên dưới.
- Tải xuống thư viện Adafruit_GFX
- Tải xuống thư viện Adafruit_SSD1306
Như mọi khi, chúng tôi bắt đầu mã của mình bằng cách bao gồm tất cả các thư viện bắt buộc. Sau đó, chúng tôi xác định tất cả các chân và biến cần thiết, tất cả đều được hiển thị bên dưới.
#include
Các SCREEN_WIDTH & SCREEN_HEIGHT định nghĩa được sử dụng để xác định kích thước màn hình. Tiếp theo, chúng ta đã xác định tất cả các chân cần thiết, qua đó chúng ta sẽ đo điện áp và dòng điện. Tiếp theo, chúng tôi đã xác định các giá trị điện trở được sử dụng trong phần cứng như bạn có thể thấy từ sơ đồ. Nếu bạn không có các giá trị này hoặc nếu bạn muốn thay đổi phạm vi của đồng hồ, bạn có thể thay đổi các giá trị đó, mã sẽ hoạt động tốt.
Vì chúng tôi đang sử dụng ACS712 để đo dòng điện, chúng tôi cần giá trị mVperAmp để tính dòng điện từ điện áp. Vì tôi đang sử dụng mô-đun ACS712 20A, giá trị mV / A là 100 như đã cho trong biểu dữ liệu. Nhưng bởi vì chúng tôi đang sử dụng ESP32 và bộ chia điện áp, chúng tôi sẽ có một nửa giá trị là 50 và đó là lý do tại sao chúng tôi đã đặt giá trị mV / AMP.
ACSoffset là độ lệch cần thiết để tính dòng điện từ điện áp. Vì IC ACS712 được cấp nguồn từ 5V, điện áp bù là 2,5V. Nhưng khi chúng ta đang sử dụng bộ chia điện áp, nó giảm xuống còn 1,25V. Bạn có thể đã biết ADC tồi tệ của ESP32, vì vậy tôi phải sử dụng giá trị là 1136. Nếu bạn đang gặp vấn đề về hiệu chuẩn, bạn có thể điều chỉnh các giá trị và bù cho ADC.
Cuối cùng, chúng ta kết thúc phần này bằng cách tạo một đối tượng hiển thị của lớp Adafruit_SSD1306 và chuyển cấu hình chiều rộng, chiều cao, I 2 C của màn hình và tham số -1 cuối cùng được sử dụng để xác định chức năng đặt lại. Nếu màn hình của bạn không có chốt đặt lại bên ngoài (chắc chắn là dành cho màn hình của tôi), thì bạn phải sử dụng -1 cho đối số cuối cùng.
void setup () {Serial.begin (115200); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Địa chỉ 0x3D cho 128x64 Serial.println (F ("Cấp phát SSD1306 không thành công")); cho (;;); } display.clearDisplay (); display.setRotation (2); display.setTextSize (1); chậm trễ (100); }
Tiếp theo, chúng ta có phần setup () của chúng ta. Trong phần này, chúng tôi kích hoạt nối tiếp để gỡ lỗi, chúng tôi kiểm tra xem màn hình I 2 C có khả dụng hay không với sự trợ giúp của phương thức bắt đầu của đối tượng hiển thị. Ngoài ra, chúng tôi đặt địa chỉ I 2 C. Tiếp theo, chúng ta xóa màn hình bằng phương thức clearDisplay () . Ngoài ra, chúng tôi xoay màn hình bằng phương thức setRotation , đó là vì tôi đã làm sai thiết kế PCB của mình. Tiếp theo, chúng tôi đặt độ trễ 100 ms để các chức năng có hiệu lực. Sau khi hoàn tất, bây giờ chúng ta có thể chuyển sang hàm vòng lặp. Nhưng trước khi tiến tới chức năng vòng lặp, chúng ta cần phải thảo luận về hai chức năng khác có return_voltage_value () , và return_current_value () .
double return_voltage_value (int pin_no) {double tmp = 0; đôi ADCVoltage = 0; đầu vào képVoltage = 0; trung bình kép = 0; for (int i = 0; i <150; i ++) {tmp = tmp + analogRead (pin_no); } avg = tmp / 150; ADCVoltage = ((trung bình * 3,3) / (4095)) + 0,138; inputVoltage = ADCVoltage / (R2_VOLTAGE / (R1_VOLTAGE + R2_VOLTAGE)); // công thức tính điện áp tức là GND return inputVoltage; }
Hàm return_voltage_value () được sử dụng để đo điện áp đi vào ADC và nó lấy pin_no làm đối số. Trong hàm này, chúng ta bắt đầu bằng cách khai báo một số biến, đó là tmp, ADCVoltage, inputVoltage và avg. Biến tmp được sử dụng để lưu trữ giá trị ADC tạm thời mà chúng ta nhận được từ hàm analogRead (), sau đó chúng ta lấy giá trị trung bình 150 lần trong vòng lặp for và chúng ta lưu giá trị vào một biến có tên là avg. Sau đó, chúng tôi tính ADCVoltage từ công thức đã cho, cuối cùng, chúng tôi tính toán điện áp đầu vào và trả về các giá trị. Giá trị +0.138 bạn thấy là giá trị hiệu chuẩn tôi đã sử dụng để hiệu chỉnh mức điện áp, hãy thử với giá trị này nếu bạn gặp bất kỳ lỗi nào.
double return_current_value (int pin_no) {double tmp = 0; trung bình kép = 0; đôi ADCVoltage = 0; Amps đôi = 0; for (int z = 0; z <150; z ++) {tmp = tmp + analogRead (pin_no); } avg = tmp / 150; ADCVoltage = ((trung bình / 4095.0) * 3300); // Cho bạn mV Amps = ((ADCVoltage - ACSoffset) / mVperAmp); trở lại Amps; }
Tiếp theo, chúng ta có hàm return_current_value () . Hàm này cũng lấy pin_no làm đối số. Trong hàm này, chúng ta cũng có bốn biến viz. tmp, trung bình, ADCVoltage và Amps
Tiếp theo, chúng ta đọc chân bằng hàm analogRead () và lấy trung bình nó 150 lần, tiếp theo chúng ta sử dụng công thức để tính ADCvoltage, với đó chúng ta tính toán dòng điện và chúng ta trả về giá trị. Với điều đó, chúng ta có thể chuyển sang phần vòng lặp.
void loop () {float input_voltage = abs (return_voltage_value (INPUT_VOLTAGE_SENSE_PIN)); float input_current = abs (return_current_value (INPUT_CURRENT_SENSE_PIN)); float output_voltage = abs (return_voltage_value (OUTPUT_VOLTAGE_SENSE_PIN)); float output_current = abs ((return_current_value (OUTPUT_CURRENT_SENSE_PIN))); input_current = input_current - 0,025; Serial.print ("Điện áp đầu vào:"); Serial.print (điện áp đầu vào); Serial.print ("- Dòng điện đầu vào:"); Serial.print (input_current); Serial.print ("- Điện áp ra:"); Serial.print (điện áp đầu ra); Serial.print ("- Dòng ra:"); Serial.println (output_current); chậm trễ (300); display.clearDisplay (); display.setCursor (0, 0); display.print ("I / PV:"); display.setCursor (37, 0); display.print (input_voltage); display.setCursor (70, 0); trưng bày.print ("V"); }
Chúng ta bắt đầu phần vòng lặp bằng cách khai báo và định nghĩa một số biến float, trong cả bốn biến. Chúng tôi gọi các hàm tương ứng, truyền pin_no làm đối số, vì mô-đun ACS712 có thể trả về giá trị hiện tại ở dạng âm. Chúng tôi sử dụng hàm abs () của thư viện toán học để tạo giá trị âm là dương. Tiếp theo, chúng tôi in nối tiếp tất cả các giá trị để gỡ lỗi. Tiếp theo, chúng tôi xóa màn hình, đặt con trỏ và in các giá trị. Chúng tôi làm điều này cho tất cả các ký tự hiển thị trong màn hình. Dấu nào đánh dấu sự kết thúc của hàm lặp và chương trình.
Kiểm tra Máy đo hiệu quả dựa trên Arduino và ESP32
Như bạn có thể thấy thiết lập thử nghiệm của tôi trong hình trên. Tôi có máy biến áp 30V làm đầu vào và tôi đã mắc đồng hồ đo của mình cho bảng kiểm tra. Tôi đang sử dụng bảng chuyển đổi buck dựa trên LM2596 và cho tải và tôi đang sử dụng song song ba điện trở 10 Ohms.
Như bạn thấy trong hình trên, tôi đã kết nối với nhiều đồng hồ để kiểm tra điện áp đầu vào và đầu ra. Máy biến áp tạo ra gần 32V và đầu ra của bộ chuyển đổi buck là 3,95V.
Hình ảnh ở đây cho thấy dòng điện đầu ra được đo bằng đồng hồ đo hiệu suất của tôi và đồng hồ vạn năng. Như bạn có thể thấy, đồng hồ vạn năng hiển thị.97 Amps, và nếu bạn phóng to một chút, nó hiển thị 1.0A, nó hơi tắt do không tuyến tính hiện diện trong mô-đun ACS712 nhưng điều này phục vụ mục đích của chúng tôi. Để được giải thích chi tiết và thử nghiệm, bạn có thể xem video trong phần video của chúng tôi.
Cải tiến hơn nữa
Đối với phần trình diễn này, mạch được làm trên PCB thủ công nhưng mạch có thể dễ dàng được chế tạo bằng PCB chất lượng tốt. Trong thí nghiệm của tôi, kích thước của PCB thực sự lớn do kích thước thành phần, nhưng trong môi trường sản xuất, nó có thể được giảm bớt bằng cách sử dụng các thành phần SMD rẻ tiền. Mạch cũng không có bất kỳ tính năng bảo vệ tích hợp nào, vì vậy việc bao gồm một mạch bảo vệ sẽ cải thiện khía cạnh an toàn tổng thể của mạch. Ngoài ra, trong khi viết mã, tôi nhận thấy ADC của ESP32 không phải là tuyệt vời. Bao gồm một ADC bên ngoài như mô-đun ADS1115 sẽ tăng độ ổn định và độ chính xác tổng thể.
Tôi hy vọng bạn thích bài viết này và học được điều gì đó mới từ nó. Nếu bạn có bất kỳ nghi ngờ nào, bạn có thể hỏi trong phần bình luận bên dưới hoặc có thể sử dụng diễn đàn của chúng tôi để thảo luận chi tiết.