نحوه راه اندازی گوشی های هوشمند و رایانه های شخصی. پرتال اطلاعاتی
  • خانه
  • برنامه ها
  • ولت متر دیجیتال در آردوینو با اتصال به کامپیوتر از طریق پورت سریال. ولت متر مخفی در آردوینو - اندازه گیری ولتاژ باتری با استفاده از میکروکنترلر

ولت متر دیجیتال در آردوینو با اتصال به کامپیوتر از طریق پورت سریال. ولت متر مخفی در آردوینو - اندازه گیری ولتاژ باتری با استفاده از میکروکنترلر

هی هابر! امروز می خواهم مبحث "تقاطع" آردوینو و اندروید را ادامه دهم. در مقاله قبلی، من در مورد دستگاه بلوتوث صحبت کردم و امروز در مورد یک ولت متر بلوتوث DIY صحبت خواهیم کرد. یکی دیگر از این دستگاه ها را می توان ولت متر هوشمند، ولت متر "هوشمند" یا فقط یک ولت متر هوشمند، بدون نقل قول نامید. نام خانوادگی از نظر دستور زبان روسی نادرست است، با این حال، اغلب در رسانه ها یافت می شود. رای گیری در مورد این موضوع در پایان مقاله خواهد بود و من پیشنهاد می کنم با نشان دادن عملکرد دستگاه شروع کنیم تا بفهمیم مقاله در مورد چیست.


سلب مسئولیت: این مقاله برای طرفداران معمولی آردوینو در نظر گرفته شده است که معمولاً با برنامه نویسی اندروید آشنایی ندارند، بنابراین مانند مقاله قبلی با استفاده از محیط توسعه بصری App Inventor 2 برای برنامه های اندرویدی یک اپلیکیشن گوشی هوشمند می سازیم.
برای ساختن یک ولت متر بلوتوث DIY، باید دو برنامه نسبتاً مستقل بنویسیم: یک طرح آردوینو و یک برنامه اندروید. اجازه دهید با یک طرح شروع کنیم.
برای شروع، باید بدانید که سه گزینه اصلی برای اندازه‌گیری ولتاژ با استفاده از آردوینو وجود دارد، صرف نظر از اینکه در کجا باید اطلاعات خروجی بگیرید: به یک پورت کام، صفحه‌نمایش متصل به آردوینو یا گوشی هوشمند.
حالت اول: اندازه گیری ولتاژ تا 5 ولت. یک یا دو خط کد در اینجا کافی است و ولتاژ مستقیماً به پایه A0 اعمال می شود:
int value = analogRead(0);// خواندن قرائت از A0
ولتاژ = (مقدار / 1023.0) * 5; // فقط در صورتی درست است که Vcc = 5.0 ولت باشد
حالت دوم: از تقسیم کننده ولتاژ برای اندازه گیری ولتاژ بالای 5 ولت استفاده می شود. این طرح بسیار ساده است، کد نیز.

طرح

int analogInput = A0;
مقدار شناور = 0.0;
ولتاژ شناور = 0.0;
شناور R1 = 100000.0; //Battery Vin -> 100K -> A0
شناور R2 = 10000.0; //Battery Gnd -> Arduino Gnd و Arduino Gnd -> 10K -> A0
مقدار int = 0;

تنظیم خالی () (
Serial.begin(9600);
pinMode (Input analog، INPUT)؛
}

حلقه خالی() (
value = analogRead(analogInput);
val = (مقدار * 4.7) / 1024.0;
ولتاژ = val / (R2/(R1+R2));
پرینت سریال (ولتاژ)؛
تاخیر (500);
}


آردوینو اونو
ماژول بلوتوث
مورد سوم. هنگامی که نیاز به دقت بیشتر در مورد ولتاژ دارید، به عنوان یک ولتاژ مرجع، باید از ولتاژ منبع تغذیه استفاده نکنید، که مثلاً با تغذیه از باتری می تواند کمی تغییر کند، اما ولتاژ تثبیت کننده داخلی آردوینو 1.1 ولت است. در اینجا مدار یکسان است، اما کد کمی طولانی تر است. من این گزینه را با جزئیات تجزیه و تحلیل نمی کنم، زیرا قبلاً در مقالات موضوعی به خوبی توضیح داده شده است، اما روش دوم برای من کاملاً کافی است، زیرا منبع تغذیه من از درگاه USB لپ تاپ پایدار است.
بنابراین ما اندازه گیری ولتاژ را فهمیدیم، حالا بیایید به نیمه دوم پروژه برویم: ایجاد یک برنامه اندروید. ما برنامه را مستقیماً از مرورگر در محیط توسعه بصری App Inventor 2 برای برنامه‌های اندروید می‌سازیم. به سایت appinventor.mit.edu/explore می‌رویم، با استفاده از حساب Google وارد سیستم می‌شویم، دکمه ایجاد، پروژه جدید را فشار می‌دهیم و با کشیدن و رها کردن عناصر به سادگی چیزی شبیه به این طرح ایجاد می کنیم:

من گرافیک را خیلی ساده کردم، اگر کسی گرافیک جالب تری می خواهد، به شما یادآوری کنم که برای این کار باید به جای فایل های jpeg از فایل های png. با پس زمینه شفاف استفاده کنید.
حالا به تب Blocks رفته و منطق برنامه را در آنجا ایجاد کنید:


اگر همه چیز درست شد، می توانید روی دکمه Build کلیک کنید و apk. را در رایانه من ذخیره کنید، و سپس برنامه را دانلود و بر روی تلفن هوشمند خود نصب کنید، اگرچه راه های دیگری برای آپلود برنامه وجود دارد. اینجا برای کسی راحت تر است. در نتیجه، من این برنامه را دریافت کردم:


من می دانم که افراد کمی از محیط توسعه بصری App Inventor 2 برای برنامه های اندرویدی در پروژه های خود استفاده می کنند، بنابراین ممکن است سوالات زیادی در مورد کار در آن ایجاد شود. برای حذف برخی از این سوالات، یک ویدیوی دقیق در مورد نحوه ساخت چنین برنامه ای از ابتدا تهیه کردم (برای مشاهده آن باید به YouTube بروید):

P.S. مجموعه ای از بیش از 100 آموزش آردوینو برای مبتدیان و حرفه ای ها

این مقاله نحوه اتصال آردوینو و کامپیوتر و انتقال داده ها از ADC به کامپیوتر را نشان می دهد. برنامه ویندوز با استفاده از Visual C++ 2008 Express نوشته شده است. برنامه ولت متر بسیار ساده است و جای پیشرفت زیادی دارد. هدف اصلی آن نمایش کار با پورت COM و تبادل داده بین کامپیوتر و آردوینو بود.

ارتباط بین آردوینو و کامپیوتر:

  • خواندن از ADC زمانی شروع می شود که کامپیوتر دستورات 0xAC و 0x1y را به آردوینو ارسال می کند. در– شماره کانال ADC (0-2)؛
  • خواندن پس از دریافت دستورات 0xAC و 0x00 توسط آردوینو متوقف می شود.
  • در طول خواندن، آردوینو دستورات 0xAB 0xaa 0xbb را هر 50 میلی‌ثانیه به کامپیوتر ارسال می‌کند که aa و bb حداکثر و حداقل اندازه‌گیری هستند.

برنامه برای آردوینو

می توانید اطلاعات بیشتری در مورد ارتباط سریال در arduino.cc بخوانید. این برنامه بسیار ساده است، بیشتر آن با یک پورت موازی کار می کند. پس از پایان خواندن داده ها از ADC، مقدار ولتاژ 10 بیتی (0x0000 - 0x0400) را در قالب متغیرهای 16 بیتی (INT) دریافت می کنیم. پورت سریال (RS-232) به شما امکان می دهد داده ها را در بسته های 8 بیتی انتقال دهید. لازم است متغیرهای 16 بیتی را به 2 قسمت 8 بیتی تقسیم کنیم.

Serial.print(ولتاژ>>8,BYTE);

Serial.print(ولتاژ%256,BYTE);

بایت های متغیر را 8 بیت به سمت راست منتقل می کنیم و سپس بر 256 تقسیم می کنیم و نتیجه را برای کامپیوتر ارسال می کنیم.

می توانید سورس کد کامل نرم افزار آردوینو را دانلود کنید

ویژوال C++

من فرض می کنم شما در حال حاضر دانش اولیه برنامه نویسی C++ برای ویندوز دارید، اگر نه، پس از Google استفاده کنید. اینترنت پر از آموزش برای مبتدیان است.

اولین کاری که باید انجام دهید این است که پورت سریال را از نوار ابزار به فرم پایین اضافه کنید. این به شما امکان می دهد برخی از پارامترهای مهم پورت سریال را تغییر دهید: نام پورت، نرخ باود، نرخ بیت. این برای اضافه کردن کنترل ها به پنجره برنامه، برای تغییر این تنظیمات در هر زمان، بدون کامپایل مجدد برنامه مفید است. من فقط از گزینه انتخاب پورت استفاده کردم.

پس از جستجوی پورت های سریال موجود، اولین پورت به صورت پیش فرض انتخاب می شود. چگونه انجام می شود:

آرایه< String ^>^serialPorts=nullptr;

serialPorts = serialPort1->GetPortNames();

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

this->comboBox1->SelectedIndex=0;

پورت سریال در رایانه شخصی فقط توسط یک برنامه در یک زمان قابل استفاده است، بنابراین درگاه باید قبل از استفاده باز باشد و بسته نشود. دستورات ساده برای این:

serialPort1->Open();

serialPort1->Close();

برای خواندن صحیح داده ها از پورت سریال، باید از رویدادها استفاده کنید (در مورد ما، وقفه). انتخاب نوع رویداد:

هنگامی که روی "DataReceived" دوبار کلیک کنید، لیست کشویی باز می شود.

کد رویداد به طور خودکار تولید می شود:

اگر اولین بایت وارد شده به پورت سریال 0xAB باشد، اگر این بدان معناست که بقیه بایت ها داده های ولتاژ را حمل می کنند.

private: System:: Void serialPort1_DataReceived(System::Object^ فرستنده، System::IO::Ports::SerialDataReceivedEventArgs^ e) (

char unsigned data0, data1;

if (SerialPort1->ReadByte()==0xAB) (

data0=serialPort1->ReadByte();

data1=serialPort1->ReadByte();

ولتاژ=ریاضی::Round((float(data0*256+data1)/1024*5.00),2);

data_count ++;

serialPort1->ReadByte();

نوشتن و خواندن داده های پورت سریال

برای من یک مشکل کوچک ارسال داده های RAW هگز از طریق پورت سریال بود. از دستور Write() استفاده شد. اما با سه آرگومان: آرایه، شماره بایت شروع، تعداد بایت‌های برای نوشتن.

خصوصی: سیستم:: دکمه خالی2_کلیک_1(سیستم::شیء^ فرستنده، سیستم::EventArgs^ e) (

کانال char بدون امضا=0;

channel=this->listBox1->SelectedIndex;

آرایه^شروع =(0xAC,(0x10+کانال));

آرایه^توقف =(0xAC,0x00);

serialPort1->Write(start,0,2);

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

) دیگر (

serialPort1->Write(stop,0,2);

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

همین!

مقاله اصلی به زبان انگلیسی (ترجمه: الکساندر کاسیانوفبرای سایت cxem.net)

این مقاله یک طرح جالب برای دوستداران آزمایش و آردوینو. این یک ولت متر دیجیتال ساده ارائه می دهد که می تواند با خیال راحت ولتاژ DC را در محدوده 0 تا 30 ولت اندازه گیری کند. خود برد آردوینو می تواند از منبع تغذیه استاندارد 9 ولت تغذیه شود.



همانطور که می دانید با استفاده از ورودی آنالوگ آردوینو می توانید ولتاژ 0 تا 5 ولت (با ولتاژ مرجع استاندارد 5 ولت) را اندازه گیری کنید. اما این محدوده را می توان با استفاده از یک تقسیم کننده ولتاژ افزایش داد.


تقسیم کننده ولتاژ اندازه گیری شده را تا حد قابل قبولی برای ورودی آنالوگ کاهش می دهد. کد ویژه نوشته شده سپس ولتاژ واقعی را محاسبه می کند.



سنسور آنالوگ در آردوینو ولتاژ ورودی آنالوگ را تشخیص می دهد و آن را به فرمت دیجیتالی که توسط میکروکنترلر پذیرفته می شود تبدیل می کند. به ورودی آنالوگ A0 یک تقسیم کننده ولتاژ تشکیل شده توسط مقاومت های R1 (100K) و R2 (10K) وصل می کنیم. با این مقادیر مقاومت، می توان تا 55 ولت را به آردوینو عرضه کرد، زیرا ضریب تقسیم در این مورد 11 است، بنابراین 55V/11=5V است. برای اطمینان از ایمنی اندازه گیری های برد، بهتر است ولتاژ را در محدوده 0 تا 30 ولت اندازه گیری کنید.



اگر نمایشگر با ولت متر کالیبره شده مطابقت ندارد، از یک مولتی متر دیجیتال دقیق برای یافتن مقادیر دقیق R1 و R2 استفاده کنید. در این صورت، در کد، باید R1=100000.0 و R2=10000.0 را با مقادیر خود جایگزین کنید. سپس ارزش آن را دارد که قدرت را با اندازه گیری ولتاژ روی برد بین 5 ولت و GND بررسی کنید. ولتاژ می تواند 4.95 V باشد. سپس در کد vout = (مقدار * 5.0) / 1024.0 باید 5.0 را با 4.95 جایگزین کنید. توصیه می شود از مقاومت های دقیق با خطای بیش از 1٪ استفاده کنید. به یاد داشته باشید که ولتاژ بالای 55 ولت می تواند به برد آردوینو آسیب برساند!



#عبارتند از ال سی دی LiquidCrystal (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()( // read value value = analogRead(analogInput)؛ vout = (مقدار * 5.0) / 1024.0؛ vin = vout / (R2/(R1+R2))؛ اگر (vin<0.09) { vin=0.0;// обнуляем нежелательное значение } lcd.setCursor(0, 1); lcd.print("INPUT V= "); lcd.print(vin); delay(500); }


عناصر مورد استفاده:


برد آردوینو Uno
مقاومت 100 کیلو اهم
مقاومت 10 کیلو اهم
مقاومت 100 اهم
پتانسیومتر 10 کیلو اهم
صفحه نمایش LCD 16×2

آیا مواقعی وجود دارد که بخواهید ولتاژ یا نقطه ای از مدار را بررسی کنید، اما ولت متر یا مولتی متر در دسترس ندارید؟ دویدن برای خرید؟ طولانی و گران است. قبل از اینکه این کار را انجام دهید، در مورد ساخت ولت متر خود چطور؟ در واقع با اجزای ساده می توانید خودتان آن را بسازید.

  • در آموزش، ما از یک برد سازگار با آردوینو استفاده کردیم - SunFounder Uno / Mars (http://bit.ly/2tkaMba)
  • کابل داده USB
  • 2 پتانسیومتر (50k)
  • LCD1602 - http://bit.ly/2ubNEfi
  • تخته نان - http://bit.ly/2slvfrB
  • پرش های متعدد

قبل از اتصال، بیایید ابتدا نحوه عملکرد آن را درک کنیم.

از برد SunFounder Uno برای قسمت اصلی پردازش داده های ولت متر، LCD1602 به عنوان صفحه، یک پتانسیومتر برای تنظیم کنتراست LCD و دیگری برای تقسیم ولتاژ استفاده کنید.

هنگامی که یک پتانسیومتر متصل به برد Uno را می چرخانید، مقاومت پتانسیومتر تغییر می کند و در نتیجه ولتاژ دو طرف آن تغییر می کند. سیگنال ولتاژ از طریق پین A0 به برد Uno ارسال می شود و Uno سیگنال آنالوگ دریافتی را به شکل دیجیتال تبدیل کرده و روی LCD می نویسد. بنابراین می توانید مقدار ولتاژ را در مقاومت خازنی جریان مشاهده کنید.

LCD1602 دارای دو حالت 4 بیتی و 8 بیتی است. هنگامی که IO MCU کافی نیست، می توانید حالت 4 بیتی را انتخاب کنید که فقط از پین های D4 ~ D7 استفاده می کند.

برای اتصال آنها جدول را دنبال کنید.

مرحله 4: پتانسیومتر را به LCD1602 وصل کنید

پایه وسط پتانسیومتر را به پین ​​Vo در LCD1602 و هر یک از پایه های دیگر را به GND وصل کنید.

پایه وسط پتانسیومتر را به پایه A0 SunFounder Uno و یکی از پایه های دیگر را به 5 ولت وصل کنید در حالی که دیگری به GND است.

مرحله 6: آپلود کد

کد مانند این است:

#عبارتند از /*********************************************** ***** *****/ const int analogIn = A0;//پتانسیومتر به ال سی دی LiquidCrystal A0 (4, 6, 10, 11, 12, 13);//lcd (RS,E,D4,D5) متصل شود ,D6.D7) float val = 0;// متغیر را به صورت value=0 تعریف کنید /******************************** ***** *****************/ void setup() ( Serial.begin(9600);//Initialize the 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 ("V")؛ // چاپ واحد به صورت V، مختصر ولتاژ در مانیتور سریال lcd setCursor(6,1)؛ // مکان نما را در خط 1، ستون 6 قرار دهید. در اینجا کاراکترها باید نمایش داده شوند lcd.print(val);//تعداد v را چاپ کنید al بر روی LCD lcd.print("V");//سپس واحد را به صورت V چاپ کنید، کوتاه برای ولتاژ در LCD delay(200); //200 میلی‌ثانیه صبر کنید)

پتانسیومتر را بچرخانید تا ولتاژ LCD1602 را در زمان واقعی بررسی کنید.

در اینجا یک مشکل است. بعد از اینکه کد را اجرا کردم، ال سی دی نمادها را نشان داد. سپس کنتراست صفحه را تنظیم کردم (تغییر تدریجی از سیاه به سفید) با چرخاندن پتانسیومتر در جهت عقربه های ساعت یا خلاف جهت عقربه های ساعت تا زمانی که صفحه نمایش کاراکترها را به وضوح نشان دهد.

دو باتری را برای اندازه گیری ولتاژ آنها بردارید: 1.5 ولت و 3.7 ولت. اتصال پتانسیومتر دوم را به پایه A0 و GND باز کنید، یعنی پتانسیومتر را از مدار خارج کنید. انتهای سیم A0 را به آند باتری و مدار GND را به کاتد ببندید. آنها را دوباره به برق وصل نکنید در غیر این صورت با باتری اتصال کوتاه خواهید داشت. مقدار 0V اتصال معکوس است.

بنابراین، ولتاژ باتری روی LCD نمایش داده می شود. ممکن است بین مقدار و اسمی خطایی وجود داشته باشد زیرا باتری کاملاً شارژ نشده است. و به همین دلیل باید ولتاژ را اندازه بگیرم تا بفهمم آیا می توانم از باتری استفاده کنم یا نه.

PS:اگر مشکلی در صفحه نمایش دارید، به این سؤالات متداول برای LCDها مراجعه کنید - http://wiki.sunfounder.cc/index.php?title=LCD1602/I2C_LCD1602_FAQ.

اندیشه

اندیشه دستگاه های اندازه گیری ولتاژ، جریان، ظرفیت، دشارژ و شاید شارژ مدت ها پیش و نه تنها با من به وجود آمدند. شما می توانید تعداد زیادی اسباب بازی به نام تستر USB (Doctor) برای آزمایش دستگاه های مختلف USB پیدا کنید. من به یک دستگاه تا حدودی همه کاره تر، مستقل از رابط، اما به سادگی برای ولتاژها و جریان های خاص طراحی شده است. به عنوان مثال، 0 - 20.00 ولت، 0 - 5.00a، 0 - 99.99Ah. در مورد توابع، من آن را اینگونه می بینم

  • نمایش ولتاژ و جریان جریان، یعنی یک ولت آمپر متر. در اصل، شما می توانید بلافاصله قدرت را منعکس کنید.
  • محاسبه و نمایش ظرفیت انباشته شده در آمپر ساعت و به احتمال زیاد بر حسب وات ساعت.
  • نمایش زمان فرآیند
  • و به احتمال زیاد، آستانه خاموش شدن ولتاژ پایین و بالای قابل تنظیم (محدودیت های تخلیه و شارژ)

توسعه

برای اجرای محاسبات و اندازه گیری ها به یک کنترل کننده نیاز داریم. من این ایده را به عنوان بخشی از آشنایی خود با آردوینو به یاد آوردم، بنابراین کنترلر ساده محبوب Atmega328 خواهد بود و در محیط برنامه ریزی می شود. آردوینو. از نقطه نظر مهندسی، انتخاب احتمالا بهترین نیست - کنترل کننده کار کمی چاق است و ADC آن را نمی توان اندازه گیری نامید، اما ... ما سعی خواهیم کرد.

  • ما در این پروژه زیاد لحیم کاری نمی کنیم. به عنوان پایه، ما ماژول آماده Arduino Pro Mini را می گیریم، زیرا چینی ها آماده هستند آنها را با قیمت 1.5 دلار در خرده فروشی عرضه کنند.
  • دستگاه نمایشگر صفحه نمایش 1602 خواهد بود - 1.5 دلار بیشتر. من گزینه ای با ماژول رابط I2C دارم، اما در این پروژه چندان مورد نیاز نیست (0.7 دلار).
  • برای توسعه، ما به تخته نان نیاز داریم. در مورد من، این یک BreadBoard کوچک 1 دلاری است.
  • البته به سیم و تعدادی مقاومت با درجه بندی های مختلف نیاز خواهید داشت. برای نمایشگر 1602 بدون I2C، انتخاب کنتراست نیز مورد نیاز است - این کار با مقاومت متغیر 2 تا 20 کیلو اهم انجام می شود.
  • برای اجرای آمپرمتر، به یک شنت نیاز دارید. به عنوان اولین تقریب، می تواند یک مقاومت 0.1 اهم و 5 وات باشد.
  • برای اجرای خاموش شدن خودکار، به یک رله با کنتاکت هایی که برای حداکثر جریان دستگاه و ولتاژی برابر با ولتاژ تغذیه طراحی شده است، نیاز دارید. برای کنترل رله به یک ترانزیستور npn و یک دیود محافظ نیاز دارید.
  • این دستگاه توسط یک منبع تغذیه خارجی، بدیهی است که حداقل 5 ولت تغذیه می شود. اگر منبع تغذیه بسیار متفاوت باشد، یک تثبیت کننده یکپارچه از نوع 7805 نیز مورد نیاز است - ولتاژ رله را تعیین می کند.
  • چه زمانی Arduino Pro Mini برای فلش کردن سیستم عامل به یک مبدل USB-TTL نیاز دارد.
  • برای تنظیم به یک مولتی متر نیاز دارید.

ولت متر

من در حال اجرای یک ولت متر ساده با محدوده 0 - 20 ولت هستم. این نکته مهم است، زیرا ADC کنترلر ما دارای ظرفیت 10 بیت (1024 مقدار گسسته) است، بنابراین خطا حداقل 0.02 V (20 / 1024) خواهد بود. برای پیاده سازی سخت افزار، به یک ورودی آنالوگ کنترلر، یک تقسیم کننده از یک جفت مقاومت و نوعی خروجی نیاز داریم (نمایشگر در نسخه تمام شده است، از یک پورت سریال می توان برای اشکال زدایی استفاده کرد).

اصل اندازه گیری ADC مقایسه ولتاژ در ورودی آنالوگ با مرجع VRef است. خروجی ADC همیشه عدد صحیح است - 0 مربوط به 0V، 1023 مربوط به ولتاژ VRef است. اندازه‌گیری با یک سری قرائت‌های متوالی ولتاژ و میانگین‌گیری در دوره بین به‌روزرسانی‌های مقدار روی صفحه انجام می‌شود. انتخاب ولتاژ مرجع مهم است زیرا به طور پیش فرض روی ولتاژ منبع تغذیه است که ممکن است پایدار نباشد. این به هیچ وجه برای ما مناسب نیست - ما یک منبع مرجع داخلی پایدار با ولتاژ 1.1 ولت را به عنوان مبنایی در نظر می گیریم و آن را با فراخوانی آنالوگReference (INTERNAL) مقداردهی اولیه می کنیم. سپس مقدار آن را با توجه به قرائت های مولتی متر کالیبره می کنیم.

در نمودار سمت چپ - یک نوع با کنترل مستقیم نمایشگر (به سادگی کنترل می شود - به طرح استاندارد LiquidCrystal\HelloWorld مراجعه کنید). در سمت راست گزینه I2C است که در ادامه از آن استفاده خواهم کرد. I2C به شما امکان می دهد در سیم ها (که در نسخه معمولی 10 عدد است، بدون احتساب نور پس زمینه) صرفه جویی کنید. اما این نیاز به یک ماژول اضافی و مقداردهی اولیه پیچیده تر دارد. در هر صورت، ابتدا باید نمایش نمادها در ماژول بررسی شود و کنتراست تنظیم شود - برای این، فقط باید هر متنی را پس از مقداردهی اولیه نمایش دهید. کنتراست توسط مقاومت R1 یا مقاومت مشابه ماژول I2C تنظیم می شود.

ورودی یک تقسیم کننده 1:19 است که در Vref = 1.1 اجازه می دهد تا حداکثر ولتاژ حدود 20 ولت را بدست آوریم (معمولاً یک خازن + دیود زنر به موازات ورودی برای محافظت قرار می گیرد، اما این هنوز برای ما مهم نیست. ). مقاومت ها دارای اسپرد و Vref مرجع کنترلر نیز هستند، بنابراین پس از مونتاژ لازم است ولتاژ (حداقل منبع تغذیه) را به موازات دستگاه خود و یک مولتی متر مرجع اندازه گیری کنیم و Vref را در کد انتخاب کنیم تا زمانی که قرائت ها مطابقت داشته باشند. همچنین شایان ذکر است که هر ADC دارای ولتاژ آفست صفر است (که قرائت‌ها را در ابتدای محدوده خراب می‌کند)، اما ما هنوز به این موضوع نمی‌پردازیم.

همچنین جدا کردن عرضه و اندازه گیری "زمین" مهم خواهد بود. ADC ما رزولوشن کمی بدتر از 1 میلی ولت دارد، که اگر سیم کشی نادرست باشد، به خصوص روی تخته نان برد می تواند مشکل ساز شود. از آنجایی که سیم کشی برد ماژول قبلا انجام شده است و ما با انتخاب پین ها روبرو هستیم. ماژول دارای چندین پایه "زمین" است، بنابراین باید مطمئن شویم که منبع تغذیه ماژول از طریق یک "زمین" و اندازه گیری ها از طریق دیگری می آید. در واقع، من همیشه از نزدیک ترین پین زمین به ورودی های آنالوگ برای تغییرات استفاده می کنم.

برای کنترل I2C، گونه ای از کتابخانه LiquidCrystal_I2C استفاده می شود - در مورد من، پین اوت خاصی از ماژول I2C نشان داده شده است (چینی ها ماژول هایی با کنترل های مختلف تولید می کنند). همچنین اشاره می کنم که I2C در آردوینو شامل استفاده از پین های A4، A5 است - در برد Pro Mini آنها در لبه نیستند، که برای نمونه سازی در BreadBoard ناخوشایند است.

منبع

#عبارتند از #عبارتند از // ولت متر ساده با نمایشگر i2c 1602. V 16.11 // تنظیمات صفحه نمایش i2c 1602 با پین اوت سفارشی #define LCD_I2C_ADDR 0x27 #define BACKLIGHT 3 #define LCD_EN 2 #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); // زمان تازه کردن، ms (200-2000) #define REFRESH_TIME 330 // ورودی آنالوگ #define PIN_VOLT A0 // ولتاژ مرجع داخلی (انتخاب) const float VRef = 1.10; // نسبت تقسیم کننده مقاومتی ورودی (Rh + Rl) / Rl. که در<-[ 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; // تبدیل به ولت (Value: 0..1023 -> (0..VRef) scaled by Mult) Volt = InVolt * VoltMult * VRef / 1023; // نمایش داده lcd.setCursor(0, 1); lcd.print(Volt); lcd.print("V"); )

برترین مقالات مرتبط