Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • telefon Windows
  • Voltmetër dixhital në Arduino me lidhje me PC nëpërmjet portës serike. voltmetër bluetooth i bazuar në arduino

Voltmetër dixhital në Arduino me lidhje me PC nëpërmjet portës serike. voltmetër bluetooth i bazuar në arduino

Një skemë e dobishme është paraqitur për ata që duan të eksperimentojnë me Arduino. Ky është një voltmetër i thjeshtë dixhital që mund të matë me besueshmëri tensionin DC në intervalin 0 - 30 V. Bordi Arduino, si zakonisht, mund të mundësohet nga një bateri 9V.

Siç e dini ndoshta, hyrjet analoge të Arduino mund të përdoren për të matur tensionin DC në intervalin 0 - 5 V dhe kjo diapazon mund të rritet,
duke përdorur dy rezistorë si ndarës të tensionit. Ndarësi do të zvogëlojë tensionin e matur në nivelin e hyrjeve analoge të Arduino. Dhe pastaj programi do të llogarisë vlerën reale të tensionit.

Sensori analog në tabelën Arduino zbulon praninë e tensionit në hyrjen analoge dhe e shndërron atë në një formë dixhitale për përpunim të mëtejshëm nga mikrokontrolluesi. Në figurë, voltazhi aplikohet në hyrjen analoge (A0) përmes një ndarësi të thjeshtë tensioni të përbërë nga rezistorët R1 (100kΩ) dhe R2 (10kΩ).

Me këto vlera të pjesëtuesit, bordi Arduino mund të furnizohet me tension nga 0 në
55 V. Në hyrjen A0 kemi tensionin e matur të ndarë me 11, pra 55V / 11=5V. Me fjalë të tjera, kur matim 55V në hyrjen Arduino, kemi vlerën maksimale të lejueshme prej 5V. Në praktikë, është më mirë të shkruani diapazonin "0 - 30V" në këtë voltmetër në mënyrë që të qëndroni
Marzhi i sigurisë!

Shënime

Nëse leximet e ekranit nuk përputhen me leximet e një voltmetri industrial (laboratorik), atëherë është e nevojshme të matni rezistencën R1 dhe R2 me një instrument të saktë dhe të futni këto vlera në vend të R1=100000.0 dhe R2=10000.0 në program. kodi. Më pas duhet të matni tensionin real midis terminaleve 5V dhe "Ground" të tabelës Arduino me një voltmetër laboratori. Rezultati do të jetë një vlerë më e vogël se 5V, për shembull, doli 4.95V. Kjo vlerë reale duhet të futet në një rresht kodi
vout = (vlera * 5.0) / 1024.0 në vend të 5.0.
Gjithashtu, përpiquni të përdorni rezistenca precize me një tolerancë prej 1%.

Rezistencat R1 dhe R2 ofrojnë njëfarë mbrojtjeje kundër tensioneve të larta hyrëse.Megjithatë, kini parasysh se çdo tension mbi 55V mund të dëmtojë tabelën Arduino. Për më tepër, ky dizajn nuk ofron lloje të tjera mbrojtjeje (nga mbitensionet e energjisë, nga polariteti i kundërt ose mbitensioni).

Programi i voltmetrit dixhital

/*
Voltmetër DC
Një Arduino DVM bazuar në konceptin e ndarësit të tensionit
T.K.Hareendran
*/
#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 e R1 (100K) -shiko tekstin!
noton R2 = 10000.0; // rezistenca e R2 (10K) - shikoni tekstin!
vlera int = 0;
konfigurimi i zbrazët ()(
pinMode (hyrje analoge, INPUT);
lcd.begin(16, 2);
lcd.print("VOLTMETER DC");
}
void loop()(
// lexoni vlerën në hyrjen analoge
vlera = analogLeximi(analogInput);
vout = (vlera * 5.0) / 1024.0; // shih tekstin
vin = vout / (R2/(R1+R2));
nëse (vin<0.09) {
vin=0.0;//deklaratë për të anuluar leximin e padëshiruar!
}
lcd.setCursor(0, 1);
lcd.print("INPUT V=");
printim LCD (vin);
vonesë (500);
}

Diagrami skematik i voltmetrit Arduino

Lista e komponentëve

Bordi i Arduino Uno
Rezistenca 100 kΩ
Rezistencë 10 kΩ
Rezistencë 100 ohm
Rezistencë prerëse 10 kΩ
Ekran LCD 16×2 (Hitachi HD44780)

Me disa shtesa.

Një tipar pak i njohur i Arduino dhe shumë çipave të tjerë AVR është aftësia për të matur tensionin e brendshëm të referencës 1.1 V. Ky funksion mund të të përdoret për përmirësojnë saktësinë Funksionet Arduino - analogLexoni duke përdorur Tensioni standard i referencës prej 5 V (në platformat me tension furnizimi 5 V) ose 3.3 V (në platformat me tension furnizimi 3.3 V).Ajo gjithashtu mund të jetë përdoret për të matur Vcc aplikohet në ofrimin e çipit mjetet e kontrollit tensioni i baterisë pa perdorim dalje të çmuara analoge.

Motivimi

Ka të paktën të paktën dy arsye për matjen tensioni i furnizimit Arduino (Vcc) tonë. Një prej tyre është projekti ynë me bateri nëse duam të monitorojmë nivelin e tensionit të baterisë. Gjithashtu, kur fuqia e baterisë (Vcc) nuk mund të jetë 5,0 volt (p.sh. furnizimi me 3 qeliza 1,5 V), dhe ne duam t'i bëjmë matjet analoge më të sakta - duhet të përdorim ose një referencë të brendshme të tensionit 1,1 V ose një referencë të jashtme të tensionit. Pse?

Zakonisht supozohet kur përdoret analogRead() se voltazhi i furnizimit analog të kontrolluesit është 5.0 volt, kur në realitet kjo mund të mos jetë fare (për shembull, fuqia nga 3 qeliza është 1.5 V). Dokumentacioni zyrtar i Arduino madje mund të na çojë në këtë supozim të pasaktë. Fakti është se furnizimi me energji elektrike nuk është domosdoshmërisht 5.0 volt, pavarësisht nga niveli aktual, kjo fuqi furnizohet me Vcc të çipit. Nëse fuqia jonë nuk është e stabilizuar, ose nëse punojmë me bateri, ky tension mund të ndryshojë mjaft. Këtu është një shembull kodi që ilustron këtë çështje:

Dyfishtë Vcc = 5.0; // jo domosdoshmërisht e vërtetë vlera int = analogRead(0); / leximi i leximeve nga A0 dy volt = (vlera / 1023.0) * Vcc; // e vërtetë vetëm nëse Vcc = 5.0 volt Për të matur saktë tensionin, nevojitet një referencë e saktë e tensionit. Shumica e çipave AVR ofrojnë tre referenca të tensionit:

  • 1.1 V nga një burim i brendshëm, në dokumentacion kalon si një referencë bandgap (disa prej tyre janë 2.56 V, për shembull ATMega 2560). Zgjedhja bëhet nga funksioni analogReference() me parametrin INTERNAL: analogReference(INTERNAL) ;
  • një burim i jashtëm i tensionit të referencës, AREF është nënshkruar në arduino. Zgjedhja: referencë analoge (E JASHTME);
  • Vcc është furnizimi me energji i vetë kontrolluesit. Zgjedhja: referencë analoge (DEFAULT).

Me një Arduino, nuk mund të vazhdoni dhe të lidhni drejtpërdrejt Vcc me një kunj analoge - si parazgjedhje AREF është i lidhur me Vcc dhe ju gjithmonë do të merrni një vlerë maksimale prej 1023, pavarësisht se çfarë tensioni po përdorni. Ai kursen lidhjen me AREF të një burimi tensioni me një tension të njohur, të qëndrueshëm, por ky është një element shtesë në qark.

Ju gjithashtu mund të lidhni Vcc me AREF nëpërmjet diodë: Rënia e tensionit në diodë dihet paraprakisht, kështu që llogaritja e Vcc nuk është e vështirë. Sidoqoftë, me një qark të tillë përmes një diodë rrymë që rrjedh vazhdimisht, duke shkurtuar jetën e baterisë, e cila gjithashtu nuk është shumë e suksesshme.

Një referencë e tensionit të jashtëm është më e sakta, por kërkon pajisje shtesë. ION i brendshëm i qëndrueshëm, por jo i saktë +/- devijimi 10%. Vcc është plotësisht jo i besueshëm në shumicën e rasteve. Zgjedhja e një reference të tensionit të brendshëm është e lirë dhe e qëndrueshme, por shumicën e kohës, ne do të donim të matim më shumë se 1.1 V, kështu që përdorimi i Vcc është më praktiki, por potencialisht më pak i saktë. Në disa raste mund të jetë shumë jo e besueshme!

Si ta bëni atë

Shumë çipa AVR duke përfshirë seritë ATmega dhe ATtiny ofrojnë një mjet për të matur referencën e tensionit të brendshëm. Pse është e nevojshme kjo? Arsyeja është e thjeshtë - duke matur tensionin e brendshëm, ne mund të përcaktojmë vlerën e Vcc. Ja se si:

  1. Cakto referencën e tensionit të paracaktuar: analogReference(DEFAULT); . Ne përdorim si burim - Vcc.
  2. Lexoni leximet ADC për furnizimin e brendshëm 1,1 V.
  3. Llogaritni vlerën e Vcc bazuar në matjen e 1.1 V duke përdorur formulën:

Vcc * (lexim ADC) / 1023 = 1,1 V

Nga sa vijon:

Vcc = 1,1 V * 1023 / (lexim ADC)

Duke i bashkuar të gjitha dhe duke marrë kodin:

gjatë readVcc() ( // Lexoni referencën 1.1V kundrejt AVcc // vendosni referencën në Vcc dhe matjen në referencën e brendshme 1.1V #nëse është përcaktuar(__AVR_ATmega32U4__) || përcaktuar(__AVR_ATmega1280__) || përcaktuar(__AVR_ATmega25 =__AVR_ATmega25 (REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #elif i përcaktuar (__AVR_ATtiny24__) || i përcaktuar(__AVR_ATtiny44__) || i përcaktuar(__AVR_ATtiny84___) (MUX0) MUX2). ADCL; // duhet të lexojë fillimisht ADCL - më pas bllokon ADCH uint8_t lartë = ADCH; // zhbllokon të dyja rezultatet e gjata = (i lartë<<8) | low; result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 return result; // Vcc in millivolts }

Përdorimi

Kontrollimi i tensionit të Vcc ose baterisë

Ju mund ta quani këtë funksion readVcc() nëse dëshironi të monitoroni Vcc. Një shembull do të ishte kontrollimi i nivelit të baterisë. Mund ta përdorni gjithashtu për të përcaktuar nëse jeni i lidhur me një burim energjie ose nëse punoni me bateri.

Matja Vcc për tensionin e referencës

Mund ta përdorni gjithashtu për të marrë vlerën e saktë Vcc për t'u përdorur me analogRead() kur përdorni tensionin e referencës (Vcc). Nëse nuk përdorni një furnizim të rregulluar me energji elektrike, nuk mund të jeni i sigurt se Vcc = 5.0 volt. Ky funksion ju lejon të merrni vlerën e duhur. Edhe pse ka një paralajmërim ....

Unë pretendova në një nga artikujt se kjo veçori mund të përdoret për të përmirësuar saktësinë e matjeve analoge në rastet kur Vcc nuk ishte saktësisht 5.0 volt. Fatkeqësisht, kjo procedurë nuk do të japë një rezultat të saktë. Pse? Kjo varet nga saktësia e referencës së tensionit të brendshëm. Specifikimi jep një tension nominal prej 1.1 volt, por thotë se mund të ndryshojë deri në 10%. Matje të tilla mund të jenë më pak të sakta se furnizimi ynë me energji Arduino!

Përmirësimi i saktësisë

Ndërsa tolerancat e mëdha të furnizimit të brendshëm 1.1 V kufizojnë shumë saktësinë e matjes kur përdoren në prodhim masiv, ne mund të arrijmë saktësi më të madhe për projektet individuale. Kjo është e lehtë për t'u bërë thjesht duke matur Vcc me një voltmetër dhe funksionin tonë readVcc(). Më pas, ne zëvendësojmë konstanten 1125300L me një ndryshore të re:

shkalla_konstante = e brendshme1.1Ref * 1023 * 1000

i brendshëm1.1Ref = 1.1 * Vcc1 (leximi_voltmetri) / Vcc2 (leximi_funksioni_Vcc()_funksioni)

Kjo vlerë e kalibruar do të jetë një tregues i mirë për matjet e çipit AVR, por mund të ndikohet nga ndryshimet e temperaturës. Mos ngurroni të eksperimentoni me matjet tuaja.

konkluzioni

Mund të bëhet shumë me këtë veçori të vogël. Ju mund të përdorni një referencë të qëndrueshme afër 5.0V pa pasur në fakt 5.0V në Vcc. Ju mund të matni tensionin e baterisë tuaj ose madje të shihni nëse jeni me bateri ose energji të palëvizshme.

Së fundi, kodi do të mbështesë të gjithë Arduinot, duke përfshirë Leonardo-n e ri, si dhe çipat e serive ATtinyX4 dhe ATtinyX5.

A ka raste kur dëshironi të kontrolloni tensionin ose ndonjë pikë në një qark, por nuk keni një voltmetër ose multimetër në dispozicion? Vraponi për të blerë? Është e gjatë dhe e shtrenjtë. Përpara se ta bëni këtë, si të bëni voltmetrin tuaj? 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
  • Breadboard - http://bit.ly/2slvfrB
  • Kërcim të shumëfishtë

Para se të lidhemi, le të kuptojmë fillimisht 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, një potenciometër për të rregulluar kontrastin LCD dhe tjetrën 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ë bordin Uno përmes pinit A0, dhe Uno do të konvertojë sinjalin analog të marrë në formë dixhitale dhe do të shkruajë në LCD. Kështu që ju mund të shihni vlerën e tensionit në rezistencën e kapacitetit aktual.

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.

Lidhni kunjin e mesit të potenciometrit me pinin A0 të SunFounder Uno dhe njërën nga të tjerat në 5V ndërsa tjetra është me GND.

Hapi 6: Ngarkimi i kodit

Kodi si ky:

#përfshi /************************************************ ***** *****/ const int analogIn = A0;//potenciometër bashkëngjitni LCD-në A0 LiquidCrystal (4, 6, 10, 11, 12, 13);//LCd(RS,E,D4,D5 ,D6.D7) float val = 0;// përcaktoni variablin si vlerë=0 /******************************** ***** *****************/ void setup() ( Serial.begin(9600);//Inicializoni serialin lcd.begin(16, 2);/ / vendosni pozicionin e karaktereve në LCD si Linja 2, Kolona 16 lcd.print("Vlera e tensionit:");//print "Vlera e tensionit:" ) /**************** ***** ****************************************/ void loop() ( val = analogLexo (A0);//Lexo vlerën e potenciometrit në val val = val/1024*5.0;// Konverto të dhënat në vlerën përkatëse të tensionit në mënyrë matematikore Serial.print(val);//Print numrin e val në monitorin serik Serial.print ("V"); // printoni njësinë si V, shkurt për tension në monitorin serik LCD setCursor(6,1); // Vendoseni kursorin në rreshtin 1, kolona 6. Nga këtu duhet të shfaqen karakteret lcd.print(val);//Print numrin e v al në LCD lcd.print("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ë e ndërlikuar. Pasi ekzekutova kodin, LCD tregoi simbole. Më pas rregullova kontrastin e ekranit (ndryshimi gradual 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 shfaqte qartë karakteret.

Merrni dy bateri për të matur tensionin 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ë të hiqni potenciometrin nga qarku. Mbërtheni fundin e telit A0 në anodin e baterisë dhe qarkun GND në katodë. MOS i lidhni sërish në prizë përndryshe do të lidhni të shkurtër baterinë. Vlera 0V është lidhja e kundërt.

Pra, voltazhi i baterisë shfaqet në LCD. Mund të ketë ndonjë gabim midis vlerës dhe asaj nominale sepse bateria nuk është e ngarkuar plotësisht. Dhe kjo është arsyeja pse unë duhet të masë tensionin për të kuptuar 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.

Hej Habr! Sot dua të vazhdoj temën e "kalimit" arduino dhe android. Në një botim të mëparshëm, unë fola, dhe sot do të flasim për një voltmetër Bluetooth DIY. Një tjetër pajisje e tillë mund të quhet një voltmetër inteligjent, voltmetër "i zgjuar" ose thjesht një 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ë propozoj të fillojmë duke demonstruar funksionimin e pajisjes për të kuptuar se për çfarë do të bëhet fjalë artikulli.


Mohim përgjegjësie: artikulli është menduar për tifozin mesatar të arduino, i cili zakonisht nuk është i njohur me programimin android, prandaj, si në artikullin e mëparshëm, ne do të bëjmë një aplikacion për 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ë arduino dhe një aplikacion 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 arduino, pavarësisht se ku duhet të nxirrni informacionin: në një com-port, në një ekran të lidhur me arduino ose në një smartphone.
Rasti i parë: matje tensioni deri në 5 volt. Një ose dy rreshta kodi janë të mjaftueshme këtu 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 tensioni përdoret për të matur tensionet mbi 5 volt. Skema është shumë e thjeshtë, kodi gjithashtu.

Skicë

int analogInput = A0;
vlera notuese = 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 pavlefshëm() (
Serial.fillim(9600);
pinMode (hyrje analoge, INPUT);
}

void loop() (
vlera = analogLeximi(analogInput);
val = (vlera * 4.7) / 1024.0;
tension = val / (R2/(R1+R2));
Println serike (tensioni);
vonesë (500);
}


Arduino Uno
moduli bluetooth
Rasti i tretë. Kur duhet të jeni më të saktë në lidhje me tensionin, si tension referencë, nuk duhet të përdorni tensionin e furnizimit, i cili mund të ndryshojë pak kur furnizohet nga bateria, për shembull, por tensioni i stabilizatorit të brendshëm arduino është 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ë artikuj tematikë, por metoda e dytë është mjaft e mjaftueshme për mua, pasi furnizimi im me energji elektrike është i qëndrueshëm, 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 të App Inventor 2 për aplikacionet android. Shkojmë në sajtin appinventor.mit.edu/explore, identifikohemi duke përdorur një llogari Google, shtypim butonin "krijo, projekti i ri" dhe thjesht duke zvarritur dhe hedhur elementë ne krijojmë diçka si ky dizajn:

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ë duhet të përdorni në vend të skedarëve .jpeg, skedarë .png me sfond transparent.
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ë e përshtatshme për dikë. Si rezultat, mora këtë aplikacion:


E kuptoj që 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ë lindin 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

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 me 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ë të gjithanshme, 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. Sa për funksionet, unë e shoh kështu

  • Shfaqja e tensionit dhe rrymës aktuale, domethënë një metër volt-amper. Në parim, ju mund të reflektoni menjëherë fuqinë.
  • Llogaritja dhe shfaqja e kapacitetit të akumuluar. Në amp-orë dhe ka shumë të ngjarë në vat-orë.
  • Shfaqja e kohës së procesit
  • Dhe, ka shumë të ngjarë, pragjet e mbylljes së tensionit të poshtëm dhe të sipërm të konfigurueshëm (kufijtë e shkarkimit dhe ngarkimit)

Zhvillimi

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ë Atmega328 e thjeshtë popullore do të jetë kontrolluesi dhe do të programohet në mjedis. Arduino. Nga pikëpamja inxhinierike, zgjedhja ndoshta nuk është më e mira - kontrolluesi për detyrën është pak i trashë, 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 modulin e gatshëm Arduino Pro Mini, pasi kinezët janë gati t'i furnizojnë me pakicë për 1,5 dollarë.
  • Pajisja e ekranit do të jetë një ekran 1602 - 1,5 dollarë më shumë. Unë kam një opsion me një modul të ndërfaqes 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 zgjedhja e kontrastit - 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 vat.
  • Për të zbatuar mbylljen automatike, ju nevojitet një stafetë me kontakte të krijuara për rrymën maksimale të pajisjes dhe një tension të barabartë me tensionin e furnizimit. Për të kontrolluar stafetën, ju nevojitet një transistor npn dhe një diodë mbrojtëse.
  • Pajisja do të mundësohet nga një furnizim i jashtëm me energji elektrike, padyshim të paktën 5V. Nëse furnizimi me energji elektrike ndryshon shumë, atëherë do të kërkohet gjithashtu një stabilizues integral i tipit 7805 - ai do të përcaktojë tensionin e stafetës.
  • Kur Arduino Pro Mini do të kërkojë një konvertues USB-TTL për të ndezur firmuerin.
  • Për ta konfiguruar do t'ju duhet një multimetër.

Voltmetër

Unë jam duke zbatuar një voltmetër të thjeshtë me një interval prej 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 të zbatuar harduerin, na duhet një hyrje analoge e kontrolluesit, një ndarës nga një palë rezistencash dhe një lloj daljeje (ekrani është në një version të përfunduar, një port serik mund të përdoret për korrigjimin e gabimeve).

Parimi i matjes së ADC është të krahasohet tensioni 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 zbatohet nga një seri leximesh të njëpasnjëshme 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 sepse ë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.1 V, 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ë opsioni I2C, të cilin do ta përdor më tej. I2C ju lejon të kurseni tela (të cilat në versionin e zakonshëm janë 10, pa llogaritur dritën e pasme). 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 e modulit 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 Vref referencë e kontrolluesit gjithashtu, kështu që pas montimit, duhet të matni tensionin (të paktën furnizimin me energji elektrike) paralelisht me pajisjen tonë dhe një multimetër referencë dhe zgjidhni Vref në kod derisa leximet të përputhen. Vlen gjithashtu të përmendet se çdo ADC ka një tension të kompensuar zero (i cili prish leximet në fillim të diapazonit), por ne nuk do të thellohemi ende në këtë.

Do të jetë gjithashtu e rëndësishme të ndani furnizimin dhe "tokën" matëse. ADC-ja jonë ka një rezolucion pak më të keq se 1mV, gjë që mund të jetë problematike nëse lidhet gabimisht, veçanërisht në një tabelë. Meqenëse instalimet elektrike të tabelës së modulit tashmë janë bërë dhe ne kemi mbetur me zgjedhjen e kunjave. Moduli ka disa kunja "tokë", kështu që duhet të sigurohemi që furnizimi me energji i modulit të vijë nga një "tokë" dhe matjet nga një tjetër. Në fakt, unë përdor gjithmonë pinin e tokës më afër hyrjeve analoge për ndryshime.

Për kontrollin I2C, përdoret një variant i bibliotekës LiquidCrystal_I2C - në rastin tim, tregohet një pikë specifike e modulit I2C (kinezët prodhojnë module me kontrolle të ndryshme). Vërej gjithashtu se I2C në Arduino përfshin përdorimin e kunjave A4, A5 - në tabelën Pro Mini ato nuk janë në skaj, gjë që është e papërshtatshme për prototipizim 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 të personalizuar #define LCD_I2C_ADDR 0x27 #define BACKLIGHT 3 #define LCD_EN 2 #define LCD_RW 1 #define LCD_RW 1 #define LCD_RW 1 #define 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); // Koha e rifreskimit, ms (200-2000) #define REFRESH_TIME 330 // Hyrja analoge #define PIN_VOLT A0 // Tensioni i brendshëm i referencës (zgjidh) 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; // Konverto në volt (Vlera: 0..1023 -> (0..VRef) shkallëzuar nga Mult) Volt = InVolt * VoltMult * VRef / 1023; // Shfaq të dhënat lcd.setCursor(0, 1); LCD.print(Volt); lcd.print("V"); )

Artikujt kryesorë të lidhur