اینترنت اشیا IOT برد ESP8266

ساخت پلتفرم IoT اختصاصی کنترل وسایل برقی بر پایه برد ESP8266 – بخش اول

simple-iot-platform-with-esp8266-and-cloud-server-digispark
نوشته شده توسط معین صابری

اینترنت اشیا، در حال تبدیل به یکی از روزمرگی‌های زندگیست. همچنان که در اخبار می‌شنوید، صحبت از خانه هوشمند، شهر هوشمند و مواردی از این دست است. همانطور که واضح است، به منظور پیاده سازی و اجرای پروژه‌های هوشمند سازی و اینترنت اشیا، نیاز به ابزار و پلتفرم IOT است. یکی از مهم‌ترین ابزارهای اجرای پروژه‌های اینترنت اشیا، ماژول‌های وای فای esp8266 است که تاکنون در پروژه‌های بسیاری، مورد استفاده قرار گرفته‌اند. این ماژول‌ها قابلیت اتصال به مودم‌های خانگی، اتصال به شبکه اینترنت، قابلیت تبدیل به نقطه دسترسی، قرار گیری در مد سرور و… را دارند. نکته مهم دیگر در رابطه با ماژول‌های ESP8266 آن است که قابلیت برنامه ریزی داشته و نیاز به میکروکنترلر اضافی ندارند. به طوریکه علاوه بر اینکه دسترسی به ارتباط بی‌سیم و شبکه را برای کاربر فراهم می‌آورند، می‌توانند برنامه کاربر را نیز اجرا نمایند. از طرفی دیگر، به لطف وجود پلتفرم آردوینو، این ماژول‌ها به سادگی همانند یک برد آردوینو پروگرام شده و از این بابت نگرانی در خصوص یادگیری زبان و ابزار جدید، مرتفع می‌گردد. این آموزش در دو مرحله تهیه شده است که در بخش نخست به طراحی وب سرویس یا همان پلتفرم IOT با ESP8266 پرداخته‌ایم. سپس در قسمت بعدی، به طراحی سخت افزاری خواهیم پرداخت. در ادامه با مرجع تخصصی آردوینو به زیان فارسی دیجی اسپارک همراه باشید.

 


تبادل اطلاعات در پلتفرم IOT با ESP8266


به منظور ارسال و دریافت داده در بستر اینترنت، نیاز به یک سرور خواهیم داشت. در حقیقت به منظور دریافت داده از برد esp8266 و ارسال فرمان به آن، هر دو طرف کاربر و برد الکترونیکی، داده‌ها و پیام‌های خود را بر روی سرور، به اشتراک می‌گذارند. بنابراین، در این آموزش، ابتدا به طراحی یک سرویس ابری ساده می‌پردازیم. سپس در گام بعدی، به طراحی لایه سخت افزاری خواهیم رسید. بنابراین، در گام نخست، به بررسی وب سرویس آنلاین می‌پردازیم. نکته مهم اینست که برای این بخش از پروژه، مخاطبان می‌بایست آشنایی حداقلی با زبان برنامه نویسی php، جاوا اسکریپت و آشنایی حداقلی با دستورات html، داشته باشند. اما با این حال، تا جای ممکن به تشریح و توضیح کدها به نحوی پرداخته شده است تا مطلبی ابهام آمیز، باقی نماند. در زیر، نمایی از این پلتفرم ساده را مشاهده می‌نمایید:

 


طراحی پلتفرم IOT با ESP8266


همانطور که مستحضر هستید، جهت ایجاد یک ارتباط اینترنتی بین کاربر و ماژول esp8266، نیاز به برپا سازی بستر ابری است. در این قسمت، به طراحی یک بستر ساده اینترنت اشیا یا همان پلتفرم IOT با ESP8266 می‌پردازیم. شایان ذکر است جهت کوتاه و خلاصه شدن بحث، از مطرح نمودن مسائلی همچون تامین امنیت، صرف نظر می‌گردد. پلتفرم مذکور این توانایی را دارد تا دمای محیط را از ماژول دریافت کرده و فرمان خاموش و روشن شدن یک لامپ را برای ماژول ارسال نماید. حتی این پلتفرم قادر است تا یک پیام متنی را از کاربر دریافت نموده و به ماژول esp8266 ارسال نماید و ماژول نیز پیام مذکور را بر روی نمایشگر oled، نمایش دهد.

به منظور طراحی پلتفرم IOT با ESP8266 ، نیاز است که در ابتدا از یکی از سرویس دهندگان دامنه و هاست، سرویسی را تهییه نماییم. ضروری است که سرویس مورد نظر، از نوع لینوکس باشد تا کدهای این پروژه، بر روی آن اجرا شود. در طراحی این پلتفرم، از مدل معماری کلاینت/سرور پیروی شده است. در این مدل، کلاینت همان کاربر است که به سرویس دهنده و یا همان سرور، درخواست ارسال می‌نماید. سرور هم درخواست‌های کاربر را دریافت نموده و به اجرای آن، می‌پردازد. به همین دلیل، کدهای این پروژه در دو دسته سمت سرور که با زبان php طراحی شده است و سمت کاربر که با زبان جاوا اسکریپت طراحی شده، تقسیم می‌شود.

در طراحی این پلتفرم، سه برنامه اصلی وجود دارد که کدهای آن در فایل‌هایی با همین نام، در سرور قرار می‌گیرند:
۱-index.php: این قسمت صفحه اصلی پلتفرم ما خواهد بود. وظیفه این قسمت نمایش دمای دریافتی از ماژول، دریافت متن و ارسال آن به ماژول و دریافت فرمان خاموش و یا روشن شدن لامپ و ارسال آن با ماژول است.

۲-string.php: این قسمت متنی که کاربر قصد دارد تا آن را برای ماژول esp8266 ارسال نماید، از کاربر دریافت می‌نماید.

۳-data_st.php : این بخش به عنوان واسط میان ماژول esp8266 و سرور، به سرور داده‌ها را ارسال و در جواب داده‌های مربوط به رله و پیام متنی را دریافت می‌نماید.

 


سورس کد پلتفرم IoT


در ابتدا، ذکر این نکته ضروری است که جهت آپلود کدها برای ساخت پلتفرم IOT با ESP8266 پس از ثبت هاست و دامین خود، وارد کنترل پنل خود شده و در قسمت public hml، فایل هایی با نام‌های فوق ایجاد کرده و کدهای مورد نظر را در آن، قرار دهید. در اینجا، ابتدا به بررسی کدهای مهم و اصلی، یعنی index.php می‌پردازیم. همانطور که پیشتر ذکر شد، معماری پلتفرم IoT ما، بر مبنای معماری کلاینت/سرور است. این بدان معنی است که بخشی از کدها بر روی رایانه کاربر و بخشی دیگر بر روی رایانه سرور، اجرا می‌شوند. در کد این قسمت، فرمی وجود دارد که شامل دو کلید برای تعیین وضعیت رله و یک textbox جهت ارسال پیام به ماژول است. همچنین قسمتی دیگری نیز وجود دارد که وظیفه نمایش داده‌های دریافتی از سوی ماژول که همان دماست را، بر عهده دارد. در ادامه سورس کد سمت پلتفرم IOT را کپی کرده و با ادامه آموزش همراه باشید.

 

جهت دسترسی به این بخش، اشتراک اسپارکر پلاس تهیه کنید.

 

 

در کد فوق، بخش پردازش مربوط به سرور با تگ php، به صورت <?php شروع می‌شوند. کدهای مربوط به سرور، در ۴ قسمت قرار گرفته‌اند.

۱- کنترل فشرده شدن کلید

۲- نمایش آخرین وضعیت لامپ

۳- نمایش آخرین پیام ارسالی

۴- نمایش دمای ارسالی از سوی ماژول

به کمک تگ‌های html، یک فرم برای کلیدهای روشن و خاموش تعبیه شده است. پس از فشرده شدن کلید، دیتایی به سرور از طریق متد post ارسال می‌گردد. متد post و متد get دو متد معروف پروتکل http جهت ارسال داده به سرور هستند. در سمت سرور، فشرده شدن کلید به صورت زیر، تشخیص داده می‌شود.

 

در قطعه کد فوق، در صورتیکه دکمه شماره یک فشار داده شده باشد، تابع button1 اجرا خواهد شد. با اجرای این تابع، یک فایل به نام data.txt، ایجاد خواهد شد. در این فایل، عبارت ۱ به معنای روشن شدن لامپ درج می‌گردد. برای کلید خاموش کننده لامپ، مشابه روال فوق، اما با درج عبارت ۰ در فایل، اجرا می‌شود. در سمت ماژول ESP8266، ماژول با خواندن این فایل، لامپ را روشن و یا خاموش می‌کند.

همانطور که مشاهده نمودید، وضعیت رله در یک فایل قرار گرفته و ماژول با خواندن فایل مورد نظر، لامپ متصل به رله را روشن و یا خاموش می‌کند. در نظر داشته باشید ابتدا به کمک تابع fopen، فایل مورد نظر را باز کرده و فرمت خواندن و یا نوشتن را، به کمک عبارت w و یا r تعیین می‌نماییم. سپس به کمک تابع fwrite و fread، که به ترتیب برای خواندن و یا نوشتن در فایل استفاده می‌شوند، عبارت مورد نظر خود را در فایل نوشته و یا می‌خوانیم. طبق قوانین زبان php، مقدار دریافتی را در یک متغیر که همراه با علامت $ در سمت چپ تابع قرار می گیرد، ذخیره نموده و به کمک تابع fclose()، فایل مورد نظر را می‌بندیم. شایان ذکر است که در صورتیکه فایل مورد نظر از پیش موجود نباشد، تابع نوشتن فایل، آن را ایجاد خواهد نمود و نیازی به ایجاد فایل به صورت دستی، نخواهد بود. به جهت خواندن آخرین وضعیت لامپ، آخرین پیام ارسالی نیز، می‌بایست فایلی که وضعیت آن‌ها در آن نوشته شده است، خوانده شود. همچنین آخرین دمای ارسالی توسط ماژول، در فایلی تحت عنوان tmp.txt قرار می‌گیرد که با خواندن مقدار آن، دمای ارسالی ، با خواندن از فایل و نمایش توسط تابع echo، در صفحه، به نمایش در می‌آید.

 


رفرش صفحه در پلتفرم IOT


در کد این صفحه، قسمتی برای رفرش صفحه، برای هر پانزده ثانیه وجود دارد. این رفرش کمک میکند تا به طور خودکار، آخرین دمای دریافتی را نمایش دهیم. به منظور اجرای  رفرش خودکار، می بایست از زبان جاوا اسکریپت استفاده نماییم.  برای این کار، به کمک تگ <script> ، ابتدا محدوده این کد ها را تعیین کرده و سپس با تگ </script>، این محدوده را می بندیم. در این تگ ، در ابتدا به کمک تابع alert، عملی که قرار است انجام دهیم را به همراه فاصله زمانی آن، تعیین می کنیم. سپس به کمک تابع location.realod();، صفحه را رفرش می نماییم.

 


دریافت و ارسال پیام متنی به ماژول


به منظور ارسال پیام به ماژول، ابتدا پیام مورد نظر خود را در textbox،تایپ می نماییم. سپس با فشردن کلید submit، پیام ما، تحت پروتکل POST، به صفحه string.php ارسال خواهد شد. در این صفحه، پیام مورد نظر از کاربر دریافت شده و درون یک فایل به نام string.txt ذخیره خواهد شد. در سمت ماژول نیز، با خواندن فایل string.txt، متن درج شده را نمایش خواهد داد. همچنین، متن ارسالی، در صفحه string.txt، به صورت زیر دریافت می شود:

 

در عبارت فوق، عبارت POST بیانگر دریافت داده تحت متد POST بوده و عبارت name، نام متغیری است که ارسال شده است. به عبارت دیگر، متن مورد نظر ما در متغیری به نام name ذخیره شده و به صفحه مورد نظر، ارسال شده است:

 


دریافت و نمایش دمای ارسالی ماژول


در این قسمت، به بررسی چگونگی دریافت دما و نمایش آن، می پردازیم. همانطور که پیشتر ذکر گردید، به منظور ارسال و دریافت داده در بستر پروتکل http، می بایست از دو متد post و get استفاده نمود. در قسمت ارسال دما به سرور، دمای ارسالی از سوی ماژول، به کمک متد post به سرور، به صفحه ای با نام data_st.php ارسال می گردد. دراین صفحه، همانند متد داده ارسالی دریافت شده و در یک فایل به نام tmp.txt ذخیره میگردد. در صفحه index.php، فایل tmp.txt خوانده و به کاربر، نمایش داده می شود. اما این تنها کارکرد این صفحه نیست. همانطور که پیشتر ذکر گردید، این صفحه به عنوان یک پل ارتباطی، مابین لایه سخت افزاری و پلتفرم ابری(وب سایت)، عمل می نماید. پس از آنکه این صفحه، دما را از ماژول دریافت و در فایل ذخیره نمود، نوبت به ارسال داده های مربوط به فرمان رله و پیام متنی می رسد تا با دریافت آن توسط ماژول، رله متصل به لامپ، لامپ را روشن و یا خاموش نموده و پیام متنی بر روی نمایشگر، به نمایش درآید.

 

جهت دسترسی به این بخش، اشتراک اسپارکر پلاس تهیه کنید.

 

در کد فوق، در ابتدا داده ارسالی از سوی ماژول، به شکل زیر دریافت می گردد:

 

در عبارت فوق، عبارت tmp بیانگر متغیر ارسالی از سوی ماژول بوده و مقدار دریافتی در متغیر x قرار گرفته تا با بازشدن فایل tmp.txt، این مقدار درون فایل، ذخیره شود. بعد از این قسمت، نوبت به ارسال داده ها به ماژول می رسد. بدین منظور، به کمک تابع echo که در زبان php وظیفه چاپ داده ها در خروجی را بر عهده دارد، ابتدا وضعیت ثبت شده برای رله را از فایل data.txt خوانده و در خروجی، چاپ می نماییم. سپس، پیام متنی درج شده در فایل string.txt را خوانده و در خروجی چاپ خواهیم نمود. دقت نظر داشته باشید که تابع echo، متن و داده مورد نظر را به نحوی به چاپ می رساند که چه با مرورگر و چه با ابزارهای دیگر، همانند ماژول  esp8266، داده به نمایش درخواهد آمد. بنابراین، فرمت ارسالی داده به ماژول، به صورت زیر، از چپ به راست، به ماژول ارسال خواهد شد:

پیام متنی+ وضعیت رله

به عنوان مثال، در صورتیکه وضعیت رله، خاموش و پیام متنی، عبارت salam ثبت شده باشد، پیام به فرمت زیر برای ماژول، ارسال خواهد شد:

۰salam

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

 

چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریع‌ترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند می‌توانید از همین طریق اطلاع رسانی کنید.

 

درباره نویسنده

معین صابری

کارشناسی ارشد رشته معماری سیستم های کامپیوتری

مالي که ز تو کس نستاند، علم است
حرزي که تو را به حق رساند، علم است
جز علم طلب مکن تو اندر عالم
چيزي که تو را ز غم رهاند، علم است
(شیخ بهایی)

تبادل نظر و رفع عیب با ثبت دیدگاه

۴ دیدگاه