در این آموزش نحوه ساخت وب سرور میکروپایتون با ESP32 مستقل را آموزش میدهیم. با استفاده از هر ماژول رله رو زبان برنامه نویسی MicroPython امکان کنترل ماژول های رله و در نهایت کنترل وسایل برقی خود را داشته باشد. در این آموزش از برد تراشه های ESP32 استفاده میکنیم که در سری آموزش های مقدماتی پیشین روش راهاندازی میکروپایتون در این نوع از برد های IoT را به شما آموزش دادیم. در ادامه آموزش با مرجع تخصصی میکروپایتون به زبان فارسی، دیجی اسپارک همراه باشید.
تراشه ESP32
ESP32 می تواند به عنوان یک سیستم کامل مستقل یا به عنوان یک دستگاه MCU عمل کند و بار اضافی ارتباطات را در پردازنده اصلی برنامه کاهش دهد. ESP32 می تواند با سیستم های دیگر ارتباط برقرار کند تا از طریق SPI عملکرد Wi-Fi و بلوتوث را ارائه دهد. ESP32 با سوئیچ های آنتن داخلی، RF balun، تقویت کننده قدرت، تقویت کننده دریافت، فیلترها و ماژول های مدیریت توان یکپارچه شده است. ESP32 با حداقل الزامات برد مدار چاپی (PCB) ، عملکرد و تطبیق پذیری بی نظیری را به برنامه های شما اضافه می کند. برد ESP32 نسل پیشرفته ESP8266 است. یکی از تفاوتهای آن بلوتوث داخلیاش میباشد. همچنین دارای هسته وایفای ۲,۴ گیگا هرتزی و بلوتوث داخلی تولید شده با تکنولوژی ۴۰ نانومتری شرکت TSMC میباشد. این ماژول دارای بهترین پرفورمنس در مصرف انرژی میباشد یعنی با کمترین مصرف انرژی بهترین نتیجه را برای ما به همراه دارد. اگر بخواهیم دقیقتر به این برد نگاه کنیم باید بگوییم که این یک chip است که پلتفرم NodeMCU در اون پیاده سازی شده که به این نوع چیپ ها System on a chip microcontrollers هم گفته میشود.
وظیفه وب سرور WebServer
وب سرور برنامهای است که از پروتکل HTTP استفاده میکند تا فایلهایی را در پاسخ به در خواست کاربر در اختیار ما قرار دهد. این در خواست از طریق اتصال HTTP هر کاربر ارسال میشوند. هر سروری که یک سند XML را به دستگاه دیگر تحویل میکند میتواند یک وب سرور باشد. در تعریفی مختصر میتوان گفت که وب سرور درواقع یک سرور در اینترنت است که به در خواست های HTTP برای تحویل محتوا و خدمات پاسخ میدهد. در این پروژه از وب سرور میکروپایتون Micropython روی برد ESP32 استفاده میکنیم.
معرفی میکروپایتون MicroPython
تا به امروز زبان برنامه نویسی پایتون Python، زبانی همه منظوره و قدرتمند معرفی شده که البته همینطور است. اما در مواردی این زبان برنامه نویسی میتواند انتخاب اول برای پروژه نباشد. برای مثال در بحث نرم افزارهای Embedded ، زبان C همواره در صدر جدول میباشد. این موضوع دلیلی شد برای متولد شدن زبان برنامه نویسی MicroPython تا جای خالی پایتون را در این موارد پر کند. MicroPython پیاده سازی مجدد پایتون ۳ است که برای میکروکنترلرها و سیستم های امبدد هدف گذاری شده است. MicroPython بسیار شبیه پایتون معمولی است. بنابراین، اگر از قبل می دانید که چگونه در پایتون برنامه نویسی کنید، می دانید که چگونه در MicroPython برنامه نویسی کنید.
پیشنیاز های این پروژه
در پروژه وب سرور میکروپایتون از برد های کمکی بر پایه تراشه ESP32 استفاده خواهیم کرد و همچنین زبن میکروپایتون برای کدنویسی این تراشه، در ادامه برای آپلود و انجام فرآیند کدنویسی از نرمافزار upycraft استفاده خواهیم کرد. این IDE نرم افزاری است که شامل ابزارهایی برای سهولت روند توسعه، رفع اشکال و بارگذاری کد است. روش های زیادی برای برنامه ریزی برد ESP با MicroPython وجود دارد. ما uPyCraft IDE را انتخاب کرده ایم زیرا استفاده از آن ساده است و با بردهای ESP عالی کار می کند. روش نصب این نرمافزار در آموزش های مقدماتی میکروپایتون آموزش داده شده است.
- ESP32
- ماژول رله
- آشنایی اولیه با زبان میکروپایتون
- نرمافزار uPyCraft
لوازم مورد نیاز
اتصالات پروژه میکروپایتون و ESP32
در این پروژه از پین های دیجیتا برای تریگر کردن رله استفاده خواهیم کرد، که در ادامه نحوه تغییر شماره GPIO در کد را به شما آموزش خواهیم داد. برای مثال من در این مثال از GPOI 26 برد ESP32 استفاده میکنم. که به ورودی ماژول رله متصل خواهد شد. همجنین از خروجی های تغذیه برد ESP32 برای تغذیه رله استفاده خواهیم کرد.
کد های پروژه میکروپایتون و ESP32
کد های این پروژه از دو بخش main.py و boot.py تشکیل میشود. که هر یک وظیفه اجرای بخشی از پروژه را بر عهده دارند. در این پروژه از کتابخانه های machine و time استفاده میکنیم تا از قابلیت های مدنظر بهره ببریم، برای مشخص کردن gpio ها، و استفاده از قابلیت deep sleep در سناریو در حال اجرا. در مرحله اول
- برای تعامل با GPIO ها، کلاس Pin را از ماژول ماشین وارد میکنیم. همچنین متد sleep() را از ماژول time برای اضافه کردن تاخیر وارد می کنیم.
from machine import Pin from time import sleep
- در ادامه یک آبجکت Pin به نام relay برای پین ۲۶ تعریف می کنیم و آن را به عنوان خروجی تعریف می کنیم.
relay = Pin(26, Pin.OUT)
- در حلقه while، یک سیگنال LOW ارسال میکنیم تا وسیله برقی به مدت ۱۰ ثانیه روشن شود. توجه کنید که تمام مقادیر قابل تغییر هستند، پس با توجه به سناریو پروژه خود این موارد را تغییر دهید. اگر از رله NC یا در حالت نرمال بسته استفاده میکنید، باید در این کد یک سیگنال HIGH ارسال کنید تا وسیله برقی روشن شود.
relay.value(0) sleep(10)
- در ادامه با ارسال یک سیگنال HIGH به پین رله، ماژول را غیر فعال میکنیم. اگر از رله NC یا در حالت نرمال بسته استفاده میکنید، یک سیگنال LOW برای متوقف کردن ارسال کنید.
relay.value(1) sleep(10)
کد های فایل main.py
def web_page(): if relay.value() == 1: relay_state = '' else: relay_state = 'checked' html = """<html><head><meta name="viewport" content="width=device-width, initial-scale=1"><style> body{font-family:Arial; text-align: center; margin: 0px auto; padding-top:30px;} .switch{position:relative;display:inline-block;width:120px;height:68px}.switch input{display:none} .slider{position:absolute;top:0;left:0;right:0;bottom:0;background-color:#ccc;border-radius:34px} .slider:before{position:absolute;content:"";height:52px;width:52px;left:8px;bottom:8px;background-color:#fff;-webkit-transition:.4s;transition:.4s;border-radius:68px} input:checked+.slider{background-color:#2196F3} input:checked+.slider:before{-webkit-transform:translateX(52px);-ms-transform:translateX(52px);transform:translateX(52px)} </style><script>function toggleCheckbox(element) { var xhr = new XMLHttpRequest(); if(element.checked){ xhr.open("GET", "/?relay=on", true); } else { xhr.open("GET", "/?relay=off", true); } xhr.send(); }</script></head><body> <h1>ESP Relay Web Server</h1><label class="switch"><input type="checkbox" onchange="toggleCheckbox(this)" %s><span class="slider"> </span></label></body></html>""" % (relay_state) return html s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.bind(('', 80)) s.listen(5) while True: try: if gc.mem_free() < 102000: gc.collect() conn, addr = s.accept() conn.settimeout(3.0) print('Got a connection from %s' % str(addr)) request = conn.recv(1024) conn.settimeout(None) request = str(request) print('Content = %s' % request) relay_on = request.find('/?relay=on') relay_off = request.find('/?relay=off') if relay_on == 6: print('RELAY ON') relay.value(0) if relay_off == 6: print('RELAY OFF') relay.value(1) response = web_page() conn.send('HTTP/1.1 200 OK\n') conn.send('Content-Type: text/html\n') conn.send('Connection: close\n\n') conn.sendall(response) conn.close() except OSError as e: conn.close() print('Connection closed')
- در بخش بعدی کد های فایل boot.py را بررسی میکنیم، در این بخش، ما یک وب سرور ایجاد کرده ایم که به شما امکان می دهد یک رله را از راه دور از طریق وب سرور کنترل کنید. در واقع این بخش از کد قسمت فراند پروژه ما خواهد بود.
کد های فایل boot.py
try: import usocket as socket except: import socket from machine import Pin import network import esp esp.osdebug(None) import gc gc.collect() ssid = 'REPLACE_WITH_YOUR_SSID' password = 'REPLACE_WITH_YOUR_PASSWORD' station = network.WLAN(network.STA_IF) station.active(True) station.connect(ssid, password) while station.isconnected() == False: pass print('Connection successful') print(station.ifconfig()) # ESP32 GPIO 26 relay = Pin(26, Pin.OUT)
در این کد بخشی که باید نسبت به شبکه مورد استفاده تغییر گردد بخش ssid و password است. که اطلاعات شبکه وایفای شما در این قسما قرار میگیرد، تا وب سرور لوکال ایجاد شود. پس از انجام تغییرات لازم، فایل های boot.py و main.py را در برد خود آپلود کنید. دکمه EN/RST را فشار دهید و در قسمت Shell باید آدرس IP مدنظر را دریافت کنید. سپس، در مرورگر آدرس IP را برای دسترسی به وب سرور تایپ کنید.
نتیجه نهایی
کلام آخر با سایفر
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
امکانش هست از کابل شبکه استفاده کرد
اگه هست ی توضیح بدید ممنون
ماژول هایی موجود هستند که ارتباط اترنت رو امکان پذیر میکنند، اما برای این منظور باید بخش زیادی از کد تغییراتی داشته باشه.
با همین روش میشه کولر آبی رو کنترل کرد؟
با سلام
بله، فقط بایستی خروجی مدار را به یک رله با جریان دهی کافی متصل کنید.
سلام. من یک مطلب رو هیچ جوری درک نمی کنم . توی همه سایت ها توضیح داده بسیار خوب شما حالا نام ssid خود را اینجا وارد کنید و در اینجا پسوردتان را بنویسید و در آخر هم که کارش تموم میشه میگه ببین دیدی این هم شماره آی پی ته . دارم منهدم میشم . خوب ما چجوری دستگاه بسازم بعد به مشتریم که نمی تونم بگم بیا مشتری گلم اول بهت پایتون یاد بدم بعد روش استفاده دستگاه رو بهت یاد بدم و حالا قشنگم بیا ssid خوشگلت رو اینجا بنویس . لطفا اگر ممکن هست بفرمایید من از چه روشی از مشتری محترمانه نام ssid اش رو بگیرم با پسورد و چگونه توی بوت قرار بدم که بتونه بدون دانش فنی این کار رو انجام بده . در ضمن اون آی پی آخر هم کجا بهش نشون بدم که نخوام از کابل استفاده کنم .
با سلام
کاربر گرامی مباحث مربوط به شبکه در پروژه تجاری سازه شده متفاوت است و میتواند یک آدرس منحصر به فرد باشد. در این خصوص باید دانش شبکه داشته باشید.