Nauč se Python > Materiály > PyWorking: MicroPython > Úvod > Velice rychle blikat

Velice rychle blikat #

Jedna z nevýhod „našeho” čipu ESP8266 je, že na svých nožičkách umí nastavovat jen dvě hodnoty – 3,3 V a zem, jedničku a nulu. Dioda tak buď svítí, nebo nesvítí – nedá se nastavit poloviční intenzita, nedá se plynule rozsvěcet nebo zhasínat.

Tuhle nevýhodu ale můžeme obejít s využitím dvou faktů. Ten první je, že diodám – na rozdíl od žárovek nebo zářivek – nevadí časté vypínání a zapínání. Opotřebovávají se spíš svícením a časem. Druhý je, že lidské oko nestačí zaznamenat pohyby a změny, které trvají míň než zhruba setinu vteřiny.

Pojďme tedy velice rychle blikat – a oblafnout tak naše oči a mozky!

from machine import Pin
from time import sleep

pin_diody = Pin(14, Pin.OUT)
while True:
    pin_diody.value(0)  # vypnout LED
    sleep(2/1000)  # počkat dvě tisíciny vteřiny
    pin_diody.value(1)  # zapnout LED
    sleep(1/1000)  # počkat jednu tisícinu vteřiny

Zkus si pohrát s hodnotami pro time.sleep.

Takhle fungují prakticky všechna stmívatelná LED světla – rychlé blikání je ekonomičtější a přesnější než např. nastavování nižšího napětí.

Dokážeš napsat program, který diodu postupně, plynule rozsvítí?

Řešení

Protože je takovéhle rychlé blikání užitečné ve spoustě různých situací, obsahuje MicroPython speciální funkci: umí blikat samostatně. Nastavíš, jak rychle má blikat a jak dlouho má trvat každé bliknutí, a MicroPython pak bude blikat automaticky, zatímco tvůj program se může věnovat něčemu jinému.

Téhle funkci se říká pulzně šířková modulace – angl. Pulse Width Modulation, neboli PWM. Z MicroPythonu jde tahle funkce ovládat pomocí třídy machine.PWM. Každý objekt téhle třídy umí ovládat jednu nožičku a dají se u něj nastavit dva parametry:

  • freq – frekvence, tedy kolikrát za sekundu se LED rozsvítí a zase zhasne a
  • duty – anglicky duty cycle, česky střída, nastavuje „šířku pulzu”, tedy jak dlouho bude dioda při každém bliknutí svítit. Hodnota duty může být od 0, kdy LED nesvítí vůbec, do 1023, kdy svítí celou dobu. Nastavíš-li duty=512, bude dioda svítit s poloviční intenzitou (512 = 1024/2).

Nastavíš-li PWM(freq=50, duty=512), dioda bude blikat 50× za sekundu. Vždycky jednu setinu vteřiny bude svítit a na jednu setinu vteřiny zhasne.

from machine import Pin, PWM

pin_diody = Pin(14, Pin.OUT)
pwm = PWM(pin_diody, freq=50, duty=512)

Když budeš chtít frekvenci nebo střídu změnit, použij:

pwm.freq(100)
pwm.duty(256)

Zkus nastavit i nižší frekvenci, třeba 3 nebo 1, ať blikání vidíš přímo!

PWM se dá zrušit metodou pwm.deinit(). Jako s otvíráním souborů, je dobré po sobě uklidit – i když tady můžeš místo toho prostě restartovat celé zařízení.


Toto je stránka lekce z kurzu, který probíhá nebo proběhl naživo s instruktorem.