class Signal -- التحكم في أجهزة الإدخال/الإخراج الخارجية واستشعارها

فئة Signal امتداد بسيط لفئة Pin. على عكس Pin التي لا يمكن أن تكون إلا في الحالتين "المطلقتين" 0 و1، يمكن لـ Signal أن تكون في حالة "مؤكَّدة" (مُشغَّلة) أو "غير مؤكَّدة" (مُطفأة)، بينما تكون مقلوبة (نشطة عند المستوى المنخفض) أو غير مقلوبة. بعبارة أخرى، تضيف دعم القلب المنطقي إلى وظائف Pin. وفي حين قد يبدو هذا إضافةً بسيطة، فهو بالضبط ما يلزم لدعم مجموعة واسعة من الأجهزة الرقمية البسيطة بطريقة قابلة للنقل عبر لوحات مختلفة، وهو أحد أهداف MicroPython الرئيسية. وبصرف النظر عما إذا كان لدى مستخدمين مختلفين LED نشط عند المستوى المرتفع أو المنخفض، أو مُرحِّل مفتوح عادةً أو مغلق عادةً -- يمكنك تطوير تطبيق واحد أنيق المظهر يعمل مع كل منها، والتقاط اختلافات تكوين العتاد في بضعة أسطر في ملف تكوين تطبيقك.

مثال:

from machine import Pin, Signal

# Suppose you have an active-high LED on pin 0
led1_pin = Pin(0, Pin.OUT)
# ... and active-low LED on pin 1
led2_pin = Pin(1, Pin.OUT)

# Now to light up both of them using Pin class, you'll need to set
# them to different values
led1_pin.value(1)
led2_pin.value(0)

# Signal class allows to abstract away active-high/active-low
# difference
led1 = Signal(led1_pin, invert=False)
led2 = Signal(led2_pin, invert=True)

# Now lighting up them looks the same
led1.value(1)
led2.value(1)

# Even better:
led1.on()
led2.on()

فيما يلي الدليل لمتى ينبغي استخدام Signal مقابل Pin:

  • استخدم Signal: إذا كنت تريد التحكم في أجهزة تشغيل/إطفاء بسيطة (بما في ذلك PWM البرمجي!) مثل LEDs أو المؤشرات متعددة المقاطع أو المرحِّلات أو الأجهزة الصفّارة، أو قراءة مستشعرات ثنائية بسيطة، مثل الأزرار المفتوحة عادةً أو المغلقة عادةً، المسحوبة عاليًا أو منخفضًا، أو مفاتيح ريد، أو كواشف الرطوبة/اللهب، إلخ. إلخ. وخلاصة القول، إذا كان لديك جهاز/مستشعر فيزيائي حقيقي يتطلب الوصول إلى GPIO، فمن المرجح أنه ينبغي لك استخدام Signal.

  • استخدم Pin: إذا كنت تنفّذ بروتوكولًا أو ناقلًا عالي المستوى للتواصل مع أجهزة أكثر تعقيدًا.

ينبع الفصل بين Pin وSignal من حالات الاستخدام أعلاه ومن بنية MicroPython: تقدّم Pin أقل حِمل، وهو ما قد يكون مهمًا عند بروتوكولات النقر البتي. لكن Signal تضيف مرونة إضافية فوق Pin، على حساب حِمل طفيف (أصغر بكثير مما لو نفّذت اختلافات الجهاز النشط عند المستوى المرتفع مقابل المنخفض في Python يدويًا!). كما أن Pin كائن منخفض المستوى يحتاج إلى تنفيذ لكل لوحة مدعومة، بينما Signal كائن عالي المستوى يأتي مجانًا بمجرد تنفيذ Pin.

إذا ساورك الشك، جرّب Signal! ومرة أخرى، فهي مُقدَّمة لتوفّر على المطورين الحاجة إلى التعامل مع اختلافات غير مثيرة مثل الإشارات النشطة عند المستوى المنخفض مقابل المرتفع، وللسماح لمستخدمين آخرين بمشاركة تطبيقك والاستمتاع به، بدلًا من الإحباط من حقيقة أنه لا يعمل لديهم لمجرد أن LEDs أو المرحِّلات لديهم موصّلة بطريقة مختلفة قليلًا.

المُنشئات

class machine.Signal(pin_obj: Pin, *, invert: bool = False)
class machine.Signal(*pin_args: Any, invert: bool = False, **pin_kwargs: Any)

تُنشئ كائن Signal. هناك طريقتان لإنشائه:

  • تغليف كائن Pin موجود -- شامل، يعمل على أي لوحة.

  • تمرير وسائط مُنشئ Pin مباشرة -- تُمرَّر الوسائط الموضعية والمفتاحية ذاتها التي تقبلها Pin إلى Pin يُنشأ داخليًا. متاح على لوحات كثيرة، لكن ليس كلها.

الوسائط:

  • pin_obj -- مثيل Pin موجود لتغليفه.

  • pin_args / pin_kwargs -- الوسائط التي تُمرَّر إلى مُنشئ Pin عند إنشاء الدبوس الأساسي مباشرةً.

  • invert -- إذا كان True فإن الإشارة مقلوبة (نشطة عند المستوى المنخفض).

الطرق

value(x: Any = None, /) int | None

تتيح هذه الطريقة ضبط قيمة الإشارة والحصول عليها، تبعًا لما إذا كان الوسيط x مُوفَّرًا أم لا.

إذا حُذف الوسيط فإن هذه الطريقة تحصل على مستوى الإشارة، حيث يعني 1 أن الإشارة مؤكَّدة (نشطة) و0 أن الإشارة غير نشطة.

إذا وُفِّر الوسيط فإن هذه الطريقة تضبط مستوى الإشارة. يمكن أن يكون الوسيط x أي شيء يتحول إلى قيمة منطقية. إذا تحوّل إلى True فالإشارة نشطة، وإلا فهي غير نشطة.

يعتمد التطابق بين كون الإشارة نشطة والمستوى المنطقي الفعلي على الدبوس الأساسي على ما إذا كانت الإشارة مقلوبة (نشطة عند المستوى المنخفض) أم لا. بالنسبة للإشارة غير المقلوبة، تتوافق الحالة النشطة مع المنطقي 1، وغير النشطة مع المنطقي 0. بالنسبة للإشارة المقلوبة/النشطة عند المستوى المنخفض، تتوافق الحالة النشطة مع المنطقي 0، بينما تتوافق غير النشطة مع المنطقي 1.

on() None

تنشّط الإشارة.

off() None

تُعطّل الإشارة.