ზუსტი ძაბვის მრიცხველი arduino-სთვის. Bluetooth ვოლტმეტრი არდუინოს საფუძველზე

მრავალფუნქციური Arduino ასამბლეები ფართო ინტერესს იწვევს ხელნაკეთი ელექტრონულად პროგრამირებადი მოწყობილობების მოყვარულთათვის, რაც მათ საშუალებას აძლევს გააცოცხლონ საინტერესო იდეები.

მზა არდუინოს სქემების მთავარი უპირატესობა არის უნიკალური ბლოკ-მოდულური პრინციპი: თითოეულ დაფას შეიძლება დაემატოს დამატებითი ინტერფეისები, რაც გაუთავებლად აფართოებს სხვადასხვა პროექტების შექმნის შესაძლებლობებს.

Arduino მოდულებიაგებულია უნივერსალურ მიკროკონტროლერზე საკუთარი ჩამტვირთველით, რაც აადვილებს მის გამორთვას საჭირო პროგრამის კოდით, დამატებითი მოწყობილობების გამოყენების გარეშე. პროგრამირება ხორციელდება სტანდარტულ C++ ენაზე.

Arduino-ს გამოყენების ერთ-ერთი უმარტივესი მაგალითი შეიძლება იყოს ამ შეკრებაზე დაფუძნებული მაღალი სიზუსტის DC ვოლტმეტრის დანერგვა, რომლის დიაპაზონი 0-დან 30 ვ-მდეა.

Arduino-ს ანალოგური შეყვანა განკუთვნილია არაუმეტეს ხუთი ვოლტის მუდმივი ძაბვისთვის, ამიტომ მათი გამოყენება ამ მნიშვნელობაზე მეტი ძაბვის დროს შესაძლებელია ძაბვის გამყოფით.


არედუინოს შეერთების დიაგრამა ძაბვის გამყოფის საშუალებით

ძაბვის გამყოფი შედგება ორი წინააღმდეგობისგან, რომლებიც დაკავშირებულია სერიაში. იგი გამოითვლება ფორმულის გამოყენებით:

გარე USB კონექტორი მანქანის რადიოში

სასარგებლო დიაგრამა წარმოდგენილია მათთვის, ვისაც უყვარს Arduino-ს ექსპერიმენტები. ეს არის მარტივი ციფრული ვოლტმეტრი, რომელსაც შეუძლია საიმედოდ გაზომოს DC ძაბვა 0 - 30 ვ დიაპაზონში. Arduino-ს დაფა, როგორც ყოველთვის, შეიძლება იკვებებოდეს 9 ვ ბატარეით.

როგორც მოგეხსენებათ, Arduino-ს ანალოგური შეყვანები შეიძლება გამოყენებულ იქნას DC ძაბვის გასაზომად 0 - 5 ვ დიაპაზონში და ეს დიაპაზონი შეიძლება გაიზარდოს.
ორი რეზისტორების გამოყენებით ძაბვის გამყოფად. გამყოფი შეამცირებს გაზომილ ძაბვას Arduino ანალოგური შეყვანის დონემდე. და შემდეგ პროგრამა გამოთვლის ძაბვის რეალურ მნიშვნელობას.

Arduino-ს დაფაზე ანალოგური სენსორი აღმოაჩენს ძაბვის არსებობას ანალოგურ შესასვლელში და გარდაქმნის მას ციფრულ ფორმაში მიკროკონტროლერის მიერ შემდგომი დამუშავებისთვის. ფიგურაში ძაბვა მიეწოდება ანალოგურ შეყვანას (A0) ძაბვის მარტივი გამყოფის მეშვეობით, რომელიც შედგება რეზისტორებისგან R1 (100 kOhm) და R2 (10 kOhm).

ამ გამყოფი მნიშვნელობებით, Arduino დაფას შეიძლება მიეწოდოს ძაბვა 0-დან
55 ვ. A0 შესასვლელში გვაქვს გაზომილი ძაბვა გაყოფილი 11-ზე, ანუ 55V / 11=5V. სხვა სიტყვებით რომ ვთქვათ, Arduino-ს შესასვლელში 55 ვ-ის გაზომვისას გვაქვს მაქსიმალური დასაშვები მნიშვნელობა 5 ვ. პრაქტიკაში, უმჯობესია ამ ვოლტმეტრზე დაწეროთ დიაპაზონი "0 - 30V" ისე, რომ ის დარჩეს
უსაფრთხოების ზღვარი!

შენიშვნები

თუ ჩვენების ჩვენებები არ ემთხვევა სამრეწველო (ლაბორატორიული) ვოლტმეტრის ჩვენებებს, მაშინ აუცილებელია ზუსტი ხელსაწყოთი გაზომოთ წინაღობის R1 ​​და R2 მნიშვნელობები და ჩასვათ ეს მნიშვნელობები R1=100000.0 და R2= ნაცვლად. პროგრამის კოდში 10000.0. შემდეგ თქვენ უნდა გაზომოთ რეალური ძაბვა არდუინოს დაფის 5V და „Ground“ ქინძისთავებს შორის ლაბორატორიული ვოლტმეტრით. შედეგი იქნება 5 ვ-ზე ნაკლები მნიშვნელობა, მაგალითად, ეს იქნება 4.95 ვ. ეს რეალური მნიშვნელობა უნდა იყოს ჩასმული კოდის ხაზში
Vout = (მნიშვნელობა * 5.0) / 1024.0 5.0-ის ნაცვლად.
ასევე, შეეცადეთ გამოიყენოთ ზუსტი რეზისტორები ტოლერანტობით 1%.

რეზისტორები R1 და R2 უზრუნველყოფენ გაზრდილი შეყვანის ძაბვისგან გარკვეულ დაცვას, თუმცა გახსოვდეთ, რომ ნებისმიერმა ძაბვამ შეიძლება დააზიანოს Arduino დაფა. გარდა ამისა, ეს დიზაინი არ უზრუნველყოფს სხვა სახის დაცვას (ელექტროენერგიის ტალღებისგან, პოლარობის შებრუნებისგან ან გადაჭარბებული ძაბვისგან).

ციფრული ვოლტმეტრის პროგრამა

/*
DC ვოლტმეტრი
Arduino DVM, რომელიც დაფუძნებულია ძაბვის გამყოფის კონცეფციაზე
T.K.Hareendran
*/
#შეიცავს
LiquidCrystal LCD (7, 8, 9, 10, 11, 12);
int analogInput = 0;
float vout = 0.0;
float vin = 0.0;
ათწილადი R1 = 100000.0; // R1-ის წინააღმდეგობა (100K) -იხილეთ ტექსტი!
ათწილადი R2 = 10000.0; // R2-ის წინააღმდეგობა (10K) – იხილეთ ტექსტი!
int მნიშვნელობა = 0;
void setup())(
pinMode(analogInput, INPUT);
lcd.begin(16, 2);
lcd.print ("DC VOLTMETER");
}
void loop ()
// წაიკითხეთ მნიშვნელობა ანალოგური შეყვანისას
მნიშვნელობა = analogRead(analogInput);
vout = (მნიშვნელობა * 5.0) / 1024.0; // იხილეთ ტექსტი
vin = vout / (R2/(R1+R2));
თუ (ვინ<0.09) {
vin=0.0;//განცხადება არასასურველი წაკითხვის გასაუქმებლად!
}
lcd.setCursor(0, 1);
lcd.print(“INPUT V=“);
lcd.print(vin);
დაგვიანებით (500);
}

არდუინო-ვოლტმეტრის სქემატური დიაგრამა

კომპონენტების სია

Arduino Uno დაფა
100 kOhm რეზისტორი
10 kOhm რეზისტორი
100 ომიანი რეზისტორი
10 kOhm ტრიმერის რეზისტორი
LCD დისპლეი 16?2 (Hitachi HD44780)

არის შემთხვევები, როდესაც გსურთ შეამოწმოთ ძაბვა ან წრეში რაღაც წერტილი, მაგრამ ხელთ არ გაქვთ ვოლტმეტრი ან მულტიმეტრი? გაიქცე საყიდლად? გრძელი და ძვირია. სანამ ამას გააკეთებ, რას იტყვი შენ თვითონ ააშენო ვოლტმეტრი? სინამდვილეში, მარტივი ინგრედიენტებით შეგიძლიათ გააკეთოთ ის თავად.

  • გაკვეთილზე გამოვიყენეთ Arduino-სთან თავსებადი დაფა - SunFounder Uno / Mars (http://bit.ly/2tkaMba)
  • USB მონაცემთა კაბელი
  • 2 პოტენციომეტრი (50k)
  • LCD1602 - http://bit.ly/2ubNEfi
  • განვითარების დაფა - http://bit.ly/2slvfrB
  • მრავალჯერადი მხტუნავები

დაკავშირებამდე, მოდით გადავხედოთ როგორ მუშაობს.

გამოიყენეთ SunFounder Uno დაფა ვოლტმეტრის მონაცემთა დამუშავების ძირითადი ნაწილისთვის, LCD1602 როგორც ეკრანი, პოტენციომეტრი LCD კონტრასტის დასარეგულირებლად და მეორე ძაბვის გასაყოფად.

როდესაც თქვენ ატრიალებთ Uno დაფასთან დაკავშირებულ პოტენციომეტრს, იცვლება პოტენციომეტრის რეზისტორი, რითაც იცვლება მასზე ძაბვა. ძაბვის სიგნალი გადაეგზავნება Uno დაფაზე A0 pin-ის საშუალებით, ხოლო Uno გადააქცევს მიღებულ ანალოგურ სიგნალს ციფრულ ფორმაში და ჩაიწერს LCD-ზე. ამ გზით თქვენ შეგიძლიათ ნახოთ ძაბვის მნიშვნელობა მიმდინარე ტევადობის წინააღმდეგობაზე.

LCD1602 აქვს ორი ოპერაციული რეჟიმი: 4-ბიტიანი და 8-ბიტიანი. როდესაც MCU IO არასაკმარისია, შეგიძლიათ აირჩიოთ 4-ბიტიანი რეჟიმი, რომელიც იყენებს მხოლოდ D4~D7 პინებს.

მიჰყევით ცხრილს მათ დასაკავშირებლად.

ნაბიჯი 4: შეაერთეთ პოტენციომეტრი LCD1602-თან

შეაერთეთ პოტენციომეტრის შუა პინი Vo pin-ზე LCD1602-ზე და ნებისმიერი სხვა პინი GND-ს.

შეაერთეთ პოტენციომეტრის შუა პინი SunFounder Uno-დან A0-ზე, ხოლო ერთი სხვა 5 ვ-ზე, ხოლო მეორე GND-ზე.

ნაბიჯი 6: ატვირთეთ კოდი

ეს კოდი:

#შეიცავს /************************************************ ******* *****/ const int analogIn = A0;//პოტენციომეტრი მიამაგრეთ A0 LiquidCrystal LCD(4, 6, 10, 11, 12, 13);//LCd(RS,E,D4 ,D5,D6.D7) float val = 0;// განსაზღვრეთ ცვლადი როგორც value=0 /**************************** ******* *****************/ void setup() ( Serial.begin(9600);//Serial lcd.begin(16, 2) ინიციალიზაცია ;//დააყენეთ სიმბოლოების პოზიცია LCD-ზე, როგორც Line 2, Column 16 lcd.print("Voltage Value:");//print "Voltage Value:" ) /*********** ****** **************************************/ void loop() ( val = analogRead (A0);//პოტენციომეტრის მნიშვნელობის წაკითხვა val val = val/1024*5.0;// მონაცემების შესაბამის ძაბვის მნიშვნელობაზე გადაყვანა მათემატიკური გზით Serial.print(val);//Val-ის რაოდენობის ამობეჭდვა სერიულ მონიტორზე Serial.print ("V"); აქ სიმბოლოები უნდა იყოს ნაჩვენები lcd.print(val);//დაბეჭდეთ val-ების რაოდენობა LCD-ზე lcd.print("V");//შემდეგ დაბეჭდეთ ერთეული როგორც V, მოკლედ ძაბვა LCD-ზე delay( 200); //დაელოდეთ 200 ms )

დაატრიალეთ პოტენციომეტრი, რათა შეამოწმოთ ძაბვა LCD1602-ზე რეალურ დროში.

აქ არის სახიფათო რამ. კოდის გაშვების შემდეგ LCD ეკრანმა აჩვენა სიმბოლოები. შემდეგ დავარეგულირე ეკრანის კონტრასტი (ეტაპობრივი ცვლილება შავიდან თეთრამდე) პოტენციომეტრის საათის ისრის მიმართულებით ან საწინააღმდეგო ისრის მიმართულებით, სანამ ეკრანი აშკარად არ გამოაჩენდა სიმბოლოებს.

აიღეთ ორი ბატარეა მათი ძაბვის გასაზომად: 1,5 ვ და 3,7 ვ. გახსენით მეორე პოტენციომეტრის კავშირი A0 და GND პინთან, რაც ნიშნავს პოტენციომეტრის ამოღებას წრედიდან. მიამაგრეთ A0 მავთულის ბოლო ბატარეის ანოდზე და GND წრე კათოდზე. არ შეაერთოთ ისინი, წინააღმდეგ შემთხვევაში მოკლე ჩართავთ ბატარეას. მნიშვნელობა 0V არის საპირისპირო კავშირი.

ამრიგად, ბატარეის ძაბვა ნაჩვენებია LCD ეკრანზე. შეიძლება იყოს გარკვეული შეცდომა მნიშვნელობასა და ნომინალურ მნიშვნელობას შორის, რადგან ბატარეა სრულად არ არის დატენილი. და ამიტომ უნდა გავზომო ძაბვა, რომ გავიგო შემიძლია თუ არა ბატარეის გამოყენება.

PS:თუ ეკრანზე დისპლეის პრობლემა გაქვთ - იხილეთ ეს ხშირად დასმული კითხვები LCD ეკრანებისთვის - http://wiki.sunfounder.cc/index.php?title=LCD1602/I2C_LCD1602_FAQ.

საწყისი მონაცემები და გადახედვა

ასე რომ, ამ ეტაპზე გვაქვს მუდმივი ძაბვის ვოლტმეტრი 0..20 ვ ლიმიტით (იხ. წინა ნაწილი). ახლა მას ვუმატებთ 0..5ა ამპერმეტრს. ამისათვის ჩვენ ოდნავ ვცვლით წრედს - ის გახდება გამტარი წრე, ანუ მას აქვს როგორც შემავალი, ასევე გამომავალი.

LCD-ზე დისპლეის ნაწილი ამოვიღე - არ შეიცვლება. პრინციპში, მთავარი ახალი ელემენტია 0.1 Ohm Rx შუნტი. R1-C1-VD1 ჯაჭვი ემსახურება ანალოგური შეყვანის დაცვას. აზრი აქვს იგივეს დაყენებას A0 შეყვანისას. ვინაიდან ჩვენ ვვარაუდობთ საკმაოდ დიდ დენებს, არსებობს ინსტალაციის მოთხოვნები - ელექტროგადამცემი ხაზები უნდა გაკეთდეს საკმაოდ სქელი მავთულით და პირდაპირ იყოს დაკავშირებული შუნტის ტერმინალებთან (სხვა სიტყვებით რომ ვთქვათ, შედუღებული), წინააღმდეგ შემთხვევაში წაკითხვები შორს იქნება რეალობისგან. ასევე არის შენიშვნა დენის შესახებ - პრინციპში, საცნობარო ძაბვა 1.1 ვ საშუალებას გაძლევთ დაარეგისტრიროთ იგი შუნტზე 0.1 Ohm დენი 11 ამპერამდე, 0.01a-ზე ოდნავ უარესი სიზუსტით, მაგრამ როდესაც ასეთი ძაბვა დაეცემა Rx-ზე, გამოშვებული სიმძლავრე გადააჭარბებს 10 W-ს, რაც სულაც არ არის სახალისო. პრობლემის გადასაჭრელად, შეგიძლიათ გამოიყენოთ გამაძლიერებელი 11-იანი მომატებით, მაღალი ხარისხის ოპ-გამაძლიერებლის და 10 mOhm (0.01 Ohm) შუნტის გამოყენებით. მაგრამ ახლა ჩვენ არ გავართულებთ ჩვენს ცხოვრებას და უბრალოდ შევზღუდავთ დენს 5A-მდე (ამ შემთხვევაში, Rx სიმძლავრე შეიძლება შეირჩეს 3-5 ვტ-ის რიგით).

ამ ეტაპზე სიურპრიზი მელოდა - აღმოჩნდა, რომ კონტროლერის ADC-ს ჰქონდა საკმაოდ დიდი ნულოვანი ოფსეტი - დაახლოებით -3 მვ. ანუ, ADC უბრალოდ ვერ ხედავს სიგნალებს 3 მვ-ზე ნაკლებზე, ხოლო ოდნავ უფრო მაღალი დონის სიგნალები ჩანს -3 მვ-ის დამახასიათებელი უზუსტობით, რაც აფუჭებს წრფივობას დიაპაზონის დასაწყისში. სწრაფმა ძიებამ არ მისცა რაიმე აშკარა მითითება ასეთ პრობლემაზე (ნულოვანი ოფსეტი ნორმალურია, მაგრამ ის მნიშვნელოვნად მცირე უნდა იყოს), ასე რომ, სავსებით შესაძლებელია, რომ ეს იყოს პრობლემა კონკრეტული Atmega 328-ის მაგალითზე ორმაგი - ძაბვაში - პროგრამული ნაბიჯი დიაპაზონის დასაწყისში (ჩვენება იწყება 0,06 ვოლტიდან), დენისთვის - აწევის რეზისტორი 5 ვ ავტობუსზე. რეზისტორი მითითებულია წერტილოვანი ხაზით.

წყაროს კოდი

ამ ვოლტ-ამპერმეტრის სრული ვერსია (I2C ვერსიაში) შეგიძლიათ ჩამოტვირთოთ სტატიის ბოლოს მოცემული ბმულიდან.შემდეგ მე ვაჩვენებ ცვლილებებს წყაროს კოდში. დამატებულია ანალოგური შეყვანის A1 წაკითხვა იგივე საშუალოდ, როგორც ვოლტმეტრისთვის. არსებითად, ეს არის იგივე ვოლტმეტრი, მხოლოდ გამყოფის გარეშე და ვიღებთ ამპერებს Ohm-ის ფორმულის გამოყენებით: I = U/Rx (მაგალითად, თუ ძაბვის ვარდნა Rx = 0.01 V-ზე, მაშინ დენი არის 0.1A). მე ასევე შემოვიღე მიმდინარე მომატების მუდმივი AmpMult - მომავლისთვის. AmpRx მუდმივი შუნტის წინააღმდეგობასთან ალბათ უნდა შეესაბამებოდეს შუნტის რეზისტორის უზუსტობის გათვალისწინებას. კარგი, რადგან ეს უკვე ვოლტ-ამპერმეტრია და 1602 დისპლეზე ჯერ კიდევ რჩება ადგილი, რჩება ენერგიის მიმდინარე მოხმარების ჩვენება ვატებში, მარტივი დამატებითი ფუნქციონირების მოპოვებით.

.... // ანალოგური შეყვანა #define PIN_VOLT A0 #define PIN_AMP A1 // შიდა საცნობარო ძაბვა (არჩევა) const float VRef = 1.10; // შეყვანის წინააღმდეგობის გამყოფი კოეფიციენტი (Rh + Rl) / Rl. IN 0.2) ინვოლტი += 3;

// კონვერტაცია ვოლტებად (In: 0..1023 -> (0..VRef) მასშტაბირება Mult-ით) float Volt = InVolt * VoltMult * VRef / 1023;



რაიმე შეკითხვა?

შეატყობინეთ შეცდომას

ტექსტი, რომელიც გაეგზავნება ჩვენს რედაქტორებს: