ATtiny85 - Simulace ohně pomocí NeoPixel Ring

Zápisník experimentátora

Hierarchy: ATtiny85

Před dvěma lety jsem naprogramoval simulaci ohně pro Arduino Uno. V tomto článku se pokusíme tuto simulaci udělat pomocí mikrokontroléru ATtiny85. Aby nebyl program úplně stejný, simulaci mírně upravíme tak, aby se dalo blikání ohně nastavovat.

Použité součástky

Použil jsem tyto součástky:

  • ATtiny85 (link) - Použil jsem moji desku s SMD součástkami.
  • NeoPixel Ring 24 LED (link) - Obsahuje 24 RGB LED diod s čipem WS2812B.
  • Rezistor 1k (link) - Rezistor se připojí na datový vstup NeoPixel Ringu. Slouží jako ochrana pinu.
  • Kondenzátor 220 uF (link) - Kondenzátor se připojí mezi VCC a GND na NeoPixel Ringu. Slouží k vyrovnávání napěťových špiček.
  • Potenciometr 10k (link) - Slouží k nastavení barevné odchylky od základní barvy ohně. Já jsem použil trimmer, protože tak neničí breadboard.
  • Arduino Pro Mini (link) - Slouží k programování ATtiny85. Popis programování naleznete zde.
  • SMD 8 LED board (link) - Slouží k indikaci logických stavů na pinech mikrokontroléru.

Původní program

Z programu neopixel_fire01 jsem vybral pouze podstatnou část. Pro každou LED se nastaví základní barva fire_color a od ní se odečte náhodná barva diff_color. Tato barva je vypočtena tak, aby výsledná barva ztmavla nejvíce ve složce R a méně v složkách G a B. Výsledkem je sytý červený odstín ohně, který prochází v ojedinělých případech až do úplně tmavé barvy.

void NeoFire::Draw()
{
Clear();

for(int i=0;i<CNT;i++)
  {
  AddColor(i, fire_color);
  int r = random(RANDOM_MAX);
  uint32_t diff_color = strip.Color ( r, r/2, r/2);
  SubstractColor(i, diff_color);
  }
 
strip.show();
}

Program s potenciometrem

Z programu neopixel_fire02 jsem vybral pouze podstatnou část. Potenciometrem, který je připojen na pin A2 se přečte analogová hodnota. Ta se pomocí funkce map upraví na vhodný rozsah. Potenciometrem můžete v jedné krajní poloze dosáhnout skoro neviditelné blikání ohně. V druhé krajní poloze je blikání mimořádně silné. Takto si můžete nastavit intenzitu blikání celé simulace.

void NeoFire::Draw()
{
Clear();

int pot = analogRead(A2);
pot = map(pot, 0, 1023, 0, RANDOM_MAX);

for(int i=0;i<CNT;i++)
  {
  AddColor(i, fire_color);
  int r = random(pot);
  uint32_t diff_color = strip.Color (r, r/2, r/2);
  SubstractColor(i, diff_color);
  }
 
strip.show();
}

Video

Zdrojový kód

Zdrojový kód se nachází na serveru GitHub.


30.03.2018


Menu