Už umíme ledku rozblikat, umíme ji rozsvítit pomocí tlačítka, a teď ještě zkusíme regulovat její jas. Regulace jasu probíhá pomocí PWM, tedy pomocí pulsně šířkové modulace. Jde o to že se místo digitální hodnoty, tedy logické jedničky nebo nuly nastavuje diskrétní hodnota, což znamená, že signál, který jde z MCU do LED se rozdělí do velmi malých časových bloků, a v každém časovém bloku se posílá určitý počet logických hodnot. Řekněme že máme 1000 logických hodnot v jednom časovém bloku, jeden časový blok je 1s. To znamená, že za jednu sekundu se musí poslat 1000 logických hodnot. Pokud budou všechny logické hodnoty 1, potom bude dioda celou dobu svítit. Pokud bude pouze prvních 500 hodnot 1 a zbytek nula, pak polovinu času bude dioda svítit a druhou polovinu zhaslá. Bude tak blikat. Ve skutečnosti se však do jedné sekundy vlezou stovky časových oken, a každé okno může mít klidně těch 1000 logických hodnot. Asi vám to nic neříká, ale když bude dioda blikat dostatečně rychle, bude se její blikání jevit jako souvislý svit se sníženým jasem. ESP8266 má těch logických hodnot dokonce 1024, takže regulovat jas v rozsahu 0-1023, což je poměrně dostatečné množství hodnot pro nastavení úrovně jasu. Nastavíme-li tedy 1023, bude dioda svítit na 100% jasu. Nastavíme-li 512, bude dioda svítit na polovinu jasu, a když pak nastavíme nulu, bude dioda zhaslá. Uděláme si program, který nám bude ukazovat postupnou regulaci jasu. Aby byl rozdíl viditelný, dáme si rozdíl třeba 50 jednotek. K nastavení diskrétní hodnoty používáme příkaz analogWrite(pin, value); kde za pin dosadíme číslo pinu led, a za value dosadíme hodnotu z rozsahu. Pomocí cyklu si uděláme postupné rozsvěcení a následně postupné zhasnutí diody. Abychom mohli měnit jas po 50 jednotkách, musíme si upravit rozsah tak, aby přičítáním, resp. pak odečítáním čísla 50 bylo možno dosáhnout obou konců rozsahu. Dáme si tedy rozsah 0 až 1000. Nesmíme pak zapomenout mezi každou změnou jasu vyčkat určitý čas, aby byla změna patrná. Podívejte se do komentovaného kódu, jak to vše funguje.

//pin pro led
const char led = 5;
//proměnná pro hodnotu jasu
int brightness = 0;
//proměnná pro krok
int krok = 50;
void setup() {
//inicializace pinu led jako výstup
pinMode(led, OUTPUT);
//nastavení hodnoty výstupu na 0
analogWrite(led, 0);
//inicializace sériového rozhraní
Serial.begin(9600);

}

void loop() {

// zvýší hodnotu proměnné jasu
brightness = brightness + krok;
//vypíše aktuální hodnotu jasu na sériový monitor
Serial.println(brightness);
// nastaví jas LED
analogWrite(led, brightness);

// pokud narazí na dolní konec rozsahu, OR (nebo) horní konec rozsahu
if (brightness == 0 || brightness == 1000) {
//všimnětě si, že v podmínce je hodnota maximálního jasu 1000, je to proto, že když přičítáme číslo 50, musíme zde dát jako maximální takovou hodnotu, kterou můžeme přičítáním čísla 50 dosáhnout.
//pak změní znaménko proměnné krok
krok = -krok;
}
//počká mezi jednotlivými změnami
delay(200);
}