Obsah:

Arduino TFT Rainbow Noise Display: 5 krokov
Arduino TFT Rainbow Noise Display: 5 krokov

Video: Arduino TFT Rainbow Noise Display: 5 krokov

Video: Arduino TFT Rainbow Noise Display: 5 krokov
Video: Урок 4. Выводим кнопку на дисплей DWIN. Среда разработки DGUS 2024, Júl
Anonim
Image
Image
Efekty používajúce plynulý šum
Efekty používajúce plynulý šum

Tento dúhový projekt sme vytvorili pomocou rôznych 'hlukových' techník, ktoré vytvárajú kontrolované náhodné efekty. Pridaním nejakej farby môže dôjsť k dúhovému efektu. Používa displej Arduino Nano a 128 x 128 OLED. Účinky sme zobrazili pomocou knižnice TFT. Použili sme tiež niekoľko rôznych komponentov, ako je doska na chlieb a niekoľko drôtov.

Krok 1: Zapojenie

Najzákladnejšou úlohou bolo zapojenie OLED do Arduina. Pripojili sme GND a VCC k príslušným zberniciam na doske s chlebom; SCL na digitálny pin 13; SDA na digitálny pin 11; RES na digitálny pin 8; DC na digitálny pin 9; CS na digitálny pin 10 a nakoniec BL na 3,3 V na Arduine. Pomocou pinov 5v a GND z Arduina sme mohli napájať celú dosku na chlieb.

Krok 2: Hladký hluk

Po inicializácii požiadaviek na TFT displej. Aby sme vytvorili efekt hladkého hluku, najskôr sme potrebovali základnú funkciu šumu. Tým sa vráti relatívne náhodná hodnota medzi 0 a 1 na základe odovzdaných hodnôt x a y. Je dôležité poznamenať, že počítač nikdy nemôže vytvoriť skutočne náhodný výsledok a táto náhodnosť sa dosiahne iba zmenou čísla čo najviac., preto veľmi veľké čí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 potom „vyhladíme“inou funkciou. To sa dosiahne vytvorením hodnoty založenej nielen na výsledku zo súradnice odovzdanej do funkcie, ale aj na okolitých súradniciach. Výsledkom je, že súradnice blízko seba produkujú podobnú hodnotu.

float smoothNoise (float x, float y) {float fractX = x - (int) x; float fractY = y - (int) y; int x1 = ((int) (x) + šírka šumu) % šírka šumu; int y1 = ((int) (y) + výška hluku) % výška hluku; int x2 = (x1 + šírka šumu - 1) % šírka šumu; int y2 = (y1 + hladina hluku - 1) % výška hluku; plávajúca hodnota = 0,0f; hodnota += zlomok X * zlomok Y * šum (x1, y1); hodnota += (1 - zlomok X) * zlomok Y * šum (x2, y1); hodnota += fractX * (1 - fractY) * šum (x1, y2); hodnota += (1 - zlomok X) * (1 - zlomok Y) * šum (x2, y2); návratová hodnota; }

Krok 3: Efekty používajúce plynulý šum

Efekty používajúce plynulý šum
Efekty používajúce plynulý šum

Vďaka tomu sme vytvorili dva efekty. Aby sme to urobili, previedli sme každý pixel na OLED a urobili sme náhodnú hodnotu šumu na základe súradníc x a y týchto pixelov. Prvý z týchto efektov sme vytvorili pomocou vygenerovanej hodnoty na výber farby a zafarbenie daného pixelu vyššie uvedenou farbou. Druhý efekt bol vytvorený podobným spôsobom, ale taktiež sme farbu znásobili vygenerovanou hodnotou šumu. Vďaka tomu mal vzor zatienenejší efekt. Použitý kód je uvedený nižšie:

void Noise2n3 (bool Noisy) {for (int y = 0; y <noiseHeight; y ++) {for (int x = 0; x 8) absNoise = 8; if (Noisy) setNoisyColour (farby [absNoise], hluk); else setBlockColour (farby [absNoise]); TFTscreen.point (x, y); }}} sada neplatných farieb } neplatné setBlockColour (farebná farba) {TFTscreen.stroke (colour.red, colour.green, colour.blue); }

Krok 4: Náhodné efekty gradientu

Náhodné efekty gradientu
Náhodné efekty gradientu
Náhodné efekty gradientu
Náhodné efekty gradientu
Náhodné efekty gradientu
Náhodné efekty gradientu

Existujú dva efekty, ktoré vytvárajú náhodný gradient. Prvý efekt priraďuje pixely k ich farbe rgb a pomaly vykresľuje na obrazovku gradientový vzor. Druhý používa rovnako farebné pixely ako prvý, ale umiestňuje ich v pevnom poradí a vytvára diagonálny prechod pozdĺž obrazovky.

Tu je prvý (podľa farieb):

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álna farba [z] [0]; G = aktuálna farba [z] [1]; B = aktuálna farba [z] [2]; pre (int x = 0; x <128; x ++) {pre (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_Spodne = B - ((x + y) / 4); if (B_Lower <1) {B_Lower = 0; } int B_Vyssie = B + ((x + y) / 4); if (B_Higher> = 255) {B_Higher = 254; } int B_Offset = random (B_Lower, B_Higher); int mult = 2; ak (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ý (usporiadanejší 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álna farba [z] [0]; G = aktuálna farba [z] [1]; B = aktuálna farba [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_Spodne = B - ((x + y) / 4); if (B_Lower <1) {B_Lower = 0; } int B_Vyssie = B + ((x + y) / 4); if (B_Higher> = 255) {B_Higher = 254; } int B_Offset = random (B_Lower, B_Higher); int mult = 2; ak (z == 1) mult = 1; TFTscreen.stroke (R_Offset * mult, G_Offset * mult, B_Offset * mult); TFTscreen.point (x, y); }}}}

Krok 5: Konečný výsledok

Nakoniec sme tieto efekty spojili do akejsi „prezentácie“dúh. Aby sme to dosiahli, jednoducho sme v slučke chvíľu zavolali každú funkciu za druhou:

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

Odporúča: