INHOUDSOPGAWE:

Meerkanaals wifi-spanning en stroommeter: 11 stappe (met foto's)
Meerkanaals wifi-spanning en stroommeter: 11 stappe (met foto's)

Video: Meerkanaals wifi-spanning en stroommeter: 11 stappe (met foto's)

Video: Meerkanaals wifi-spanning en stroommeter: 11 stappe (met foto's)
Video: Dingtian DT-R008 многоканальное умное реле с ethernet и wi-fi - обзор и интеграция в Home Assistant 2024, Julie
Anonim
Meerkanaals wifi-spanning en stroommeter
Meerkanaals wifi-spanning en stroommeter

As u aan boord gaan, moet u gereeld verskillende dele van die stroombaan tegelyk monitor.

Om te verhoed dat die pyn die multimeter-sondes van die een plek na die ander hoef te plak, wou ek 'n meerkanaalse spanning- en stroommeter ontwerp.

Die Ina260 -bord van Adafruit bied 'n baie effektiewe en doeltreffende manier om dit te doen. Dit bevat 'n baie akkurate spannings- en stroommeter met 'n geïntegreerde I2C -brug (bespaar baie penne by die kombinasie van 3 daarvan!).

Die enigste ding wat ontbreek, was 'n vertoning. Vandaar die besluit om die borde aan te sluit op 'n ESP32 -ontwikkelbord, wat maklik 'n webserver kan dra om die gemete items op 'n rekenaar/mobiele skerm te kan voorstel.

Voorrade

3 x Ina260 adafruitbord

3 x koppenne met lang penne

Min 6 springdrade

1 x ESP32 Wrover-B (of enige ander Wifi-bord met I2C-ondersteuning)

2 x 19 -pen penkop (indien van toepassing)

1 x PCB of Perfboard

1 x 3,3 V kragtoevoer

Stap 1: Soldeer die drie INA -borde

Soldeer die drie INA -borde
Soldeer die drie INA -borde

Die eerste stap is om die drie INA260 -borde aanmekaar te sit.

'N Baie goeie instruksie kan gevind word op die Adafruit -webwerf. Volg die monteerinstruksies van Adafruit.

Om dit bo -op mekaar te stapel, gebruik die lang penkoppe eerder as die afgeleë penstroke!

Stap 2: Stel drie verskillende I2C -adresse op

Stel drie verskillende I2C -adresse op
Stel drie verskillende I2C -adresse op
Stel drie verskillende I2C -adresse op
Stel drie verskillende I2C -adresse op
Stel drie verskillende I2C -adresse op
Stel drie verskillende I2C -adresse op
Stel drie verskillende I2C -adresse op
Stel drie verskillende I2C -adresse op

I2C is 'n seriële protokol vir 'n tweedraad-koppelvlak om toestelle met lae spoed oor kort afstande aan te sluit. 'N Mens kan tot 127 slawe verbind. Op een bus moet elke toestel geïdentifiseer word deur 'n unieke I2C -adres. Die I2C -adres van 'n toestel word gereeld met die chip van 'n toestel verbind. Om dieselfde toestelle op een bus aan te sluit, laat die vervaardiger dikwels die moontlikheid om die I2C -adres te verander deur 'n konfigurasie van penne aanmekaar te soldeer.

Dit is ook die geval met die drie INA260 -borde. Die toestel het twee adrespenne, A0 en A1, wat aan GND, VS, SCL of SDA gekoppel kan word om die gewenste adres in te stel. In die datablad van die INA260 -chip van Texas Instruments kan u die lys van penverbindings vir elk van die 16 moontlike adresse vind.

Die adafruitbord beperk dit tot 4 borde deur twee pads bloot te stel wat gebruik kan word om die A0 en/of A1 na VS te trek. Die standaardadres van die INA260 -bord is 0x40.

U voltooi hierdie stap deur verskillende adresse aan die twee ander borde toe te ken:

Deur die A0 -pad van die tweede bord te soldeer stel u sy adres op: 0x41 (of 1000001 BIN)

Deur die A1 -pad van die derde bord te soldeer, gee u die adres toe aan: 0x44 (of 1000100 BIN)

Stap 3: Koppel die Ina Boards aan die ESP32

Koppel die Ina Boards aan die ESP32
Koppel die Ina Boards aan die ESP32

Noudat ons aan elkeen van die INA -borde verskillende I2C -adresse toegeken het, is dit tyd om dit aan die ESP32 -bord te koppel!

Koppel volgens die prent hierbo

1) die VCC -pen tot die 3.3V -pen

2) die GND -pen na die GND -pen

3) die SDA -pen na GPIO -pen 21

4) die SCL -pen na GPIO -pen 22

Ek het 'n PCB -ontwerp gebruik om die verbindings te maak, aangesien dit deel uitmaak van 'n groter projek ('n WiFi -verstelbare spanningsbron met verstelbare stroombeperking - ek hoop ook om 'n instruksie hiervoor te maak).

U kan enige ander manier gebruik om aan te sluit; dit kan 'n perfboard wees wat u soldeer of 'n broodbord gebruik. Albei sal ook goed werk.

Stap 4: Installeer die ESP32 -bord in die Arduino IDE

Installeer die ESP32 -bord in die Arduino IDE
Installeer die ESP32 -bord in die Arduino IDE

Noudat ons die borde met mekaar verbind het, is dit tyd om die verbinding na te gaan.

Ons sal dit doen deur die I2C -adresse van die Ina -borde te versamel.

Die ESP32 -bord werk perfek met die Arduino IDE.

Laat ons dus die ESP32 -bord in Arduino installeer met behulp van die bestuurder.

Stap 5: Kontroleer die verbinding tussen Ina en ESP32 met behulp van I2C -skandeerder

Kontroleer die Ina na ESP32 -verbinding met die I2C -skandeerder
Kontroleer die Ina na ESP32 -verbinding met die I2C -skandeerder

Ons sal 'n eenvoudige I2C -adresskandeerder gebruik om die verbinding tussen die ESP32 en die Ina260 -borde te verseker.

Die I2C -adresskandeerderkode kan in 'n leë Arduino -projek geplak word.

Die kode is geneem van die Arduino cc webwerf:

// -------------------------------------- // i2c_scanner // // Weergawe 1/ / Hierdie program (of kode wat lyk) // kan op baie plekke gevind word. // Byvoorbeeld op die Arduino.cc -forum. // Die oorspronklike skrywer weet nie. // Weergawe 2, Juni 2012, met behulp van Arduino 1.0.1 // Aangepas om so eenvoudig as moontlik te wees deur Arduino.cc -gebruiker Krodal // Weergawe 3, 26 Februarie 2013 // V3 deur louarnold // Weergawe 4, 3 Maart 2013, Met behulp van Arduino 1.0.3 // deur Arduino.cc -gebruiker Krodal. // Veranderinge deur louarnold verwyder. // Skanderingadresse verander van 0… 127 na 1… 119, // volgens die i2c -skandeerder deur Nick Gammon // https://www.gammon.com.au/forum/?id=10896 // Weergawe 5, Maart 28, 2013 // As weergawe 4, maar adres skandeer nou na 127. // Dit lyk asof 'n sensor adres 120. // Weergawe 6, 27 November 2015. // Bygevoeg wag vir die seriële kommunikasie van Leonardo. // // // Hierdie skets toets die standaard 7-bis adresse // Toestelle met 'n hoër bis adres sal moontlik nie behoorlik gesien word nie. // #sluit leegstelling op () {Wire.begin (); Serial.begin (9600); terwyl (! Serial); // Leonardo: wag vir seriële monitor Serial.println ("\ nI2C Scanner"); } leemte lus () {byte fout, adres; int nToestelle; Serial.println ("Skandeer …"); nToestelle = 0; vir (adres = 1; adres <127; adres ++) {// Die i2c_scanner gebruik die retourwaarde van // die Write.endTransmisstion om te sien of // 'n toestel die adres wel erken het. Wire.beginTransmission (adres); error = Wire.endTransmission (); as (fout == 0) {Serial.print ("I2C -toestel gevind by adres 0x"); if (adres <16) Serial.print ("0"); Serial.print (adres, HEX); Serial.println ("!"); nToestelle ++; } anders as (fout == 4) {Serial.print ("Onbekende fout by adres 0x"); if (adres <16) Serial.print ("0"); Serial.println (adres, HEX); }} if (nDevices == 0) Serial.println ("Geen I2C -toestelle gevind / n"); anders Serial.println ("klaar / n"); vertraging (5000); // wag 5 sekondes vir die volgende skandering}

Stap 6: Skep die HTML -webbedienergids

Die skep van die HTML -webbedienergids
Die skep van die HTML -webbedienergids

Die ESP32 bied die moontlikheid om 'n webbediener te bestuur. Dit bied ook 'n redelike groot RAM -geheue om 'n paar webblaaie te hou. (Dit komprimeer die webbladlêers outomaties).

Die Arduino IDE bied die funksie om die geskepte webblaaie direk na die ESP32 se RAM op te laai.

Om dit te kan doen, moet u 'data' van die lêergids onder die gids van die Arduino -projek skep. In my geval is dit / Arduino / esp32_Power_supply_v1_implemented / data.

Dit is belangrik om die gids presies 'data' te noem, aangesien dit die lêernaam is waarna Arduino sal soek wanneer u die webbladlêers na die ESP oplaai.

Stap 7: Skep die Power Monitor -webblad

HMTL is 'n taal waarmee 'n teks in 'n webblaaier aangebied kan word. 'N HTML -lêer word gestoor onder die uitbreiding htm (l). Die opmaak van 'n webblad word gewoonlik in 'n aparte lêer (bv. Css -lêer) geplaas. Die programfunksionaliteit wat 'n webblad moet bied, word normaalweg in 'n ander lêer geplaas (bv. Js -lêer, vir javascript).

In my HTML -dokument het ek die teks, opmaak en Javascript in een lêer opgeneem. Dit is dus nie 'n goeie voorbeeld van hoe om 'n webblad te maak nie, maar dit dien die doelwitte. Ek het die HTML -dokument 'Index.htm' genoem.

'N Tweede lêer is ingesluit in my databasis, dws. PicoGraph.js. Die PicoGraph -biblioteek word verskaf deur Vishnu Shankar B van RainingComputers en bied 'n baie eenvoudige, maar doeltreffende en buigsame manier om grafieke op 'n webblad te bied. Ek het die kode effens gewysig om my doel beter te dien.

U sal sien dat die HTML -webblad ook die kode bevat vir die beheer van die spanningsbronne op my printplaat. Die spanningstoevoerkode beheer die spanningsvlak van 5 I/O -penne. U kan die kode verander om dit uit te sluit, of u kan dit inlaat as daar geen impak is nie.

Die html -kode word as 'n txt -lêer aan hierdie stap gekoppel (aangesien die instruksies nie die oplaai van htm -kode moontlik maak nie).

Om die HTML -kode te gebruik, kopieer en plak dit in 'n teksredigeerder (ek gebruik Notepad ++) en stoor dit as 'Index.htm' onder die 'Data' -lêergids. U doen dieselfde vir die picograph.txt -lêer, maar hernoem dit na picograph.js

Met betrekking tot die HTML -lêer:

'N Funksie SndUpdate word gebruik om boodskappe van die ESP na die webblad terug te stuur.

Die boodskappe wat van die ESP gestuur word, dien die funksie van die kragtoevoer en is buite die omvang hiervan. die boodskappe aan die ESP dien op die Ina260 -bordmetings.

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

Bogenoemde kode lees 6 nommers van die ESP32 -bord, dws. die spanningsmeting, die stroommeting vanaf die eerste bord, gevolg deur die twee metings van die tweede ensovoorts.

Die grafieke is ingebed in sogenaamde flex-containers, wat die buiging van die webblad buigsaam kan maak.

.flex-houer {display: flex; agtergrondkleur: cadetblue; flex-wrap: wrap; }.flex-houer> div {agtergrond-kleur: #f1f1f1; marge: 10 px; opvulling: 20 px; lettergrootte: 20 px; font-family: "Sewe segment"; lettertipe gewig: vet; }

Die inhoud van elk van die buighouers word soos volg saamgestel, insluitend die ingebedde grafieke.

(let op dat dit verwyder is)

div etiket vir = "PG1_scale" Skaal:/etiket invoer naam = "PG1_scale" waarde = "10" brbr!-Doek vir thr grafiek-canvas style = "hoogte: 100px; rand: 2px soliede #000000; agtergrond-kleur: #fafafa; " /doek

!-div vir legendes/etikette-

div /div div /div /div

Die laaste gedeelte van belang in die HTML -lêer werk saam met die PicoGraph -biblioteek om die getalle voor te stel:

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", ["Ch2"], "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", ["Ch3"], "mA", "PG6_graphLabels", 20, 11, false, false, 11, "#0000ff"); / * Werk waardes elke sekonde op */ setInterval (updateEverySecond, 1000); update updateEverySecond () { / * Kry nuwe waardes * / SndUpdate ();

/ * Werk grafiek */PG1_demograph.update ([PG1_yrand0], parseInt (byID ("PG1_scale"). Waarde)+ parseInt (byID ("PG1_scale"). Waarde)/10, "#e52b50") op; PG2_demograph.update ([PG2_yrand0], parseInt (byID ("PG2_scale"). Waarde)+ parseInt (byID ("PG2_scale"). Waarde)/10, "#e52b50"); PG3_demograph.update ([PG3_yrand0], parseInt (byID ("PG3_scale"). Waarde)+ parseInt (byID ("PG3_scale"). Waarde)/10, "#008000"); PG4_demograph.update ([PG4_yrand0], parseInt (byID ("PG4_scale"). Waarde)+ parseInt (byID ("PG4_scale"). Waarde)/10, "#008000"); // PG5_demograph.update ([PG5_yrand0], parseInt (byID ("PG5_scale"). Waarde)+ // parseInt (byID ("PG5_scale"). Waarde)/10, "#0000ff"); PG6_demograph.update ([PG6_yrand0], parseInt (byID ("PG6_scale"). Waarde)+ parseInt (byID ("PG6_scale"). Waarde)/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`; byID ("PG1_scale"). waarde = Math.floor (parseInt (byID ("PG1_scale"). waarde)/2+PG1_yrand0); byID ("PG2_scale"). waarde = Math.floor (parseInt (byID ("PG2_scale"). waarde)/2+PG2_yrand0); byID ("PG3_scale"). waarde = Math.floor (parseInt (byID ("PG3_scale"). waarde)/2+PG3_yrand0); byID ("PG4_scale"). waarde = Math.floor (parseInt (byID ("PG4_scale"). waarde)/2+PG4_yrand0); // byID ("PG5_scale"). waarde = Math.floor (parseInt (byID ("PG5_scale"). waarde)/2+PG5_yrand0); byID ("PG6_scale"). waarde = Math.floor (parseInt (byID ("PG6_scale"). waarde)/2+PG6_yrand0);

As u die kode bestudeer, sal ek sien dat ek slegs 5 grafieke van die 6 vir my doel gebruik. As u nie op die regte lyne kommentaar lewer nie, word die sesde grafiek moontlik gemaak.

Vir diegene wat nie ervaring het met html nie, kan hierdie stap net so moeilik wees. Dit kan egter dien as 'n goeie inleiding tot die wêreld van HTML. Ek weet, want dit was die eerste bladsy wat ek ooit gemaak het. Moet dus nie bang wees nie. Wees vergewensgesind vir diegene onder ons.

Die resultaat van u werk op die webblad kan hersien word deur u html oop te maak, dit word in u blaaier gelaai en die voorkoms daarvan vertoon. U kan na moontlike foute kyk deur op die F12 -sleutel in u blaaier te druk; die ontfoutingsvenster verskyn. Die volledige uiteensetting van hoe om te ontfout is buite die omvang van hierdie instruksies, maar die webblad kan nuttig wees as 'n eerste stap na ontfouting van webbladsye / JavaScript.

Die volgende stap is om die geskepte webblaaie in die ESP32 te laai.

Stap 8: Laai webbladsy in die ESP32

Laai webbladsy in die ESP32
Laai webbladsy in die ESP32

Nadat u 'n bevredigende resultaat gekry het, is dit tyd om die webblad na die ESP32 op te laai.

U doen dit deur die 'Index.htm' (u webblad) en die 'PicoGraph.js' in die 'data' -lêergids onder u Arduino -projek op te slaan.

Die volgende stap is om die ESP32 -bord aan te sluit op die rekenaar. Nadat u die korrekte bord en die COM -poort gekies het, kies u die oplaai van ESP32 -sketsdata onder die menu 'Tools' in die Arduino IDE.

U sal sien dat die IDE met die oplaai proses begin, wat tot 'n suksesvolle laai behoort te lei.

Langs hierdie stap is die opstel van die ESP32 -mikrobeheerder as 'n webserver.

Stap 9: Stel die ESP32 as webbediener op

Hierby vind u die Arduino Ino -skets wat die ESP32 as 'n webserver sal opstel.

U moet die SSID en die verwante wagwoord vervang met die wagwoord van u router.

Soos reeds genoem, bevat hierdie skets ook die kode om die webblad op te stel as 'n beheerder vir die kragtoevoerkant van die PCB (in werklikheid, die konfigurasie van 5 IO -penne as PWM -penne en dit deur die boodskapstroom vanaf die webblad te beheer).

Die skets is gebaseer op die standaard Webserver -skets wat deur Hristo Gochkov ontwikkel is.

'N Paar verduidelikings oor die kode.

Die volgende funksies hou alles verband met die opstel van die webbediener.

String formatBytes (size_t bytes) String getContentType (String lêernaam) bool bestaan (String pad) bool handleFileRead (String pad) void handleFileUpload () void handleFileDelete () void handleFileCreate () void handleFileList ()

Die eerste kode in die setup () -funksie hou ook verband met PWM en Webserver -opstelling.

Die volgende kode stel die onderbrekingsfunksie in wat die boodskapstrome na en van die webblad bedien:

(u moet die identifiseerders van die skepping van die webblad herken)

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

String msg = "{"; Msg+ = "\" PG1_yrand0 / ":"+ (string) Vina [1]; Msg+ = ", \" PG2_yrand0 / ":"+ (string) Iina [1]; Msg+ = ", \" PG3_yrand0 / ":"+ (string) Vina [0]; Msg+ = ", \" PG4_yrand0 / ":"+ (string) Iina [0]; Msg+ = ", \" PG5_yrand0 / ":"+ (string) Vina [2]; Msg+ = ", \" PG6_yrand0 / ":"+ (string) Iina [2]; Msg+= "}";

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

Dit begin die bediener:

bediener.begin ();

Die volgende kodeblok, begin die INA260 -borde:

// INA260 -inisialisering as (! Ina260_0x40.begin (0x40)) {Serial.println (F ("INA260 0x40 -chip nie gevind nie")); // terwyl (1); } Serial.println (F ("INA260 chip 0x40" gevind)); as (! ina260_0x41.begin (0x41)) {Serial.println (F ("0x41 INA260 chip nie gevind nie")); // terwyl (1); } Serial.println (F ("INA260 0x41 chip gevind")); as (! ina260_0x44.begin (0x44)) {Serial.println (F ("INA260 0x44 -chip nie gevind nie")); // terwyl (1); } Serial.println (F ("INA260 chip 0x44" gevind));

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);

In die Loop -kode verseker die volgende stelling die hantering van die onderbrekingskode:

server.handleClient ();

Die volgende kode in die lusverklaring hou verband met die funksie van kragtoevoer.

Die volgende kode in die lus () is weer interessant:

Vina [0] = ina260_0x40.readBusVoltage ()/1000.0f; Iina [0] = ina260_0x40.readCurrent (); Vina [1] = ina260_0x41.readBusVoltage ()/1000.0f; Iina [1] = ina260_0x41.readCurrent (); Vina [2] = ina260_0x44.readBusVoltage ()/1000.0f; Iina [2] = ina260_0x44.readCurrent ();

Hierdie stellings versamel en berei die metings voor vir oordrag na die webblad via die Server.on onderbrekingsoproepe (kom elke 1000 ms voor in die HTML -Java -script van die webblad).

Stap 10: U is klaar

Jy is klaar!
Jy is klaar!

As u die skets na die ESP32 -bord laai, moet die opstelling afgehandel word en moet u kragmonitor finaal wees!

U het miskien opgemerk dat die aanstuur van die ESP32 nou via die USB -poort plaasvind, dit verhoog 'n groot deel van die voordele van die WiFi -gebaseerde verbinding met u spanning / stroommeters. Daarom het ek 'n eenvoudige LM317 -gebaseerde spanningsgeregelde kragbron vir die ESP32 gemaak. Ek het dit buite die omvang van hierdie instruksies gehou, maar as daar belangstelling is, kan dit 'n volgende instruksie word.

In die volgende stap het ek reeds die elektroniese stroombaan voorsien vir die kragtoevoer wat as inspirasie kan dien.

Stap 11: Skakel die ESP32 aan

Skakel die ESP32 aan
Skakel die ESP32 aan

Hiermee 'n inspirasie om 'n losstaande kragbron vir u ESP32 te bou, as u nie een het nie.

Die kragkring werk van 'n 19V skootrekenaarkragbron. Dit vra vir 'n twee -fasige spanningstap om die kragverlies van die LM317 onder beheer te hou. (Selfs met hittebakke!). Moet ook nie vergeet om 'n 100uF -kondensator voor die VCC_ESP -lyn in te sluit nie, aangesien die mikrobeheerders groot stroomskommelinge het tydens die aanvang van die WiFi -verbinding.

Let daarop dat die ESP32 nie met meer as een kragbron op 'n slag gevoed moet word nie!

Verder die gewone aanspreeklikheidsvrystellings, maar veral

Hê pret!

Al die lêers kan op my GitHub gevind word:

Aanbeveel: