Obsah:

Arduino TFT Rainbow Noise Display: 5 kroků
Arduino TFT Rainbow Noise Display: 5 kroků

Video: Arduino TFT Rainbow Noise Display: 5 kroků

Video: Arduino TFT Rainbow Noise Display: 5 kroků
Video: jak převést CRT TV na osciloskop 2024, Červenec
Anonim
Image
Image
Efekty využívající plynulý šum
Efekty využívající plynulý šum

Tento duhový projekt jsme vytvořili pomocí různých „hlukových“technik, které vytvářejí kontrolované náhodné efekty. Přidáním nějaké barvy by mohl vzniknout duhový efekt. Používá Arduino Nano a OLED displej 128x128. Účinky jsme zobrazili pomocí knihovny TFT. Použili jsme také některé různé součásti, jako je pečivo a několik drátů.

Krok 1: Zapojení

Nejzákladnějším úkolem bylo zapojení OLED k Arduinu. Připojili jsme GND a VCC k příslušným sběrnicím na desce chleba; SCL na digitální pin 13; SDA na digitální pin 11; RES na digitální pin 8; DC na digitální pin 9; CS na digitální pin 10 a nakonec BL na 3,3 V na Arduinu. Pomocí pinů 5v a GND z Arduina jsme mohli napájet celé prkénko.

Krok 2: Hladký hluk

Po inicializaci požadavků na TFT displej. Abychom vytvořili efekt hladkého šumu, nejprve jsme potřebovali základní funkci šumu. Tím se vrátí relativně náhodná hodnota mezi 0 a 1 na základě předaných hodnot x a y. Je důležité si uvědomit, že počítač nikdy nemůže vytvořit skutečně náhodný výsledek a této náhodnosti je dosaženo pouze změnou čísla co nejvíce, proto velmi velká čísla v rovnici.

float noise (int x, int y) {int n; n = x + y * 57; n += (n << 13) ^ n; návrat (1,0 - ((n * ((n * n * 15731) + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0); }

Hluk pak 'vyhladíme' jinou funkcí. Toho je dosaženo vytvořením hodnoty založené nejen na výsledku ze souřadnic předaných do funkce, ale také na okolních souřadnicích. Výsledkem je, že souřadnice poblíž sebe vytvářejí podobnou hodnotu.

float smoothNoise (float x, float y) {float fractX = x - (int) x; float fractY = y - (int) y; int x1 = ((int) (x) + šířka šumu) % šířka šumu; int y1 = ((int) (y) + noiseHeight) % noiseHeight; int x2 = (x1 + Šířka Šumu - 1) % Šířka Šumu; int y2 = (y1 + noiseHeight - 1) % noiseHeight; float hodnota = 0,0f; hodnota += zlomek X * zlomek Y * šum (x1, y1); hodnota += (1 - zlomek X) * zlomek Y * šum (x2, y1); hodnota += zlomek X * (1 - zlomek Y) * šum (x1, y2); hodnota += (1 - zlomek X) * (1 - zlomek Y) * šum (x2, y2); návratová hodnota; }

Krok 3: Efekty využívající plynulý šum

Efekty využívající plynulý šum
Efekty využívající plynulý šum

Díky tomu jsme vytvořili dva efekty. Za tímto účelem jsme prošli každý pixel na OLED a vzali náhodnou hodnotu šumu na základě souřadnic x a y těchto pixelů. První z těchto efektů jsme vytvořili pomocí vygenerované hodnoty pro výběr barvy a zabarvení pixelu výše uvedenou barvou. Druhý efekt byl vytvořen podobným způsobem, ale také jsme barvu vynásobili vygenerovanou hodnotou šumu. To dalo vzoru více stínovaný efekt. Použitý kód je uveden níže:

void Noise2n3 (bool Noisy) {for (int y = 0; y <noiseHeight; y ++) {for (int x = 0; x 8) absNoise = 8; if (Noisy) setNoisyColour (barvy [absNoise], šum); else setBlockColour (barvy [absNoise]); TFTscreen.point (x, y); }}} neplatná sadaNoisyColour (barevná barva, plovoucí šum) {TFTscreen.stroke (color.red * noise, colour.green * noise, colour.blue * noise); } neplatné setBlockColour (barevná barva) {TFTscreen.stroke (colour.red, colour.green, colour.blue); }

Krok 4: Náhodné efekty přechodu

Náhodné efekty přechodu
Náhodné efekty přechodu
Náhodné efekty přechodu
Náhodné efekty přechodu
Náhodné efekty přechodu
Náhodné efekty přechodu

Existují dva efekty, které vytvářejí náhodný přechod. První efekt umístí pixely vzhledem k jejich barvě rgb a pomalu vykreslí přechodový vzor na obrazovku. Druhý používá stejně barevné pixely jako první, ale umisťuje je v pevném pořadí a vytváří diagonální přechod podél obrazovky.

Zde je první (podle barev):

void Noise1 () {for (int z = 0; z <3; z ++) {TFTscreen.background (0, 0, 0); int CurrentColour [3] [3] = {{64, 35, 26}, {24, 64, 34}, {20, 18, 64}}; R = aktuální barva [z] [0]; G = aktuální barva [z] [1]; B = aktuální barva [z] [2]; for (int x = 0; x <128; x ++) {for (int y = 0; y <128; y ++) {int R_Lower = R - ((x+y) / 4); if (R_Lower = 255) {R_Higher = 254; } int R_Offset = random (R_Lower, R_Higher); int G_Lower = G - ((x + y) / 4); if (G_Lower = 255) {G_Higher = 254; } int G_Offset = random (G_Lower, G_Higher); int B_Lower = B - ((x + y) / 4); if (B_Lower <1) {B_Lower = 0; } int B_Vyšší = B + ((x + y) / 4); if (B_Higher> = 255) {B_Higher = 254; } int B_Offset = random (B_Lower, B_Higher); int mult = 2; if (z == 1) mult = 1; TFTscreen.stroke (R_Offset * mult, G_Offset * mult, B_Offset * mult); TFTscreen.point ((R_Offset * (B_Offset / 32)), (G_Offset * (B_Offset / 32))); TFTscreen.point ((G_Offset * (B_Offset / 32)), (R_Offset * (B_Offset / 32))); TFTscreen.point ((B_Offset * (G_Offset / 32)), (R_Offset * (G_Offset / 32))); }}}}

A druhý (uspořádanější efekt):

void Noise4 () {for (int z = 0; z <3; z ++) {TFTscreen.background (0, 0, 0); int CurrentColour [3] [3] = {{64, 35, 26}, {24, 64, 34}, {20, 18, 64}}; R = aktuální barva [z] [0]; G = CurrentColour [z] [1]; B = aktuální barva [z] [2]; for (int x = 0; x <128; x ++) {for (int y = 0; y <128; y ++) {int R_Lower = R - ((x+y) / 4); if (R_Lower = 255) {R_Higher = 254; } int R_Offset = random (R_Lower, R_Higher); int G_Lower = G - ((x + y) / 4); if (G_Lower = 255) {G_Higher = 254; } int G_Offset = random (G_Lower, G_Higher); int B_Lower = B - ((x + y) / 4); if (B_Lower <1) {B_Lower = 0; } int B_Higher = B + ((x + y) / 4); if (B_Higher> = 255) {B_Higher = 254; } int B_Offset = random (B_Lower, B_Higher); int mult = 2; if (z == 1) mult = 1; TFTscreen.stroke (R_Offset * mult, G_Offset * mult, B_Offset * mult); TFTscreen.point (x, y); }}}}

Krok 5: Konečný výsledek

Nakonec jsme tyto efekty spojili do jakési „slideshow“duh. Abychom toho dosáhli, jednoduše jsme v cyklu while každou funkci zavolali za druhou:

while (true) {Noise2n3 (false); Noise2n3 (true); TFTscreen.background (0, 0, 0); Noise1 (); Noise4 (); }

Doporučuje: