Indholdsfortegnelse:

Arduino præcis og nøjagtig voltmåler (0-90V DC): 3 trin
Arduino præcis og nøjagtig voltmåler (0-90V DC): 3 trin

Video: Arduino præcis og nøjagtig voltmåler (0-90V DC): 3 trin

Video: Arduino præcis og nøjagtig voltmåler (0-90V DC): 3 trin
Video: How to use Mosfet Optocoupled HW-532 to control up to 30V DC Motor Speed or load using Arduino 2024, Juli
Anonim

I denne instruktive har jeg bygget et voltmeter til at måle højspændinger DC (0-90v) med relativ præcision og nøjagtighed ved hjælp af en Arduino Nano.

De testmålinger, jeg tog, var præcise nok, mest inden for 0,3 v af den faktiske spænding målt med et standard voltmeter (jeg brugte en Astro AI DM6000AR). Dette er tæt nok til min påtænkte brug af enheden.

For at arkivere dette brugte jeg en spændingsreference (4.096v) og spændingsdeler.

På kodesiden brugte jeg naturligvis indstillingen "ekstern reference" til Arduino Nano og "Smoothing" -eksemplet i Arduino -øvelserne.

Forbrugsvarer

1 x Arduino Nano - Link

1 x Oled Display (SSD 1306) - Link

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

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

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

1 x 4.096v LM4040DIZ -4.1 Spændingsreference - Link

Brødbræt og ledninger - Link

Astro AI DM6000AR - Link

USB Power Bank - Link

9V batterier - Link

CanadianWinters er deltager i Amazon Services LLC Associates Program, et affilieret annonceringsprogram designet til at give websteder mulighed for at tjene gebyrer ved at linke til Amazon.com og tilknyttede websteder. Ved at bruge disse links tjener jeg som Amazon Associate på kvalificerede køb, selvom du køber noget andet-og det vil ikke koste dig noget.

Trin 1: Skemaerne

Skemaerne
Skemaerne
Skemaerne
Skemaerne

Jeg forbandt alle delene i henhold til skemaerne ovenfor. Især valgte jeg 4.096 spændingsreferencen for at blive så tæt som muligt på 5v -mærket for at undgå at miste opløsning.

Efter databladet valgte jeg en 1K ohm modstand til spændingsreferencen, selvom en anden værdi kunne bruges. Spændingen til referencen leveres fra Nano 5v pin.

Tanken med kredsløbet er, at DC -spændingen, der skal måles, går gennem en spændingsmodstand. Den skalerede spænding og kommer derefter ind i den analoge pin på Arduino for at samples, udjævnes, skaleres igen og vises på OLed-displayet.

Jeg prøvede at holde tingene enkle:)

Trin 2: Kode- og modstandsberegningerne

Modstandens værdier blev valgt, da det er tilrådeligt (hvis jeg ikke tager fejl, er dette på Arduino/Atmega -databladet) for at holde impedansen under 10k ohm.

For at forenkle tingene lavede jeg et regneark, der automatiserer beregningerne, hvis du vil bruge forskellige modstandsværdier: Link til Google Sheet

Her er koden, jeg brugte til dette projekt:

#omfatte

#include U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2 (U8G2_R0); // (rotation, [reset]) flydespænding = 0; // bruges til at gemme spændingsværdi float Radjust = 0,043459459; // Spændingsdelingsfaktor (R2 /R1+R2) float vbat = 0; // slutspænding efter beregninger- spænding af batteriflåden Vref = 4.113; // Spændingsreference - målt reel værdi. Nominel værdi 4,096v const int numReadings = 50; // antal læseprøver - øg for mere udjævning. Fald for hurtigere læsning. int aflæsninger [numReadings]; // aflæsningerne fra den analoge indgang int readIndex = 0; // indekset for den aktuelle læsning usigneret lang total = 0; // det løbende samlede int -gennemsnit = 0; // variabler til opdatering af skærmen uden brug af forsinkelse unsigned long previousMillis = 0; // vil gemme sidste gang skærmen blev opdateret // konstanter ændres ikke: const langt interval = 50; // interval for opdatering af skærmen (millisekunder) hulrumsopsætning (tomrum) {analogReference (EXTERNAL); // brug AREF til referencespænding 4.096. Min reference reelle spænding er 4.113v u8g2.begin (); for (int thisReading = 0; thisReading = numReadings) {//… vikle rundt til begyndelsen: readIndex = 0; } // beregne gennemsnittet: gennemsnit = (total / numReadings); spænding = gennemsnit * (Vref / 1023.0); //4.113 er Vref vbat = spænding/Radjust; // Indstilling af forsinkelsen for skærmopdatering ved hjælp af Millis if (currentMillis - previousMillis> = interval) {// gem sidste gang skærmen blev opdateret previousMillis = currentMillis; u8g2.clearBuffer (); // ryd den interne menory // Pack Voltage display u8g2.setFont (u8g2_font_fub20_tr); // 20px skrifttype u8g2.setCursor (1, 20); u8g2.print (vbat, 2); u8g2.setFont (u8g2_font_8x13B_mr); // 10 px skrifttype u8g2.setCursor (76, 20); u8g2.print ("volt"); u8g2.setCursor (1, 40); u8g2.print ("CanadianWinters '"); u8g2.setCursor (1, 60); u8g2.print ("Præcis spænding"); } u8g2.sendBuffer (); // overfør intern hukommelse til displayforsinkelsen (1); }

Bemærk, at jeg er lidt rusten med Arduino -kodning, så hvis du finder en fejl eller en måde at forbedre koden, er jeg åben for forslag:)

Trin 3: Lad os teste det

Lad os teste det!
Lad os teste det!
Lad os teste det!
Lad os teste det!
Lad os teste det!
Lad os teste det!

For at teste dette voltmeter brugte jeg 8x 9v batterier, som jeg fik i en lokal butik. Jeg planlægger at bruge dette voltmeter til at måle spændingen på mine elektriske cykler batteripakker (de har spændinger fra 24-60v med lejlighedsvis 72v).

Når elektronikken er pakket ind i et printkort og en lille æske, vil dette være en flot og bærbar batteripakemåler. Grafikken og skrifttyperne på OLED kan tilpasses dine behov (f.eks. Større skrifttype til let læsning).

Mit mål var at have en spændingsaflæsning på Oled/Arduino -måleren ikke for langt fra mit Digital Multi Meter. Jeg sigtede mod +/- 0, 3v max delta. Som du kan se fra videoen, kunne jeg arkivere dette undtagen i den øverste ende af målingerne.

Jeg håber, at du nød denne instruks og lad mig vide dine tanker!

Anbefalede: