
میکروپایتون قسمت 3: مرور سریع پایتون برای میکروپایتون
در جلسه گذشته، محیط توسعه را کامل راهاندازی کردیم؛ میکروپایتون را روی برد فلش کردیم، بابزارهای برنامهنویسی آشنا شدیم و با اجرای اولین برنامه، ارتباط خود را با سختافزار برقرار کردیم. حالا که برد ما آماده و درست ماست، وقت آن رسیده که زبان میکروپایتون را عمیقتر بشناسیم؛ در این جلسه با انواع داده و متغیرها، عملگرها، ساختارهای کنترلی، توابع، ماژولها و مدیریت خطا آشنا میشویم تا بتوانیم برنامههای واقعیتر و حرفهایتری برای میکروکنترلر خود بنویسیم.
سرفصل های این قسمت:
- آشنایی با انواع داده و متغیرها در میکروپایتون
- یادگیری عملگرها و نحوه استفاده از آنها
- تسلط بر ساختارهای کنترلی (شرطها و حلقهها)
- توانایی تعریف توابع و کار با ماژولها
- آشنایی با مدیریت خطا (Exception Handling)
- درک محدودیتها و تفاوتهای میکروپایتون با پایتون استاندارد
1. انواع داده و متغیرها
در میکروپایتون همانند پایتون استاندارد، متغیرها بدون اعلام نوع تعریف میشوند. اما به دلیل محدودیت حافظه، باید به اندازه و کارایی توجه داشت.
انواع داده اصلی:
| نوع داده | توضیح | مثال |
|---|---|---|
int |
اعداد صحیح (در میکروپایتون معمولاً ۳۲ بیت) | x = 42 |
float |
اعداد اعشاری (دقت محدود، گاهی ۳۲ بیت) | y = 3.14 |
bool |
مقادیر True یا False | z = True |
str |
رشتههای متنی | name = "Micro" |
bytes |
دنبالهای از بایتها | data = b'\x01\x02' |
list |
لیست (قابل تغییر) | nums = [1, 2, 3] |
tuple |
تاپل (غیرقابل تغییر) | point = (10, 20) |
dict |
دیکشنری (نگاشت کلید-مقدار) | d = {'key': 'value'} |
set |
مجموعه (اعضای یکتا) | s = {1, 2, 3} |
نکته مهم: در میکروپایتون، اعداد صحیح میتوانند تا اندازه ۳۲ بیت باشند و در صورت سرریز به طور خودکار به long integer تبدیل نمیشوند (برخلاف پایتون استاندارد). اعداد اعشاری معمولاً با دقت تکدقتی (single precision) پیادهسازی میشوند.
متغیرها:
|
1 2 3 4 5 |
counter = 0 name = "Ali" temperature = 25.5 is_on = False |
بررسی نوع داده:
|
1 2 |
print(type(counter)) # <class 'int'> |
تبدیل نوع:
|
1 2 3 4 |
a = int("100") # 100 b = str(3.14) # "3.14" c = float("2.5") # 2.5 |
2. عملگرها
عملگرهای حسابی:
| عملگر | توضیح | مثال |
|---|---|---|
+ |
جمع | 5 + 3 = 8 |
- |
تفریق | 5 - 3 = 2 |
* |
ضرب | 5 * 3 = 15 |
/ |
تقسیم (نتیجه float) | 5 / 2 = 2.5 |
// |
تقسیم صحیح | 5 // 2 = 2 |
% |
باقیمانده | 5 % 2 = 1 |
** |
توان | 2 ** 3 = 8 |
عملگرهای مقایسهای:
| عملگر | توضیح | مثال |
|---|---|---|
== |
مساوی | 5 == 5 → True |
!= |
نامساوی | 5 != 3 → True |
< |
کوچکتر | 3 < 5 → True |
> |
بزرگتر | 5 > 3 → True |
<= |
کوچکتر یا مساوی | 3 <= 3 → True |
>= |
بزرگتر یا مساوی | 5 >= 3 → True |
عملگرهای منطقی:
| عملگر | توضیح | مثال |
|---|---|---|
and |
و | True and False → False |
or |
یا | True or False → True |
not |
نقیض | not True → False |
عملگرهای انتساب:
| عملگر | معادل | مثال |
|---|---|---|
= |
انتساب ساده | x = 5 |
+= |
افزایش و انتساب | x += 3 → x = x + 3 |
-= |
کاهش و انتساب | x -= 2 |
*= |
ضرب و انتساب | x *= 2 |
/= |
تقسیم و انتساب | x /= 2 |
3. ساختارهای کنترلی
الف) شرط if-elif-else
|
1 2 3 4 5 6 7 8 9 10 11 |
temperature = 30 if temperature > 35: print("خیلی گرم!") elif temperature > 25: print("گرم") elif temperature > 15: print("مطبوع") else: print("سرد") |
ب) حلقه for
حلقه for برای پیمایش روی دنبالهها (لیست، رشته، تاپل، range) استفاده میشود.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# پیمایش روی لیست fruits = ["apple", "banana", "cherry"] for fruit in fruits: print(fruit) # با استفاده از range for i in range(5): # 0 تا 4 print(i) # پیمایش روی رشته for ch in "Micro": print(ch) |
ج) حلقه while
تکرار تا زمانی که شرط برقرار باشد.
|
1 2 3 4 5 |
count = 0 while count < 5: print("count:", count) count += 1 |
د) دستورات break و continue
break: خروج از حلقهcontinue: پرش به تکرار بعدی
|
1 2 3 4 5 6 7 |
for i in range(10): if i == 3: continue # از چاپ ۳ صرفنظر کن if i == 7: break # حلقه را پایان بده print(i) |
4. توابع (Functions)
تعریف تابع با کلیدواژه def انجام میشود. توابع به ماژولار شدن کد کمک میکنند.
تعریف تابع ساده:
|
1 2 3 4 5 |
def say_hello(): print("Hello!") say_hello() # فراخوانی |
تابع با پارامتر و مقدار بازگشتی:
|
1 2 3 4 5 6 |
def add(a, b): return a + b result = add(5, 3) print(result) # 8 |
پارامتر پیشفرض:
|
1 2 3 4 5 6 |
def greet(name, msg="سلام"): print(msg, name) greet("Ali") # سلام علی greet("Sara", "خوش آمدی") # خوش آمدی سارا |
محدودیت در میکروپایتون:
- توابع تو در تو (nested) پشتیبانی میشوند اما ممکن است مصرف حافظه بیشتری داشته باشند.
- closures و lambda نیز وجود دارند (lambda با محدودیت).
مثال lambda:
|
1 2 3 |
square = lambda x: x**2 print(square(4)) # 16 |
5. ماژولها و کتابخانهها
ماژولها فایلهای حاوی کد پایتون هستند که میتوان آنها را وارد (import) کرد.
ایمپورت ماژولهای داخلی:
میکروپایتون مجموعهای از ماژولهای مفید دارد:
machine: دسترسی به سختافزار (پینها، تایمر، ADC و …)time: توابع مربوط به زمان و تأخیرmath: توابع ریاضیsys: اطلاعات سیستمos: مدیریت فایلها
|
1 2 3 4 5 6 7 8 9 10 |
import machine import time led = machine.Pin(2, machine.Pin.OUT) while True: led.value(1) time.sleep(1) led.value(0) time.sleep(1) |
ایمپورت انتخابی:
|
1 2 3 4 5 |
from machine import Pin from time import sleep led = Pin(2, Pin.OUT) |
ساخت ماژول شخصی:
میتوانید فایل .py جدیدی روی برد بسازید و آن را import کنید.
فایل myutils.py:
|
1 2 3 4 5 |
def double(x): return x * 2 PI = 3.14 |
استفاده:
|
1 2 3 4 |
import myutils print(myutils.double(5)) print(myutils.PI) |
6. مدیریت استثناها (Exceptions)
مدیریت خطا به برنامه اجازه میدهد بهجای توقف ناگهانی، رفتار مناسبی از خود نشان دهد.
ساختار try-except:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
try: a = int(input("عدد وارد کن: ")) b = int(input("عدد دیگر: ")) result = a / b print("نتیجه:", result) except ValueError: print("خطا: ورودی معتبر نیست!") except ZeroDivisionError: print("خطا: تقسیم بر صفر!") except Exception as e: print("خطای ناشناخته:", e) |
استفاده از finally:
|
1 2 3 4 5 6 |
try: f = open("data.txt", "r") # پردازش فایل finally: f.close() # حتماً اجرا میشود |
نکات در میکروپایتون:
- مدیریت استثناها مقداری حافظه مصرف میکند، پس در حلقههای بحرانی از آن کمتر استفاده کنید.
- خطاهای رایج:
NameError,TypeError,IndexError,KeyError.
7. نکات بهینهسازی برای میکروپایتون
با توجه به محدودیت منابع، رعایت موارد زیر مفید است:
- از متغیرهای محلی استفاده کنید (دسترسی سریعتر).
- از لیستها و دیکشنریهای بزرگ بپرهیزید (حافظه محدود).
- از عملگرهای حسابی ساده استفاده کنید (عملیات سنگین مثل اعشاری طولانی ممکن است کند باشد).
- در حلقهها، محاسبات ثابت را خارج از حلقه قرار دهید.
- از تخصیص مکرر حافظه در حلقه خودداری کنید (مثلاً ساختن لیست جدید هر بار).
- از
micropythonماژول برای بهینهسازیهای سطح پایین استفاده کنید. (اختیاری)
مثال:
|
1 2 3 4 5 6 7 8 9 10 |
# بد for i in range(1000): x = i * 2 + 1 # خوب است اما # بهتر factor = 2 offset = 1 for i in range(1000): x = i * factor + offset |
8. تمرینهای عملی
تمرین ۱: ماشین حساب ساده
برنامهای بنویسید که دو عدد از ورودی بگیرد و عملگر (+, -, *, /) را دریافت کرده و نتیجه را چاپ کند. از مدیریت خطا برای ورودی نامعتبر استفاده کنید.
تمرین ۲: اعداد فیبوناچی
تابعی بنویسید که عدد n را گرفته و n عدد اول دنباله فیبوناچی را در یک لیست برگرداند. سپس با حلقه آنها را چاپ کنید.
تمرین ۳: مدیریت LED با تابع
تابعی به نام blink_led(pin, duration, count) بنویسید که یک LED روی پین مشخص را به تعداد دفعات count با تأخیر duration ثانیه چشمک بزند. سپس این تابع را صدا بزنید.
تمرین ۴: ماژول شخصی
یک ماژول به نام conversions.py بسازید که شامل توابع تبدیل دما (C به F و بالعکس) و تبدیل فاصله (km به mile) باشد. سپس در برنامه اصلی آن را import کرده و از آن استفاده کنید.
تمرین ۵: مدیریت خطا در سنسور
فرض کنید قصد دارید مقداری از یک سنسور بخوانید. اگر خطایی رخ داد (مثلاً سنسور وصل نیست)، پیام مناسب چاپ کنید و برنامه متوقف نشود. (میتوانید با try شبیهسازی کنید.)
9. خلاصه جلسه
در این جلسه مروری بر مفاهیم پایهای پایتون داشتیم که برای برنامهنویسی با میکروپایتون ضروری هستند. این مفاهیم شامل:
- انواع داده و متغیرها
- عملگرها
- ساختارهای کنترلی
- توابع و ماژولها
- مدیریت استثناها
همچنین نکات بهینهسازی و تفاوتهای میکروپایتون با پایتون استاندارد را بررسی کردیم. تمرینهای عملی به شما کمک میکنند این مفاهیم را تثبیت کنید.
در جلسه بعد به ورودی/خروجی دیجیتال میپردازیم و با GPIO کار خواهیم کرد.



