class Signal – styr och avläs externa I/O-enheter

Signal-klassen är en enkel utvidgning av Pin-klassen. Till skillnad från Pin, som endast kan vara i de ”absoluta” tillstånden 0 och 1, kan en Signal vara i tillstånden ”aktiverad” (på) eller ”avaktiverad” (av), samtidigt som den kan vara inverterad (aktiv låg) eller inte. Med andra ord lägger den till stöd för logisk inversion till Pin-funktionaliteten. Även om detta kan verka som ett enkelt tillägg är det exakt vad som behövs för att stödja en bred uppsättning enkla digitala enheter på ett sätt som är portabelt mellan olika kort, vilket är ett av MicroPythons huvudmål. Oavsett om olika användare har en aktiv-hög eller aktiv-låg LED, ett normalt öppet eller normalt slutet relä - kan du utveckla en enda, snygg tillämpning som fungerar med var och en av dem, och fånga skillnader i hårdvarukonfiguration i ett fåtal rader i appens konfigurationsfil.

Exempel:

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()

Följande är en vägledning för när Signal kontra Pin bör användas:

  • Använd Signal: Om du vill styra enkla på/av-enheter (inklusive mjukvaru-PWM!) som LED-lampor, flersegmentsindikatorer, reläer, summer, eller läsa enkla binära sensorer, som normalt öppna eller normalt slutna knappar, uppdragna till hög eller låg nivå, reedkontakter, fukt-/flamdetektorer osv. osv. Sammanfattningsvis, om du har en verklig fysisk enhet/sensor som kräver GPIO-åtkomst bör du sannolikt använda en Signal.

  • Använd Pin: Om du implementerar ett protokoll eller en buss på högre nivå för att kommunicera med mer komplexa enheter.

Uppdelningen mellan Pin och Signal kommer från användningsfallen ovan och MicroPythons arkitektur: Pin erbjuder den lägsta omkostnaden, vilket kan vara viktigt vid bit-banging av protokoll. Men Signal lägger till ytterligare flexibilitet ovanpå Pin, till priset av en mindre omkostnad (mycket mindre än om du implementerade skillnader mellan aktiv-hög och aktiv-låg enhet manuellt i Python!). Dessutom är Pin ett lågnivåobjekt som behöver implementeras för varje kort som stöds, medan Signal är ett högnivåobjekt som kommer gratis så snart Pin är implementerat.

Om du är osäker, ge Signal ett försök! Återigen, det erbjuds för att bespara utvecklare behovet av att hantera ointressanta skillnader som aktiv-låg kontra aktiv-hög signaler, och för att låta andra användare dela och njuta av din tillämpning, i stället för att bli frustrerade över att den inte fungerar för dem helt enkelt för att deras LED-lampor eller reläer är kopplade på ett något annorlunda sätt.

Konstruktorer

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

Skapa ett Signal-objekt. Det finns två sätt att konstruera det:

  • Omslut ett befintligt Pin-objekt – universellt, fungerar på vilket kort som helst.

  • Skicka Pin-konstruktorargument direkt – samma positions- och nyckelordsargument som accepteras av Pin vidarebefordras till en internt skapad Pin. Tillgängligt på många, men inte alla, kort.

Argument:

  • pin_obj – en befintlig Pin-instans att omsluta.

  • pin_args / pin_kwargs – argumenten att vidarebefordra till Pin-konstruktorn när det underliggande stiftet konstrueras direkt.

  • invert – om True inverteras signalen (aktiv låg).

Metoder

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

Denna metod gör det möjligt att sätta och hämta värdet på signalen, beroende på om argumentet x anges eller inte.

Om argumentet utelämnas hämtar denna metod signalnivån, där 1 betyder att signalen är aktiverad (aktiv) och 0 - signalen inaktiv.

Om argumentet anges sätter denna metod signalnivån. Argumentet x kan vara vad som helst som konverteras till ett booleskt värde. Om det konverteras till True är signalen aktiv, annars är den inaktiv.

Sambandet mellan att signalen är aktiv och den faktiska logiska nivån på det underliggande stiftet beror på huruvida signalen är inverterad (aktiv låg) eller inte. För en icke-inverterad signal motsvarar aktivt tillstånd logisk 1, inaktivt - logisk 0. För en inverterad/aktiv-låg signal motsvarar aktivt tillstånd logisk 0, medan inaktivt - logisk 1.

on() None

Aktivera signal.

off() None

Avaktivera signal.