Sadržaj:

Arduino TFT zaslon dugine buke: 5 koraka
Arduino TFT zaslon dugine buke: 5 koraka

Video: Arduino TFT zaslon dugine buke: 5 koraka

Video: Arduino TFT zaslon dugine buke: 5 koraka
Video: SKR 1.4 - Connecting any BTT Touch Screen Display to SKR 1.3/1.4 2024, Srpanj
Anonim
Image
Image
Učinci pomoću glatke buke
Učinci pomoću glatke buke

Ovaj dugin projekt stvorili smo koristeći različite tehnike 'buke' koje stvaraju kontrolirane slučajne efekte. Dodavanjem neke boje mogao bi se stvoriti efekt duge. Koristi Arduino Nano i OLED zaslon 128x128. Efekte smo prikazali pomoću TFT knjižnice. Koristili smo i neke razne komponente, poput ploče za kruh i nekoliko žica.

Korak 1: Ožičenje

Najosnovniji zadatak bilo je ožičenje OLED -a na Arduino. Spojili smo GND i VCC na odgovarajuće sabirnice na ploči za kruh; SCL na digitalni pin 13; SDA na digitalni pin 11; RES na digitalni pin 8; Istosmjerni na digitalni pin 9; CS na digitalni pin 10 i na kraju BL na 3.3V na Arduinu. Koristeći 5v i GND pinove iz Arduina uspjeli smo napajati cijelu ploču za kruh.

Korak 2: Glatka buka

Nakon inicijalizacije zahtjeva za TFT zaslon. Da bismo stvorili efekt glatke buke, prvo nam je bila potrebna osnovna funkcija šuma. Ovo vraća relativno slučajnu vrijednost između 0 i 1 na temelju prenesenih vrijednosti x i y. Važno je napomenuti da računalo nikada ne može proizvesti zaista slučajan rezultat, a ta se slučajnost postiže samo promjenom broja što je više moguće, dakle vrlo veliki brojevi u jednadžbi.

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

Zatim "uglađujemo" šum drugom funkcijom. To se postiže stvaranjem vrijednosti ne samo na temelju rezultata iz koordinate prenesene u funkciju, već i okolnih koordinata. Kao rezultat toga, koordinate u blizini jedna drugoj proizvode sličnu vrijednost.

float smoothNoise (float x, float y) {float fractX = x - (int) x; float fractY = 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; float vrijednost = 0,0f; vrijednost += fractX * fractY * šum (x1, y1); vrijednost += (1 - fractX) * fractY * šum (x2, y1); vrijednost += fractX * (1 - fractY) * šum (x1, y2); vrijednost += (1 - fractX) * (1 - fractY) * šum (x2, y2); povratna vrijednost; }

Korak 3: Učinci pomoću glatke buke

Učinci pomoću glatke buke
Učinci pomoću glatke buke

Time smo stvorili dva efekta. Da bismo to učinili, petljali smo kroz svaki piksel na OLED -u i uzeli slučajnu vrijednost šuma na temelju koordinata x i y ovih piksela. Prvi od ovih efekata proizveli smo pomoću generirane vrijednosti za odabir boje i obojili taj piksel spomenutom bojom. Drugi efekt proizveden je na sličan način, ali smo također pomnožili boju s generiranom vrijednošću šuma. To je uzorku dalo zasjenjeniji učinak. Kôd koji se koristi prikazan je ispod:

void Noise2n3 (bool Noisy) {for (int y = 0; y <noiseHeight; y ++) {for (int x = 0; x 8) absNoise = 8; if (Bučno) setNoisyColour (boje [absNoise], šum); else setBlockColour (boje [absNoise]); TFTscreen.point (x, y); }}} void setNoisyColour (Boja boje, float šum) {TFTscreen.stroke (boja.crvena * šum, boja.zelena * buka, boja.plava * šum); } void setBlockColour (boja u boji) {TFTscreen.stroke (boja.crvena, boja.zelena, boja.plava); }

Korak 4: Slučajni gradijentni učinci

Učinci slučajnog gradijenta
Učinci slučajnog gradijenta
Učinci slučajnog gradijenta
Učinci slučajnog gradijenta
Učinci slučajnog gradijenta
Učinci slučajnog gradijenta

Postoje dva učinka koji proizvode slučajni gradijent. Prvi učinak postavlja piksele u odnosu na njihovu rgb boju, polako prikazujući gradijentni uzorak na zaslonu. Drugi koristi piksele u istoj boji kao i prvi, ali ih postavlja fiksnim redoslijedom stvarajući dijagonalni gradijent duž zaslona.

Evo prvog (na temelju boja):

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 = Boja struje [z] [0]; G = Boja struje [z] [1]; B = Boja struje [z] [2]; za (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 = slučajno (R_Sniži, R_Više); int G_Lower = G - ((x + y) / 4); if (G_Lower = 255) {G_Higher = 254; } int G_Offset = slučajno (G_Lower, G_Higher); int B_Donji = B - ((x + y) / 4); if (B_Sniženje <1) {B_Lower = 0; } int B_Više = B + ((x + y) / 4); ako je (B_Više> = 255) {B_Više = 254; } int B_Offset = slučajno (B_Sniženje, B_Više); int mult = 2; ako je (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))); }}}}

I drugo (uredniji učinak):

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 = Boja struje [z] [0]; G = Boja struje [z] [1]; B = Boja struje [z] [2]; za (int x = 0; x <128; x ++) {za (int y = 0; y <128; y ++) {int R_Lower = R - ((x+y) / 4); if (R_Lower = 255) {R_Higher = 254; } int R_Offset = slučajno (R_Sniži, R_Više); int G_Lower = G - ((x + y) / 4); if (G_Lower = 255) {G_Higher = 254; } int G_Offset = slučajno (G_Lower, G_Higher); int B_Donji = B - ((x + y) / 4); if (B_Sniženje <1) {B_Lower = 0; } int B_Više = B + ((x + y) / 4); ako je (B_Više> = 255) {B_Više = 254; } int B_Offset = slučajno (B_Sniženje, B_Više); int mult = 2; ako je (z == 1) mult = 1; TFTscreen.stroke (R_Offset * mult, G_Offset * mult, B_Offset * mult); TFTscreen.point (x, y); }}}}

Korak 5: Konačni rezultat

Na kraju smo spojili ove učinke u svojevrsni 'slideshow' duginih boja. Da bismo to postigli, jednostavno smo pozvali svaku funkciju jednu za drugom u while petlji:

while (istina) {Noise2n3 (false); Buka2n3 (istina); TFTscreen.background (0, 0, 0); Buka1 (); Buka4 (); }

Preporučeni: