Bluetooth voltmeter basert på arduino. Digital voltmeter på Arduino med tilkobling til PC via en seriell port Arduino voltmeter med datautgang til datamaskin

Multifunksjonelle Arduino-enheter er av stor interesse for fans av hjemmelagde elektronisk programmerbare enheter, slik at de kan bringe interessante ideer til live.

Hovedfordelen med ferdige Arduino-kretser er det unike blokkmodulære prinsippet: hvert kort kan legges til med ekstra grensesnitt, noe som uendelig utvider mulighetene for å lage forskjellige prosjekter.

Arduino-moduler er bygget på en universell mikrokontroller med egen bootloader, som gjør det enkelt å flashe den med nødvendig programkode, uten bruk av ekstra enheter. Programmering utføres i standard C++-språk.

Et av de enkleste eksemplene på bruk av Arduino kan være implementeringen, basert på denne sammenstillingen, av et høypresisjons DC-voltmeter med et måleområde fra 0 til 30 V.

Arduino analoge innganger er designet for en konstant spenning på ikke mer enn fem volt, derfor er det mulig å bruke dem ved spenninger som overstiger denne verdien med en spenningsdeler.


Tilkoblingsskjema av Areduino via spenningsdeler

En spenningsdeler består av to motstander koblet i serie. Det beregnes ved hjelp av formelen:

Ekstern USB-kontakt i bilradio

Et nyttig diagram presenteres for de som liker å eksperimentere med Arduino. Dette er et enkelt digitalt voltmeter som pålitelig kan måle likespenning i området 0 - 30V. Arduino-kortet kan som vanlig drives av et 9V-batteri.

Som du sikkert vet, kan Arduinos analoge innganger brukes til å måle likespenning i området 0 - 5V og dette området kan økes,
bruker to motstander som spenningsdeler. Deleren vil redusere den målte spenningen til nivået til Arduino analoge innganger. Og så vil programmet beregne den virkelige spenningsverdien.

Den analoge sensoren på Arduino-kortet oppdager tilstedeværelsen av spenning ved den analoge inngangen og konverterer den til digital form for videre behandling av mikrokontrolleren. På figuren tilføres spenning til den analoge inngangen (A0) gjennom en enkel spenningsdeler bestående av motstander R1 (100 kOhm) og R2 (10 kOhm).

Med disse deleverdiene kan Arduino-kortet forsynes med spenning fra 0 til
55V. På inngang A0 har vi den målte spenningen delt på 11, dvs. 55V / 11=5V. Med andre ord, når vi måler 55V på Arduino-inngangen, har vi en maksimal tillatt verdi på 5V. I praksis er det bedre å skrive området "0 - 30V" på dette voltmeteret slik at det forblir
Sikkerhetsmargin!

Notater

Hvis displayavlesningene ikke sammenfaller med avlesningene til et industrielt (laboratorie) voltmeter, er det nødvendig å måle verdien av motstandene R1 og R2 med et nøyaktig instrument og sette inn disse verdiene i stedet for R1=100000.0 og R2=10000.0 i programkoden. Deretter bør du måle den virkelige spenningen mellom 5V- og "Ground"-pinnene på Arduino-kortet med et laboratorievoltmeter. Resultatet vil være en verdi mindre enn 5V, for eksempel vil det være 4,95V. Denne virkelige verdien bør settes inn i kodelinjen
vout = (verdi * 5,0) / 1024,0 i stedet for 5,0.
Prøv også å bruke presisjonsmotstander med 1 % toleranse.

Motstander R1 og R2 gir en viss beskyttelse mot økte inngangsspenninger, men husk at enhver spenning over 55V kan skade Arduino-kortet. I tillegg gir ikke denne utformingen andre typer beskyttelse (mot spenningsstøt, polaritetsreversering eller overspenning).

Digitalt voltmeterprogram

/*
DC voltmeter
En Arduino DVM basert på spenningsdelerkonsept
T.K.Hareendran
*/
#inkludere
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int analogInput = 0;
float vout = 0,0;
float vin = 0,0;
flyte R1 = 100000,0; // motstand på R1 (100K) -se tekst!
flyte R2 = 10000,0; // motstand på R2 (10K) – se tekst!
int verdi = 0;
ugyldig oppsett())(
pinMode(analogInput, INPUT);
lcd.begin(16, 2);
lcd.print(“DC VOLTMETER”);
}
void loop()
// les verdien ved analog inngang
verdi = analogLes(analoginngang);
vout = (verdi * 5,0) / 1024,0; // se tekst
vin = vout / (R2/(R1+R2));
hvis (vin<0.09) {
vin=0.0;//utsagn for å oppheve uønsket lesing!
}
lcd.setCursor(0, 1);
lcd.print(“INPUT V= “);
lcd.print(vin);
forsinkelse(500);
}

Skjematisk diagram av Arduino-voltmeter

Liste over komponenter

Arduino Uno-brett
100 kOhm motstand
10 kOhm motstand
100 ohm motstand
10kOhm trimmermotstand
LCD-skjerm 16?2 (Hitachi HD44780)

Skjematisk diagram av et hjemmelaget bipolar voltmeter på Arduino Uno og med en 1602A-skjerm. I artikkelen «Dobbelt voltmeter på ARDUINO UNO» (L.1) foreslo forfatteren en beskrivelse av voltmeteret og et program for samtidig måling og indikasjon av to konstante spenninger. Noe som er veldig praktisk hvis du samtidig skal måle to konstante spenninger og sammenligne dem.

Dette kan være nødvendig for eksempel ved reparasjon eller oppsett av en likespenningsstabilisator for å måle spenningen ved inngang og utgang, eller i andre tilfeller.

Imidlertid er det kretser med bipolar strømforsyning, når spenningen på et tidspunkt i kretsen i forhold til den vanlige "null" kan være enten positiv eller negativ.

Skjematisk diagram

Her beskriver vi modifikasjonen av kretsen og programmet slik at enheten kan måle og indikere både positiv og negativ spenning.

Til å begynne med leveres de målte spenningene til to analoge innganger A1 og A2. Det er totalt seks analoge innganger, A0-A5, du kan velge to av dem. I dette tilfellet er A1 og A2 valgt. Spenningen på analoge porter kan bare være positiv og bare i området fra null til mikrokontrollerens forsyningsspenning, det vil si nominelt opptil 5V.

Utgangen fra den analoge porten konverteres til digital form av mikrokontrollerens ADC. For å få resultatet i voltenheter, må du multiplisere det med 5 (med referansespenningen, det vil si med forsyningsspenningen til mikrokontrolleren) og dele med 1024.

Ris. 1. Skjematisk diagram av et bipolart voltmeter på Arduino Uno og 1602A.

For å kunne måle spenninger større enn 5V, eller rettere sagt, større enn forsyningsspenningen til mikrokontrolleren, fordi den faktiske spenningen ved utgangen av 5-volts stabilisatoren på ARDUINO UNO-kortet kan avvike fra 5V, og vanligvis en litt lavere, må du bruke konvensjonelle resistive skillelinjer ved inngangen.

Her er dette spenningsdelere over motstandene R1, R3 og R2, R4. Men hva om spenningen må måles mindre enn null? I dette tilfellet er det bare én vei ut av situasjonen - å heve nivået på inngangen null. Ideelt sett trenger du halve forsyningsspenningen, det vil si opptil 2,5V. I dette tilfellet vil 2,5V-data bli lagt til inngangsspenningen.

Deretter, programmatisk, trekker du ganske enkelt denne spenningen fra den målte. Men dette vil kreve en ekstra kilde til denne spenningen. I prinsippet er dette ikke vanskelig å gjøre, men det finnes en enklere løsning.

I tillegg til 5V spenningsstabilisatoren har ARDUINO UNO-kortet en 3,3V spenningskilde. Så det kan brukes som et "virtuelt null" for inngang.

Endringer i kretsen er synlige i figur 1. Sammenlignet med det første alternativet, er inngangen "null" ganske enkelt omorganisert fra den vanlige null til +Z.ZV-kilden. Derfor, når inngangsspenningen er positiv, er den ved inngangen mer enn 3,3V (men ikke mer enn 5V - dette er den øvre grensen for målingen), og når den er negativ - mindre enn 3,3V (men ikke mindre enn OV - dette er den nedre grense for måling).

En økning i målegrensene (modulo) oppnås av en resistiv deler, og indikasjonen av den faktiske inngangsspenningen tilført til X2 og X3 oppnås ved programvaresubtraksjon av en verdi på 3,3V fra spenningen ved mikrokontrollerinngangene.

Programmet er vist i tabell 1. Dette kan sees i linjene:

volt=(vout*5,0/1024,0-3,3)/0,048 ;

voltl=(voutl*5,0/1024,0-3,3)/0,048;

Tallet 3.3 er nøyaktig denne spenningen til den "virtuelle null"-inngangen.

På disse linjene er tallet 5.0 spenningen ved utgangen til stabilisatoren til ARDUINO UNO-kortet. Ideelt sett bør det være 5V, men for at voltmeteret skal fungere nøyaktig, må denne spenningen først måles. Koble til strømkilden og mål +5V spenningen ved POWER-kontakten på brettet med et ganske nøyaktig voltmeter.

Hva som skjer, så skriv inn disse linjene i stedet for 5.0. Det samme gjelder spenningen +3.3V - det må måles på kortkontakten, fordi det faktisk kan avvike litt fra 3.3V. For eksempel, hvis "5V" faktisk er 4,85V og "3,3V" faktisk er 3,32V, vil linjene se slik ut:

volt=(vout*4,85/1024,0-3,32)/0,048;

voltl=(voutl*4,85/1024,0-3,32)/0,048;

På neste trinn må du måle de faktiske motstandene til motstandene R1-R4 og bestemme K-koeffisientene (angitt som 0,048) for disse linjene ved å bruke formlene:

K1 = R3 / (R1+R3) og K2 = R4 / (R2+R4)

La oss si K1 = 0,046 og K2 = 0,051, så vi skriver:

volt=(vout*4,85/1024,0-3,32)/0,046;

voltl=(voutl*4,85/1024,0-3,32)/0,051;

Det må derfor gjøres endringer i programteksten i henhold til den faktiske spenningen ved utgangen av 5-volts- og 3,3-volts-stabilisatorene til ARDUINO UNO-kortet, og i henhold til de faktiske delingskoeffisientene til resistive delere.

Etter dette vil enheten fungere nøyaktig og vil ikke kreve noen justering eller kalibrering. Ved måling av negativ spenning på LCD-indikatoren vil det være et minustegn foran spenningsverdien i den tilsvarende linjen. Ved måling av positiv spenning er det ingen tegn.

Ved å endre divisjonskoeffisientene til resistive delere (og følgelig "K"-koeffisientene), kan du lage andre målegrenser, og ikke nødvendigvis de samme for begge inngangene.

Jeg vil minne deg på at H1 type 1602A flytende krystall displaymodul er koblet til de digitale portene D2-D7 på ARDUINO UNO-kortet. LCD-indikatoren drives av en 5V spenningsstabilisator plassert på 5V spenningsstabilisatorkortet.

For at indikatoren skal samhandle med ARDUINO UNO, må du laste inn en subrutine i programmet for å kontrollere den. Slike rutiner kalles "biblioteker", og det er mange forskjellige "biblioteker" i programvarepakken ARDUINO UNO. For å jobbe med en LCD-indikator basert på HD44780 trenger du LiquidCrystal-biblioteket. Derfor begynner programmet (tabell 1) med å laste inn dette biblioteket:

Denne linjen gir kommandoen for å laste dette biblioteket inn i ARDUINO UNO. Deretter må du tilordne ARDUINO UNO-porter som fungerer med LCD-indikatoren. Jeg valgte portene D2 til D7. Du kan velge andre. Disse portene er tilordnet av linjen:

LiquidCrystal led(2, 3, 4, 5, 6, 7);

Deretter fortsetter programmet til den faktiske driften av voltmeteret.

Karavkin V. RK-06-17.

Litteratur: 1. Karavkin V. - Dobbelt voltmeter på ARDUINO UNO. RK-01-17.

Idé

Idé enheter for måling av spenning, strøm, kapasitet, utladning og kanskje ladning oppsto for lenge siden og ikke bare for meg. Du kan finne mange leker kalt USB Tester (Doctor) for å teste ulike USB-enheter. Jeg er interessert i en noe mer universell enhet, uavhengig av grensesnittet, men ganske enkelt designet for visse spenninger og strømmer. For eksempel 0 - 20.00v, 0 - 5.00a, 0 - 99.99Ah. Når det gjelder funksjoner, ser jeg det slik

  • Viser strømspenning og strøm, det vil si en volt-amperemåler. I prinsippet kan du umiddelbart reflektere kraften.
  • Telling og visning av akkumulert kapasitet. I amperetimer og mest sannsynlig i watttimer.
  • Visning av prosesstid
  • Og mest sannsynlig justerbare nedre og øvre spenningsgrenser (utladnings- og ladegrenser)

Utvikling

For å gjennomføre beregninger og målinger trenger vi en kontroller. Jeg husket denne ideen som en del av mitt bekjentskap med Arduino, så kontrolleren vil være en enkel populær Atmega328 og den vil bli programmert i miljøet Arduino. Fra et ingeniørmessig synspunkt er nok ikke valget det beste – kontrolleren er litt feit for oppgaven, og dens ADC kan ikke kalles måling, men... vi prøver.

  • Vi vil ikke lodde mye i dette prosjektet. Som grunnlag tar vi en ferdig Arduino Pro Mini-modul, siden kineserne er klare til å levere dem for 1,5 dollar i detaljhandel.
  • Skjermenheten vil være en 1602-skjerm - ytterligere $1,5. Jeg har et alternativ med en I2C-grensesnittmodul, men i dette prosjektet er det egentlig ikke nødvendig ($0,7).
  • For utvikling trenger vi et brødbrett. I mitt tilfelle er dette et lite BreadBoard for $1.
  • Selvfølgelig trenger du ledninger og en rekke motstander av forskjellige verdier. For en 1602-skjerm uten I2C må du også velge kontrast - dette gjøres med en variabel motstand på 2 - 20 kOhm.
  • For å implementere et amperemeter trenger du en shunt. Til en første tilnærming kan det være en 0,1 Ohm, 5 W motstand.
  • For å implementere automatisk avstengning trenger du et relé med kontakter designet for enhetens maksimale strøm og en spenning lik forsyningsspenningen. For å styre releet trenger du en NPN-transistor og en beskyttelsesdiode.
  • Enheten vil få strøm fra en ekstern strømkilde, åpenbart minst 5 V. Hvis strømforsyningen varierer mye, vil det også være nødvendig med en integrert stabilisator type 7805 - den vil bestemme reléspenningen.
  • Når Arduino Pro Mini krever en USB-TTL-konverter for å laste opp fastvaren.
  • For oppsett trenger du et multimeter.

Voltmeter

Jeg implementerer et enkelt voltmeter med ett område på omtrent 0 - 20V. Denne merknaden er viktig fordi ADC-en til kontrolleren vår har en 10-bits kapasitet (1024 diskrete verdier), så feilen vil være minst 0,02 V (20 / 1024). For å implementere maskinvaren trenger vi en analog inngang til kontrolleren, en deler laget av et par motstander og en slags utgang (en skjerm i den ferdige versjonen, en seriell port kan brukes til feilsøking).

Prinsippet for ADC-måling er å sammenligne spenningen ved den analoge inngangen med referansen VRef. ADC-utgangen er alltid heltall - 0 tilsvarer 0V, 1023 tilsvarer spenningen VRef. Målingen implementeres ved en serie sekvensielle spenningsavlesninger og gjennomsnittsberegning over perioden mellom oppdateringer av verdien på skjermen. Valget av referansespenning er viktig fordi den er standard til forsyningsspenningen, som kanskje ikke er stabil. Dette passer ikke oss i det hele tatt - vi vil ta utgangspunkt i en stabil intern referansekilde med en spenning på 1,1V, initialisere den ved å kalle analogReference(INTERNAL). Vi vil deretter kalibrere verdien ved hjelp av multimeteravlesningene.

Diagrammet til venstre viser en variant med direkte styring av displayet (det styres enkelt - se standard LiquidCrystal\HelloWorld skissen). Til høyre er I2C-alternativet, som jeg vil bruke videre. I2C lar deg spare på ledninger (hvorav det er 10 i den vanlige versjonen, ikke medregnet bakgrunnsbelysningen). Men dette krever en ekstra modul og mer kompleks initialisering. I alle fall må visningen av tegn på modulen først kontrolleres og kontrasten justeres - for å gjøre dette trenger du bare å vise hvilken som helst tekst etter initialisering. Kontrasten justeres av motstand R1, eller en lignende motstand til I2C-modulen.

Inngangen er en 1:19 deler, som lar deg få en maksimal spenning på ca 20V ved Vref = 1,1 (vanligvis er en kondensator + en zenerdiode plassert parallelt med inngangen for beskyttelse, men dette er ikke viktig for oss foreløpig ). Motstander har en spredning, og det har også referanse Vref til kontrolleren, så etter montering må vi måle spenningen (minst forsyningen) parallelt med enheten vår og et referansemultimeter og velge Vref i koden til avlesningene stemmer. Det er også verdt å merke seg at enhver ADC har en null offsetspenning (som ødelegger avlesningene i begynnelsen av området), men vi vil ikke gå inn på det foreløpig.

Det vil også være viktig å skille forsynings- og målegrunn. Vår ADC har en oppløsning litt dårligere enn 1mV, noe som kan skape problemer hvis ledningene er feil, spesielt på en breadboard. Siden oppsettet av modulkortet allerede er gjort og vi bare trenger å velge pinnene. Modulen har flere "jording" pinner, så vi må sørge for at strøm kommer inn i modulen gjennom den ene "jorden", og målinger gjennom den andre. Faktisk, for å gjøre endringer, bruker jeg alltid jordpinnen nærmest de analoge inngangene.

For å kontrollere I2C brukes en versjon av LiquidCrystal_I2C-biblioteket - i mitt tilfelle er den spesifikke pinouten til I2C-modulen indikert (kineserne produserer moduler med forskjellige kontroller). Jeg legger også merke til at I2C i Arduino krever bruk av pinner A4 og A5 - på Pro Mini-kortet er de ikke plassert på kanten, noe som er upraktisk for prototyping på BreadBoard.

Kilde

#inkludere #inkludere // Enkelt voltmeter med i2c-skjerm 1602. V 16.11 // Innstillinger for i2c-skjerm 1602 med ikke-standard pinout #define LCD_I2C_ADDR 0x27 #define BACKLIGHT 3 #define LCD_EN 2 #define LCD_RW 1 #define LCD_RW 1 #define LCD #_D4_D LCD 5 #define LCD_D6 6 #define LCD_D7 7 LiquidCrystal_I2C lcd(LCD_I2C_ADDR,LCD_EN,LCD_RW,LCD_RS,LCD_D4,LCD_D5,LCD_D6,LCD_D7); // Lese oppdateringstid, ms (200-2000) #define REFRESH_TIME 330 // Analog inngang #define PIN_VOLT A0 // Intern referansespenning (velg) const float VRef = 1.10; // Inngangsresistiv delerkoeffisient (Rh + Rl) / Rl. I<-[ Rh ]--(analogInPin)--[ Rl ]--|GND const float VoltMult = (180.0 + 10.0) / 10.0; float InVolt, Volt; void setup() { analogReference(INTERNAL); // Инициализация дисплея lcd.begin (16, 2); lcd.setBacklightPin(BACKLIGHT, POSITIVE); lcd.setBacklight(HIGH); // включить подсветку lcd.clear(); // очистить дисплей lcd.print("Voltage"); } void loop() { unsigned long CalcStart = millis(); int ReadCnt = 0; InVolt = 0; // Чтение из порта с усреднением while ((millis() - CalcStart) < REFRESH_TIME) { InVolt += analogRead(PIN_VOLT); ReadCnt++; } InVolt = InVolt / ReadCnt; // Смещение 0 для конкретного ADC (подобрать или отключить) if (InVolt >0,2) InVolt += 3; // Konverter til volt (Verdi: 0..1023 -> (0..VRef) skalert av Mult) Volt = InVolt * VoltMult * VRef / 1023; // Utdata lcd.setCursor (0, 1); lcd.print(Volt); lcd.print("V"); )

Denne artikkelen gir et interessant diagram for de som liker å eksperimentere og Arduino. Den har et enkelt digitalt voltmeter som trygt kan måle likespenning mellom 0 og 30 V. Selve Arduino-kortet kan drives av en standard 9 V-forsyning.



Som du vet, ved å bruke den analoge Arduino-inngangen kan du måle spenning fra 0 til 5 V (med en standard referansespenning på 5 V). Men dette området kan utvides ved å bruke en spenningsdeler.


Deleren reduserer den målte spenningen til et nivå som er akseptabelt for den analoge inngangen. Deretter beregner spesialskrevet kode den faktiske spenningen.



Den analoge sensoren i Arduino registrerer spenningen ved den analoge inngangen og konverterer den til et digitalt format som kan leses av mikrokontrolleren. Vi kobler en spenningsdeler dannet av motstandene R1 (100K) og R2 (10K) til analog inngang A0. Med disse motstandsverdiene kan opptil 55 V tilføres Arduino, siden delingskoeffisienten i dette tilfellet er 11, så 55V/11 = 5V. For å være sikker på at målingene er trygge for brettet, er det bedre å måle spenning i området fra 0 til 30 V.



Hvis displayavlesningene ikke samsvarer med de bekreftede voltmeteravlesningene, bruk et digitalt presisjonsmultimeter for å finne de nøyaktige verdiene til R1 og R2. I dette tilfellet må du i koden erstatte R1=100000.0 og R2=10000.0 med dine egne verdier. Da bør du sjekke strømforsyningen ved å måle spenningen på brettet mellom 5V og GND. Spenningen kan være 4,95 V. Da må du i koden vout = (verdi * 5,0) / 1024,0 erstatte 5,0 med 4,95. Det anbefales å bruke presisjonsmotstander med en feil på ikke mer enn 1%. Husk at spenning over 55V kan skade Arduino-kortet!



#inkludere LiquidCrystal lcd(7, 8, 9, 10, 11, 12); int analogInput = 0; float vout = 0,0; float vin = 0,0; flyte R1 = 100000,0; // motstand R1 (100K) float R2 = 10000,0; // motstand R2 (10K) int verdi = 0; void setup())( pinMode(analogInput, INPUT); lcd.begin(16, 2); lcd.print("DC VOLTMETER"); ) void loop())( // les den analoge verdien = analogRead(analogInput ); vout = (verdi * 5,0) / 1024,0; vin = vout / (R2/(R1+R2)); if (vin<0.09) { vin=0.0;// обнуляем нежелательное значение } lcd.setCursor(0, 1); lcd.print("INPUT V= "); lcd.print(vin); delay(500); }


Elementer som brukes:


Arduino Uno-brett
Motstand 100 KOhm
Motstand 10 KOhm
100 ohm motstand
Potensiometer 10 KOhm
LCD-skjerm 16×2