1. صفحه نخست
  2. راهنمای سنسورها
  3. کنترل LED توسط ESP8266 و سنسور PIR
  1. صفحه نخست
  2. آموزش ESP8266
  3. کنترل LED توسط ESP8266 و سنسور PIR

کنترل LED توسط ESP8266 و سنسور PIR

مقدمه

در این قسمت از مجموعه آموزش های مخترع شوید، قصد داریم با معرفی و توضیح چگونگی عملکرد interrupt یا وقفه و تایمر در برد ESP8266، یک LED را کنترل می کنیم. برای این پروژه از یک سنسور حرکتی PIR نیز استفاده می شود. به طور کلی می خواهیم مداری را ببندیم که در آن با تشخیص حرکت توسط PIR, برد ESP8266 یک LED را بر اساس زمانی که از قبل تعیین کرده اید روشن می کند(با شروع تایمر) و پس از پایان timer ، ال ای دی به طور اتوماتیک خاموش می شود.

راهنمای ESP8266_سنسور حرکتی_ کنترل LED_ایجاد وقفه
راهنمای ESP8266_سنسور حرکتی_ کنترل LED_ایجاد وقفه

 

قبل از شروع این آموزش, باید برد ESP8266 خود را به نرم افزار Arduino IDE اضافه کنید. بدین هدف می توانید پست WiKi را در مطالعه کنید:

راهنمای نصب برد ESP8266 در Arduino IDE

تعریف ESP8266 Interrupt

وقفه ها برای ساخت برنامه های اتوماتیک در روند کد نویسی یک میکرکنترلر بسیار مفید و کاربردی می باشد. همچنین از interrupt یا وقفه برای هندل و حل کردن مشکلات تایمینیگ (زمان) ، استفاده می شود.

هنگامی که از وقفه استفاده می کنید؛ لزومی ندارد به طور مداوم مقادیر چک شود. با تشخیص یک تغییر، تابعی به نام (interrupt service routine (ISR صدا زده می شود.

وقتی که وقفه اتفاق می افتد؛ پردازنده برای اجرای یک کار اجرای برنامه اصلی را متوقف می کند و پس از انجام آن کار, به برنامه اصلی برمی گردد.

interrupt وقفه چیست؟
interrupt وقفه چیست؟

 

وقفه به ویژه برای:

1.اجرای یک برنامه پس از تشخیص یک حرکت

2. پس از فشردن دکمه در یک مدار نیاز به بررسی مداوم تغییر حالت ها نیست

تابع ()attachInterrupt

برای وارد کردن وقفه در Arduino IDE باید از تابع ()attachInterrupt استفاده کنید. این تابع؛ پین GPIO interrupt ، نام تابعی که باید اجرا شود ISR و mode را به عنوان آرگومان می پذیرد:

GPIO interrupt pin

  • اولین آرگومان پین وقفه GPIO , می باشد. با توجه به دستور کد زیر، از digitalPinToInterrupt(GPIO) استفاده کردیم. به عنوان مثال در این آموزش ما پین 14 را ست کرده ایم:

توجه

برد ESP8266 هر GPIO ای بجز GPIO16، ساپورت می کند.

ISR

  • دومین آرگومان از تابع ()attachInterrupt ، اسم همان تابعی است که هر زمان وقفه یا interrupt شروع می شود، آن را صدا می زند service routine (ISR).
  • قبل از تعریف تابع برای اجرای کد وقفه در RAM، دقت داشته باشید که آرگومان ISR باید ICACHE_RAM_ATTR را داشته باشد.

mode

سومین آرگومان, mode دارای 3 حالت مختلف است:

1.CHANGE: برای اجرای وقفه در هر تغییر و هرزمان_ به عنوان مثال: HIGH به LOW یا LOW به HIGH.

1.1 FALLING: برای زمانی که پین از HIGH به LOW می رود.

1.2 RISING: برای زمانی که پین از LOW به HIGH می رود.

به عنوان مثال از RISING mode استفاده خواهیم کرد. زیرا زمانی که سنسور PIR، حرکت را تشخیص می دهد, پین از LOW به HIGH می رود.

تعریف ESP8266 Timers

clock
clock

از آنجای که می خواهیم یک LED به مدت زمانی معلوم روشن باشد. به جای استفاده از تابع ()delay، که باعث بلاک شدن کد و عدم اجرای هر کاری می شود, از تایمرها استفاده می کنیم. 

 مقایسه ()delay با ()millis

  • تابع ()delay، یک سیگنال از نوع عددی int را به عنوان یک آرگومان می پذیرد. این عدد نشان دهنده زمان بر حسب میلی ثانیه است که برنامه باید منتظر بماند تا به خط بعدی کد برود.

  • وقتی که delay(1000) را فراخوان می دهید، برنامه شما به مدت 1 ثانیه در آن خط متوقف می شود. ()delay یک تابع مسدود کننده است.
Blocking function

این توابع برنامه را از انجام کار دیگری تا زمان تکمیل انجام آن کار خاص، متوقف می کند.

 

نکته

اگر می خواهید چندین رویداد, همزمان اتفاق بیفتد. تابع delay به هیچ وجه مناسب نیست. برای اکثر پروژها از timer ها به جای delay استفاده می شود.

  • با استفاده از تابع ()millis, می توانید تعداد میلی ثانیه ای که از زمان شروع برنامه گذشته است را برگردانید:

LED چشمک زن با استفاده از ()millis

در این بخش از آموزش قصد داریم تابع ()millis را معرفی کنیم. اگر آشنایی کافی با این توضیحات دارید به قسمت بعدی مقاله مراجعه کنید. دستوراتی که در زیر مشاهده می کنید با استفاده از تابع ()millis، یک LED را به مدت 1000 میلی ثانیه روشن و سپس خاموش می کند.

شرح جزئیات کد

بیایید با دقت بیشتر به طرح LED چشمک زن که از millis به جای delay، استفاده شده, نگاهی بیاندازیم🤓

اساساً, این کد زمان ضبط شده قبلی (previousMillis) را از زمان فعلی (currentMillis) کم می کند. اگر مقدار باقی مانده بزرگتر از مقدار 1000 میلی ثانیه(در این مورد) باشد؛ برنامه متغیر previousMillis را به زمان فعلی به روزرسانی می کند و پس از آن LED خاموش یا روشن می شود.

  • با توجه به اینکه این کد طرح مسدود نیست؛ پس هر دستور که خارج از  آن قرار بگیرد می تواند اجرا شود.
  • کد را در برد ESP8266 بارگذاری کرده و امتحان کنید. مشاهده خواهید کرد که  LED تعبیه شد روی برد, هر یک ثانیه چشمک می زند.
ESP8266 blinking LED
ESP8266 blinking LED

ESP8266 NodeMCU با سسنور حرکتی PIR

چگونگی تشخیص حرکت توسط PIR با استفاده از تایمر و وقفه ها را در این قسمت فراخواهید گرفت.

قطعات مورد نیاز

برای خریدی به صرفه و امن به فروشگاه الکترونیکی ایوینک مراجعه کنید.

مدار شماتیک

طبق شکل زیر قطعات را به هم متصل کنید. ما LED را به  GPIO 12 (D6) و پین دیتا سنسور PIR را به GPIO 14 (D5) وصل کرده ایم.

esp8266_interrupts_pir_sensor_bb
esp8266_interrupts_pir_sensor_bb

 

مطالعه مقاله پین های ESP8266 توصیه می شود.

پین های سنسور حرکتی PIR
پین های سنسور حرکتی PIR

کد

پس از بستن مدار بالا, کد را در نرم افزار Arduino ide کپی کنید. کد را بدون تغییر می توانید کپی کنید و یا اینکه مقدار ثانیه ای که LED پس از تشخیص حرکت روشن می باشد را تغییر دهید. این تغییر به سادگی با وارد زمان دلخواهتان در متغیر timeSeconds صورت می پذیرد.

نحوه عملکرد کد
  • در ابتدای کد, با تعریف پین های GPIO برای LED و سنسور حرکتی شروع می شود:

  • سپس, متغیرهایی ایجاد می کنیم که اجازه ست کردن تایمر برای خاموش شدن LED را می دهند:

 

متغیر now, زمان فعلی را نگه می دارد. متغیر lastTrigger , زمانی که سنسور PIR حرکت را تشخیص می دهد، زمان را نگه می دارد.startTimer یک متغیر از نوع boolean است که باعث شروع تایمر، زمان تشخیص حرکت می شود.

()setup
  • پورت سریال با سرعت تبادل داده 115200 مقدار دهی را شروع می کند:

  • سنسور حرکتی PIR به عنوان یک ورودی معرفی می شود:

پین GPIO 14 حرکت را تشخیص خواهد داد و تابع ()detectsMovement را بر مود RISING فرامی خواند. 

  • LED یک خروجی OUTPUT است که در حالت LOW شروع می کند:

()loop
  • این تابع باعث می شود که بارها و بارها اجرای برنامه تکرار شود ولی در هر loop، متغیر now، به روزرسانی زمان فعلی را انجام می دهد:

  • تابع ()detectsMovement, یک پیغام در مانیتور سریال نمایش می دهد، LED را روشن می کند، متغیر startTimer از نوع boolean را روی true ست می کند و  متغیر lastTrigger را با زمان فعلی به روز می کند:

  • در این قسمت, کد به loop برمی گردد و اینبار متغیر startTimer در حالت true قرار دارد. بنابراین وقتی که زمان از ثانیه های تعریف شده گذشت(از تشخیص حرکت)؛ دستورات زیر true خواهند بود:

 

وقتی پیغام “…Motion stopped” در مانیتور سریال نمایش داده شود, LED خاموش شده و متغیر startTimer بر روی false ست می شود.

نمایش

کد را در ESP8266 آپلود کرده و از انتخاب صحیح پورت و نوع برد ، اطمینان حاصل کنید. سپس مانیتور سریال را در بادریت 115200 باز کنید:

مانیتور سریال
مانیتور سریال

 

در آخر برای تست مدار خود, دست خود را مقابل سنسور PIR حرکت دهید. LED باید روشن شود و پیغام “!!!MOTION DETECTED” نمایش داده می شود و پس از 10 ثانیه LED خاموش خواهد شد.

ESP8266_سنسور حرکتی
ESP8266_سنسور حرکتی

 

 

 

آخرین آپدیت در مارس 1, 2021

آیا این مقاله آموزشی مفید بود ؟

نوشته های مرتبط

لطفا نظر خود را بنویسید، این نظر میتواند تنها یک تشکر باشد.