در پروژه DS18B20 با میکروپایتون طراحی وب سرور با استفاده از سنسور DS18B20 با بردهای توسعه ESP32 و MicroPython که مقادیر دما را بر حسب واحدهای سانتیگراد و فارنهایت نمایش می دهد را یاد می گیریم. در این آموزش از MicroPython برای ساخت یک وب سرور EP32 استفاده خواهیم کرد که از طریق هر دستگاهی قابل دسترسی است و همچنین دستگاه باید به شبکه محلی شما متصل باشد. این بدان معناست که دستگاه باید به همان شبکه ای که برد ESP32 به آن متصل است متصل شود. در این پروژه برای کدنویسی از نرمافزار upycraft استفاده خواهیم کرد. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
سنسور دما Ds18b20
سنسورها در انواع مختلف با کاربریهای مختلف طراحی و تولید میشود. سنسورهای تک سیمه یا همان oneWire نوعی پرکاربرد در انواع صنایع هستند. سنسور DS18B20 با اینکه سه رشته سیم دارد ولی در دسته تک سیمهها قرار میگیرد. به این دلیل که این سنسور فقط با یک سیم کلیه اطلاعات را ارسال میکند و چندین سنسور هم با یک پایه از میکروکنترلر میتوانند ارتباط برقرار کنند. سنسور دما Ds18b20 با رنج اندازهگیری دما بین ۱۲۵+ تا ۵۵- درجه سانتیگراد و ولتاژ کاری ۵ ولت از سنسور های پر استفاده در زمینه اندازیگیری دما بشمار میرود. از ویژگیهای مهم این سنسور میتوان به قابلیت ارسال دیتا تنها از یک پین اشاره کرد. در ادامه میتوان با استفاده از کد ۶۴ بیتی مختص به هر سنسور مقادیر آن ها را تنها از یک ورودی در میکروکنتلر اندازهگیری کرد. به عبارتی قابلیت اتصال چند سنسور DS18b20 به صورت همزمان از یک پایه وجود دارد. همچنین این سنسور ضد آب بوده پس میتوان در شرایط مختلف از آن استفاده کرد.
تراشه ESP32
ESP32 می تواند به عنوان یک سیستم کامل مستقل یا به عنوان یک دستگاه MCU عمل کند و بار اضافی ارتباطات را در پردازنده اصلی برنامه کاهش دهد. ESP32 می تواند با سیستم های دیگر ارتباط برقرار کند تا از طریق SPI عملکرد Wi-Fi و بلوتوث را ارائه دهد. ESP32 با سوئیچ های آنتن داخلی، RF balun، تقویت کننده قدرت، تقویت کننده دریافت، فیلترها و ماژول های مدیریت توان یکپارچه شده است. ESP32 با حداقل الزامات برد مدار چاپی (PCB) ، عملکرد و تطبیق پذیری بی نظیری را به برنامه های شما اضافه می کند. برد ESP32 نسل پیشرفته ESP8266 است.
قطعات مورد نیاز
شرح پروژه DS18B20 با میکروپایتون
در این پروژه ابتدا کتابخانه مربوط به سنسور دما ds18b20 را در محیط نرمافزار خود مبتنی بر میکروپایتون اضافه میکنیم، در ادامه با ایجاد فایلی جدید کد سناریو اصلی را اجرا میکنیم، در پروژه DS18B20 با میکروپایتون وبسروری برای کاربر ایجاد خواهد شد که امکان مشاهده مقادیر قابل اندازهگیری با سنسور را در اختیار کاربر قرار میدهد.
شماتیک پروژه DS18B20 با میکروپایتون
در این پروژه پین سیگنال یا دیتای سنسور دما ds18b20 به پین GPIO14 در برد ESP32 متصل میشود، همچنین برای تغذیه سنسور از خروجی ۳v3 و gnd برد ESP32 استفاده خواهیم کرد. در صورت نیاز به تغییر پین ها دیتا امکان تغییر در کد های این پروژه فراهم شده است.
اسکریپت boot.py
در اجرای پروژه DS18B20 با میکروپایتون برای ایجاد وب سرور ds18b20 با ESP32 و MicroPython، باید دو فایل MicroPython با نام های boot.py و main.py ایجاد کنیم. فایل boot.py یک اسکریپت میکروپایتون است که یک بار در ESP32 بوت می شود. فایل main.py شامل یک کد HTML و راهانداز وب سرور است. برای ارسال و دریافت درخواستهای کلاینت.
- در اولین قدم یک فایل جدید با نام boot.py ایجاد کنید و کد های زیر را در آن پیست کنید.
try: import usocket as socket except: import socket from time import sleep from machine import Pin import onewire, ds18x20 import network import esp esp.osdebug(None) import gc gc.collect() ds_pin = Pin(4) ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin)) ssid = 'Enter your SSID name' password = 'Enter your SSID password here' station = network.WLAN(network.STA_IF) station.active(True) station.connect(ssid, password) while station.isconnected() == False: pass print('Connection successful') print(station.ifconfig())
- در فایل boot.py یک بخش از کد که مخصوص به اتصالات شبکه لوکال است توسط کاربرد قبل از آپلود باید تغییر گردد، یعنی مقادیر ssid و پسوورد شبکه وایفای مورد نظر.
ssid = 'SSID ' password = 'password'
اسکریپت Main.py
در این مرحله از پروژه DS18B20 با میکروپایتون نوبت به اسکریپت Main.py میرسد، در این اسکریپت سناریو اصلی و همچنین کد های مربوط به وبسرور موجود است که در کنار فایل قبلی یعنی boot.py اجرا میشود. کد های زیر را در یک فایل جدید با نام Main.py پیست کنید. در اسکریپت main.py، یک تابع read_ds_sensor تعریف می کنیم که ۲ بایت از مقدار دما را از تعداد سنسورهای DS18B20 متصل به پین GPIO14 را اسکن و می خواند. در ادامه یک آبجکت ds_sensor در پین GPIO14 در فایل boot.py ایجاد کرده ایم. علاوه بر این، میتوانیم از همان پین GPIO برای خواندن مقادیر دما از چندین سنسور دما استفاده کنیم.
def read_ds_sensor(): try: roms = ds_sensor.scan() print('Found DS devices: ', roms) print('Temperatures: ') ds_sensor.convert_temp() for rom in roms: temp = ds_sensor.read_temp(rom) if isinstance(temp, float): msg = round(temp, 2) print(temp, end=' ') print('Valid temperature') return msg return b'0.0' except OSError as e: return('Failed to read sensor.') def web_page(): temp = read_ds_sensor() html = """<html> <head> <meta http-equiv="refresh" content="10"> <title>MicroPython DS18B20 ESP Web Server</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous"> <link rel="icon" href="data:,"> <style> html {font-family: Arial; display: inline-block; text-align: center;} p { font-size: 1.2rem;} body { margin: 0;} .top_nav { overflow: hidden; background-color: #da0a0a; color: white; font-size: 1rem; } .content { padding: 30px; } .card { background-color: white; box-shadow: 2px 2px 12px 1px rgba(140,140,140,.5); } .cards { max-width: 800px; margin: 0 auto; display: grid; grid-gap: 2rem; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); } .value { font-size: 3rem; } .symbol { font-size: 2rem; } </style> </head> <body> <div class="top_nav"> <h1>DS18B20 Web Server</h1> </div> <div class="content"> <div class="cards"> <div class="card"> <p><i class="fas fa-thermometer-half fa-3x" style="color:#da0a0a;"></i><span class="symbol">Temperature</span></p><p><span class="value"><span id="temp">""" + str(temp) + """</span> °C</span></p> </div> <div class="card"> <p><i class="fas fa-thermometer-half fa-3x" style="color:#da0a0a;"></i> <span class="symbol">Temperature</span></p><p><span class="value"><span id="hum">""" + str(round(temp * (9/5) + 32.0, 2)) + """</span> °F</span></p> </div> </div> </div> </body> </html>""" 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) 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')
- سنسورهای دمای DS18B20 داده ها را از طریق یک رابط سریال با یک سیم در اختیار کاربر قرار می دهند و هر سنسور دارای یک عدد ۶۴ بیتی منحصر به فرد قابل شناسایی است که می تواند برای خواندن مقادیر دما از چندین سنسور DS18B20 با استفاده از یک پایه GPIO استفاده شود. یعنی می توانیم چندین سنسور را به یک پین متصل کنیم.
-
تابع ()scan تمام حسگرهای DS18B20 متصل به پین ds_sensor را اسکن می کند و آدرس ۶۴ بیتی هر سنسور را در یک متغیر لیست که “roms” است ذخیره می کند. در ادامه از این آدرس ها برای خواندن دما از هر سنسور یک به یک استفاده خواهیم کرد.
نتیجه نهایی
در نتیجه این پروژه، پس از آپلود کد های موجود و برقراری اتصالات، مقایر بدست آمده از سنسور ds18b20 در صفحه وب سرور ایجاد شده برای شما نمایش داده خواهند شد، برای دسترسی به این وب سرور، در ترمینال نرمافزار upycraft یک ip آدرس برای شما نمایش داده خواهد شد که با جستجوی آن در مرورگر خود قادر به دسترسی به این وبسرور خواهید بود.
کلام آخر با سایفر
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.