Turinys:

„Arduino TFT Rainbow Noise“ekranas: 5 žingsniai
„Arduino TFT Rainbow Noise“ekranas: 5 žingsniai

Video: „Arduino TFT Rainbow Noise“ekranas: 5 žingsniai

Video: „Arduino TFT Rainbow Noise“ekranas: 5 žingsniai
Video: msi optix mag27cqr Horizontal Lines easy fix, read description pls 2024, Liepa
Anonim
Image
Image
Poveikis naudojant sklandų triukšmą
Poveikis naudojant sklandų triukšmą

Mes sukūrėme šį vaivorykštės projektą naudodami įvairius „triukšmo“metodus, kurie sukuria kontroliuojamus atsitiktinius efektus. Pridėjus šiek tiek spalvų, galima sukurti vaivorykštės efektą. Jame naudojamas „Arduino Nano“ir 128x128 OLED ekranas. Efektus rodėme naudodami TFT biblioteką. Mes taip pat naudojome įvairius komponentus, tokius kaip duonos lenta ir keli laidai.

1 žingsnis: laidų prijungimas

Pagrindinė užduotis buvo prijungti OLED prie „Arduino“. Mes prijungėme GND ir VCC prie atitinkamų duonos lentos magistralių; SCL į skaitmeninį kaištį 13; SDA į skaitmeninį kaištį 11; AEI į 8 skaitmeninį kaištį; DC į skaitmeninį kaištį 9; CS į skaitmeninį kaištį 10 ir galiausiai BL į 3.3V „Arduino“. Naudodami „Arduino“5v ir GND kaiščius, mes galėjome maitinti visą duonos lentą.

2 žingsnis: sklandus triukšmas

Suformavus TFT ekrano reikalavimus. Norėdami sukurti sklandų triukšmo efektą, pirmiausia mums reikėjo pagrindinės triukšmo funkcijos. Grąžinama santykinai atsitiktinė reikšmė nuo 0 iki 1, remiantis įvestomis x ir y reikšmėmis. Svarbu pažymėti, kad kompiuteris niekada negali pateikti tikrai atsitiktinio rezultato, o šis atsitiktinumas pasiekiamas tik kiek įmanoma pakeitus skaičių, todėl labai dideli skaičiai lygtyje.

plūdės triukšmas (int x, int y) {int n; n = x + y * 57; n += (n << 13) ^ n; grįžimas (1,0 - ((n * ((n * n * 15731) + 789221) + 1376312589) ir 0x7fffffff) / 1073741824.0); }

Tada triukšmą „išlyginame“kita funkcija. Tai pasiekiama sukuriant vertę, pagrįstą ne tik rezultatu iš koordinačių, perduotų funkcijai, bet ir aplinkinėmis koordinatėmis. Dėl to koordinatės, esančios šalia viena kitos, sukuria panašią vertę.

float smoothNoise (float x, float y) {float fractX = x - (int) x; plūdės lūžisY = y - (int) y; int x1 = ((int) (x) + noiseWidth) % noiseWidth; int y1 = ((int) (y) + noiseHeight) % noiseHeight; int x2 = (x1 + noiseWidth - 1) % noiseWidth; int y2 = (y1 + noiseHeight - 1) % noiseHeight; plūdės vertė = 0,0f; reikšmė += fractX * fractY * triukšmas (x1, y1); reikšmė += (1 - fractX) * fractY * triukšmas (x2, y1); reikšmė += fractX * (1 - fractY) * triukšmas (x1, y2); vertė += (1 - fractX) * (1 - fractY) * triukšmas (x2, y2); grąžinimo vertė; }

3 žingsnis: efektai naudojant sklandų triukšmą

Poveikis naudojant sklandų triukšmą
Poveikis naudojant sklandų triukšmą

Taip sukūrėme du efektus. Norėdami tai padaryti, mes peržiūrėjome kiekvieną OLED pikselį ir paėmėme atsitiktinę triukšmo vertę, pagrįstą šių pikselių x ir y koordinatėmis. Pirmasis iš šių efektų buvo sukurtas naudojant spalvą parenkant sukurtą vertę ir tą pikselį nuspalvinus minėta spalva. Antrasis efektas buvo sukurtas panašiai, tačiau mes taip pat padauginome spalvą iš sukurtos triukšmo vertės. Tai suteikė modeliui tamsesnį efektą. Naudojamas kodas parodytas žemiau:

void Noise2n3 (bool Noisy) {už (int y = 0; y <noiseHeight; y ++) {už (int x = 0; x 8) absNoise = 8; if (Noisy) setNoisyColour (spalvos [absNoise], triukšmas); else setBlockColour (spalvos [absNoise]); TFT ekranas.taškas (x, y); }}} void setNoisyColour (Spalvos spalva, plūduriuojantis triukšmas) {TFTscreen.stroke (spalva.raudona * triukšmas, spalva.žalia * triukšmas, spalva. mėlyna * triukšmas); } void setBlockColour (Spalvos spalva) {TFTscreen.stroke (spalva.raudona, spalva.žalia, spalva.melsva); }

4 žingsnis: atsitiktiniai gradiento efektai

Atsitiktiniai gradiento efektai
Atsitiktiniai gradiento efektai
Atsitiktiniai gradiento efektai
Atsitiktiniai gradiento efektai
Atsitiktiniai gradiento efektai
Atsitiktiniai gradiento efektai

Yra du efektai, kurie sukuria atsitiktinį gradientą. Pirmasis efektas nustato taškus pagal jų rgb spalvą, lėtai perteikiant ekrano gradientą. Antrasis naudoja tuos pačius spalvotus pikselius, kaip ir pirmasis, tačiau juos nustato tam tikra tvarka, sukurdamas įstrižąjį gradientą išilgai ekrano.

Štai pirmasis (pagal spalvas):

void Noise1 () {for (int z = 0; z <3; z ++) {TFTscreen.background (0, 0, 0); int Dabartinė spalva [3] [3] = {{64, 35, 26}, {24, 64, 34}, {20, 18, 64}}; R = dabartinė spalva [z] [0]; G = dabartinė spalva [z] [1]; B = Dabartinė spalva [z] [2]; for (int x = 0; x <128; x ++) {for (int y = 0; y <128; y ++) {int R_Lower = R - ((x+y) / 4); jei (R_Apatinis = 255) {R_Aukštesnis = 254; } int R_Offset = atsitiktinis (R_Apatinis, R_Aukštesnis); int G_Žemesnis = G - ((x + y) / 4); jei (G_Žemesnis = 255) {G_Aukštesnis = 254; } int G_Offset = atsitiktinis (G_Lower, G_Higher); int B_Žemesnis = B - ((x + y) / 4); jei (B_Apatinis <1) {B_Apatinis = 0; } int B_Aukštesnis = B + ((x + y) / 4); jei (B_Aukštesnis> = 255) {B_Aukštesnis = 254; } int B_Offset = atsitiktinis (B_Apatinis, B_Aukštesnis); int mult = 2; jei (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))); }}}}

Ir antrasis (tvarkingesnis efektas):

void Noise4 () {for (int z = 0; z <3; z ++) {TFTscreen.background (0, 0, 0); int Dabartinė spalva [3] [3] = {{64, 35, 26}, {24, 64, 34}, {20, 18, 64}}; R = dabartinė spalva [z] [0]; G = dabartinė spalva [z] [1]; B = Dabartinė spalva [z] [2]; for (int x = 0; x <128; x ++) {for (int y = 0; y <128; y ++) {int R_Lower = R - ((x+y) / 4); jei (R_Apatinis = 255) {R_Aukštesnis = 254; } int R_Offset = atsitiktinis (R_Apatinis, R_Aukštesnis); int G_Žemesnis = G - ((x + y) / 4); jei (G_Žemesnis = 255) {G_Aukštesnis = 254; } int G_Offset = atsitiktinis (G_Lower, G_Higher); int B_Žemesnis = B - ((x + y) / 4); jei (B_Apatinis <1) {B_Apatinis = 0; } int B_Aukštesnis = B + ((x + y) / 4); jei (B_Aukštesnis> = 255) {B_Aukštesnis = 254; } int B_Offset = atsitiktinis (B_Apatinis, B_Aukštesnis); int mult = 2; jei (z == 1) mult = 1; TFTscreen.stroke (R_Offset * mult, G_Offset * mult, B_Offset * mult); TFT ekranas.taškas (x, y); }}}}

5 žingsnis: galutinis rezultatas

Galų gale mes sujungėme šiuos efektus į tam tikrą vaivorykštės „skaidrių demonstraciją“. Norėdami tai pasiekti, mes tiesiog iškvietėme kiekvieną funkciją po kitos tam tikru ciklu:

while (tiesa) {Noise2n3 (false); Triukšmas2n3 (tiesa); TFT ekranas.fonas (0, 0, 0); Triukšmas1 (); Triukšmas4 (); }

Rekomenduojamas: