Inhoudsopgave:

Meerkanaals wifi-spannings- en stroommeter - Ajarnpa
Meerkanaals wifi-spannings- en stroommeter - Ajarnpa

Video: Meerkanaals wifi-spannings- en stroommeter - Ajarnpa

Video: Meerkanaals wifi-spannings- en stroommeter - Ajarnpa
Video: Dingtian DT-R008 многоканальное умное реле с ethernet и wi-fi - обзор и интеграция в Home Assistant 2024, Juli-
Anonim
Meerkanaals wifi-spannings- en stroommeter
Meerkanaals wifi-spannings- en stroommeter

Bij breadboarden moet men vaak verschillende delen van het circuit tegelijk in de gaten houden.

Om te voorkomen dat ik de multimeter-sondes van de ene plaats naar de andere moest plakken, wilde ik een meerkanaals spannings- en stroommeter ontwerpen.

Het Ina260 bord van Adafruit is hiervoor een zeer effectieve en efficiënte manier. Het bevat een zeer nauwkeurige spannings- en stroommeter met een geïntegreerde I2C-brug (bespaart veel pinnen bij het combineren van 3 ervan!).

Het enige wat ontbrak was een display. Vandaar de beslissing om de borden aan te sluiten op een ESP32-ontwikkelbord, dat gemakkelijk een webserver kan dragen om de gemeten items op een pc/mobiel scherm te presenteren.

Benodigdheden

3 x Ina260 adafruitbord

3 x header-pinnen met lange pinnen

Min 6 jumperdraden

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

2 x 19 pins pin header (indien van toepassing)

1 x printplaat of perfboard

1 x 3,3 V-voeding

Stap 1: Soldeer de drie INA-kaarten

Soldeer de drie INA-platen
Soldeer de drie INA-platen

De eerste stap is het monteren van de drie INA260-kaarten.

Een zeer goede instructie is te vinden op de website van Adafruit. Volg de montage-instructies van Adafruit.

Om ze op elkaar te kunnen stapelen, gebruikt u de lange pin headers in plaats van de meegeleverde pinstrips!

Stap 2: Configureer drie verschillende I2C-adressen

Configureer drie verschillende I2C-adressen
Configureer drie verschillende I2C-adressen
Configureer drie verschillende I2C-adressen
Configureer drie verschillende I2C-adressen
Configureer drie verschillende I2C-adressen
Configureer drie verschillende I2C-adressen
Configureer drie verschillende I2C-adressen
Configureer drie verschillende I2C-adressen

I2C is een serieel protocol voor een tweedraads interface om apparaten met een lage snelheid over korte afstanden aan te sluiten. Men kan maximaal 127 slaves aansluiten. Op één bus moet elk apparaat worden geïdentificeerd door een uniek I2C-adres. Het I2C-adres van een apparaat zit vaak vast in de chip van een apparaat. Om dezelfde apparaten op één bus aan te sluiten, laat de fabrikant vaak de mogelijkheid open om het I2C-adres te wijzigen door een configuratie van pinnen aan elkaar te solderen.

Dit is ook het geval voor de drie INA260 borden. Het apparaat heeft twee adrespinnen, A0 en A1 die kunnen worden aangesloten op GND, VS, SCL of SDA om het gewenste adres in te stellen. In de datasheet van de INA260-chip van Texas Instruments staat de lijst met pinverbindingen voor elk van de 16 mogelijke adressen.

Het adafruit-bord beperkt dit tot 4 borden door twee pads bloot te leggen die kunnen worden gebruikt om de A0 en/of A1 naar VS te trekken. Het standaardadres van het INA260-bord is 0x40.

U voltooit deze stap door verschillende adressen toe te wijzen aan de twee andere borden:

Door het A0-pad van het tweede bord te solderen, stel je zijn adres in op: 0x41 (of 1000001 BIN)

Door de A1-pad van het derde bord te solderen, wijst u het adres toe aan: 0x44 (of 1000100 BIN)

Stap 3: Sluit de Ina Boards aan op de ESP32

Sluit de Ina Boards aan op de ESP32
Sluit de Ina Boards aan op de ESP32

Nu we verschillende I2C-adressen hebben toegewezen aan elk van de INA-kaarten, is het tijd om ze aan te sluiten op het ESP32-bord!

Sluit volgens de bovenstaande afbeelding aan

1) de VCC-pin naar de 3.3V-pin

2) de GND-pin naar de GND-pin

3) de SDA-pin naar GPIO-pin 21

4) de SCL-pin naar GPIO-pin 22

Ik heb een PCB-ontwerp gebruikt om de verbindingen te maken, omdat het deel uitmaakt van een groter project (een WiFi-aanpasbare spanningsvoorziening met instelbare stroombegrenzing - ik hoop hier ook een instructable voor te maken).

U kunt elke andere manier gebruiken om verbinding te maken, dit kan een perfboard zijn dat u soldeert of een breadboard gebruikt. Beide zullen ook prima werken.

Stap 4: Installeer het ESP32-bord in de Arduino IDE

Installeer het ESP32-bord in de Arduino IDE
Installeer het ESP32-bord in de Arduino IDE

Nu we de borden met elkaar hebben verbonden, is het tijd om de verbinding te controleren.

Dat doen we door de I2C-adressen van de Ina-borden te verzamelen.

Het ESP32-bord werkt perfect met de Arduino IDE.

Dus laten we het ESP32-bord in Arduino installeren met behulp van de Boardmanager.

Stap 5: Controleer de Ina naar ESP32-verbinding met behulp van I2C-scanner

Controleer de Ina naar ESP32-verbinding met behulp van I2C-scanner
Controleer de Ina naar ESP32-verbinding met behulp van I2C-scanner

We zullen een eenvoudige I2C-adresscanner gebruiken om de connectiviteit tussen de ESP32- en de Ina260-kaarten te garanderen.

De I2C-adresscannercode kan worden gekopieerd en in een leeg Arduino-project worden geplakt.

De code is overgenomen van de Arduino cc-website:

// --------------------------------------// i2c_scanner // // Versie 1 / / Dit programma (of code die er op lijkt) // is op veel plaatsen te vinden. // Bijvoorbeeld op het Arduino.cc-forum. // De oorspronkelijke auteur is niet bekend. // Versie 2, juni 2012, met Arduino 1.0.1 // Aangepast om zo eenvoudig mogelijk te zijn door Arduino.cc-gebruiker Krodal // Versie 3, 26 februari 2013 // V3 door louarnold // Versie 4, 3 maart 2013, Arduino 1.0.3 gebruiken // door Arduino.cc-gebruiker Krodal. // Wijzigingen door louarnold verwijderd. // Scanadressen gewijzigd van 0…127 in 1…119, // volgens de i2c-scanner van Nick Gammon // https://www.gammon.com.au/forum/?id=10896 // Versie 5, maart 28, 2013 // Als versie 4, maar adres scant nu naar 127. // Een sensor lijkt adres 120 te gebruiken. // Versie 6, 27 november 2015. // Wachtend op de seriële communicatie van Leonardo toegevoegd. // // // Deze schets test de standaard 7-bits adressen // Apparaten met een hoger bitadres worden mogelijk niet goed gezien. // #include void setup() { Wire.begin(); Serieel.begin(9600); terwijl (!Serial); // Leonardo: wacht op seriële monitor Serial.println ("\nI2C Scanner"); } void loop() { bytefout, adres; int nApparaten; Serial.println("Scannen…"); nApparaten = 0; for(address = 1; address <127; address++) { // De i2c_scanner gebruikt de retourwaarde van // de Write.endTransmisstion om te zien of // een apparaat het adres heeft bevestigd. Wire.beginTransmission (adres); error = Wire.endTransmission(); if (fout == 0) { Serial.print ("I2C-apparaat gevonden op adres 0x"); if (adres<16) Serial.print("0"); Serial.print (adres, HEX); Serieel.println(" !"); nApparaten++; } else if (error==4) { Serial.print("Onbekende fout op adres 0x"); if (adres<16) Serial.print("0"); Serial.println(adres, HEX); } } if (nDevices == 0) Serial.println("Geen I2C-apparaten gevonden\n"); else Serial.println("klaar\n"); vertraging (5000); // wacht 5 seconden voor de volgende scan}

Stap 6: De HTML-webservermap maken

De HTML-webservermap maken
De HTML-webservermap maken

De ESP32 biedt de mogelijkheid om een webserver te draaien. Het biedt ook een vrij groot RAM-geheugen voor sommige webpagina's. (Het comprimeert automatisch de webpaginabestanden).

De Arduino IDE biedt de functionaliteit voor het rechtstreeks uploaden van de gemaakte webpagina's naar het RAM-geheugen van de ESP32.

Om dit te doen, moet je een map 'data' maken onder de map van het Arduino-project. In mijn geval is dit \Arduino\esp32_Power_supply_v1_implemented\data.

Het is belangrijk om de map precies 'data' te noemen, aangezien dit de mapnaam is waarnaar Arduino zal zoeken bij het uploaden van de webpaginabestanden naar de ESP.

Stap 7: Maak de Power Monitor-webpagina

HMTL is een taal die het mogelijk maakt om een tekst in een webbrowser te presenteren. Een HTML-bestand wordt opgeslagen onder de extensie htm(l). De opmaak van een webpagina wordt meestal in een apart bestand (bijv. css-bestand) geplaatst. De programmafunctionaliteit die een webpagina moet bieden, wordt normaal gesproken in een ander bestand geplaatst (bijv. js-bestand, voor javascript).

In mijn HTML-document heb ik de tekst, opmaak en Javascript in één bestand opgenomen. Het is dus geen goed voorbeeld van hoe je een webpagina maakt, maar het dient wel het doel. Ik noemde het HTML-document 'Index.htm'.

Een tweede bestand is opgenomen in mijn datamap, nl. PicoGraph.js. De PicoGraph-bibliotheek wordt geleverd door Vishnu Shankar B van RainingComputers en zorgt voor een zeer eenvoudige, maar effectieve en flexibele manier om grafieken op een webpagina te presenteren. Ik heb de code enigszins gewijzigd om mijn doel beter te dienen.

U zult merken dat op de HTML-webpagina ook de code staat voor het aansturen van de spanningsvoorzieningen op mijn printplaat. De voedingscode regelt het spanningsniveau van 5 I/O-pinnen. U kunt de code wijzigen om dit uit te sluiten of u kunt deze laten staan als dit geen effect heeft.

De html-code is als een txt-bestand aan deze stap toegevoegd (omdat de instructables het uploaden van htm-code niet toestaan).

Om de HTML-code te gebruiken, kopieer en plak je deze in een teksteditor (ik gebruik Notepad++) en sla je deze op als ' Index.htm' onder de map ' Data'. U doet hetzelfde voor het picograph.txt-bestand, maar hernoem het naar picograph.js

Met betrekking tot het HTML-bestand:

Een functie SndUpdate wordt gebruikt om berichten heen en weer te sturen van de ESP naar de webpagina.

De berichten die door de ESP worden verzonden, dienen de functionaliteit van de voeding en vallen buiten het bereik van deze instructable. de berichten naar de ESP dienen voor de Ina260-bordmetingen.

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

De bovenstaande code leest 6 cijfers van het ESP32-bord, dwz. de spanningsmeting, de stroommeting van het eerste bord, gevolgd door de twee metingen van het tweede, enzovoort.

De grafieken zijn ingebed in zogenaamde flex-containers, die een flexibele resize van de webpagina mogelijk maken.

.flex-container { display: flex; achtergrondkleur: cadetblue; flexomslag: omslag; }.flex-container > div { achtergrondkleur: #f1f1f1; marge: 10px; opvulling: 20px; lettergrootte: 20px; font-familie: "Zeven Segment"; lettergewicht: vet; }

De inhoud van elk van de flexcontainers is als volgt opgebouwd, inclusief de ingebedde grafieken.

(merk op dat de waar verwijderd)

div label for="PG1_scale"Scale:/label input name="PG1_scale" value="10"brbr !-- Canvas voor de grafiek -- canvas /canvas

!-- div voor legendes/labels --

div /div div /div /div

De laatste sectie van belang in het HTML-bestand werkt met de PicoGraph-bibliotheek om de getallen weer te geven:

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 waarden elke seconde bij */ setInterval(updateEverySecond, 1000); functie updateEverySecond() { /* Nieuwe waarden ophalen */ SndUpdate();

/* Grafiek bijwerken */ 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: ${Watt} mW `; var Watts = Math.round(PG3_yrand0 * PG4_yrand0 *100)/100; byID("PG3_wattLabel").innerHTML = `WATT: ${Watt} mW`; // var Watts = Math.round(PG5_yrand0 * PG6_yrand0 *100)/100; // byID("PG5_wattLabel").innerHTML = `WATT: ${Watt} mW`; byID("PG1_scale").value = Math.floor(parseInt(byID("PG1_scale").value)/2+PG1_yrand0); byID("PG2_scale").value = Math.floor(parseInt(byID("PG2_scale").value)/2+PG2_yrand0); byID("PG3_scale").value = Math.floor(parseInt(byID("PG3_scale").value)/2+PG3_yrand0); byID("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); byID("PG6_scale").value = Math.floor(parseInt(byID("PG6_scale").value)/2+PG6_yrand0);

Als je de code bestudeert, zul je merken dat ik slechts 5 grafieken van de 6 voor mijn doel gebruik. Als u de rechter lijnen uit commentaar haalt, wordt de 6e grafiek ingeschakeld.

Voor degenen die geen ervaring hebben met html, kan deze stap moeilijk overkomen. Het kan echter dienen als een mooie introductie in de wereld van HTML. Ik weet het, want dit was de eerste pagina die ik ooit heb gemaakt. Dus wees niet bang. Voor degenen die onder ons ervaren zijn, wees vergevingsgezind.

Het resultaat van uw werk op de webpagina kan worden bekeken door uw html te openen, deze wordt in uw browser geladen en toont zijn uiterlijk. U kunt controleren op mogelijke fouten door op de F12-toets in uw browser te drukken, het foutopsporingsvenster verschijnt. Volledige uitleg over hoe te debuggen valt buiten het bestek van deze instructable, maar de webpagina kan nuttig zijn als eerste stap naar het debuggen van webpagina's / javascript.

De volgende stap is om de gemaakte webpagina's in de ESP32 te laden.

Stap 8: laad webpagina in de ESP32

Laad webpagina in de ESP32
Laad webpagina in de ESP32

Na het verkrijgen van een bevredigend resultaat, is het tijd om de webpagina te uploaden naar de ESP32.

Dit doe je door de 'Index.htm' (je webpagina) en de 'PicoGraph.js' op te slaan in de map 'data' onder je Arduino-project.

De volgende stap is om het ESP32-bord op de computer aan te sluiten. Nadat je het juiste bord en de COM-poort hebt geselecteerd, selecteer je de ESP32 Sketch Data Upload onder het menu Tools in de Arduino IDE.

U zult zien dat de IDE begint met het uploadproces, wat zou moeten leiden tot een succesvolle lading.

Naast deze stap is het configureren van de ESP32-microcontroller als webserver.

Stap 9: Configureer de ESP32 als webserver

Bijgevoegd vindt u de Arduino Ino-schets die de ESP32 zal configureren als een webserver.

U moet de SSID en het bijbehorende wachtwoord vervangen door het wachtwoord van uw router.

Zoals eerder vermeld, bevat deze schets ook de code om de webpagina te configureren als een controller voor de voedingszijde van de PCB (in feite 5 IO-pinnen configureren als PWM-pinnen en deze besturen via de berichtenstroom van de webpagina).

De schets is gebaseerd op de standaard Webserver-schets ontwikkeld door Hristo Gochkov.

Enige uitleg over de code.

De volgende functies zijn allemaal gerelateerd aan het instellen van de webserver.

String formatBytes(size_t bytes)String getContentType(String bestandsnaam) bool exist(String path) bool handleFileRead(String path) void handleFileUpload() void handleFileDelete() void handleFileCreate() void handleFileList()

Ook de eerste code in de setup() functie is gerelateerd aan PWM en Webserver setup.

De volgende code stelt de Interrupt-functie in die de berichtenstromen van en naar de webpagina bedient:

(u moet de identifiers herkennen van het maken van de webpagina)

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

Tekenreeks 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]; Bericht+="}";

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

Dit start de server:

server.begin();

Het volgende codeblok initialiseert de INA260-kaarten:

// INA260-initialisatie if (!ina260_0x40.begin (0x40)) { Serial.println (F ("Kon INA260 0x40-chip niet vinden")); // terwijl (1); } Serial.println (F ("Gevonden INA260-chip 0x40")); if (!ina260_0x41.begin(0x41)) { Serial.println(F("Kon de 0x41 INA260-chip niet vinden")); // terwijl (1); } Serial.println (F ("Gevonden INA260 0x41-chip")); if (!ina260_0x44.begin(0x44)) { Serial.println(F("Kon INA260 0x44 chip niet vinden")); // terwijl (1); } Serial.println (F ("Gevonden INA260-chip 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);

In de Loop-code verzekert de volgende verklaring de afhandeling van de interruptcode:

server.handleClient();

De volgende code in de lusinstructie heeft betrekking op de functionaliteit van de voeding.

De volgende code in de loop() 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();

Deze verklaringen verzamelen en maken de metingen gereed voor overdracht naar de webpagina via de Server.on interrupt-aanroepen (die elke 1000 ms plaatsvinden, ingesteld in het html java-script van de webpagina).

Stap 10: Je bent klaar

Je bent klaar!
Je bent klaar!

Het uploaden van de schets naar het ESP32-bord zou de installatie moeten voltooien en uw Power-monitor zou definitief moeten zijn!

Je hebt misschien gemerkt dat het voeden van de ESP32 nu via de USB-poort gebeurt, dit verhoogt een groot deel van de voordelen van de wifi-gebaseerde verbinding met je spannings- / stroommeters. Daarom heb ik een eenvoudige, op LM317 gebaseerde, spanningsgestuurde voeding voor de ESP32 gemaakt. Ik hield het buiten het bestek van deze instructable, maar als er interesse is, kan het een volgende instructable worden.

In de volgende stap heb ik al het elektronische circuit voor de voeding geleverd dat als inspiratie zou kunnen dienen.

Stap 11: De ESP32 aanzetten

De ESP32 aanzetten
De ESP32 aanzetten

Hierbij een inspiratie om een stand alone stroombron voor je ESP32 te bouwen, mocht je er geen hebben liggen.

Het stroomcircuit werkt van een 19V laptopvoeding. Dit vraagt om een tweefasige spanningsverlaging om de vermogensdissipatie van de LM317's onder controle te houden. (Zelfs met koellichamen!). Vergeet ook niet om een 100uF-condensator voor de VCC_ESP-lijn op te nemen, aangezien deze microcontrollers grote stroomschommelingen hebben, zeker bij het opstarten van de WiFi-verbinding.

Let op: voed de ESP32 niet met meer dan één stroombron tegelijk!

Verder de gebruikelijke disclaimers van aansprakelijkheid, maar vooral:

Veel plezier!

Alle bestanden zijn te vinden op mijn GitHub:

Aanbevolen: