- Materiały wymagane do miernika mocy ESP32
- Miernik wydajności oparty na Arduino i ESP32 - schemat obwodu
- Projekt PCB dla miernika wydajności opartego na Arduino i ESP32
- Miernik wydajności oparty na Arduino i ESP32 - kod
- Testowanie miernika wydajności opartego na Arduino i ESP32
- Dalsze ulepszenia
Wszyscy jesteśmy świadomi istnienia podstawowego woltomierza, amperomierza i watomierzy, trzech podstawowych rzeczy potrzebnych do mierzenia wartości we wszelkich projektach elektronicznych lub obwodach. Pomiar napięcia i prądu za pomocą multimetru może być dobrym sposobem na rozpoczęcie, ale jednym z największych problemów, jakie napotykam podczas testowania obwodu, jest pomiar sprawności energetycznej. Tak więc dzisiaj rozwiążemy ten problem, budując miernik wydajności oparty na Arduino i ESP32, który może mierzyć napięcie wejściowe, prąd wejściowy, napięcie wyjściowe i prąd wyjściowy. W związku z tym może mierzyć moc wejściową i moc wyjściową w tym samym czasie, a dzięki tym wartościom możemy łatwo zmierzyć wydajność. Wcześniej zrobiliśmy również coś bardzo podobnego w naszym projekcie watomierza opartym na Arduino, ale tutaj będziemy mierzyć zarówno moc wejściową, jak i moc wyjściową do obliczyć sprawność energetyczną.
Zamiast kupować cztery liczniki do pracy, będziemy w stanie rozwiązać ten problem, łącząc możliwości wszystkich czterech metrów w jeden. Zbudowanie licznika cyfrowego nie tylko obniża koszty, ale także daje swobodę wprowadzania ulepszeń i ulepszeń. Ponieważ używamy ESP32 do tworzenia tego projektu, możemy łatwo włączyć ten licznik IoT i rejestrować dane przez Internet, co jest tematem przyszłego projektu. Po wyjaśnieniu wszystkich podstaw, przejdźmy od razu do tego.
Uwaga: ten miernik mocy jest przeznaczony do obwodów prądu stałego. Jeśli chcesz zmierzyć prąd AC do obliczonej wydajności energetycznej AC, możesz sprawdzić licznik energii elektrycznej oparty na IoT i projekty przedpłaconych liczników energii.
Materiały wymagane do miernika mocy ESP32
Poniższy obrazek przedstawia materiały użyte do budowy obwodu. Ponieważ jest on wykonany z bardzo ogólnych komponentów, powinieneś być w stanie znaleźć wszystkie wymienione materiały w lokalnym sklepie hobbystycznym.
Poniżej wymieniłem również komponenty wraz z wymaganą ilością. Jeśli sam budujesz obwód, zdecydowanie zalecamy pobranie wszystkich materiałów z poniższej listy.
- Płytka ESP32 - 1
- 128X64 OLED - 1
- Układ scalony ACS712-20 - 2
- Gniazdo lufy DC - 1
- Kondensator 100uF - 2
- 104pF - 2
- 102pF - 2
- 10 tys., 1% - 4
- 68 tys., 1% - 2
- 6,8 tys., 1% - 2
Miernik wydajności oparty na Arduino i ESP32 - schemat obwodu
Schemat miernika wydajności opartego na Arduino i ESP32 pokazano poniżej. Tworzenie tego obwodu jest bardzo proste i wykorzystuje ogólne komponenty.
Obsługa obwodu jest bardzo prosta. W tym projekcie będziemy mierzyć napięcie i prąd, ale w wyjątkowy sposób. Mierzymy napięcie i prąd zarówno na wejściu, jak i na wyjściu, dzięki czemu możemy zobaczyć sprawność obwodu. Jest to bardzo przydatne w przypadku niektórych projektów. Przykładem może być przetwornica DC / DC, w której pomiar sprawności staje się obowiązkowy. Sposób działania tego obwodu opisano poniżej.
Układ scalony czujnika prądu ACS712:
Jak widać na powyższym rysunku, do pomiaru prądu używamy układu scalonego czujnika prądu ACS712. Jest to bardzo interesujący układ scalony, ponieważ wykorzystuje efekt Halla do pomiaru prądu, istnieją trzy warianty tego układu, które można znaleźć na rynku f (lub 5A, 20A i 30A). Używamy tego wariantu 20A i jest on oznaczony jako ACS712-20.
Arkusz danych ACS712 zaleca zakres napięcia 4,5 - 5,5, aby zapewnić płynną pracę. A ponieważ zamierzamy zmierzyć prąd za pomocą ESP32, jest on tolerancyjny tylko 3,3 V, dlatego użyłem dzielnika napięcia z dwoma rezystorami 10K, aby obniżyć napięcie wyjściowe układu ACS712. Kiedy żaden prąd nie przepływa przez układ scalony, generuje 2,5 V, a gdy pewna ilość prądu przepływa przez układ scalony, albo obniża napięcie, albo zwiększa napięcie w zależności od kierunku przepływu prądu. Użyliśmy dwóch z tych układów scalonych do pomiaru prądu wejściowego i wyjściowego. Sprawdź nasze poprzednie projekty (poniżej), w których wykorzystaliśmy ten czujnik ACS712.
- Licznik energii elektrycznej oparty na IoT wykorzystujący Arduino i moduł Wi-Fi ESP8266
- Obwód amperomierza cyfrowego wykorzystujący mikrokontroler PIC i ACS712
Gdzie szczegółowo omówiliśmy działanie tych czujników. Możesz je sprawdzić, jeśli chcesz dowiedzieć się więcej o tych czujnikach.
Dzielnik napięcia:
Aby zmierzyć napięcie wejściowe i wyjściowe, mamy dwa dzielniki napięcia po stronie wejściowej i wyjściowej obwodu. Maksymalne napięcie, które obwód może zmierzyć, wynosi 35 V, ale można je łatwo zmienić, zmieniając wartości rezystorów dla dzielnika napięcia.
Regulator napięcia:
Ogólny regulator napięcia LM7805 jest używany do zasilania układów scalonych ESP32, OLED i ACS712. Ponieważ zasilamy go dość czystą mocą, nie używamy kondensatorów odsprzęgających, ale użyliśmy kondensatorów 100uF zarówno na wejściu, jak i na wyjściu, aby ustabilizować układ scalony.
Układ scalony ESP32 i wyświetlacz OLED:
Jako główny procesor użyliśmy ESP32, który jest odpowiedzialny za wszystkie odczyty, obliczenia, dane wejściowe i wyjściowe. Ponadto użyliśmy wyświetlacza OLED 128X64, aby poznać wartości.
Projekt PCB dla miernika wydajności opartego na Arduino i ESP32
Płytka drukowana naszego miernika wydajności opartego na Arduino i ESP32 została zaprojektowana na jednostronnej płytce. Użyłem Eagle do zaprojektowania mojej płytki PCB, ale możesz użyć dowolnego oprogramowania do projektowania, które wybierzesz. Obraz 2D mojego projektu płyty jest pokazany poniżej.
Wystarczający ślad uziemienia służy do prawidłowego połączenia uziemienia między wszystkimi komponentami. Zadbaliśmy również o użycie odpowiednich ścieżek 5 V i 3,3 V, aby zmniejszyć hałas i poprawić wydajność.
- Pobierz pliki PCB Design i GERBER Miernik wydajności oparty na Arduino i ESP32
Ręcznie robiona płytka drukowana:
Dla wygody i testów wykonałem własną ręcznie wersję PCB i pokazano to poniżej. W pierwszej wersji popełniłem błędy, które poprawiłem używając kilku przewodów połączeniowych. Ale w ostatecznej wersji naprawiłem te, możesz po prostu pobrać pliki i używać ich.
Miernik wydajności oparty na Arduino i ESP32 - kod
Teraz, gdy już dobrze rozumiemy stronę sprzętową, możemy otworzyć Arduino IDE i rozpocząć kodowanie. Celem kodu jest odczytanie napięcia analogowego z pinu 35 i 33 płyty ESP32. Odczytujemy również napięcie z pinu 32 i 34, które jest wartością bieżącą. Gdy to zrobimy, możemy je pomnożyć, aby uzyskać moc wejściową i wyjściową, i wstawić to do wzoru na sprawność, aby uzyskać wydajność.
Na koniec wyświetlamy go na ekranie LCD. Na końcu podany jest kompletny program do tego samego, który może być użyty jako taki do omówionego powyżej sprzętu. Ponadto kod jest podzielony na małe fragmenty i wyjaśniony.
Ponieważ używamy wyświetlacza OLED 128X64 , potrzebujemy biblioteki Adafruit_GFX i biblioteki Adafruit_SSD1306 do komunikacji z wyświetlaczem. Możesz pobrać oba z nich z domyślnego terminala menedżera płyty Arduino; jeśli masz jakiekolwiek problemy z częścią menedżera tablicy, możesz również pobrać i dołączyć biblioteki z powiązanego repozytorium GitHub, które jest podane poniżej.
- Pobierz bibliotekę Adafruit_GFX
- Pobierz bibliotekę Adafruit_SSD1306
Jak zwykle zaczynamy nasz kod od dołączenia wszystkich wymaganych bibliotek. Następnie definiujemy wszystkie niezbędne szpilki i zmienne, z których wszystkie pokazano poniżej.
#zawierać
W SCREEN_WIDTH i SCREEN_HEIGHT definicje są wykorzystywane do określenia rozmiaru obrazu. Następnie zdefiniowaliśmy wszystkie niezbędne piny, za pomocą których będziemy mierzyć napięcie i prąd. Następnie zdefiniowaliśmy wartości rezystorów, które są używane w sprzęcie, jak widać na schemacie. Jeśli nie masz tych wartości lub chcesz zmienić zakres miernika, możesz zmienić te wartości, kod będzie działał dobrze.
Ponieważ używamy ACS712 do pomiaru prądu, potrzebujemy wartości mVperAmp, aby obliczyć prąd z napięcia. Ponieważ używam modułu ACS712 20A, wartość mV / A wynosi 100, jak podano w arkuszu danych. Ale ponieważ używamy ESP32 i dzielnika napięcia, będziemy mieli połowę wartości, która wynosi 50, i dlatego wstawiliśmy wartość mV / AMP.
ACSoffset to przesunięcie potrzebne do obliczenia prądu na podstawie napięcia. Ponieważ układy scalone ACS712 są zasilane z 5 V, napięcie przesunięcia wynosi 2,5 V. Ale ponieważ używamy dzielnika napięcia, spada do 1,25 V. Być może znasz już kiepski ADC ESP32, więc musiałem użyć wartości 1136. Jeśli masz problemy z kalibracją, możesz dostosować wartości i skompensować ADC.
Na koniec kończymy tę sekcję, tworząc obiekt wyświetlany klasy Adafruit_SSD1306 i przekazując szerokość, wysokość ekranu, konfigurację I 2 C, a ostatni parametr -1 jest używany do zdefiniowania funkcji resetowania. Jeśli twój wyświetlacz nie ma zewnętrznego styku resetowania (co z pewnością jest dla mojego wyświetlacza), musisz użyć -1 dla ostatniego argumentu.
void setup () {Serial.begin (115200); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Adres 0x3D dla 128x64 Serial.println (F ("alokacja SSD1306 nie powiodła się")); dla (;;); } display.clearDisplay (); display.setRotation (2); display.setTextSize (1); opóźnienie (100); }
Następnie mamy sekcję setup () . W tej sekcji włączamy port szeregowy do debugowania, sprawdzamy, czy wyświetlacz I 2 C jest dostępny, czy nie, za pomocą metody początkowej obiektu wyświetlanego. Ustawiamy również adres I 2 C. Następnie czyścimy ekran za pomocą metody clearDisplay () . Obracamy również wyświetlacz metodą setRotation , ponieważ popsułem projekt PCB. Następnie ustawiamy opóźnienie 100 ms, aby funkcje zaczęły działać. Gdy to zrobisz, możemy teraz przejść do funkcji pętli. Ale zanim przejdziemy do funkcji pętli, musimy omówić dwie inne funkcje, które są return_voltage_value () , a return_current_value () .
double return_voltage_value (int pin_no) {double tmp = 0; podwójne napięcie ADC = 0; podwójne wejście Napięcie = 0; podwójna średnia = 0; for (int i = 0; i <150; i ++) {tmp = tmp + analogRead (pin_no); } avg = tmp / 150; ADCVoltage = ((średnio * 3,3) / (4095)) + 0,138; inputVoltage = ADCVoltage / (R2_VOLTAGE / (R1_VOLTAGE + R2_VOLTAGE)); // wzór na obliczenie napięcia np. GND zwraca inputVoltage; }
Funkcja return_voltage_value () służy do pomiaru napięcia wchodzącego do ADC i przyjmuje pin_no jako argument. W tej funkcji zaczynamy od zadeklarowania niektórych zmiennych, którymi są tmp, ADCVoltage, inputVoltage i avg. Zmienna tmp służy do przechowywania tymczasowej wartości ADC, którą otrzymujemy z funkcji analogRead (), następnie uśredniamy ją 150 razy w pętli for i przechowujemy tę wartość w zmiennej o nazwie avg. Następnie obliczamy ADCVoltage z podanego wzoru, na koniec obliczamy napięcie wejściowe i zwracamy wartości. Wartość +0,138, którą widzisz, to wartość kalibracji, której użyłem do kalibracji poziomu napięcia, pobaw się tą wartością, jeśli otrzymujesz jakiekolwiek błędy.
double return_current_value (int pin_no) {double tmp = 0; podwójna średnia = 0; podwójne napięcie ADC = 0; podwójne wzmacniacze = 0; for (int z = 0; z <150; z ++) {tmp = tmp + analogRead (pin_no); } avg = tmp / 150; ADCVoltage = ((średnio / 4095,0) * 3300); // Pobiera mV Amps = ((ADCVoltage - ACSoffset) / mVperAmp); Return Amps; }
Następnie mamy funkcję return_current_value () . Ta funkcja również przyjmuje pin_no jako argument. W tej funkcji mamy również cztery zmienne, a mianowicie. tmp, avg, ADCVoltage i Amps
Następnie odczytujemy pin za pomocą funkcji analogRead () i uśredniamy go 150 razy, następnie używamy wzoru do obliczenia napięcia ADC, na podstawie którego obliczamy prąd i zwracamy wartość. Dzięki temu możemy przejść do sekcji pętli.
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 ("Napięcie wejściowe:"); Serial.print (input_voltage); Serial.print ("- Prąd wejściowy:"); Serial.print (input_current); Serial.print ("- Napięcie wyjściowe:"); Serial.print (output_voltage); Serial.print ("- Prąd wyjściowy:"); Serial.println (output_current); opóźnienie (300); display.clearDisplay (); display.setCursor (0, 0); display.print ("I / PV:"); display.setCursor (37, 0); display.print (napięcie_wejściowe); display.setCursor (70, 0); pokaz.print ("V"); }
Rozpoczynamy sekcję pętli od zadeklarowania i zdefiniowania pewnych zmiennych typu float we wszystkich czterech zmiennych. Wywołujemy odpowiednie funkcje, przekazując pin_no jako argument, ponieważ moduł ACS712 może zwracać bieżące wartości w postaci ujemnej. Używamy funkcji abs () z biblioteki matematycznej, aby ujemna wartość była dodatnia. Następnie szeregowo drukujemy wszystkie wartości do debugowania. Następnie czyścimy wyświetlacz, ustawiamy kursor i drukujemy wartości. Robimy to dla wszystkich znaków pokazanych na wyświetlaczu. Co oznacza koniec funkcji pętli i programu.
Testowanie miernika wydajności opartego na Arduino i ESP32
Jak widać moja konfiguracja testowa na powyższym obrazku. Mam transformator 30 V jako wejście i mam miernik podłączony do płytki testowej. Używam płyty konwertera buck opartej na LM2596 i dla obciążenia i używam równolegle trzech rezystorów 10 Ohm.
Jak widać na powyższym obrazku podłączyłem do multimetrów w celu sprawdzenia napięcia wejściowego i wyjściowego. Transformator wytwarza prawie 32 V, a wyjście przetwornika buck to 3,95 V.
Zdjęcie tutaj pokazuje prąd wyjściowy zmierzony przez mój miernik wydajności i multimetr. Jak widać, multimetr pokazuje 0,97 Amperów, a jeśli trochę przybliżysz, pokazuje 1.0A, to jest nieco odchylone z powodu nieliniowości występującej w module ACS712, ale to służy naszemu celowi. Aby uzyskać szczegółowe wyjaśnienie i testy, możesz obejrzeć wideo w naszej sekcji wideo.
Dalsze ulepszenia
Na potrzeby tej demonstracji obwód jest wykonany na ręcznie robionej płytce drukowanej, ale można go łatwo zbudować w dobrej jakości PCB. W moim eksperymencie rozmiar PCB jest naprawdę duży ze względu na rozmiar komponentu, ale w środowisku produkcyjnym można go zmniejszyć, stosując tanie komponenty SMD. Obwód nie ma również żadnej wbudowanej funkcji zabezpieczającej, więc włączenie obwodu ochronnego poprawi ogólny aspekt bezpieczeństwa obwodu. Również podczas pisania kodu zauważyłem, że ADC w ESP32 nie jest tak świetny. Dołączenie zewnętrznego ADC, takiego jak moduł ADS1115, zwiększy ogólną stabilność i dokładność.
Mam nadzieję, że spodobał Ci się ten artykuł i nauczyłeś się z niego czegoś nowego. Jeśli masz jakiekolwiek wątpliwości, możesz zapytać w komentarzach poniżej lub skorzystać z naszych forów w celu szczegółowej dyskusji.