شِفر (کود) جستجو

درس ۱۷ از ۳۱: چگونه تأخیر را در آردوینو قطع کنیم و مقاومت وابسته به نور LDR | Robojax

درس ۱۷ از ۳۱: چگونه تأخیر را در آردوینو قطع کنیم و مقاومت وابسته به نور LDR | Robojax

در این راهنما، دو مفهوم اساسی آردوینو را بررسی خواهیم کرد: وقفه‌ها (interrupts) و مقاومت‌های وابسته به نور (LDR). یاد خواهید گرفت که چگونه تأخیرها را در شِفر (کود) خود قطع کنید تا آردوینو شما بتواند فوراً به فشار دکمه پاسخ دهد، و سپس یک مدار حساس(حس کننده) نور می‌سازیم که می‌تواند به طور خودکار در شب یک بوق یا چراغ را روشن کند. این پروژه برای هر کسی که می‌خواهد فراتر از پروژه‌های ساده چشمک‌زن LED برود و شروع به ساخت پروژه‌های اتوماسیون واکنش‌گرا و واقعی کند، عالی است. می‌توانید این مهارت‌ها را برای ایجاد یک چراغ شب هوشمند برای راهروی خود، یک دزدگیر ساده که با باز شدن در به صدا در می‌آید، یک چراغ باغچه خورشیدی که هنگام غروب فعال می‌شود، یا یک پرده خودکار که با غروب خورشید بسته می‌شود، به کار ببرید. این درس بر اساس کیت آردوینو ۳ در ۱ SunFounder است، اما مفاهیم برای هر برد استاندارد آردوینو قابل استفاده است.

LDR_12708_orig
LDR Illustration and symbol

سخت‌افزار و قطعات

برای دنبال کردن این پروژه، به قطعات زیر نیاز دارید. یک آردوینو Uno یا Nano استاندارد برای این ساخت عالی است.

  • آردوینو Uno یا Nano
  • مقاومت وابسته به نور (LDR)، مانند Kweeds KM601
  • مقاومت ۱۰ کیلواهمی
  • دکمه فشاری
  • بوق (Buzzer)
  • برد بورد و سیم جامپر

درک وقفه‌های آردوینو

در یک اسکچ استاندارد آردوینو، تابع loop() به طور پیوسته اجرا می‌شود و وظایف را خط به خط انجام می‌دهد. وقتی از delay() استفاده می‌کنید، آردوینو برای آن مدت از انجام هر کار دیگری متوقف می‌شود. این یک مشکل است اگر نیاز به پاسخ به یک رویداد مهم، مانند فشار دکمه، در حالی که کار دیگری در حال اجراست داشته باشید. به عنوان مثال، اگر یک تأخیر یک ثانیه‌ای برای چشمک زدن LED داشته باشید، ممکن است فشار دکمه تا یک ثانیه ثبت نشود، که احساس عدم واکنش می‌کند (در ویدیو در ۰۸:۱۳).

وقفه‌های آردوینو این مشکل را حل می‌کنند. یک وقفه یک ویژگی سخت‌افزاری است که به یک پایه خاص اجازه می‌دهد تا برنامه اصلی را "قطع" کند، هر کاری که انجام می‌دهد را متوقف کند، و یک تابع ویژه به نام روال سرویس وقفه (ISR) را اجرا کند. این به آردوینو شما اجازه می‌دهد تا فوراً به رویدادهای با اولویت بالا پاسخ دهد، صرف‌نظر از هر چیز دیگری که در حال رخ دادن است. مهم است توجه داشته باشید که همه پایه‌ها از وقفه پشتیبانی نمی‌کنند. در آردوینو Uno و Nano، فقط پایه‌های ۲ و ۳ می‌توانند برای این منظور استفاده شوند (در ویدیو در ۰۲:۳۷). بردهای دیگر مانند Mega گزینه‌های بیشتری دارند، اما برای این پروژه، ما به پایه ۲ می‌چسبیم.

وقفه‌ها می‌توانند توسط تغییرات مختلف حالت روی پایه فعال شوند: LOW، CHANGE، RISING و FALLING. حالت CHANGE وقفه را هر زمان که حالت پایه از HIGH به LOW یا از LOW به HIGH تغییر کند، فعال می‌کند، که برای یک کلید فشار دکمه عالی است.

راهنمای سیم‌کشی

buzzer_push_button_schematic
lcd1602_I2C_wiring_sunfounder

ما در این درس دو مدار خواهیم ساخت. اولی وقفه‌ها را با یک دکمه و بوق نشان می‌دهد، و دومی از یک LDR برای حس سطوح نور استفاده می‌کند. بیایید با مدار وقفه شروع کنیم.

مدار ۱: دکمه و بوق برای نمایش وقفه

این مدار ساده است. دکمه به پایه ۲ متصل است، که پایه وقفه ماست. یک مقاومت ۱۰ کیلواهمی پایین‌کش (pull-down) تضمین می‌کند که پایه وقتی دکمه فشرده نشده LOW بخواند، و وقتی فشرده شده HIGH. بوق به پایه ۸ متصل است.

برای نمایش وقفه، قطعات را به صورت زیر وصل کنید:

  • دکمه فشاری: یک پایه را به 5V و پایه دیگر را به پایه دیجیتال ۲ وصل کنید. یک مقاومت ۱۰ کیلواهمی از پایه ۲ به GND وصل کنید.
  • بوق: پایه منفی را به GND و پایه مثبت را به پایه دیجیتال ۸ وصل کنید.

مدار ۲: LDR و بوق برای حس نور

برای مدار LDR، از یک پیکربندی تقسیم‌کننده ولتاژ استفاده می‌کنیم. مقاومت LDR با نور تغییر می‌کند، که ولتاژ در پایه آنالوگ را تغییر می‌دهد. وقتی تاریک است، LDR مقاومت بالایی دارد (حدود ۱۰ کیلواهم)، و وقتی روشن است، مقاومت به طور قابل توجهی کاهش می‌یابد (در ویدیو در ۱۶:۲۵). این تغییر در مقاومت چیزی است که ما اندازه‌گیری می‌کنیم.

یک تقسیم‌کننده ولتاژ ضروری است زیرا آردوینو فقط می‌تواند ولتاژ را بخواند، نه مقاومت را. با قرار دادن LDR به صورت سری با یک مقاومت ثابت ۱۰ کیلواهمی، ولتاژ در نقطه بین آنها به طور متناسب با مقاومت LDR تغییر می‌کند. این ولتاژ سپس توسط مبدل آنالوگ به دیجیتال (ADC) آردوینو خوانده می‌شود.

برای نمایش LDR، قطعات را به صورت زیر وصل کنید:

  • LDR: یک پایه را به 5V و پایه دیگر را به پایه آنالوگ A0 وصل کنید.
  • مقاومت ۱۰ کیلواهمی: از پایه LDR که به A0 می‌رود به GND وصل کنید. این تقسیم‌کننده ولتاژ را ایجاد می‌کند.
  • بوق: پایه منفی را به GND و پایه مثبت را به پایه دیجیتال ۸ وصل کنید.

توجه: تخصیص دقیق پایه‌ها در شِفر (کود) تعریف شده است و می‌تواند برای تنظیمات شما تغییر کند.

توضیح شِفر (کود)

ما بر بخش‌های قابل تنظیم توسط کاربر شِفر (کود) ارائه‌شده تمرکز خواهیم کرد که رفتار پروژه را کنترل می‌کنند. برنامه کامل برای دانلود در زیر مقاله موجود است.

شِفر (کود) به گونه‌ای طراحی شده است که به راحتی قابل تغییر باشد. در بالای اسکچ، متغیرهای کلیدی را پیدا خواهید کرد که می‌توانید تنظیم کنید.

const byte buzzerPin = 8;
const byte interruptPin = 2;
volatile byte state = LOW;
int count=0;

در اینجا، buzzerPin به پایه ۸ تنظیم شده است، که محل اتصال بازر است. interruptPin به پایه ۲ تنظیم شده است، که پینی است که به فشار دکمه گوش میدهد. متغیر state یک بایت volatile است که وضعیت فعلی بازر (HIGH یا LOW) را نگه میدارد. به دلیل اینکه در داخل روال سرویس وقفه (ISR) تغییر میکند، به عنوان volatile علامتگذاری شده است، و این کلمه کلیدی تضمین میکند که آردوینو همیشه آخرین مقدار را بخواند. متغیر count یک شمارنده ساده است که در حلقه اصلی افزایش مییابد تا نشان دهد که حلقه در حالی که وقفه فعال است همچنان در حال اجرا است.

در تابع setup()، پایه بازر به عنوان OUTPUT و پایه وقفه به عنوان INPUT تنظیم شده است. خط حیاتی attachInterrupt() است، که در آنجا وقفه را پیکربندی میکنید. این تابع به آردوینو میگوید که کدام پایه را تماشا کند، کدام تابع را هنگام وقوع وقفه فراخوانی کند، و از چه شرایط محرکی استفاده کند.

attachInterrupt(digitalPinToInterrupt(interruptPin), noisy, CHANGE);

این خط یک وقفه را به پایه مشخص شده متصل میکند. تابع digitalPinToInterrupt() شماره پایه را به شماره وقفه صحیح تبدیل میکند. noisy نام تابعی است که هنگام فعال شدن وقفه فراخوانی میشود. در نهایت، CHANGE حالت است که وقفه را در هر تغییر وضعیت پایه فعال میکند. بسته به نیاز خود میتوانید این را به RISING، FALLING یا LOW تغییر دهید.

تابع noisy() همان ISR است. این یک تابع تغییر وضعیت ساده است که حالت بازر را برعکس میکند. وقتی دکمه فشار داده میشود، وقفه این تابع را فعال میکند، که متغیر state را معکوس کرده و آن را به پایه بازر مینویسد. این به شما امکان میدهد با هر بار فشار دکمه، بازر را روشن و خاموش کنید، حتی در حالی که حلقه اصلی مشغول شمارش و تأخیر است.

برای تغییر رفتار پروژه به طوری که بازر در شب به جای روز فعال شود، باید منطق شرطی را در حلقه اصلی تغییر دهید و دستورات digitalWrite() را برای حالتهای HIGH و LOW جابهجا کنید.

پروژه زنده و نمایش

در نمایش، دو آزمایش کلیدی خواهید دید. ابتدا، مدار وقفه بدون شِفر (کود) وقفه در حال اجرا نشان داده میشود، جایی که تأخیر در حلقه باعث میشود پاسخ دکمه کند باشد. این مشکلی را برجسته میکند که وقفهها حل میکنند.

سپس، با بارگذاری شِفر (کود) وقفه، نمایشگر مسلسل شمارنده را نشان میدهد که هر ثانیه افزایش مییابد. وقتی دکمه فشار داده میشود، بازر فوراً روشن یا خاموش میشود، صرفنظر از تأخیر در حلقه اصلی. این ثابت میکند که وقفه با موفقیت زمان انتظار را دور میزند و وظیفه خود را بلافاصله اجرا میکند (در ویدیو در ۱۴:۰۷).

برای بخش LDR، نمایشگر مسلسل مقدار آنالوگ خام را چاپ میکند. میبینید که مقدار در نور روشن بالا است (حدود ۹۶۰) و وقتی حساس(حس کننده) پوشانده میشود به طور قابل توجهی کاهش مییابد (به حدود ۴۰۰ یا کمتر). این نشان میدهد که مقاومت LDR چگونه با شدت نور تغییر میکند. سپس شِفر (کود) از یک مقدار آستانه برای تعیین اینکه "روز" است یا "شب" استفاده میکند و بازر را بر این اساس کنترل میکند. با پوشاندن حساس(حس کننده) برای شبیهسازی شب، میتوانید بازر را فعال کنید، و با قرار دادن آن در معرض نور، آن را خاموش کنید.

فصلها

  • [۰۰:۰۰] مقدمهای بر وقفههای آردوینو و LDR
  • [۰۱:۴۳] مشکل تأخیرها در شِفر (کود) آردوینو
  • [۰۳:۳۷] درک پینها و حالتهای وقفه
  • [۰۴:۲۰] سیمکشی مدار دکمه و بازر
  • [۰۶:۲۲] توضیح شِفر (کود) برای نمایش تأخیر
  • [۰۷:۴۸] نمایش مشکل تأخیر
  • [۰۹:۲۶] پیادهسازی و کدنویسی وقفه
  • [۱۱:۵۰] نحوه عملکرد تابع وقفه
  • [۱۴:۲۶] مقدمهای بر مقاومتهای وابسته به نور (LDR)
  • [۱۵:۴۴] اندازهگیری مقاومت LDR با مولتیمتر
  • [۱۷:۲۲] سیمکشی مدار LDR و بازر
  • [۱۹:۵۵] شِفر (کود) برای خواندن مقادیر LDR
  • [۲۰:۴۹] نمایش تغییرات مقدار LDR
  • [۲۲:۰۸] تنظیم آستانههای روز و شب
  • [۲۳:۴۰] شِفر (کود) برای کنترل بازر با LDR
  • [۲۵:۲۱] نمایش چراغ شب خودکار

تصاویر

An LDR
An LDR
LDR Illustration and symbol
LDR Illustration and symbol
lcd1602_I2C_wiring_sunfounder
lcd1602_I2C_wiring_sunfounder
buzzer_push_button_schematic
buzzer_push_button_schematic
buzzer_push_button_wiring
buzzer_push_button_wiring
ldr
ldr
LDR_12708_orig
LDR_12708_orig
913-Lesson 17/31: interrupt a delay in Arduino and Light Dependent Resistor LDR
زبان: C++
/*
Lesson 20/31: interrupt a delay in Arduino and Light Dependent Resistor LDR
Get this code and watch video Download and resource page https://robojax.com/RJT600
YouTube video https://www.youtube.com/watch?v=N_L11m1v_yk
 
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been download from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
const byte buzzerPin = 8;
const byte interruptPin = 2;
volatile byte state = LOW;
int count=0;

void setup() {
  pinMode(buzzerPin, OUTPUT);
  pinMode(interruptPin, INPUT);
  attachInterrupt(digitalPinToInterrupt(interruptPin), noisy, CHANGE);
  Serial.begin(9600);
  digitalWrite(buzzerPin, state);
}

void loop() {
  count++;
  Serial.println(count);
  delay(1000);
}

void noisy() {
  state = !state;
  digitalWrite(buzzerPin, state);
}

مواردی که ممکن است به آن‌ها نیاز داشته باشید

فایل‌ها📁

کتابخانه‌های آردوینو (zip)