Sadržaj:

Arduino TFT ekran duge buke: 5 koraka
Arduino TFT ekran duge buke: 5 koraka

Video: Arduino TFT ekran duge buke: 5 koraka

Video: Arduino TFT ekran duge buke: 5 koraka
Video: BTT Octopus - RepRap Discount Full Graphics Smart Controller 2024, Juli
Anonim
Image
Image
Efekti pomoću glatke buke
Efekti 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 efekat duge. Koristi Arduino Nano i OLED ekran 128x128. Efekte smo prikazali pomoću TFT biblioteke. 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. Povezali smo GND i VCC na odgovarajuće sabirnice na ploči za hljeb; SCL na digitalni pin 13; SDA na digitalni pin 11; RES na digitalni pin 8; DC 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 nasumičnost postiže samo promjenom broja što je više moguće, otuda i 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' buku 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) + widthWidth) % 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: Efekti pomoću glatke buke

Efekti pomoću glatke buke
Efekti pomoću glatke buke

Ovim smo stvorili dva efekta. Da bismo to učinili, petljali smo kroz svaki piksel na OLED -u i uzeli slučajnu vrijednost šuma na osnovu koordinata x i y ovih piksela. Prvi od ovih efekata proizveli smo korištenjem generirane vrijednosti za odabir boje i obojili taj piksel spomenutom bojom. Drugi efekat je proizveden na sličan način, ali smo takođe pomnožili boju sa generisanom vrednošću buke. To je uzorku dalo zasjenjeniji efekt. 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 (color.red, colour.green, colour.blue); }

Korak 4: Slučajni gradijentni efekti

Efekti slučajnog gradijenta
Efekti slučajnog gradijenta
Efekti slučajnog gradijenta
Efekti slučajnog gradijenta
Efekti slučajnog gradijenta
Efekti slučajnog gradijenta

Postoje dva efekta koji proizvode slučajni gradijent. Prvi efekat postavlja piksele u odnosu na njihovu rgb boju, polako prikazujući gradijentni uzorak na ekranu. Drugi koristi piksele u istoj boji kao i prvi, ali ih postavlja u fiksnom redoslijedu, stvarajući dijagonalni gradijent duž ekrana.

Evo prvog (na osnovu 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 = Trenutna boja [z] [0]; G = Trenutna boja [z] [1]; B = Trenutna boja [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_Lower, R_Higher); 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_Lower = B - ((x + y) / 4); if (B_Lower <1) {B_Lower = 0; } int B_Više = B + ((x + y) / 4); if (B_Više> = 255) {B_Više = 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))); }}}}

I drugo (uredniji efekat):

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 = Trenutna boja [z] [0]; G = Trenutna boja [z] [1]; B = Trenutna boja [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_Lower, R_Higher); 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_Lower = B - ((x + y) / 4); if (B_Lower <1) {B_Lower = 0; } int B_Više = B + ((x + y) / 4); if (B_Više> = 255) {B_Više = 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); }}}}

Korak 5: Konačni rezultat

Na kraju smo spojili ove efekte u neku vrstu 'slideshowa' duginih boja. Da bismo to postigli, jednostavno smo pozvali svaku funkciju jednu za drugom u while petlji:

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

Preporučuje se: