Ovládání jasu externí LED pomocí rezistorů. Ovládání jasu LED pomocí potenciometru Arduino, plynulé zapnutí rgb LED z tlačítka

V tomto experimentu jedním tlačítkem přidáme část jasu LED a druhým jej snížíme.

SEZNAM DÍLŮ K EXPERIMENTU

- 1 deska Arduino Uno;

- 1 nepájené prkénko na krájení;

- 2 tlačítka hodin;

- 1 rezistor s nominální hodnotou 220 Ohmů;

- 1 LED;

- 7 vodičů samec-samec.

KRUHOVÝ DIAGRAM

DIAGRAM NA PLÁŠTĚ

POZNÁMKA

  • Pokud předěláváte obvod z předchozího experimentu, všimněte si, že tentokrát musíme LED připojit k portu, který podporuje PWM.

SKICA

Stáhněte si skicu pro Arduino IDE
#define PLUS_BUTTON_PIN 2 #define MINUS_BUTTON_PIN 3 #define LED_PIN 9 int jas = 100; boolean plusUp = true; boolean minusUp = true; void setup() ( pinMode(LED_PIN, OUTPUT); pinMode(PLUS_BUTTON_PIN, INPUT_PULLUP); pinMode(MINUS_BUTTON_PIN, INPUT_PULLUP); ) void loop() ( analogWrite(LED_PIN, jas); // reagovat na kliknutí pomocí funkce, kterou jsme napsali plusUp = handleClick(PLUS_BUTTON_PIN, plusUp, +35); minusUp = handleClick(MINUS_BUTTON_PIN, minusUp, -35); ) // Vlastní funkce se 3 parametry: číslo PIN pomocí tlačítka // (buttonPin), stav před ověřením (wasUp ) a gradaci // jasu po kliknutí na tlačítko (delta). Funkce vrátí // (anglicky return) zpět nový, aktuální stav tlačítka boolean handleClick(int buttonPin, boolean wasUp, int delta) ( boolean isUp = digitalRead(buttonPin); if (wasUp && !isUp) ( delay(10 ); isUp = digitalRead(buttonPin); // pokud došlo ke kliknutí, změňte jas z 0 na 255 if (!isUp) bright = constrain(brightness + delta, 0, 255); ) return isUp; // return the hodnotu zpět na kód volajícího)

VYSVĚTLENÍ KÓDU

  • Můžeme využívat nejen vestavěné funkce, ale také vytvářet vlastní. To je opodstatněné, když potřebujeme opakovat stejné akce na různých místech v kódu nebo například potřebujeme provést stejné akce na různých datech, jako v tomto případě: zpracovat signál z digitálních portů 2 a 3.
  • Své vlastní funkce můžete definovat kdekoli v kódu mimo kód jiných funkcí. V našem příkladu jsme definovali funkci po smyčka .
  • K definování vlastní funkce potřebujeme:
    • Deklarujte, jaký datový typ vrátí. V našem případě ano booleovský. Pokud funkce provádí pouze některé akce a nevrací žádnou hodnotu, použijte klíčové slovo prázdnota
    • Přiřaďte funkci název – identifikátor. Platí zde stejná pravidla jako při pojmenovávání proměnných a konstant. Funkce jsou pojmenovány stejným stylem jako Proměnné .
    • V závorkách uveďte parametry předané funkci s uvedením typu každého z nich. Jedná se o deklaraci proměnných, které jsou viditelné v rámci nově vytvořené funkce a pouze v ní. Pokud se například v tomto experimentu pokusíme o přístup wasUp nebo je nahoře z smyčka() Od kompilátoru obdržíme chybovou zprávu. Stejně tak proměnné deklarované v smyčka, nejsou viditelné pro jiné funkce, ale jejich hodnoty lze předat jako parametry.
    • Mezi pár složených závorek napište kód spuštěný funkcí
    • Pokud funkce musí vrátit nějakou hodnotu, použijte klíčové slovo vrátit se určit, jakou hodnotu vrátit. Tato hodnota musí být typu, který jsme deklarovali
  • Takzvané globální proměnné, tzn. Proměnné, ke kterým lze přistupovat z libovolné funkce, jsou obvykle deklarovány na začátku programu. V našem případě je to tak jas .
  • Uvnitř funkce, kterou jsme vytvořili kliknout na kliku Děje se to samé jako v experimentu.
  • Protože s krokem zvýšení jasu 35, po maximálně osmi po sobě jdoucích kliknutích na jedno z tlačítek, hodnota výrazu jas + delta půjde mimo interval . Pomocí funkce omezovat omezíme povolené hodnoty proměnné jas specifikované hranice intervalů.
  • Ve výrazu plusUp = handleClick(PLUS_BUTTON_ KOLÍK , plusUp, +35) přistupujeme k proměnné plusUp dvakrát. Protože = vloží hodnotu pravého operandu do levého a nejprve vypočítá, co se vrátí kliknout na kliku. Takže když jí dáme plusUp jako parametr má stále starou hodnotu vypočítanou při posledním volání kliknout na kliku .
  • Uvnitř kliknout na kliku vypočítáme novou hodnotu jasu LED a zapíšeme ji do globální proměnné jas, který při každé iteraci smyčka právě předán analogWrite .

OTÁZKY K VYZKOUŠENÍ

  1. Co znamená klíčové slovo? prázdnota ?
  2. Jak se program chová, když je jedna proměnná zmíněna z různých stran operátoru přiřazení = ?

ÚKOLY PRO SAMOSTATNÉ ŘEŠENÍ

  1. Upravte kód tak, aby byl krok změny jasu nastaven na jednom místě.
  2. Vytvořte další funkci a přepracujte kód tak, aby jedna funkce byla zodpovědná za sledování úhozů a druhá za výpočet jasu LED a jeho návrat do analogWrite .

Seznam dílů pro experiment

Za úkol navíc

    1 další LED

    1 další rezistor s nominální hodnotou 220 Ohmů

    2 další dráty

Schematický diagram

Schéma na prkénku

Poznámka

    „Uzemnění“ LED a proměnný odpor (potenciometr) jsme připojili k dlouhé „-“ kolejnici prkénka a již jsme jej připojili ke vstupu GND mikrokontroléru. Tímto způsobem jsme použili méně vstupů a méně vodičů vede od prkénka k ovladači.

    Podpisy „+“ a „-“ na prkénku vás nezavazují, abyste je používali výhradně pro napájení, prostě se tak používají nejčastěji a označení nám pomáhají

    Nezáleží na tom, která z vnějších nohou potenciometru je připojena na 5 V a která na GND, změní se pouze směr, kterým je potřeba otočit knoflík pro zvýšení napětí. Pamatujte, že signál čteme ze střední nohy

    Pro čtení analogového signálu, který přijímá široký rozsah hodnot, a ne jen 0 nebo 1 jako digitální signál, jsou vhodné pouze porty označené "ANALOG IN" na desce a očíslované předponou A. Pro Arduino Uno je to A0-A5.

Skica

p030_pot_light.ino // dát rozumná jména pro piny s LED // a potenciometr (anglicky potenciometr nebo jednoduše „pot“)#define LED_PIN 9 #define POT_PIN A0 void setup() ( // pin s LED - výstup, jako předtím... pinMode(LED_PIN, OUTPUT) ; // ...ale pin s potenciometrem by měl být vstup // (anglický „vstup“): chceme přečíst napětí,// jím vydaný pinMode(POT_PIN, INPUT) ; ) void loop() ( // deklarujeme, že dále budeme používat 2 proměnné s // pojmenovává rotaci a jas a co do nich budeme ukládat // celá čísla (anglicky: „integer“, zkráceno jednoduše „int“) int rotace, jas; // odečtěte napětí z potenciometru v rotaci: // mikrokontrolér vydá číslo od 0 do 1023 // úměrné úhlu natočení rukojeti rotace = analogRead(POT_PIN) ; // v jasu zapíšeme dříve získanou hodnotu rotace // děleno 4. Protože jsme chtěli ukládat do proměnných // celočíselné hodnoty, zlomková část dělení bude zahozena. // V důsledku toho dostaneme celé číslo od 0 do 255 jas = rotace / 4 ; // výstup výsledku na LED analogWrite(LED_PIN, jas) ; )

Vysvětlení kódu

    Pomocí direktivy #define jsme řekli kompilátoru, aby nahradil identifikátor POT_PIN za A0 - číslo analogového vstupu. Můžete narazit na kód tam, kde se k analogovému portu přistupuje pomocí čísla bez indexu A. Tento kód bude fungovat, ale aby nedošlo k záměně s digitálními porty, použijte index.

    Proměnné mají obvykle názvy začínající malým písmenem.

    Chcete-li použít proměnnou, musíte ji deklarovat, což provedeme pomocí instrukce:

int rotace, jas;

    Proměnné stejného typu lze deklarovat v jednom příkazu a uvést je oddělené čárkami, což jsme udělali

    Funkce analogRead(pinA) vrací celočíselnou hodnotu v rozsahu 0 až 1023, úměrnou napětí přivedenému na analogový vstup, jehož číslo předáme funkci jako parametr pinA.

    Všimněte si, jak jsme dostali hodnotu vrácenou analogRead(): jednoduše jsme ji vložili do rotační proměnné pomocí operátoru přiřazení =, který zapíše to, co je napravo od ní, do proměnné nalevo.

Otázky k otestování

    Můžeme při sestavování obvodu připojit LED a potenciometr přímo na různé GND vstupy mikrokontroléru?

    Jakým směrem by měl být proměnný rezistor otočen, aby se zvýšil jas LED?

    Co se stane, když z programu vymažete řádek pinMode(LED_PIN, OUTPUT)? řádek pinMode(POT_PIN, INPUT) ?

    Proč rozdělujeme hodnotu přijatou z analogového vstupu před nastavením jasu LED? co se stane, když se to neudělá?

Funkce analogWrite() se používá k zeslabení LED a jeho postupnému rozsvícení.

AnalogWrite využívá modulaci šířky pulzu (PWM), která umožňuje digitálnímu kolíku zapínat/vypínat vysokou rychlostí a generovat tlumící efekt.

Co budete k projektu potřebovat

  • Deska Arduino
  • Breadboard
  • Světelná dioda
  • odpor 220 ohmů

Schéma připojení LED k Arduinu

Připojte anodu (delší kladnou nohu) LED k digitálnímu kolíku 9 desky Arduino přes odpor 220 ohmů. Připojte katodu (kratší, záporně nabitou nohu) k zemi.

Schéma zapojení LED připojené k Arduinu


Možnost stínění s LED pro Arduino

Popis programu pro Arduino

Po deklaraci pinu 9 jako ledPin nemusí být tělo funkce setup() vyplněno.

Funkce analogWrite(), kterou použijete v hlavní smyčce, vyžaduje dva argumenty: jeden pro určení pinu, na který se má zapisovat, a jeden pro zobrazení zapisované hodnoty PWM.

Abyste postupně rozsvěcovali a zhasínali vaši LED, postupně zvyšujte hodnotu PWM od 0 do 255 a poté zpět na 0 pro dokončení cyklu. Na náčrtu níže je hodnota PWM použita pro proměnnou zvanou jas. Pokaždé, když se smyčka dokončí, zvýší hodnotu proměnné.

Pokud jas dosáhne své mezní hodnoty (0 nebo 255), fadeAmount změní svou hodnotu na zápornou. Jinými slovy, pokud je fadeAmount 5, jeho hodnota se změní na -5. Při další iteraci smyčky to způsobí změnu proměnné jasu.

analogWrite() umožňuje rychlou změnu hodnoty PWM, takže prodleva na konci náčrtu řídí rychlost poklesu. Zkuste změnit hodnotu zpoždění a uvidíte, jak program funguje.

Skica pro Arduino IDE

Tento příklad ukazuje, jak zajistit útlum na kolíku 9 pomocí funkce analogWrite().

int led = 9; // pin, ke kterému je připojena LED

int jas = 0; // Jas LED

int fadeAmount = 5; // jak moc zvýšit jas LED

// funkce nastavení se spustí jednou po restartu desky:

// deklaruje pin 9 jako výstup:

pinMode(led, OUTPUT);

// smyčka se donekonečna opakuje:

// nastaví jas pinu 9:

analogWrite(led, jas);

// změňte jas při další iteraci pomocí smyčky:

jas = jas + fadeAmount;

// změní hodnotu útlumu na podobnou s opačným znaménkem na hraničních hodnotách:

if (jas == 0 || jas == 255) (

fadeAmount = -fadeAmount ;

// zpoždění 30 pro sledování efektu blednutí

Nyní se podívejme na vícebarevnou LED, která se často nazývá zkratkou: RGB LED. RGB je zkratka, která znamená: červená - červená, zelená - zelená, modrá - modrá. To znamená, že uvnitř tohoto zařízení jsou umístěny tři samostatné LED diody. V závislosti na typu může mít RGB LED společnou katodu nebo společnou anodu.

1. Míchání barev

Proč je RGB LED lepší než tři konvenční? Je to všechno o schopnosti naší vize míchat světlo z různých zdrojů umístěných blízko sebe. Umístíme-li například modré a červené LED vedle sebe, tak na vzdálenost několika metrů se jejich záře spojí a oko uvidí jeden fialový bod. A když přidáme i zelenou, tečka se nám bude jevit jako bílá. Přesně tak fungují počítačové monitory, televize a venkovní obrazovky. TV matice se skládá z jednotlivých bodů různých barev. Pokud vezmete lupu a podíváte se přes ni na zapnutý monitor, tyto tečky snadno uvidíte. Ale na venkovní obrazovce nejsou body umístěny příliš hustě, takže je lze rozeznat pouhým okem. Ale ze vzdálenosti několika desítek metrů jsou tyto body k nerozeznání. Ukazuje se, že čím blíže jsou vícebarevné tečky k sobě, tím menší vzdálenost potřebuje oko k namíchání těchto barev. Z toho tedy závěr: na rozdíl od tří samostatných LED je míchání barev RGB LED patrné již na vzdálenost 30-70 cm, RGB LED s matnou čočkou si mimochodem vede ještě lépe.

2. Připojení RGB LED k Arduinu

Vzhledem k tomu, že vícebarevná LED se skládá ze tří běžných LED diod, zapojíme je samostatně. Každá LED je připojena k vlastnímu kolíku a má svůj samostatný odpor. V tomto tutoriálu používáme RGB LED se společnou katodou, takže k zemi bude pouze jeden vodič. Schematický diagram
Vzhled rozložení

3. Program pro ovládání RGB LED

Vytvořme jednoduchý program, který postupně rozsvítí každou ze tří barev. const byte rPin = 3; const byte gPin = 5; const byte bPin = 6; void setup() ( pinMode(rPin, OUTPUT); pinMode(gPin, OUTPUT); pinMode(bPin, OUTPUT); ) void loop() ( // vypnout modrou, zapnout červenou digitalWrite(bPin, LOW); digitalWrite( rPin, HIGH); delay(500); // vypnout červenou, zapnout zelenou digitalWrite(rPin, LOW); digitalWrite(gPin, HIGH); delay(500); // vypnout zelenou, zapnout modrou digitalWrite(gPin , LOW); digitalWrite( bPin, HIGH); delay(500); ) Načtěte program do Arduina a sledujte výsledek. Váš prohlížeč nepodporuje značku videa. Pojďme si program trochu optimalizovat: místo proměnných rPin, gPin a bPin použijeme pole. To nám pomůže v dalších úkolech. const byte rgbPins = (3,5,6); void setup() ( for(byte i=0; i<3; i++) pinMode(rgbPins[i], OUTPUT); } void loop() { digitalWrite(rgbPins, LOW); digitalWrite(rgbPins, HIGH); delay(500); digitalWrite(rgbPins, LOW); digitalWrite(rgbPins, HIGH); delay(500); digitalWrite(rgbPins, LOW); digitalWrite(rgbPins, HIGH); delay(500); }

4. Sedm barev duhy

Nyní zkusme rozsvítit dvě barvy současně. Pojďme si naprogramovat následující pořadí barev:
  • Červené
  • červená + zelená = žlutá
  • zelená
  • zelená + modrá = světle modrá
  • modrý
  • modrá + červená = fialová
Oranžovou barvu jsme pro jednoduchost vynechali. Ukázalo se tedy, že jde o šest barev duhy 🙂 const byte rgbPins = (3,5,6); const byte rainbow = ( (1,0,0), // červená (1,1,0), // žlutá (0,1,0), // zelená (0,1,1), // modrá ( 0,0,1), // modrá (1,0,1), // fialová ); void setup() ( for(byte i=0; i<3; i++) pinMode(rgbPins[i], OUTPUT); } void loop() { // перебираем все шесть цветов for(int i=0; i<6; i++){ // перебираем три компоненты каждого из шести цветов for(int k=0; k<3; k++){ digitalWrite(rgbPins[k], rainbow[i][k]); } delay(1000); } } В результате работы программы получается: Your browser does not support the video tag.

5. Hladká změna barvy

Ne nadarmo jsme připojili RGB LED na piny 3, 5 a 6. Jak víte, tyto piny umožňují generovat PWM signál různých pracovních cyklů. Jinými slovy, nemůžeme LED pouze rozsvítit nebo zhasnout, ale ovládat na něm úroveň napětí. To se provádí pomocí funkce analogWrite. Zajistěme, aby naše LED přecházela mezi barvami duhy ne náhle, ale plynule. const byte rgbPins = (3,5,6); int dim = 1; void setup() ( for(byte i=0; i<3; i++){ pinMode(rgbPins[i], OUTPUT); } // начальное состояние - горит красный цвет analogWrite(rgbPins, 255); analogWrite(rgbPins, 0); analogWrite(rgbPins, 0); } void loop() { // гасим красный, параллельно разжигаем зеленый for(int i=255; i>=0; i--)( analogWrite(rgbPins, i/dim); analogWrite(rgbPins, (255-i)/dim); delay(10); ) // vypnout zelenou, zapnout modrou paralelně pro (int i=255 ; i> =0; i--)( analogWrite(rgbPins, i/dim); analogWrite(rgbPins, (255-i)/dim); delay(10); ) // vypnout modrou, paralelně zapnout červenou for(int i=255 ; i>=0; i--)( analogWrite(rgbPins, i/dim); analogWrite(rgbPins, (255-i)/dim); delay(10); ) ) Proměnná dim určuje jas záře. Při šeru = 1 máme maximální jas. Nahrajte program do Arduina. Váš prohlížeč nepodporuje značku videa.

Úkoly

  1. Ukazatel teploty. Do obvodu přidáme termistor a připojíme jej k analogovému vstupu. LED by měla měnit barvu v závislosti na teplotě termistoru. Čím nižší teplota, tím modřejší barva a čím vyšší teplota, tím více červené.
  2. RGB lampa s regulátorem. Do obvodu přidáme tři proměnné rezistory a připojíme je k analogovým vstupům. Program by měl průběžně číst hodnoty rezistoru a měnit barvu příslušné RGB LED komponenty.

V předchozích lekcích jsme se seznámili s nejjednoduššími obvody - montáž a. Dnes montujeme model s potenciometrem (variabilní odpor) a LED. Takový model lze použít k ovládání robota.

Potenciometr je proměnná odpor s nastavitelným odporem.Potenciometry se v robotice používají jako regulátory různých parametrů - hlasitost zvuku, výkon, napětí atd. V našem modeluod otáčení knoflíku potenciometruJas LED bude záviset. To je také jedno ze základních schémat.

Video návod na sestavení modelu:

K sestavení modelu potřebujeme:

  • Arduino deska (nebo analogy);
  • Prkénko;
  • 6 drátů a/nebo propojky samec-samec;
  • Světelná dioda;
  • potenciometr (proměnný odpor);
  • odpor 220 Ohmů;
  • Arduino IDE, které lze stáhnout z webu Arduino.

Co potřebujete k připojení potenciometru a LED k Arduinu?

Schéma zapojení pro model Arduino s potenciometrem a LED:

Schéma zapojení pro model Arduino s potenciometrem a LED

Pro tento model je vhodný následující program (program můžete jednoduše zkopírovat do Arduino IDE):

// zadejte názvy pinů s LED
// a potenciometr
#define led 9
#definujte hrnec A0
void setup()
{
// pin s LED - výstup
pinMode(led, OUTPUT);
// pin s potenciometrem - vstup
pinMode(pot, INPUT);
}
void loop()
{
// deklarace proměnné x
int x;
// odečtěte napětí z potenciometru:
// bude získáno číslo od 0 do 1023
// vydělte 4, dostanete číslo v rozsahu
// 0-255 (zlomková část bude zahozena)
x = analogRead(pot) / 4;
// výstup výsledku na LED
analogWrite(led, x);
}

Takto vypadá sestavený Arduino model potenciometru s LED:

Model Arduino s potenciometrem a LED sestavený

Tím je dokončena třetí lekce „Arduino pro začátečníky“. Pokračování příště!

Příspěvky z lekce:

  1. První hodina: .
  2. Druhá lekce: .
  3. Třetí lekce: .
  4. Čtvrtá lekce: .
  5. Pátá lekce: .
  6. Lekce šest: .
  7. Sedmá lekce: .
  8. Osmá lekce: .
  9. Devátá lekce:
Pokud najdete chybu, vyberte část textu a stiskněte Ctrl+Enter.