در قسمت بیست و هشتم از آموزش آردوینو به بررسی خواندن بیش از شش ورودی آنالوگ و اندازهگیری ولتاژها تا 5 ولت پرداختیم. در این قسمت قصد داریم درباره پاسخ به تغییرات ولتاژ و اندازهگیری ولتاژهای بیش از ۵ ولت (تقسیم ولتاژ) صحبت کنیم.
فرض کنید شما میخواهید یک یا چند ولتاژ را مانیتور کنید و هنگام عبور ولتاژ از یک حد آستانه (بالا یا پایین) اقدام خاصی انجام دهید. برای مثال، ممکن است بخواهید یک LED را برای نشاندادن کاهش سطح باتری روشن کنید؛ بهطوری که زمانی که ولتاژ از یک حد هشدار پایینتر بیاید، LED شروع به چشمکزدن کند و با کاهش بیشتر ولتاژ، شدت چشمکزدن افزایش یابد.
میتوانید از اتصالات نشاندادهشده در شکل زیر استفاده کنید، اما در اینجا مقدار خواندهشده از analogRead را بررسی میکنیم تا ببینیم آیا ولتاژ از حد آستانه پایینتر آمده است یا نه.
اتصلات آردوینو
در این مثال:
وقتی ولتاژ به 1.2 ولت برسد،LED شروع به چشمک زدن میکند.
هرچه ولتاژ بیشتر از این حد پایین بیاید، مدتزمان روشن ماندن LED نسبت به خاموششدن آن بیشتر میشود.
اگر ولتاژ از یک حد آستانه دوم (کمتر از مقدار قبلی) پایینتر برود، LED بهطور دائم روشن میماند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | /* * RespondingToChanges sketch * flash an LED to indicate low voltage levels */ long batteryFull = 1500; // millivolts for a full battery long warningThreshold = 1200; // Warning level in millivolts - LED flashes long criticalThreshold = 1000; // Critical voltage level - LED stays on const int batteryPin = A0; const int ledPin = LED_BUILTIN; void setup() { pinMode(ledPin, OUTPUT); } void loop() { int val = analogRead(batteryPin); // read the value from the sensor int mv = map(val, 0, 1023, 0, 5000); if(mv < criticalThreshold) { digitalWrite(ledPin, HIGH); } else if (mv < warningThreshold) { int blinkDelay = map(mv, criticalThreshold, batteryFull, 0, 250); flash(blinkDelay); } else { digitalWrite(ledPin, LOW); } delay(1); } // function to flash an led with specified on/off time void flash(int blinkDelay) { digitalWrite(ledPin, HIGH); delay(blinkDelay); digitalWrite(ledPin, LOW); delay(blinkDelay); } |
این اسکچ مقدار خواندهشده از پورت آنالوگ را به بازهی ولتاژ آستانه (۰ تا ۵,۰۰۰ میلیولت) تبدیل میکند. اگر warning Threshold (حد هشدار) ۱ ولت و ولتاژ مرجع ۵ ولت باشد، میخواهید بدانید چه زمانی مقدار خواندهشده از آنالوگ برابر با یکپنجم ولتاژ مرجع است. در این حالت، وقتی مقدار خروجی از تابع analogRead برابر با ۲۰۵ باشد، تابع map مقدار ۱,۰۰۰ میلیولت (یا همان ۱ ولت) را برمیگرداند. (۱,۰۰۰ میلیولت = ۱ ولت)
اگر ولتاژ (برحسب میلیولت) کمتر از criticalThreshold باشد، LED روشن میماند. در غیر این صورت، اسکچ بررسی میکند که آیا ولتاژ کمتر از warningThreshold است یا نه. اگر اینطور باشد، مدتزمان تأخیر چشمکزدن را با استفاده از تابع map محاسبه میکند و مقدار ولتاژ را به عددی بین ۰ تا ۲۵۰ تبدیل میکند.
بهطورکلی، هرچه ولتاژ به criticalThreshold نزدیکتر باشد، تأخیر چشمکزدن کمتر شده و LED سریعتر چشمک میزند. اما اگر ولتاژ از warningThreshold بیشتر باشد، LED خاموش میماند.
فرض کنید شما میخواهید ولتاژهای بیش از ۵ ولت را اندازهگیری کنید. برای مثال، میخواهید ولتاژ یک باتری ۹ ولتی را نمایش داده و زمانی که ولتاژ از یک سطح مشخص پایینتر بیاید، یک LED هشدار را فعال کنید.
ولتاژ را از طریق یک تقسیمکننده ولتاژ متصل کنید (مطابق شکل زیر).
برای ولتاژهای تا 10 ولت، میتوانید از دو مقاومت 4.7 کیلو اهمی استفاده کنید و برای ولتاژهای بالاتر، میتوانید مقدار مقاومتهای موردنیاز را با استفاده از جدول زیر تعیین کنید.
مقادیر مقاومت
تقسیم ولتاژ برای اندازهگیری ولتاژهای بیشتر از ۵ ولت
ردیفی را که دارای بیشترین ولتاژ موردنیاز برای اندازهگیری است، انتخاب کنید تا مقادیر دو مقاومت را به دست آورید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | * DisplayMoreThan5V sketch prints the voltage on analog pin to the serial port Do not connect more than 5 volts directly to an Arduino pin. */ const float referenceVolts = 5; // the default reference on a 5-volt board //const float referenceVolts = 3.3; // use this for a 3.3-volt board const float R1 = 1000; // value for a maximum voltage of 10 volts const float R2 = 1000; // determine by voltage divider resistors, see text const float resistorFactor = 1023.0 * (R2/(R1 + R2)); const int batteryPin = 0; // +V from battery is connected to analog pin 0 void setup() { Serial.begin(9600); } void loop() { int val = analogRead(batteryPin); // read the value from the sensor float volts = (val / resistorFactor) * referenceVolts; // calculate the ratio Serial.println(volts); // print the value in volts } |
مانند روشهای قبلی، این روش نیز بر این اصل استوار است که مقدار analogRead نشاندهنده نسبت بین ولتاژ اندازهگیریشده و ولتاژ مرجع است. اما ازآنجاییکه ولتاژ اندازهگیریشده به دلیل وجود مقاومتهای تقسیمکننده کاهش مییابد، برای بهدستآوردن ولتاژ واقعی باید مقدار analogRead در عدد مناسبی ضرب شود.
در این کد، مقدار خواندهشده از پایه آنالوگ بر resistorFactor تقسیم میشود:
1 | float volts = (val / 1023.0) * referenceVolts * ((R1 + R2) / R2); |
محاسبات انجامشده برای تهیه جدول بر اساس این فرمول است:
ولتاژ خروجی برابر است با ولتاژ ورودی ضرب در R2، تقسیم بر مجموع R1 و R2
بهعنوانمثال، اگر از دو مقاومت با مقدار مساوی استفاده شود تا ولتاژ یک باتری ۹ ولتی به نصف کاهش یابد، مقدار resistorFactor برابر با ۵۱۱ (نصف ۱۰۲۳) خواهد بود؛ بنابراین، مقدار volts که در محاسبات به دست میآید، دو برابر ولتاژی خواهد بود که روی پایه ورودی مشاهده میشود.
اگر مقاومتها بهگونهای انتخاب شوند که برای ولتاژ ۱۰ ولت مناسب باشند، مقدار آنالوگ خواندهشده از یک باتری ۹ ولتی تقریباً ۹۲۰ خواهد بود.
اگر ولتاژ بیش از ۵ ولت (یا ۳.۳ ولت در بردهای ۳.۳ ولتی) به پایه وارد شود، ممکن است به آن آسیب برساند و حتی باعث از بین رفتن تراشه شود؛ بنابراین، قبل از اتصال مقاومتها به پایه ورودی آردوینو، حتماً بررسی کنید که مقدار درستی را انتخاب کرده و بهدرستی سیمکشی کردهاید.
اگر مولتیمتر دارید، حتماً قبل از اتصال مدار به آردوینو، ولتاژ را اندازهگیری کنید تا مطمئن شوید که ولتاژ بیش از ۵ ولت نباشد.
خواندن چندین ورودی آنالوگ و...
من کاپیتان آردوینو، اسمم میلاده و اینجا هستم تا تجربیاتم در رابطه با آردوینو رو با شما به اشتراک بزارم!
مقالات بیشتر
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.