Spisu treści:

Wielokanałowy miernik napięcia i prądu Wifi: 11 kroków (ze zdjęciami)
Wielokanałowy miernik napięcia i prądu Wifi: 11 kroków (ze zdjęciami)

Wideo: Wielokanałowy miernik napięcia i prądu Wifi: 11 kroków (ze zdjęciami)

Wideo: Wielokanałowy miernik napięcia i prądu Wifi: 11 kroków (ze zdjęciami)
Wideo: 🔴 Nowe modele amplitunerów Marantz - różnice pomiędzy następcami a poprzednikami | Webinar na żywo 🔴 2024, Lipiec
Anonim
Wielokanałowy miernik napięcia i prądu Wifi
Wielokanałowy miernik napięcia i prądu Wifi

Podczas wprowadzania płytki stykowej często trzeba jednocześnie monitorować różne części obwodu.

Aby uniknąć bólu związanego z przyklejaniem sond multimetru z jednego miejsca do drugiego, chciałem zaprojektować wielokanałowy miernik napięcia i prądu.

Deska Ina260 firmy Adafruit zapewnia na to bardzo skuteczny i wydajny sposób. Zawiera bardzo dokładny miernik napięcia i prądu ze zintegrowanym mostkiem I2C (oszczędność dużej ilości pinów przy łączeniu 3 z nich!).

Brakowało tylko wyświetlacza. Stąd decyzja o podłączeniu płyt do płytki rozwojowej ESP32, która może z łatwością obsługiwać serwer sieciowy do prezentacji zmierzonych elementów na ekranie komputera PC/mobilnego.

Kieszonkowe dzieci

3 x deska Ina260 adafruit

3 x kołki nagłówka z długimi kołkami

Minimum 6 przewodów połączeniowych

1 x ESP32 Wrover-B (lub dowolna inna płyta Wifi z obsługą I2C)

2 x 19-pinowa listwa (jeśli dotyczy)

1 x PCB lub Perfboard

Zasilanie 1x3,3 V

Krok 1: Przylutuj trzy płyty INA

Przylutuj trzy płytki INA
Przylutuj trzy płytki INA

Pierwszym krokiem jest złożenie trzech płyt INA260.

Bardzo dobrą instrukcję można znaleźć na stronie Adafruit. Postępuj zgodnie z instrukcją montażu Adafruit.

Aby móc układać je jeden na drugim, użyj długich nagłówków pinów, a nie dostarczonych pasków pinów!

Krok 2: Skonfiguruj trzy różne adresy I2C

Skonfiguruj trzy różne adresy I2C
Skonfiguruj trzy różne adresy I2C
Skonfiguruj trzy różne adresy I2C
Skonfiguruj trzy różne adresy I2C
Skonfiguruj trzy różne adresy I2C
Skonfiguruj trzy różne adresy I2C
Skonfiguruj trzy różne adresy I2C
Skonfiguruj trzy różne adresy I2C

I2C to protokół szeregowy dla dwuprzewodowego interfejsu do łączenia urządzeń o niskiej prędkości na krótkie odległości. Można podłączyć do 127 urządzeń podrzędnych. Na jednej magistrali każde urządzenie musi być identyfikowane przez unikalny adres I2C. Adres I2C urządzenia jest często na stałe wpisany w chip urządzenia. Aby połączyć te same urządzenia na jednej magistrali, producent często pozostawia możliwość zmiany adresu I2C poprzez zlutowanie ze sobą konfiguracji pinów.

Tak jest również w przypadku trzech płyt INA260. Urządzenie posiada dwa piny adresowe, A0 i A1, które można podłączyć do GND, VS, SCL lub SDA, aby ustawić żądany adres. W karcie katalogowej układu INA260 firmy texas można znaleźć listę połączeń pinów dla każdego z 16 możliwych adresów.

Deska adafruit ogranicza to do 4 desek, odsłaniając dwa pady, które można wykorzystać do przeciągnięcia A0 i/lub A1 do VS. Domyślny adres płyty INA260 to 0x40.

Wykonujesz ten krok, przypisując różne adresy dwóm pozostałym tablicom:

Lutując podkładkę A0 drugiej płytki ustawiasz jego adres na: 0x41 (lub 1000001 BIN)

Przylutowując podkładkę A1 trzeciej płytki przypisujesz adres: 0x44 (lub 1000100 BIN)

Krok 3: Podłącz płyty Ina do ESP32

Podłącz płyty Ina do ESP32
Podłącz płyty Ina do ESP32

Teraz, gdy przypisaliśmy różne adresy I2C do każdej z płyt INA, nadszedł czas, aby podłączyć je do płyty ESP32!

Jak na powyższym obrazku, połącz

1) pin VCC do pinu 3.3 V

2) pin GND do pinu GND

3) pin SDA do pinu GPIO 21

4) pin SCL do pinu GPIO 22

Użyłem projektu PCB do wykonania połączeń, ponieważ jest to część większego projektu (regulowany zasilacz WiFi z regulowanym ograniczeniem prądu - mam nadzieję, że również dla tego będzie instrukcja).

Możesz użyć dowolnego innego sposobu połączenia, może to być płytka perforowana, którą lutujesz lub używasz płytki stykowej. Oba te rozwiązania również będą działać dobrze.

Krok 4: Zainstaluj płytkę ESP32 w Arduino IDE

Zainstaluj płytkę ESP32 w Arduino IDE
Zainstaluj płytkę ESP32 w Arduino IDE

Teraz, gdy już połączyliśmy ze sobą płytki, czas sprawdzić połączenie.

Zrobimy to, zbierając adresy I2C płyt Ina.

Płytka ESP32 doskonale współpracuje z Arduino IDE.

Zainstalujmy więc płytkę ESP32 w Arduino za pomocą menedżera płytek.

Krok 5: Sprawdź połączenie Ina z ESP32 za pomocą skanera I2C

Sprawdź połączenie Ina z ESP32 za pomocą skanera I2C
Sprawdź połączenie Ina z ESP32 za pomocą skanera I2C

Użyjemy prostego skanera adresów I2C, aby zapewnić łączność między płytami ESP32 i Ina260.

Kod skanera adresu I2C można skopiować i wkleić do pustego projektu Arduino.

Kod został pobrany ze strony Arduino cc:

// ---------------------------------------// i2c_scanner // // Wersja 1 / / Ten program (lub kod, który tak wygląda) // można znaleźć w wielu miejscach. // Na przykład na forum Arduino.cc. // Oryginalny autor nie jest znany. // Wersja 2, czerwiec 2012, korzystanie z Arduino 1.0.1 // Adaptacja tak, aby była jak najprostsza przez użytkownika Arduino.cc Krodal // Wersja 3, 26 lutego 2013 // V3 autorstwa louarnold // Wersja 4, 3 marca 2013, Korzystanie z Arduino 1.0.3 // przez użytkownika Arduino.cc Krodal. // Zmiany wprowadzone przez Louarnolda usunięte. // Zmieniono adresy skanowania z 0…127 na 1…119, // według skanera i2c autorstwa Nicka Gammona // https://www.gammon.com.au/forum/?id=10896 // Wersja 5, marzec 28, 2013 // Jak wersja 4, ale adres skanuje teraz do 127. // Czujnik wydaje się używać adresu 120. // Wersja 6, 27 listopada 2015. // Dodano oczekiwanie na komunikację szeregową Leonardo. // // // Ten szkic testuje standardowe 7-bitowe adresy // Urządzenia o wyższym adresie bitowym mogą nie być poprawnie widoczne. // #include void setup() { Wire.begin(); Serial.początek(9600); podczas (!Serial); // Leonardo: czekaj na monitor szeregowy Serial.println("\nI2C Scanner"); } void loop() { błąd bajtu, adres; int nUrządzenia; Serial.println("Skanowanie…"); nUrządzenia = 0; for(adres = 1; adres < 127; adres++) { // i2c_scanner używa wartości zwracanej // Write.endTransmisstion, aby sprawdzić, // czy urządzenie potwierdziło adres. Wire.beginTransmisja(adres); błąd = Wire.endTransmission(); if (error == 0) { Serial.print("Znaleziono urządzenie I2C pod adresem 0x"); if (adres<16) Serial.print("0"); Serial.print(adres, HEX); Serial.println(" !"); nUrządzenia++; } else if (error==4) { Serial.print("Nieznany błąd pod adresem 0x"); if (adres<16) Serial.print("0"); Serial.println(adres, HEX); } } if (nDevices == 0) Serial.println("Nie znaleziono urządzeń I2C\n"); else Serial.println("gotowe\n"); opóźnienie(5000); // poczekaj 5 sekund na następne skanowanie }

Krok 6: Tworzenie folderu serwera WWW w formacie HTML

Tworzenie folderu serwera WWW w formacie HTML
Tworzenie folderu serwera WWW w formacie HTML

ESP32 daje możliwość uruchomienia serwera WWW. Zapewnia również dość dużą pamięć RAM do przechowywania niektórych stron internetowych. (Automatycznie kompresuje pliki strony internetowej).

Arduino IDE zapewnia funkcjonalność przesyłania utworzonych stron internetowych bezpośrednio do pamięci RAM ESP32.

Aby to zrobić, musisz utworzyć folder „data” pod folderem projektu Arduino. W moim przypadku jest to \Arduino\esp32_Power_supply_v1_implemented\data.

Ważne jest, aby nazwać folder dokładnie „data”, ponieważ jest to nazwa folderu, której Arduino będzie szukał podczas przesyłania plików strony internetowej do ESP.

Krok 7: Utwórz stronę internetową Power Monitor

HMTL to język umożliwiający prezentację tekstu w przeglądarce internetowej. Plik HTML jest zapisywany pod rozszerzeniem htm(l). Formatowanie strony internetowej jest zwykle umieszczane w osobnym pliku (np. pliku css). Funkcjonalność programu, którą musi oferować strona internetowa, jest zwykle umieszczana w innym pliku (np. pliku js, dla javascript).

W moim dokumencie HTML umieściłem tekst, formatowanie i JavaScript w jednym pliku. Nie jest więc dobrym przykładem tego, jak zrobić stronę internetową, ale służy celom. Nazwałem dokument HTML 'Index.htm'.

Drugi plik znajduje się w moim folderze danych, tj. PicoGraph.js. Biblioteka PicoGraph jest dostarczana przez Vishnu Shankara B z RainingComputers i pozwala na bardzo prosty, ale efektywny i elastyczny sposób prezentowania wykresów na stronie internetowej. Lekko poprawiłem kod, aby lepiej służył mojemu celowi.

Zauważysz, że strona HTML zawiera również kod do sterowania zasilaniem na mojej płytce PCB. Kod napięcia zasilającego kontroluje poziom napięcia 5 pinów I/O. Możesz zmienić kod, aby to wykluczyć lub możesz go pozostawić, jeśli nie ma to żadnego wpływu.

Kod html jest dołączony do tego kroku jako plik txt (ponieważ instrukcje nie pozwalają na przesłanie kodu htm).

Aby użyć kodu HTML, skopiuj go i wklej do edytora tekstu (ja używam Notepad++) i zapisz jako „Index.htm” w folderze „Dane”. Robisz to samo dla pliku picograph.txt, ale zmieniasz jego nazwę na picograph.js

W odniesieniu do pliku HTML:

Funkcja SndUpdate służy do wysyłania wiadomości tam iz powrotem z ESP na stronę internetową.

Komunikaty wysyłane z ESP obsługują funkcję zasilania i są poza zakresem tej instrukcji. komunikaty do ESP służą do pomiarów płyty Ina260.

var Msg = JSON.parse(xh.responseText); PG1_yrand0=Wiadom. PG1_yrand0; PG2_yrand0=Wiadom. PG2_yrand0; PG3_yrand0=Wiadom. PG3_yrand0; PG4_yrand0=Wiadom. PG4_yrand0; PG5_yrand0=Wiadom. PG5_yrand0; PG6_yrand0=Wiadom. PG6_yrand0;

Powyższy kod odczytuje 6 cyfr z płytki ESP32 tj. pomiar napięcia, pomiar prądu z pierwszej płytki, a następnie dwa pomiary z drugiej i tak dalej.

Wykresy osadzone są w tzw. flex-kontenerach, które pozwalają na elastyczną zmianę rozmiaru strony.

.flex-container { wyświetlanie: flex; kolor tła: cadetblue; flex-wrap: owijka; }.flex-container > div { kolor tła: #f1f1f1; margines: 10px; wypełnienie: 20px; rozmiar czcionki: 20px; rodzina czcionek: "Siedem segmentów"; grubość czcionki: pogrubiona; }

Zawartość każdego z kontenerów flex składa się w następujący sposób, w tym osadzone wykresy.

(zauważ, że gdzie usunięto)

div label for="PG1_scale"Scale:/label input name="PG1_scale" value="10"brbr !-- Canvas for thr graph -- canvas /płótno

!-- div dla legend/etykiet --

div /div div /div /div

Ostatnia ważna sekcja w pliku HTML współpracuje z biblioteką PicoGraph w celu przedstawienia liczb:

var PG1_demograph = createGraph("PG1_graphDemo", ["Ch1"], "V", "PG1_graphLabels", 20, 11, false, false, 11, "#e52b50"); var PG2_demograph = createGraph("PG2_graphDemo", ["Ch1"], "mA", "PG2_graphLabels", 20, 11, false, false, 11, "#e52b50"); var PG3_demograph = createGraph("PG3_graphDemo", ["Ch2"], "V", "PG3_graphLabels", 20, 11, false, false, 11, "#008000"); var PG4_demograph = createGraph("PG4_graphDemo", ["K2"], "mA", "PG4_graphLabels", 20, 11, false, false, 11, "#008000"); // var PG5_demograph = createGraph("PG5_graphDemo", ["Ch3"], "V", "PG5_graphLabels", 20, 11, false, false, 11, "#0000ff"); var PG6_demograph = createGraph("PG6_graphDemo", ["K3"], "mA", "PG6_graphLabels", 20, 11, false, false, 11, "#0000ff"); /* Aktualizuj wartości co sekundę */ setInterval(updateEverySecond, 1000); function updateEverySecond() { /* Pobierz nowe wartości */ SndUpdate();

/* Zaktualizuj wykres */ PG1_demograph.update([PG1_yrand0], parseInt(byID("PG1_scale").value)+ parseInt(byID("PG1_scale").value)/10, "#e52b50"); PG2_demograph.update([PG2_yrand0], parseInt(byID("PG2_scale").value)+ parseInt(byID("PG2_scale").value)/10, "#e52b50"); PG3_demograph.update([PG3_yrand0], parseInt(byID("PG3_scale").value)+ parseInt(byID("PG3_scale").value)/10, "#008000"); PG4_demograph.update([PG4_yrand0], parseInt(byID("PG4_scale").value)+ parseInt(byID("PG4_scale").value)/10, "#008000"); // PG5_demograph.update([PG5_yrand0], parseInt(byID("PG5_scale").value)+ // parseInt(byID("PG5_scale").value)/10, "#0000ff"); PG6_demograph.update([PG6_yrand0], parseInt(byID("PG6_scale").value)+ parseInt(byID("PG6_scale").value)/10, "#0000ff"); var Watts = Math.round(PG1_yrand0 * PG2_yrand0 *100)/100; byID("PG1_wattLabel").innerHTML = ` WATT: ${Watts} mW `; var Watts = Math.round(PG3_yrand0 * PG4_yrand0 *100)/100; byID("PG3_wattLabel").innerHTML = `WATT: ${Watts} mW`; // var Watts = Math.round(PG5_yrand0 * PG6_yrand0 *100)/100; // byID("PG5_wattLabel").innerHTML = `WATT: ${Watts} mW`; wedługID("PG1_scale").value = Math.floor(parseInt(byID("PG1_scale").value)/2+PG1_yrand0); wedługID("skala_PG2").value = Math.podłoga(parseInt(wedługID("skala_PG2").value)/2+PG2_yrand0); wedługID("PG3_scale").value = Math.floor(parseInt(byID("PG3_scale").value)/2+PG3_yrand0); wedługID("PG4_scale").value = Math.floor(parseInt(byID("PG4_scale").value)/2+PG4_yrand0); // byID("PG5_scale").value = Math.floor(parseInt(byID("PG5_scale").value)/2+PG5_yrand0); wedługID("skala_PG6").wartość = Math.podłoga(parseInt(wedługID("skala_PG6").wartość)/2+PG6_yrand0);

Studiując kod, zauważysz, że używam tylko 5 wykresów z 6 do mojego celu. Odkomentowanie właściwych linii włączy szósty wykres.

Dla tych, którzy nie mają doświadczenia z html, ten krok może okazać się równie trudny. Może jednak służyć jako miłe wprowadzenie w świat HTML-a. Wiem, bo to była pierwsza strona, jaką stworzyłem. Więc nie bój się. Dla doświadczonych pod nami wybacz.

Efekt Twojej pracy na stronie możesz obejrzeć otwierając swój html, załaduje się on do Twojej przeglądarki i pokaże swój wygląd. Możesz sprawdzić ewentualne błędy, naciskając klawisz F12 w przeglądarce, pojawi się okno debugowania. Pełne wyjaśnienie, jak debugować, wykracza poza zakres tej instrukcji, ale strona internetowa może być pomocna jako pierwszy krok do debugowania stron internetowych / JavaScript.

Następnym krokiem jest załadowanie utworzonych stron internetowych do ESP32.

Krok 8: Załaduj stronę internetową do ESP32

Załaduj stronę internetową do ESP32
Załaduj stronę internetową do ESP32

Po uzyskaniu zadowalającego wyniku czas wgrać stronę do ESP32.

Robisz to, zapisując „Index.htm” (Twoja strona internetowa) i „PicoGraph.js” w folderze „data” w Twoim projekcie Arduino.

Następnym krokiem jest podłączenie płytki ESP32 do komputera. Po wybraniu odpowiedniej płytki i portu COM, wybierz ESP32 Sketch Data Upload w menu Tools w Arduino IDE.

Zobaczysz, że IDE rozpocznie proces przesyłania, co powinno doprowadzić do pomyślnego załadowania.

Kolejnym krokiem jest skonfigurowanie mikrokontrolera ESP32 jako serwera WWW.

Krok 9: Skonfiguruj ESP32 jako serwer WWW

W załączniku znajduje się szkic Arduino Ino, który skonfiguruje ESP32 jako serwer WWW.

Będziesz musiał zastąpić SSID i powiązane hasło hasłem routera.

Jak już wspomniano, ten szkic zawiera również kod do konfiguracji strony internetowej jako kontrolera po stronie zasilania PCB (w rzeczywistości konfiguracja 5 pinów IO jako pinów PWM i kontrolowanie ich poprzez strumień wiadomości ze strony internetowej).

Szkic jest oparty na standardowym szkicu Webserver opracowanym przez Hristo Gochkova.

Niektóre wyjaśnienia dotyczące kodu.

Wszystkie poniższe funkcje są związane z konfiguracją serwera WWW.

String formatBytes(size_t bytes)String getContentType(String filename) bool existing(String path) bool handleFileRead(String path) void handleFileUpload() void handleFileDelete() void handleFileCreate() void handleFileList()

Również pierwszy kod w funkcji setup() jest powiązany z konfiguracją PWM i serwera WWW.

Poniższy kod ustawia funkcję Interrupt, która obsługuje strumienie wiadomości do i ze strony internetowej:

(należy rozpoznać identyfikatory z tworzenia strony)

server.on("/SndUpdate", HTTP_GET, () {

Wiadomość ciąg = "{"; Msg+="\"PG1_yrand0\":"+ (Ciąg) Vina[1]; Msg+=", \"PG2_yrand0\":"+ (Ciąg) Iina[1]; Msg+=", \"PG3_yrand0\":"+ (Ciąg) Vina[0]; Msg+=", \"PG4_yrand0\":"+ (Ciąg) Iina[0]; Msg+=", \"PG5_yrand0\":"+ (Ciąg) Vina[2]; Msg+=", \"PG6_yrand0\":"+ (Ciąg) Iina[2]; Wiadomość+="}";

server.send(200, "text/json", Msg);

To uruchamia serwer:

serwer.początek();

Kolejny blok kodu inicjuje płyty INA260:

//Inicjalizacja INA260 if (!ina260_0x40.begin(0x40)) { Serial.println(F("Nie można znaleźć układu INA260 0x40")); //gdy (1); } Serial.println(F("Znaleziono układ INA260 0x40")); if (!ina260_0x41.begin(0x41)) { Serial.println(F("Nie można znaleźć układu 0x41 INA260")); //gdy (1); } Serial.println(F("Znaleziono układ INA260 0x41")); if (!ina260_0x44.begin(0x44)) { Serial.println(F("Nie można znaleźć układu INA260 0x44")); //gdy (1); } Serial.println(F("Znaleziono układ INA260 0x44"));

ina260_0x40.setAveragingCount(INA260_COUNT_256);

ina260_0x40.setVoltageConversionTime(INA260_TIME_1_1_ms); ina260_0x40.setCurrentConversionTime(INA260_TIME_1_1_ms); ina260_0x40.setMode(INA260_MODE_CONTINUOUS); ina260_0x41.setAveragingCount(INA260_COUNT_256); ina260_0x41.setVoltageConversionTime(INA260_TIME_1_1_ms); ina260_0x41.setCurrentConversionTime(INA260_TIME_1_1_ms); ina260_0x41.setMode(INA260_MODE_CONTINUOUS); ina260_0x44.setAveragingCount(INA260_COUNT_256); ina260_0x44.setVoltageConversionTime(INA260_TIME_1_1_ms); ina260_0x44.setCurrentConversionTime(INA260_TIME_1_1_ms); ina260_0x44.setMode(INA260_MODE_CONTINUOUS);

W kodzie pętli następująca instrukcja zapewnia obsługę kodu przerwania:

server.handleClient();

Poniższy kod w instrukcji pętli dotyczy funkcji zasilacza.

Poniższy kod w loop() jest znowu interesujący:

Vina[0]=ina260_0x40.odczytajBusNapięcie()/1000.0f; Iina[0]=ina260_0x40.odczytajBieżący(); Vina[1]=ina260_0x41.odczytajBusNapięcie()/1000.0f; Iina[1]=ina260_0x41.readCurrent(); Vina[2]=ina260_0x44.odczytajBusNapięcie()/1000.0f; Iina[2]=ina260_0x44.odczytajBieżący();

Instrukcje te zbierają i ustawiają gotowe pomiary do przesłania do strony internetowej za pośrednictwem wywołań przerwań Server.on (występujących co 1000ms, ustawionych w skrypcie html strony internetowej java).

Krok 10: Gotowe

Gotowe!
Gotowe!

Przesłanie szkicu do płyty ESP32 powinno zakończyć konfigurację, a monitor zasilania powinien być ostateczny!

Być może zauważyłeś, że zasilanie ESP32 odbywa się teraz przez port USB, co podnosi dużą część zalet połączenia Wi-Fi z miernikami napięcia / prądu. Dlatego stworzyłem prosty zasilacz z regulacją napięcia oparty na LM317 dla ESP32. Trzymałem to poza zakresem tej instrukcji, ale jeśli jest zainteresowanie, może stać się następną instrukcją.

W kolejnym kroku dostarczyłem już układ elektroniczny zasilacza, który może służyć jako inspiracja.

Krok 11: Zasilanie ESP32

Zasilanie ESP32
Zasilanie ESP32

Oto inspiracja do zbudowania samodzielnego źródła zasilania dla twojego ESP32, jeśli nie masz takiego w pobliżu.

Obwód zasilania działa jak zasilacz laptopa 19V. Wymaga to dwufazowego obniżenia napięcia, aby utrzymać kontrolę nad rozpraszaniem mocy LM317. (Nawet z radiatorami!). Nie zapomnij również umieścić kondensatora 100uF przed linią VCC_ESP, ponieważ te mikrokontrolery mają duże wahania prądu z pewnością podczas uruchamiania połączenia Wi-Fi.

Uwaga, aby nie zasilać ESP32 więcej niż jednym źródłem zasilania na raz!

Dalej zwykłe wyłączenia odpowiedzialności, ale przede wszystkim

Baw się dobrze!

Wszystkie pliki można znaleźć na moim GitHubie:

Zalecana: