Bluetooth voltmeter baserad på arduino. Digital voltmeter på Arduino med anslutning till en PC via en seriell port Arduino voltmeter med datautgång till en dator

Multifunktionella Arduino-enheter är av stort intresse för fans av hemgjorda elektroniskt programmerbara enheter, vilket gör att de kan förverkliga intressanta idéer.

Den största fördelen med färdiga Arduino-kretsar är den unika blockmodulära principen: varje kort kan läggas till med ytterligare gränssnitt, vilket oändligt utökar möjligheterna att skapa olika projekt.

Arduino-modulerär byggda på en universell mikrokontroller med egen bootloader, vilket gör det enkelt att flasha den med den nödvändiga programkoden, utan användning av ytterligare enheter. Programmering utförs i standardspråket C++.

Ett av de enklaste exemplen på att använda Arduino kan vara implementeringen, baserat på denna sammansättning, av en högprecisions DC-voltmeter med ett mätområde från 0 till 30 V.

Arduino analoga ingångar är designade för en konstant spänning på högst fem volt, därför är det möjligt att använda dem vid spänningar som överstiger detta värde med en spänningsdelare.


Kopplingsschema för Areduino via spänningsdelare

En spänningsdelare består av två resistanser kopplade i serie. Det beräknas med formeln:

Extern USB-kontakt i bilradio

Ett användbart diagram presenteras för dem som gillar att experimentera med Arduino. Detta är en enkel digital voltmeter som på ett tillförlitligt sätt kan mäta DC-spänning i området 0 - 30V. Arduino-kortet kan som vanligt drivas av ett 9V-batteri.

Som du säkert vet kan Arduinos analoga ingångar användas för att mäta DC-spänning i intervallet 0 - 5V och detta intervall kan ökas,
använder två motstånd som spänningsdelare. Avdelaren kommer att minska den uppmätta spänningen till nivån för Arduinos analoga ingångar. Och sedan kommer programmet att beräkna det verkliga spänningsvärdet.

Den analoga sensorn på Arduino-kortet känner av närvaron av spänning vid den analoga ingången och omvandlar den till digital form för vidare bearbetning av mikrokontrollern. I figuren tillförs spänning till den analoga ingången (A0) genom en enkel spänningsdelare bestående av motstånd R1 (100 kOhm) och R2 (10 kOhm).

Med dessa delarvärden kan Arduino-kortet förses med spänning från 0 till
55V. På ingång A0 har vi den uppmätta spänningen dividerad med 11, dvs 55V / 11=5V. Med andra ord, när vi mäter 55V vid Arduino-ingången har vi ett maximalt tillåtet värde på 5V. I praktiken är det bättre att skriva intervallet "0 - 30V" på denna voltmeter så att den förblir
Säkerhetsmarginal!

Anteckningar

Om displayavläsningarna inte sammanfaller med avläsningarna från en industriell (laboratorie) voltmeter, är det nödvändigt att mäta värdet på motstånden R1 och R2 med ett exakt instrument och infoga dessa värden istället för R1=100000.0 och R2=10000.0 i programkoden. Sedan bör du mäta den verkliga spänningen mellan 5V- och "Jord"-stiften på Arduino-kortet med en laboratorievoltmeter. Resultatet blir ett värde mindre än 5V, till exempel blir det 4,95V. Detta verkliga värde ska infogas i kodraden
vout = (värde * 5,0) / 1024,0 istället för 5,0.
Försök också använda precisionsmotstånd med 1 % tolerans.

Motstånd R1 och R2 ger ett visst skydd mot ökade inspänningar, men kom ihåg att alla spänningar över 55V kan skada Arduino-kortet. Dessutom ger denna design inte andra typer av skydd (mot spänningsöverspänningar, polaritetsomkastning eller överspänning).

Program för digital voltmeter

/*
DC voltmeter
En Arduino DVM baserad på spänningsdelarkoncept
T.K.Hareendran
*/
#omfatta
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int analogInput = 0;
float vout = 0,0;
float vin = 0,0;
float R1 = 100000,0; // motstånd på R1 (100K) -se text!
flottör R2 = 10000,0; // motstånd på R2 (10K) – se text!
int värde = 0;
void setup())(
pinMode(analogInput, INPUT);
lcd.begin(16, 2);
lcd.print(“DC VOLTMETER”);
}
void loop()
// läs värdet på analog ingång
värde = analogRead(analogInput);
vout = (värde * 5,0) / 1024,0; // se text
vin = vout/(R2/(Rl+R2));
om (vin<0.09) {
vin=0.0;//påstående för att upphäva oönskad läsning!
}
lcd.setCursor(0, 1);
lcd.print(“INPUT V= “);
lcd.print(vin);
fördröjning(500);
}

Schematiskt diagram av Arduino-voltmeter

Lista över komponenter

Arduino Uno-bräda
100 kOhm motstånd
10 kOhm motstånd
100 ohm motstånd
10kOhm trimmermotstånd
LCD-skärm 16?2 (Hitachi HD44780)

Schematisk bild av en hemmagjord bipolär voltmeter på Arduino Uno och med en 1602A display. I artikeln "Dubbel voltmeter på ARDUINO UNO" (L.1) föreslog författaren en beskrivning av voltmetern och ett program för samtidig mätning och indikering av två konstanta spänningar. Vilket är väldigt bekvämt om du samtidigt behöver mäta två konstanta spänningar och jämföra dem.

Detta kan krävas till exempel vid reparation eller installation av en DC-spänningsstabilisator för att mäta spänningen vid dess ingång och utgång, eller i andra fall.

Det finns dock kretsar med bipolär strömförsörjning, när spänningen vid någon punkt i kretsen i förhållande till den vanliga "nollan" kan vara antingen positiv eller negativ.

Schematiskt diagram

Här beskriver vi modifieringen av kretsen och programmet så att enheten kan mäta och indikera både positiv och negativ spänning.

Till att börja med matas de uppmätta spänningarna till två analoga ingångar A1 och A2. Det finns sex analoga ingångar totalt, A0-A5, du kan välja två av dem. I detta fall är A1 och A2 valda. Spänningen på analoga portar kan bara vara positiv och endast i intervallet från noll till mikrokontrollerns matningsspänning, det vill säga nominellt upp till 5V.

Utsignalen från den analoga porten omvandlas till digital form av mikrokontrollerns ADC. För att få resultatet i voltenheter måste du multiplicera det med 5 (med referensspänningen, det vill säga med mikrokontrollerns matningsspänning) och dividera med 1024.

Ris. 1. Schematisk bild av en bipolär voltmeter på Arduino Uno och 1602A.

För att kunna mäta spänningar större än 5V, eller snarare, större än mikrokontrollerns matningsspänning, eftersom den faktiska spänningen vid utgången av 5-voltsstabilisatorn på ARDUINO UNO-kortet kan skilja sig från 5V, och vanligtvis en lite lägre måste du använda konventionella resistiva delare vid ingången.

Här är dessa spänningsdelare över motstånden R1, R3 och R2, R4. Men vad händer om spänningen måste mätas mindre än noll? I det här fallet finns det bara en väg ut ur situationen - att höja nivån på ingångsnoll. Helst behöver du halva matningsspänningen, det vill säga upp till 2,5V. I detta fall kommer 2,5V-data att läggas till ingångsspänningen.

Sedan, programmatiskt, subtraherar du helt enkelt denna spänning från den uppmätta. Men detta kommer att kräva en extra källa för denna spänning. I princip är detta inte svårt att göra, men det finns en enklare lösning.

Förutom 5V-spänningsstabilisatorn har ARDUINO UNO-kortet en 3,3V-spänningskälla. Så den kan användas som en "virtuell nolla" för inträde.

Förändringar i kretsen är synliga i figur 1. Jämfört med det första alternativet är ingången "noll" helt enkelt omordnad från den gemensamma nollan till +Z.ZV-källan. Därför, när ingångsspänningen är positiv, är den vid ingången mer än 3,3V (men inte mer än 5V - detta är den övre gränsen för mätning), och när den är negativ - mindre än 3,3V (men inte mindre än OV - detta är den nedre gränsen för mätning).

En ökning av mätgränserna (modulo) uppnås av en resistiv delare, och indikeringen av den faktiska inspänningen som tillförs X2 och X3 uppnås genom mjukvarusubtraktion av ett värde på 3,3V från spänningen vid mikrokontrollerns ingångar.

Programmet visas i tabell 1. Detta kan ses på raderna:

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

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

Siffran 3,3 är exakt denna spänning för ingången "virtuell noll".

På dessa rader är siffran 5.0 spänningen vid utgången av stabilisatorn på ARDUINO UNO-kortet. Helst ska det vara 5V, men för att voltmetern ska fungera korrekt måste denna spänning först mätas. Anslut strömkällan och mät +5V-spänningen vid POWER-kontakten på kortet med en ganska exakt voltmeter.

Vad som händer, skriv sedan in i dessa rader istället för 5.0. Detsamma gäller spänningen +3.3V - det måste mätas vid kortkontakten, eftersom det faktiskt kan skilja sig något från 3.3V. Till exempel, om "5V" faktiskt är 4,85V och "3,3V" faktiskt är 3,32V skulle linjerna se ut så här:

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

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

I nästa steg måste du mäta de faktiska motstånden för motstånden R1-R4 och bestämma K-koefficienterna (indikerade som 0,048) för dessa linjer med hjälp av formlerna:

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

Låt oss säga att K1 = 0,046 och 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;

Således måste ändringar göras i programtexten enligt den faktiska spänningen vid utgången av 5-volts- och 3,3-volts-stabilisatorerna på ARDUINO UNO-kortet, och enligt de faktiska delningskoefficienterna för resistiva delare.

Efter detta kommer enheten att fungera korrekt och kommer inte att kräva någon justering eller kalibrering. Vid mätning av en negativ spänning på LCD-indikatorn kommer det att finnas ett minustecken framför spänningsvärdet i motsvarande rad. Vid mätning av positiv spänning finns inget tecken.

Genom att ändra divisionskoefficienterna för de resistiva dividerarna (och följaktligen "K"-koefficienterna) kan du göra andra mätgränser, och inte nödvändigtvis samma för båda ingångarna.

Jag skulle vilja påminna dig om att H1 typ 1602A displaymodul med flytande kristaller är ansluten till de digitala portarna D2-D7 på ARDUINO UNO-kortet. LCD-indikatorn drivs av en 5V spänningsstabilisator placerad på 5V spänningsstabilisatorkortet.

För att indikatorn ska interagera med ARDUINO UNO måste du ladda en subrutin i programmet för att styra den. Sådana rutiner kallas "bibliotek", och det finns många olika "bibliotek" i ARDUINO UNO-programsviten. För att arbeta med en LCD-indikator baserad på HD44780 behöver du LiquidCrystal-biblioteket. Därför börjar programmet (tabell 1) med att ladda det här biblioteket:

Den här raden ger kommandot för att ladda detta bibliotek till ARDUINO UNO. Sedan måste du tilldela ARDUINO UNO-portar som fungerar med LCD-indikatorn. Jag valde portarna D2 till D7. Du kan välja andra. Dessa portar tilldelas av linjen:

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

Därefter fortsätter programmet till den faktiska driften av voltmetern.

Karavkin V. RK-06-17.

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

Aning

Aning apparater för att mäta spänning, ström, kapacitet, urladdning och kanske laddning uppstod för länge sedan och inte bara för mig. Du kan hitta många leksaker som kallas USB Tester (Doctor) för att testa olika USB-enheter. Jag är intresserad av en något mer universell enhet, oberoende av gränssnittet, men helt enkelt designad för vissa spänningar och strömmar. Till exempel, 0 - 20.00v, 0 - 5.00a, 0 - 99.99Ah. När det gäller funktioner ser jag det så här

  • Visar aktuell spänning och ström, det vill säga en volt-amperemätare. I princip kan du direkt spegla kraften.
  • Räkna och visa ackumulerad kapacitet. I amperetimmar och troligen i wattimmar.
  • Visning av processtid
  • Och troligen justerbara nedre och övre trösklar för spänningsavbrott (urladdnings- och laddningsgränser)

Utveckling

För att genomföra beräkningar och mätningar behöver vi en regulator. Jag kom ihåg den här idén som en del av min bekantskap med Arduino, så kontrollern kommer att vara en enkel populär Atmega328 och den kommer att programmeras i miljön Arduino. Ur ingenjörssynpunkt är valet förmodligen inte det bästa - kontrollern är lite fet för uppgiften, och dess ADC kan inte kallas mätning, men... vi ska försöka.

  • Vi kommer inte att löda mycket i det här projektet. Som grund kommer vi att ta en färdig Arduino Pro Mini-modul, eftersom kineserna är redo att leverera dem för 1,5 dollar i detaljhandeln.
  • Displayenheten kommer att vara en 1602-skärm - ytterligare $1,5. Jag har ett alternativ med en I2C-gränssnittsmodul, men i det här projektet behövs det inte riktigt ($0,7).
  • För utveckling behöver vi en brödbräda. I mitt fall är detta en liten BreadBoard för $1.
  • Naturligtvis kommer du att behöva ledningar och ett antal motstånd av olika värden. För en 1602-skärm utan I2C behöver du även välja kontrast - detta görs med ett variabelt motstånd på 2 - 20 kOhm.
  • För att implementera en amperemeter behöver du en shunt. Till en första uppskattning kan det vara ett 0,1 Ohm, 5 W motstånd.
  • För att implementera automatisk avstängning behöver du ett relä med kontakter utformade för enhetens maximala ström och en spänning lika med matningsspänningen. För att styra reläet behöver du en NPN-transistor och en skyddsdiod.
  • Enheten kommer att drivas från en extern strömkälla, uppenbarligen minst 5 V. Om strömförsörjningen varierar mycket, kommer en integrerad stabilisator typ 7805 också att krävas - den kommer att bestämma reläspänningen.
  • När Arduino Pro Mini kräver en USB-TTL-omvandlare för att ladda upp firmware.
  • För installationen behöver du en multimeter.

Voltmeter

Jag implementerar en enkel voltmeter med ett område på cirka 0 - 20V. Den här anmärkningen är viktig eftersom ADC för vår styrenhet har en 10-bitars kapacitet (1024 diskreta värden), så felet kommer att vara minst 0,02 V (20 / 1024). För att implementera hårdvaran behöver vi en analog ingång på styrenheten, en avdelare gjord av ett par motstånd och någon form av utgång (en display i den färdiga versionen, en serieport kan användas för felsökning).

Principen för ADC-mätning är att jämföra spänningen vid den analoga ingången med referensen VRef. ADC-utgången är alltid heltal - 0 motsvarar 0V, 1023 motsvarar spänningen VRef. Mätningen genomförs genom att ta en serie sekventiella spänningsavläsningar och medelvärdesberäkning över perioden mellan uppdateringar av värdet på skärmen. Valet av referensspänning är viktigt eftersom det är standard på matningsspänningen, som kanske inte är stabil. Detta passar oss inte alls - vi kommer att utgå från en stabil intern referenskälla med en spänning på 1,1V, initiera den genom att anropa analogReference(INTERNAL). Vi kommer sedan att kalibrera dess värde med hjälp av multimeteravläsningarna.

Diagrammet till vänster visar en variant med direkt styrning av displayen (den är enkelt styrd - se standardskiss för LiquidCrystal\HelloWorld). Till höger finns alternativet I2C, som jag kommer att använda vidare. I2C låter dig spara på kablar (varav det finns 10 i den vanliga versionen, bakgrundsbelysningen räknas inte med). Men detta kräver en extra modul och mer komplex initiering. I vilket fall som helst måste visningen av tecken på modulen först kontrolleras och kontrasten justeras - för att göra detta behöver du bara visa vilken text som helst efter initialisering. Kontrasten justeras av motstånd R1, eller ett liknande motstånd i I2C-modulen.

Ingången är en 1:19 delare, vilket gör att du kan få en maximal spänning på ca 20V vid Vref = 1,1 (vanligtvis är en kondensator + en zenerdiod placerad parallellt med ingången för skydd, men detta är inte viktigt för oss för tillfället ). Motstånd har en spridning, och det har också referensen Vref för regulatorn, så efter montering måste vi mäta spänningen (åtminstone matningen) parallellt med vår enhet och en referensmultimeter och välja Vref i koden tills avläsningarna matchar. Det är också värt att notera att alla ADC har en noll offset spänning (vilket förstör avläsningarna i början av intervallet), men vi kommer inte att gå in på det för tillfället.

Det blir också viktigt att separera tillförsel- och mätmark. Vår ADC har en upplösning något sämre än 1mV, vilket kan skapa problem om kablaget är felaktigt, speciellt på en breadboard. Eftersom layouten av modulkortet redan är klar och vi behöver bara välja stiften. Modulen har flera "jorda" stift, så vi måste se till att ström kommer in i modulen genom en "jord" och mätningar genom den andra. För att göra ändringar använder jag faktiskt alltid jordstiftet närmast de analoga ingångarna.

För att styra I2C används en version av LiquidCrystal_I2C-biblioteket - i mitt fall anges den specifika pinouten för I2C-modulen (kineserna producerar moduler med olika kontroller). Jag noterar också att I2C i Arduino kräver användning av stift A4 och A5 - på Pro Mini-kortet är de inte placerade på kanten, vilket är obekvämt för prototyper på BreadBoard.

Källa

#omfatta #omfatta // Enkel voltmeter med i2c display 1602. V 16.11 // Inställningar för i2c display 1602 med icke-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 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); // Läs uppdateringstid, ms (200-2000) #define REFRESH_TIME 330 // Analog ingång #define PIN_VOLT A0 // Intern referensspänning (välj) const float VRef = 1.10; // Resistiv ingångskoefficient (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; // Konvertera till volt (Värde: 0..1023 -> (0..VRef) skalad av Mult) Volt = InVolt * VoltMult * VRef / 1023; // Utdata lcd.setCursor (0, 1); lcd.print(Volt); lcd.print("V"); )

Den här artikeln ger ett intressant diagram för dem som gillar att experimentera och Arduino. Den har en enkel digital voltmeter som säkert kan mäta DC-spänning mellan 0 och 30 V. Själva Arduino-kortet kan drivas av en standard 9 V-matning.



Som du vet kan du med den analoga ingången Arduino mäta spänning från 0 till 5 V (med en standardreferensspänning på 5 V). Men detta intervall kan utökas genom att använda en spänningsdelare.


Avdelaren minskar den uppmätta spänningen till en nivå som är acceptabel för den analoga ingången. Därefter beräknar specialskriven kod den faktiska spänningen.



Den analoga sensorn i Arduino känner av spänningen vid den analoga ingången och omvandlar den till ett digitalt format som kan läsas av mikrokontrollern. Vi ansluter en spänningsdelare bildad av motstånd R1 (100K) och R2 (10K) till analog ingång A0. Med dessa resistansvärden kan upp till 55 V matas till Arduino, eftersom divisionskoefficienten i detta fall är 11, så 55V/11 = 5V. För att vara säker på att mätningarna är säkra för kortet är det bättre att mäta spänningen i området från 0 till 30 V.



Om displayavläsningarna inte stämmer överens med de verifierade voltmetervärdena, använd en digital precisionsmultimeter för att hitta de exakta värdena för R1 och R2. I det här fallet måste du i koden ersätta R1=100000.0 och R2=10000.0 med dina egna värden. Då bör du kontrollera strömförsörjningen genom att mäta spänningen på kortet mellan 5V och GND. Spänningen kan vara 4,95 V. Då behöver du i koden vout = (värde * 5,0) / 1024,0 ersätta 5,0 med 4,95. Det är tillrådligt att använda precisionsmotstånd med ett fel på högst 1%. Kom ihåg att spänning över 55V kan skada Arduino-kortet!



#omfatta LiquidCrystal lcd(7, 8, 9, 10, 11, 12); int analogInput = 0; float vout = 0,0; float vin = 0,0; float R1 = 100000,0; // motstånd R1 (100K) float R2 = 10000,0; // motstånd R2 (10K) int värde = 0; void setup())( pinMode(analogInput, INPUT); lcd.begin(16, 2); lcd.print("DC VOLTMETER"); ) void loop())( // läs det analoga värdet = analogRead(analogInput ); vout = (värde * 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); }


Element som används:


Arduino Uno-bräda
Motstånd 100 KOhm
Motstånd 10 KOhm
100 ohm motstånd
Potentiometer 10 KOhm
LCD-skärm 16×2