Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Programet
  • Voltmetër dixhital në Arduino i lidhur me PC nëpërmjet portës serike. Voltmetër sekret Arduino - matja e tensionit të baterisë me anë të një mikrokontrollues

Voltmetër dixhital në Arduino i lidhur me PC nëpërmjet portës serike. Voltmetër sekret Arduino - matja e tensionit të baterisë me anë të një mikrokontrollues

Përshëndetje, Habr! Sot dua të vazhdoj temën e "kalimit" arduino dhe android. Në botimin e mëparshëm, fola për një makinë bluetooth, dhe sot do të flasim për një voltmetër Bluetooth DIY. Një pajisje tjetër e tillë mund të quhet voltmetër inteligjent, voltmetër "i zgjuar" ose thjesht voltmetër inteligjent, pa thonjëza. Mbiemri është i pasaktë nga pikëpamja e gramatikës së gjuhës ruse, megjithatë, shpesh gjendet në media. Votimi për këtë temë do të jetë në fund të artikullit dhe unë sugjeroj të filloni me një demonstrim të funksionimit të pajisjes për të kuptuar se për çfarë do të bëhet fjalë artikulli.


Mohim përgjegjësie: artikulli është menduar për një hobiist mesatar arduino, i cili zakonisht nuk është i njohur me programimin për android, prandaj, si në artikullin e mëparshëm, ne do të krijojmë një aplikacion për një smartphone duke përdorur mjedisin e zhvillimit vizual të App Inventor 2 për aplikacionet android.
Për të bërë një voltmetër bluetooth DIY, duhet të shkruajmë dy programe relativisht të pavarura: një skicë për arduino dhe një aplikacion për android. Le të fillojmë me një skicë.
Për të filluar, duhet të dini se ekzistojnë tre opsione kryesore për matjen e tensionit duke përdorur një arduino, pavarësisht se ku duhet të shfaqni informacionin: në com-port, në ekranin e lidhur me arduino ose në një smartphone.
Rasti i parë: matje tensioni deri në 5 volt. Këtu, mjaftojnë një ose dy rreshta kodi, dhe voltazhi aplikohet drejtpërdrejt në pinin A0:
vlera int = analogLeximi (0); // leximi i leximeve nga A0
tension = (vlera / 1023.0) * 5; // e vërtetë vetëm nëse Vcc = 5.0 volt
Rasti i dytë: Një ndarës i tensionit përdoret për të matur tensionet mbi 5 volt. Skema është shumë e thjeshtë, kodi është gjithashtu.

Skicë

int analogInput = A0;
val float = 0,0;
tension notues = 0,0;
noton R1 = 100000.0; // Bateria Vin-> 100K -> A0
noton R2 = 10000.0; // Bateria Gnd -> Arduino Gnd dhe Arduino Gnd -> 10K -> A0
vlera int = 0;

Konfigurimi i zbrazët () (
Seriali.fillimi (9600);
pinMode (hyrje analoge, INPUT);
}

Cikli i zbrazët () (
vlera = analogLeximi (analogInput);
val = (vlera * 4.7) / 1024.0;
tension = val / (R2 / (R1 + R2));
Serial.println (tensioni);
vonesë (500);
}


Arduino Uno
Moduli Bluetooth
Rasti i tretë. Kur ju duhet të merrni informacion më të saktë në lidhje me tensionin, nuk duhet të përdorni tensionin e furnizimit si tension referencë, i cili mund të ndryshojë pak kur furnizohet nga një bateri, për shembull, por tensioni i stabilizatorit të brendshëm të Arduino prej 1.1 volt. Këtu qarku është i njëjtë, por kodi është pak më i gjatë. Unë nuk do ta analizoj këtë opsion në detaje, pasi tashmë është përshkruar mirë në artikujt tematikë, dhe metoda e dytë është mjaft e mjaftueshme për mua, pasi kam një furnizim të qëndrueshëm të energjisë nga porta USB e laptopit.
Pra, ne kuptuam matjen e tensionit, tani le të kalojmë në gjysmën e dytë të projektit: krijimin e një aplikacioni android. Ne do ta bëjmë aplikacionin direkt nga shfletuesi në mjedisin e zhvillimit vizual për aplikacionet android App Inventor 2. Shkoni në faqen e internetit appinventor.mit.edu/explore, identifikohuni me llogarinë tuaj Google, klikoni butonin e krijimit, projektit të ri dhe nga thjesht zvarritja dhe lëshimi i elementeve krijon diçka si ky dizajn:

Unë e bëra grafikën shumë të thjeshtë, nëse dikush dëshiron grafikë më interesante, më lejoni t'ju kujtoj se për këtë ju duhet të përdorni skedarë .png me sfond transparent në vend të skedarëve .jpeg.
Tani shkoni te skeda Blocks dhe krijoni logjikën e aplikacionit atje si kjo:


Nëse gjithçka funksionoi, mund të klikoni butonin Build dhe të ruani .apk në kompjuterin tim dhe më pas të shkarkoni dhe instaloni aplikacionin në smartphone tuaj, megjithëse ka mënyra të tjera për të ngarkuar aplikacionin. këtu është më i përshtatshëm për këdo. Si rezultat, mora aplikacionin e mëposhtëm:


Unë e kuptoj që shumë pak njerëz përdorin mjedisin e zhvillimit vizual të App Inventor 2 për aplikacionet android në projektet e tyre, kështu që mund të ketë shumë pyetje rreth punës në të. Për të hequr disa nga këto pyetje, bëra një video të detajuar se si të bëni një aplikacion të tillë "nga e para" (duhet të shkoni në YouTube për ta parë):

P.S. Një koleksion me mbi 100 mësime Arduino për fillestarët dhe profesionistët

Ky artikull ju tregon se si të lidhni Arduino dhe PC dhe të transferoni të dhëna nga ADC në PC. Programi Windows është shkruar duke përdorur Visual C ++ 2008 Express. Programi i voltmetrit është shumë i thjeshtë dhe ka shumë vend për përmirësim. Qëllimi i tij kryesor ishte të tregonte se si të punonte me një port COM dhe të shkëmbejë të dhëna midis një kompjuteri dhe një Arduino.

Komunikimi midis Arduino dhe PC:

  • Leximi nga ADC fillon kur kompjuteri dërgon komandat Arduino 0xAC dhe 0x1y. - Numri i kanalit ADC (0-2);
  • Leximi ndalon pasi Arduino merr komanda 0xAC dhe 0x00;
  • Gjatë marrjes së leximeve, Arduino dërgon komanda 0xAB 0xaa 0xbb në kompjuter çdo 50 ms, ku aa dhe bb janë rezultatet maksimale dhe minimale të matjes.

Programi Arduino

Mund të lexoni më shumë rreth komunikimit serial në arduino.cc. Programi është mjaft i thjeshtë, pjesa më e madhe e tij është e zënë duke punuar me një port paralel. Pas përfundimit të leximit të të dhënave nga ADC, marrim një vlerë të tensionit 10-bit (0 × 0000 - 0 × 0400) në formën e variablave 16-bit (INT). Porta serike (RS-232) lejon transmetimin e të dhënave në pako me 8 bit. Është e nevojshme të ndahen variablat 16-bit në 2 pjesë me 8 bit.

Serial.print (voltazhi >> 8, BYTE);

Serial.print (voltage% 256, BYTE);

I zhvendosim bajtët e ndryshores 8 bit djathtas dhe më pas i ndajmë me 256 dhe rezultatin e dërgojmë në kompjuter.

Kodi i plotë burimor për softuerin Arduino mund ta shkarkoni

Vizuale c ++

Unë supozoj se ju tashmë keni një njohuri bazë të programimit C ++ për Windows, nëse jo, kërkoni në google. Interneti është plot me mësime për fillestarët.

Gjëja e parë që duhet të bëni është të shtoni portën serike nga shiriti i veglave në formën e poshtme. Kjo do t'ju lejojë të ndryshoni disa parametra të rëndësishëm të portës serike: emri i portit, shpejtësia e transmetimit, shpejtësia e bitit. Kjo është e dobishme për shtimin e kontrolleve në dritaren e aplikacionit, për ndryshimin e këtyre cilësimeve në çdo kohë, pa e rikompiluar programin. Kam përdorur vetëm opsionin e zgjedhjes së portit.

Pas kërkimit të porteve serike të disponueshme, porta e parë zgjidhet si parazgjedhje. Si është bërë:

varg< String ^>^ serialPorts = nullptr;

serialPorts = serialPort1-> GetPortNames ();

this-> comboBox1-> Items-> AddRange (SerialPorts);

this-> comboBox1-> SelectedIndex = 0;

Porta serike në një PC mund të përdoret vetëm nga një aplikacion në të njëjtën kohë, kështu që porti duhet të jetë i hapur përpara përdorimit dhe jo i mbyllur. Komanda të thjeshta për këtë:

serialPort1-> Hap ();

serialPort1-> Mbylle ();

Për të lexuar saktë të dhënat nga porti serik, duhet të përdorni ngjarje (në rastin tonë, një ndërprerje). Zgjidhni llojin e ngjarjes:

Lista dropdown kur klikoni dy herë "Data Received".

Kodi i ngjarjes gjenerohet automatikisht:

Nëse bajt i parë që arrin në portën serike është 0xAB, nëse kjo do të thotë se bajtët e mbetur mbajnë të dhëna të tensionit.

private: Sistemi :: Serial i pavlefshëmPort1_DataReceived (Sistemi :: Objekti ^ dërguesi, Sistemi :: IO :: Portet :: SerialDataReceivedEventArgs ^ e) (

të dhënat e panënshkruara char0, data1;

nëse (SerialPort1-> ReadByte () == 0xAB) (

data0 = serialPort1-> ReadByte ();

data1 = serialPort1-> ReadByte ();

voltazh = Math :: Round ((float (të dhëna0 * 256 + të dhëna1) /1024*5.00), 2);

numërimi i të dhënave ++;

serialPort1-> ReadByte ();

Shkrimi dhe leximi i të dhënave të portit serik

Një problem i vogël për mua ishte dërgimi i të dhënave HEX RAW mbi portën serike. Është përdorur komanda Write (); por me tre argumente: grup, numri i bajtit të fillimit, numri i bajteve për t'u shkruar.

private: Sistemi :: Butoni i pavlefshëm2_Click_1 (Sistemi :: Objekti ^ dërguesi, Sistemi :: EventArgs ^ e) (

kanal char i panënshkruar = 0;

kanal = this-> listBox1-> SelectedIndex;

grupi ^ start = (0xAC, (0x10 + kanal));

grupi ^ ndalesa = (0xAC, 0x00);

serialPort1-> Shkruaj (fillimi, 0,2);

this-> button2-> Tekst = "Stop";

) tjeter (

serialPort1-> Shkruaj (stop, 0.2);

this-> button2-> Tekst = "Start";

Kjo eshte e gjitha!

Artikulli origjinal në anglisht (përkthim: Alexander Kasyanov për faqen cxem.net)

Ky artikull ofron një diagram interesant për ata që duan të eksperimentojnë dhe Arduino... Ai prezanton një voltmetër të thjeshtë dixhital që mund të matë në mënyrë të sigurt tensionet DC nga 0 në 30 V. Vetë bordi Arduino mund të mundësohet nga një standard standard 9 V.



Siç e dini, hyrja analoge e Arduino mund të matë tensionet nga 0 në 5 V (me një referencë standarde 5V). Por kjo gamë mund të zgjerohet duke përdorur një ndarës tensioni.


Ndarësi zvogëlon tensionin e matur në një nivel të pranueshëm për hyrjen analoge. Kodi i shkruar posaçërisht më pas llogarit tensionin aktual.



Një sensor analog në Arduino zbulon tensionin në hyrjen analoge dhe e konverton atë në një format dixhital që mikrokontrolluesi mund të lexojë. Në hyrjen analoge A0 lidhim një ndarës tensioni të formuar nga rezistenca R1 (100K) dhe R2 (10K). Me vlera të tilla të rezistencës, mund të furnizoni Arduino deri në 55 V, pasi raporti i ndarjes në këtë rast është 11, pra 55V / 11 = 5V. Për t'u siguruar që matjet janë të sigurta për tabelën, është më mirë të matni tensionin në intervalin nga 0 në 30 V.



Nëse ekrani nuk përputhet me atë të një voltmetri të verifikuar, duhet të përdoret një multimetër dixhital preciz për të gjetur vlerat e sakta për R1 dhe R2. Në këtë rast, në kod do t'ju duhet të zëvendësoni R1 = 100000.0 dhe R2 = 10000.0 me vlerat tuaja. Atëherë ia vlen të kontrolloni fuqinë duke matur tensionin në tabelë midis 5V dhe GND. Tensioni mund të jetë 4.95 V. Pastaj në kodin vout = (vlera * 5.0) / 1024.0 ju duhet të zëvendësoni 5.0 me 4.95. Këshillohet të përdorni rezistorë precizion me një gabim jo më shumë se 1%. Mos harroni se tensionet mbi 55 V mund të dëmtojnë tabelën Arduino!



#përfshi LCD Crystal Liquid (7, 8, 9, 10, 11, 12); int analogInput = 0; float vout = 0.0; float vin = 0,0; noton R1 = 100000.0; // rezistenca R1 (100K) float R2 = 10000.0; // rezistenca R2 (10K) vlera int = 0; konfigurimi void () (pinMode (analogInput, INPUT); lcd.begin (16, 2); lcd.print ("VOLTMETER DC");) void loop () (// lexo vlerën e vlerës analoge = analogRead (analogInput); vout = (vlera * 5.0) / 1024.0; vin = vout / (R2 / (R1 + R2)); nëse (vin<0.09) { vin=0.0;// обнуляем нежелательное значение } lcd.setCursor(0, 1); lcd.print("INPUT V= "); lcd.print(vin); delay(500); }


Elementet e përdorura:


Pllaka Arduino Uno
Rezistencë 100 K om
Rezistencë 10K
Rezistencë 100 ohm
Potenciometër 10Kohm
Ekran LCD 16 × 2

Ka raste kur dëshironi të kontrolloni një tension ose një pikë në një qark, por nuk keni një voltmetër ose multimetër në dorë? Vraponi për të blerë? Është e gjatë dhe e shtrenjtë. Përpara se ta bëni këtë, si të bëni vetë një voltmetër? Në fakt, me komponentë të thjeshtë, mund ta bëni vetë.

  • Në tutorial, ne përdorëm një tabelë të pajtueshme me Arduino - SunFounder Uno / Mars (http://bit.ly/2tkaMba)
  • Kabllo USB të dhënash
  • 2 potenciometra (50k)
  • LCD1602 - http://bit.ly/2ubNEfi
  • Bordi i zhvillimit - http://bit.ly/2slvfrB
  • Kërcim të shumëfishtë

Para se të lidhemi, le të hedhim një vështrim se si funksionon.

Përdorni tabelën SunFounder Uno për pjesën kryesore të përpunimit të të dhënave të voltmetrit, LCD1602 si ekran, potenciometrin për të rregulluar kontrastin LCD dhe tjetrin për të ndarë tensionin.

Kur rrotulloni një potenciometër të lidhur me tabelën Uno, rezistenca e potenciometrit ndryshon, duke ndryshuar kështu tensionin në të. Sinjali i tensionit do të dërgohet në tabelën Uno përmes pinit A0, dhe Uno do të dixhitalizojë sinjalin analog të marrë dhe do të shkruajë në LCD. Kështu që ju mund të shihni vlerën e tensionit në rezistencën aktuale të kondensatorit.

LCD1602 ka dy mënyra funksionimi: 4-bit dhe 8-bit. Kur IO e MCU është e pamjaftueshme, mund të zgjidhni modalitetin 4-bit, i cili përdor vetëm kunjat D4 ~ D7.

Ndiqni tabelën për t'i lidhur ato.

Hapi 4: lidhni potenciometrin me LCD1602

Lidhni kunjin e mesit të potenciometrit me pinin Vo në LCD1602 dhe cilindo nga kunjat e tjera me GND.

Lidheni kunjin e mesit të potenciometrit me pinin A0 të SunFounder Uno dhe njërën nga të tjerat me 5V, ndërsa tjetrën me GND.

Hapi 6: Ngarko kodin

Kodi si ky:

#përfshin / ********************************************** * **** / const int analogIn = A0; // potenciometri lidhet me LCD-në A0 LiquidCrystal (4, 6, 10, 11, 12, 13); // LCD (RS, E, D4, D5, D6.D7) notues val = 0; // përcaktoni variablin si vlerë = 0 / ************************************** ** **************** / void setup () (Serial.begin (9600); // Inicializoni serialin lcd.begin (16, 2); // vendosni pozicionin e karakteret në LCD si Linja 2, Kolona 16 lcd.print ("Vlera e tensionit:"); // printoni "Vlera e tensionit:") / ******************* ********************************** / void loop () (val = analogLexo (A0); // Lexo vlera e potenciometrit në val val = val / 1024 * 5.0; // Konvertoni të dhënat në vlerën përkatëse të tensionit në një mënyrë matematikore Serial.print (val); // Shtypni numrin e val në monitorin serik Serial.print ("V"); // printoni njësinë si V, shkurtim i tensionit në monitorin serik lcd.setCursor (6,1); // Vendoseni kursorin në rreshtin 1, kolona 6. Nga këtu duhet të shfaqen karakteret lcd.print (val); // Shtypni numrin e v al në LCD printim LCD ("V"); // Më pas printoni njësinë si V, shkurt për tension në vonesën LCD (200); // Prisni për 200 ms)

Rrotulloni potenciometrin për të kontrolluar tensionin në LCD1602 në kohë reale.

Këtu është një gjë e ndërlikuar. Pasi ekzekutova kodin, simbolet u shfaqën në LCD. Më pas rregullova kontrastin e ekranit (zbehet nga e zeza në të bardhë) duke e rrotulluar potenciometrin në drejtim të akrepave të orës ose në të kundërt derisa ekrani t'i tregojë karakteret qartë.

Merrni dy bateri për të matur tensionet e tyre: 1.5 V dhe 3.7 V. Shkëputni lidhjen e potenciometrit të dytë me pinin A0 dhe GND, që do të thotë heqja e potenciometrit nga qarku. Mbërtheni fundin e telit A0 në anodin e baterisë dhe qarkun GND në katodë. MOS i lidhni përsëri në prizë, përndryshe do të keni një qark të shkurtër në bateri. Vlera 0V është lidhja e kundërt.

Pra, tensioni i baterisë shfaqet në LCD. Mund të ketë ndonjë gabim midis vlerës dhe vlerës nominale pasi bateria nuk është e ngarkuar plotësisht. Dhe kjo është arsyeja pse unë duhet të masë tensionin në mënyrë që të kuptoj nëse mund ta përdor baterinë apo jo.

PS: Nëse keni probleme me ekranin - shihni këtë FAQ për LCD - http://wiki.sunfounder.cc/index.php?title=LCD1602/I2C_LCD1602_FAQ.

Ideja

Ideja Pajisjet për matjen e tensionit, rrymës, kapacitetit, shkarkimit dhe ndoshta ngarkimit u ngritën shumë kohë më parë dhe jo vetëm për mua. Mund të gjeni mjaft lodra të quajtura USB Tester (Doktor) për testimin e pajisjeve të ndryshme USB. Unë jam i interesuar për një pajisje disi më universale, e pavarur nga ndërfaqja, por e krijuar thjesht për tensione dhe rryma të caktuara. Për shembull, 0 - 20.00v, 0 - 5.00a, 0 - 99.99Ah. Përsa i përket funksioneve, unë e shoh kështu

  • Shfaqja e tensionit dhe rrymës aktuale, d.m.th. njehsori volt-amper. Në parim, ju mund të reflektoni menjëherë fuqinë.
  • Numërimi dhe shfaqja e kapacitetit të akumuluar. Amper-orë dhe ka shumë të ngjarë vat-orë.
  • Shfaqja e kohës së procesit
  • Dhe, ka shumë të ngjarë, pragjet e ndërprerjes së tensionit të poshtëm dhe të sipërm të personalizueshëm (kufijtë e shkarkimit dhe ngarkimit)

Zhvillimi i

Për të zbatuar llogaritjet dhe matjet, na duhet një kontrollues. E mbaja mend këtë ide si pjesë e njohjes sime me Arduino, kështu që kontrolluesi do të jetë një Atmega328 i thjeshtë popullor dhe do të programohet në mjedis. Arduino. Nga pikëpamja inxhinierike, zgjedhja ndoshta nuk është më e mira - kontrolluesi është pak i trashë për detyrën, dhe ADC-ja e tij nuk mund të quhet matës, por ... do të përpiqemi.

  • Ne nuk do të bashkojmë shumë në këtë projekt. Si bazë, ne do të marrim një modul të gatshëm Arduino Pro Mini, pasi kinezët janë gati t'i furnizojnë me pakicë me 1,5 dollarë.
  • Ekrani 1602 do të veprojë si një pajisje ekrani - 1,5 dollarë të tjera. Unë kam një variant me një modul ndërfaqe I2C, por në këtë projekt nuk është shumë i nevojshëm (0,7 dollarë).
  • Për zhvillim, ne kemi nevojë për një dërrasë buke. Në rastin tim, ky është një BreadBoard i vogël 1 $.
  • Natyrisht, do t'ju nevojiten tela dhe një numër rezistencash të vlerësimeve të ndryshme. Për një ekran 1602 pa I2C, nevojitet gjithashtu një përzgjedhje kontrasti - bëhet me një rezistencë të ndryshueshme prej 2 - 20 kOhm.
  • Për të zbatuar një ampermetër, keni nevojë për një shunt. Si përafrim i parë, mund të jetë një rezistencë 0,1 ohm, 5 W.
  • Për të zbatuar mbylljen automatike, ju nevojitet një stafetë me kontakte të krijuara për rrymën dhe tensionin maksimal të pajisjes të barabartë me tensionin e furnizimit. Një transistor NPN dhe një diodë mbrojtëse janë të nevojshme për të kontrolluar rele.
  • Pajisja do të mundësohet nga një furnizim i jashtëm me energji elektrike, padyshim të paktën 5V. Nëse furnizimi me energji ndryshon shumë, atëherë kërkohet gjithashtu një stabilizues integral i tipit 7805 - ai do të përcaktojë tensionin e stafetës.
  • Kur Arduino Pro Mini kërkon një konvertues USB-TTL për të ngarkuar firmuerin.
  • Për konfigurim do t'ju duhet një multimetër.

Voltmetër

Unë jam duke zbatuar një voltmetër të thjeshtë me një diapazon të vetëm rreth 0 - 20v. Kjo vërejtje është e rëndësishme, pasi ADC e kontrolluesit tonë ka një kapacitet prej 10 bit (1024 vlera diskrete), kështu që gabimi do të jetë së paku 0.02 V (20/1024). Për ta zbatuar atë, ne kemi nevojë për një hyrje analoge të kontrolluesit, një ndarës nga një palë rezistencash dhe një lloj daljeje (ekrani ka përfunduar, për korrigjimin mund të përdorni një port serik).

Parimi i matjes ADC është krahasimi i tensionit në hyrjen analoge me referencën VRef. Dalja ADC është gjithmonë numër i plotë - 0 korrespondon me 0V, 1023 korrespondon me tensionin VRef. Matja realizohet nga një seri leximesh sekuenciale të tensionit dhe mesatarizimi gjatë periudhës ndërmjet përditësimeve të vlerës në ekran. Zgjedhja e tensionit të referencës është e rëndësishme për shkak se është e paracaktuar me tensionin e furnizimit, i cili mund të mos jetë i qëndrueshëm. Kjo nuk na përshtatet aspak - ne do të marrim si bazë një burim të brendshëm referimi të qëndrueshëm me një tension prej 1.1v, duke e inicializuar atë me një thirrje në referencë analoge (INTERNAL). Pastaj do të kalibrojmë vlerën e tij sipas leximeve të multimetrit.

Në diagramin në të majtë - një variant me kontroll të drejtpërdrejtë të ekranit (ai thjesht kontrollohet - shihni skicën standarde LiquidCrystal \ HelloWorld). Në të djathtë është varianti I2C, të cilin do ta përdor më tej. I2C ju lejon të kurseni tela (nga të cilat në versionin e zakonshëm - 10, pa llogaritur dritën e prapme). Por kjo kërkon një modul shtesë dhe inicializim më kompleks. Në çdo rast, shfaqja e simboleve në modul duhet së pari të kontrollohet dhe të rregullohet kontrasti - për këtë, thjesht duhet të shfaqni çdo tekst pas inicializimit. Kontrasti rregullohet nga rezistenca R1, ose një rezistencë e ngjashme në modulin I2C.

Hyrja është një ndarës 1:19, i cili lejon në Vref = 1.1 të marrë një tension maksimal prej rreth 20 V (zakonisht një kondensator + diodë zener vendoset paralelisht me hyrjen për mbrojtje, por kjo nuk është ende e rëndësishme për ne). Rezistorët kanë një përhapje, dhe referencën Vref të kontrolluesit gjithashtu, kështu që pas montimit është e nevojshme të matni tensionin (të paktën furnizimin me energji elektrike) paralelisht me pajisjen tonë dhe multimetrin referencë dhe zgjidhni Vref në kod derisa leximet të përputhen. . Vlen gjithashtu të përmendet se çdo ADC ka një tension kompensues zero (i cili prish leximet në fillim të diapazonit), por ne nuk do të hyjmë në këtë për momentin.

Do të jetë gjithashtu e rëndësishme të ndani furnizimin dhe "tokën" e matjes. ADC-ja jonë ka një rezolucion pak më të keq se 1mV, gjë që mund të krijojë probleme me instalime elektrike të pasakta, veçanërisht në një tabelë. Meqenëse faqosja e tabelës së modulit tashmë është bërë dhe ne duhet të zgjedhim vetëm kunjat. Moduli ka disa kunja "tokë", kështu që duhet të sigurohemi që furnizimi me energji i modulit të vijë në një "tokë", dhe matjet në tjetrin. Në fakt, unë përdor gjithmonë pinin e tokës më afër hyrjeve analoge për ndryshime.

Për të kontrolluar I2C, përdoret një version i bibliotekës LiquidCrystal_I2C - në rastin tim, tregohet pika specifike e modulit I2C (kinezët prodhojnë module me kontroll të ndryshëm). Vërej gjithashtu se I2C në Arduino supozon përdorimin e kunjave A4, A5 - në tabelën Pro Mini ato nuk janë në skaj, gjë që është e papërshtatshme për prototipimin në BreadBoard.

Burimi

#përfshi #përfshi // Voltmetër i thjeshtë me ekran i2c 1602. V 16.11 // Cilësimet për ekranin i2c 1602 me pinout jo standarde #define LCD_I2C_ADDR 0x27 #define BACKLIGHT 3 #define LCD_EN 2 #define LCD_EN 2 #define LCD_EN 2 #define LCD_RW 2 #define LCD_RWefin 1602 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); // Koha për përditësimin e leximeve, ms (200-2000) #define REFRESH_TIME 330 // Hyrja analoge #define PIN_VOLT A0 // Tensioni i brendshëm i referencës (marr) konst float VRef = 1.10; // Raporti i ndarësit rezistues në hyrje (Rh + Rl) / Rl. NË<-[ 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; // Konvertimi në volt (Vlera: 0..1023 -> (0..VRef) i shkallëzuar nga Mult) Volt = InVolt * VoltMult * VRef / 1023; // Dalja e të dhënave lcd.setCursor (0, 1); lcd.print (Volt); lcd.print ("V"); )

Artikujt kryesorë të lidhur