شرح مختصر پروژه
در مقاله های آموزشی قبل، پروتکل MQTT رو معرفی کردیم و برای کنترل GPIO سرور محلی MQTT رو روی RPi نصب کردیم. شما می تونید برای مشاهده مقاله های مربوط به این پروتکل از برچسب ها یا جستجو سایت استفاده کنید. نقطه ضعفی که سرور MQTT داره اینه که نمیتونیم از هر جای دنیا که دلمون خواست GPIOها رو کنترل کنیم. این سرور فقط سرویسهای محلی ارائه میده. اما اگر سرور MQTT بر روی فضای ابری قرار بگیره میتونیم تمامی تجهیزات متصل به RPi رو از هر جای دنیا که هستیم کنترل کنیم. در این مقاله اتوماسیون خانگی با استفاده از رزبری پای و مبتنی بر MQTT به راحتی می تونیم از هر شبکه ای کنترل لوازم خانه را به دست بگیریم.
همراه من باشید.
در این مقاله آموزشی، از Adafruit IO به عنوان بروکر MQTT و کنترل دستگاه AC استفاده میکنیم که به GPIO رزبری پای متصل هست.
قطعات موردنیاز
لوازم مورد نیاز
-
رزبری پای که Raspbian Stratch روی اون نصب شده باشه. (Raspberry Pi with Raspbian Stretch installed)
-
ماژول رله (Relay Module)
-
لامپ (Bulb)
-
سیم جامپر (Jumper Wires)
نمودار مدار
مدار الکتریکی وسایل خانگی مبتنی بر IoT با استفاده از MQTT cloud و RPi ساده است. فقط کافیه لامپ رو به همراه ماژول رله به GPIO پین 35 RPi وصل کنین.
نصب کتابخانههای MQTT Cloud روی RPi
در این مقاله آموزشی، از پلتفرم Adafruit IO به همراه RPi به عنوان بروکر MQTT استفاده میکنیم. قبلاً در پروژههای زیادی از پلتفرم Adafruit IO استفاده کردیم و الان هم میتونیم از اون در RPi استفاده کنیم.
برای این کار کافیه یه حساب کاربری در پلتفرم Adafruit IO برین و یک feed ایجاد کنین. پس از ایجاد داشبورد، برای شروع کار با MQTT باید چند تا کتابخانه رو در RPi نصب کنین.
1- در مرحله اول، Pi و پایتون رو با اجرای فرمانهای زیر بهروزرسانی کنین:
sudo apt-get update sudo apt-get upgrade sudo pip3 install --upgrade setuptools
2- حالا با اجرای فرمانهای زیر، کتابخانههای Rpi.gpio و Adafruit blink رو نصب کنین.
sudo pip3 install RPI.GPIO sudo pip3 install adafruit-blinka
3- برای نصب کتابخانه Adafruit IO فرمان زیر رو اجرا کنین.
sudo pip3 install adafruit-io
4- برای کلون کردن (clone) نمونههای adafruit از github فرمان زیر رو اجرا کنین.
برای دسترسی به سورس های این پروژه به لینک زیر مراجعه کنید.
git clone https://github.com/adafruit/Adafruit_IO_Python.git
5- در مرحله بعد با اجرای فرمان زیر در terminal، پوشه نمونههای (examples) را بررسی کنین.
cd Adafruit_IO_Python/examples/basics
اگه نمیدونین تو کدوم دایرکتوری قرار دارین اجرای pwd میتونه تو این زمینه بهتون کمک کنه.
6- برای مثال، تو این پوشه، باید ADAFRUIT_IO_KEY و ADAFRUIT_IO_USERNAME رو مشخص کنین (این اطلاعات رو میتونین در داشبورد Adafruit پیدا کنین):
اگه کلیدی که در داشبورد Adafruit IO هست رو بزنید، میتونین فرمان زیر رو در ترمینال PRi ببینین.
7- حالا پوشه subscribe.py رو با استفاده از ادیتور nano باز کنین. برای باز کردن اون این فرمان رو اجرا کنین:
sudo nano subscribe.py
برای اینکه بتونیم GPOI رو از داشبورد کنترل کنیم باید این برنامه رو کمی تغییر بدیم.
کُدنویسی برای کنترل GPOI رزبری پای با استفاده از MQTT
اول، برای استفاده از پینهای GPIO و کلاینت Adafruit MQTT باید تمامی کتابخانههای مورد نیاز رو بارگذاری کنین:
import RPi.GPIO as GPIO import sys from Adafruit_IO import MQTTClient
حالا حالت GPIO رو تنظیم کنین و شماره پین LED رو مشخص کرده و اون رو به عنوان خروجی تعریف کنین:
GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) ledPin = 12 GPIO.setup(ledPin, GPIO.OUT)
حالا باید AIO key و Username رو تعریف کنیم:
ADAFRUIT_IO_KEY = 'YOUR_AIO_KEY' ADAFRUIT_IO_USERNAME = 'YOUR_AIO_USERNAME'
نام feed رو که برای خاموش و روشن کردن لامپ مشخص کردین، وارد کنین. من اسم این feed رو “light” گذاشتم:
FEED_ID = 'light'
در این مرحله، باید یک تابع تعریف کنین تا هر زمان اتفاقی افتاد، این تابع فراخوانی بشه. به همین دلیل، Feed رو با استفاده از client.subscribe(FEED_ID) ،subscribe میکنیم:
def connected(client): client.subscribe(FEED_ID) print('Waiting for feed data...')
پس از subscribe کردن فید، باید به دنبال یک مقدار (value) جدید باشیم و اون رو در متغیر payload ذخیره کنیم. در این صورت تابع message فراخونی میشه. بنابراین هر زمان که متغیر payload برابر با 1 بود پین LED روشن و هر زمان که برابر با 0 (صفر) بود، پین اون خاموش میشه.
def message(client, feed_id, payload): print('Feed {0} received new value: {1}'.format(feed_id, payload)) if payload == 1: GPIO.output(ledPin, GPIO.HIGH) else: GPIO.output(ledPin, GPIO.LOW)
حالا برای وصل شدن به پلتفرم Adafruit IO و فرستادن پیام از اون و به اون یک client ایجاد میکنیم.
client = MQTTClient(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY) client.on_connect = connected client.on_disconnect = disconnected
حواستون به indentation های کد باشه، در غیر این صورت کُد خطا میده. کُد کامل در پایان این مقاله آموزشی قرار داده شده است.
در پایان، با زدن کلید ctrl+x و enter برنامه رو ذخیره کنین. حالا برای subscribe کردن پیامها (message) باید اسکریپت رو اجرا کنیم. حالا توی ترمینال python subscribe.py رو تایپ کنین و کلید enter رو بزنین.
python subscribe.py
یه پیام با مضمون Waiting For Feed Data به شما نشون داده میشه.
ماژول رله (relay) حتماً باید به پین GPIO رزبری پای وصل باشه و حالا به داشبورد Adafruit IO برید و فید لامپ (light feed) رو عوض کنین. هر زمان که پیام 1 دریافت کردیم لامپ باید روشن بشه و هر زمان که پیام 0 دریافت کردیم باید خاموش بشه (تصویر زیر).
کد نهایی
با این روش میتونیم از هر جای دنیا که بودیم وسایل و دستگاهها رو با استفاده از RPi و MQTT cloud کنترل کنیم. در ادامه می تونید کد نهایی و کامل این مقاله برای اتوماسیون خانگی با رزبری پای رو مشاهده کنید.
import RPi.GPIO as GPIO import sys from Adafruit_IO import MQTTClient GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) ledPin = 12 GPIO.setup(ledPin, GPIO.OUT) ADAFRUIT_IO_KEY = 'YOUR_AIO_KEY' ADAFRUIT_IO_USERNAME = 'YOUR_AIO_USERNAME' FEED_ID = 'light' def connected(client): # Subscribe to changes on a feed named Counter. print('Subscribing to Feed {0}'.format(FEED_ID)) client.subscribe(FEED_ID) print('Waiting for feed data...') def disconnected(client): sys.exit(1) def message(client, feed_id, payload): print('Feed {0} received new value: {1}'.format(feed_id, payload)) if payload == 1: GPIO.output(ledPin, GPIO.HIGH) else: GPIO.output(ledPin, GPIO.LOW) # Create an MQTT client instance. client = MQTTClient(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY) # Setup the callback functions defined above. client.on_connect = connected client.on_disconnect = disconnected client.on_message = message # Connect to the Adafruit IO server. client.connect() client.loop_blocking()
جمع بندی
با مطالعه و دنبال کردن این مقاله اتوماسیون خانگی با رزبری پای، شما به راحتی می تونید هر دستگاه و لوازمی از خونه خودتون رو کنترل کنید. درصورتی در حین انجام این پروژه به مشکلی برخوردید حتما در بخش نظرات بنویسید تا خیلی زود مشکل رو برطرف کنیم.
منبع