Innholdsfortegnelse:

Arduino presis og nøyaktig voltmeter (0-90V DC): 3 trinn
Arduino presis og nøyaktig voltmeter (0-90V DC): 3 trinn

Video: Arduino presis og nøyaktig voltmeter (0-90V DC): 3 trinn

Video: Arduino presis og nøyaktig voltmeter (0-90V DC): 3 trinn
Video: Control Position and Speed of Stepper motor with L298N module using Arduino 2024, November
Anonim

I denne instruksen har jeg bygget et voltmeter for å måle høyspenninger DC (0-90v) med relativ presisjon og nøyaktighet ved hjelp av en Arduino Nano.

Testmålingene jeg tok var nøyaktige nok, stort sett innenfor 0,3v av den faktiske spenningen målt med et standard voltmeter (jeg brukte en Astro AI DM6000AR). Dette er nær nok til min tiltenkte bruk av enheten.

For å arkivere dette brukte jeg en spenningsreferanse (4.096v) og spenningsdeler.

På kodesiden brukte jeg selvfølgelig alternativet "ekstern referanse" for Arduino Nano og "Smoothing" -eksemplet i Arduino -opplæringsprogrammene.

Rekvisita

1 x Arduino Nano - lenke

1 x Oled -skjerm (SSD 1306) - lenke

1 x 1/4W 1% motstander - 1k ohm - Link

1 x 1/4W 1% motstander - 220k ohm - Link

1 x 1/4W 1% motstander - 10k ohm - Link

1 x 4.096v LM4040DIZ -4.1 Spenningsreferanse - lenke

Brødbrett og ledninger - Link

Astro AI DM6000AR - Link

USB Power Bank - Link

9V batterier - lenke

CanadianWinters er deltaker i Amazon Services LLC Associates Program, et tilknyttet reklameprogram som er utformet for å gi nettsteder mulighet til å tjene avgifter ved å koble til Amazon.com og tilknyttede nettsteder. Ved å bruke disse koblingene tjener jeg som Amazon-medarbeider på kvalifiserte kjøp, selv om du kjøper noe annet-og det vil ikke koste deg noe.

Trinn 1: Skjemaene

Skjemaene
Skjemaene
Skjemaene
Skjemaene

Jeg koblet alle delene i henhold til skjemaet ovenfor. Spesielt valgte jeg 4.096 spenningsreferansen for å holde meg så nær 5v -merket som mulig for å unngå å miste oppløsning.

Etter databladet valgte jeg en 1K ohm motstand for spenningsreferansen, selv om en annen verdi kunne brukes. Spenningen for referansen leveres fra Nano 5v -pinnen.

Tanken med kretsen er at DC -spenningen som skal måles går gjennom en spenningsmotstand. Den skalerte spenningen og kommer deretter inn i den analoge pinnen på Arduino for å samples, glattes ut, skaleres på nytt og vises på OLed-skjermen.

Jeg prøvde å holde ting enkelt:)

Trinn 2: Kode- og motstandsberegningene

Motstandsverdiene ble valgt som det er tilrådelig (hvis jeg ikke tar feil, er dette på Arduino/Atmega -databladet) for å holde impedansen under 10k ohm.

For å forenkle ting laget jeg et regneark som automatiserer beregningene hvis du vil bruke forskjellige motstandsverdier: Lenke til Google Sheet

Her er koden jeg brukte for dette prosjektet:

#inkludere

#include U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2 (U8G2_R0); // (rotation, [reset]) flytespenning = 0; // brukes til å lagre spenningsverdi float Radjust = 0.043459459; // Spenningsdelingsfaktor (R2 /R1+R2) float vbat = 0; // sluttspenning etter beregning- spenning av batteriflåten Vref = 4.113; // Spenningsreferanse - målt virkelig verdi. Nominell verdi 4,096v const int numReadings = 50; // antall leseprøver - øk for mer utjevning. Reduser for raskere lesing. int avlesninger [numReadings]; // avlesningene fra den analoge inngangen int readIndex = 0; // indeksen for gjeldende lesning usignert lang total = 0; // løpende total int gjennomsnitt = 0; // variabler for å oppdatere skjermen uten å bruke forsinkelse unsigned long previousMillis = 0; // vil lagre forrige gang skjermen ble oppdatert // konstanter vil ikke endres: const langt intervall = 50; // intervall for oppdatering av skjermen (millisekunder) hulromsoppsett (tomrom) {analogReference (EXTERNAL); // bruk AREF for referansespenning 4.096. Min reelle spenning er 4.113v u8g2.begin (); for (int thisReading = 0; thisReading = numReadings) {// … vikle rundt til begynnelsen: readIndex = 0; } // beregne gjennomsnittet: gjennomsnitt = (total / numReadings); spenning = gjennomsnittlig * (Vref / 1023.0); //4.113 er Vref vbat = spenning/Radjust; // Angi forsinkelse for skjermoppdatering ved hjelp av Millis if (currentMillis - previousMillis> = intervall) {// lagre siste gangen skjermen ble oppdatert previousMillis = currentMillis; u8g2.clearBuffer (); // tøm den interne menyen // Pack Voltage display u8g2.setFont (u8g2_font_fub20_tr); // 20px skrift u8g2.setCursor (1, 20); u8g2.print (vbat, 2); u8g2.setFont (u8g2_font_8x13B_mr); // 10 px skrift u8g2.setCursor (76, 20); u8g2.print ("volt"); u8g2.setCursor (1, 40); u8g2.print ("CanadianWinters '"); u8g2.setCursor (1, 60); u8g2.print ("Presis spenning"); } u8g2.sendBuffer (); // overføre internminnet til skjermforsinkelsen (1); }

Vær oppmerksom på at jeg er litt rusten med Arduino -koding, så hvis du finner feil eller en måte å forbedre koden, er jeg åpen for forslag:)

Trinn 3: La oss teste det

La oss teste det!
La oss teste det!
La oss teste det!
La oss teste det!
La oss teste det!
La oss teste det!

For å teste dette voltmeteret brukte jeg 8x 9v batterier som jeg fikk i en lokal butikk. Jeg planlegger å bruke dette voltmeteret til å måle spenningen på mine elektriske sykler batteripakker (de har spenninger fra 24-60v med sporadiske 72v).

Når elektronikken er pakket inn i en kretskort og en liten eske, vil dette lage en fin og bærbar batteripakemåler. Grafikken og skriftene på OLED kan tilpasses dine behov (f.eks. Større skrift for enkel lesing).

Målet mitt var å ha en spenningsavlesning på Oled/Arduino -måleren ikke så langt fra min digitale multimåler. Jeg siktet til +/- 0, 3v max delta. Som du kan se fra videoen, klarte jeg å arkivere dette bortsett fra øverste ende av målingene.

Jeg håper du likte denne instruksen og gi meg beskjed om tankene dine!

Anbefalt: