ATtiny85 - Simulácia ohňa pomocou NeoPixel Ring

Zápisník experimentátora

Hierarchy: ATtiny85

Pred dvomi rokmi som naprogramoval simuláciu ohňa pre Arduino Uno. V tomto článku sa pokúsime túto simuláciu urobiť pomocou mikrokontroléra ATtiny85. Aby nebol program úplne rovnaký, simuláciu mierne upravíme tak, aby sa dalo blikanie ohňa nastavovať.

Použité súčiastky

Použil som tieto súčiastky:

  • ATtiny85 (link) - Použil som moju dosku s SMD súčiastkami.
  • NeoPixel Ring 24 LED (link) - Obsahuje 24 RGB LED diód s čipom WS2812B.
  • Rezistor 1k (link) - Rezistor sa pripojí na dátový vstup NeoPixel Ringu. Slúži ako ochrana pinu.
  • Kondenzátor 220 uF (link) - Kondenzátor sa pripojí medzi VCC a GND na NeoPixel Ringu. Slúži na vyrovnávanie napäťových špičiek.
  • Potenciometer 10k (link) - Slúži na nastavenie farebnej odchylky od základnej farby ohňa. Ja som použil trimmer, pretože tak neničí breadboard.
  • Arduino Pro Mini (link) - Slúži na programovanie ATtiny85. Popis programovania nájdete tu.
  • SMD 8 LED board (link) - Slúži na indikáciu logických stavov na pinoch mikrokontroléra.

Pôvodný program

Z programu neopixel_fire01 som vybral iba podstatnú časť. Pre každú LED sa nastaví základná farba fire_color a od nej sa odpočíta náhodná farba diff_color. Táto farba je vypočítaná tak, aby výsledná farba stmavla najviac v zložke R a menej v zložkách G a B. Výsledkom je sýty červený odtieň ohňa, ktorý prechádza v ojedinelých prípadoch až do úplne tmavej farby.

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 potenciometrom

Z programu neopixel_fire02 som vybral iba podstatnú časť. Potenciometrom, ktorý je pripojený na pin A2 sa prečíta analógová hodnota. Tá sa pomocou funkcie map upraví na vhodný rozsah. Potenciometrom môžete v jednej krajnej polohe dosiahnuť skoro neviditeľné blikanie ohňa. V druhej krajnej polohe je blikanie mimoriadne silné. Takto si môžete nastaviť intenzitu blikania celej simulácie.

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 sa nachádza na serveri GitHub.


27.03.2018


Menu