İçindekiler:

Arduino TFT Gökkuşağı Gürültü Göstergesi: 5 Adım
Arduino TFT Gökkuşağı Gürültü Göstergesi: 5 Adım

Video: Arduino TFT Gökkuşağı Gürültü Göstergesi: 5 Adım

Video: Arduino TFT Gökkuşağı Gürültü Göstergesi: 5 Adım
Video: ЛУЧШИЙ ЭКРАН ДЛЯ АРДУИНО ARDUINO TFT LCD 1.44 SPI 128Х128 ЗА $3! 2024, Temmuz
Anonim
Image
Image
Pürüzsüz Gürültü Kullanan Efektler
Pürüzsüz Gürültü Kullanan Efektler

Bu gökkuşağı projesini, kontrollü rastgele efektler oluşturan çeşitli 'gürültü' tekniklerini kullanarak oluşturduk. Biraz renk ekleyerek bir gökkuşağı efekti üretilebilir. Arduino Nano ve 128x128 OLED ekran kullanır. Efektleri TFT kütüphanesini kullanarak gösterdik. Ayrıca ekmek tahtası ve birkaç tel gibi çeşitli bileşenler de kullandık.

Adım 1: Kablolama

En temel görev, OLED'in Arduino'ya kablolanmasıydı. GND ve VCC'yi breadboard üzerindeki ilgili buslara bağladık; SCL'den dijital pin 13'e; SDA'dan dijital pin 11'e; RES'den dijital pin 8'e; DC'den dijital pin 9'a; Arduino'da CS'den dijital pin 10'a ve son olarak BL'den 3.3V'a. Arduino'nun 5v ve GND pinlerini kullanarak tüm breadboard'a güç verebildik.

2. Adım: Pürüzsüz Gürültü

TFT ekranı için gereksinimleri başlattıktan sonra. Düzgün gürültü efekti yaratmak için önce temel bir gürültü işlevine ihtiyacımız vardı. Bu, iletilen x ve y değerlerine bağlı olarak 0 ile 1 arasında nispeten rastgele bir değer döndürür. Bir bilgisayarın asla gerçekten rastgele bir sonuç üretemeyeceğini ve bu rastgeleliğin yalnızca sayıyı mümkün olduğunca değiştirerek elde edildiğini unutmamak önemlidir., dolayısıyla denklemdeki çok büyük sayılar.

kayan gürültü (int x, int y){ int n; n = x + y * 57; n += (n << 13) ^ n; dönüş (1.0 - ((n * ((n * n * 15731) + 789221) + 1376312589) & 0x7ffffff) / 1073741824.0); }

Daha sonra gürültüyü başka bir işlevle 'düzeltiyoruz'. Bu, yalnızca fonksiyona geçirilen koordinatın sonucuna değil, aynı zamanda çevreleyen koordinatlara da dayalı bir değer üretilerek elde edilir. Bunun sonucunda birbirine yakın koordinatlar benzer bir değer üretir.

float smoothNoise(float x, float y){ float fractX = x - (int) x; kayan noktaY = y - (int) y; int x1 = ((int) (x) + gürültüGenişliği) % gürültüGenişliği; int y1 = ((int) (y) + noiseHeight) % noiseHeight; int x2 = (x1 + noiseWidth - 1) % noiseWidth; int y2 = (y1 + noiseHeight - 1) % noiseHeight; kayan değer = 0.0f; değer += fractX * fractY * gürültü(x1, y1); değer += (1 - fractX) * fractY * gürültü(x2, y1); değer += fractX * (1 - fractY) * gürültü(x1, y2); değer += (1 - fractX) * (1 - fractY) * gürültü(x2, y2); geri dönüş değeri; }

Adım 3: Pürüzsüz Gürültü Kullanan Efektler

Pürüzsüz Gürültü Kullanan Efektler
Pürüzsüz Gürültü Kullanan Efektler

Bununla iki efekt oluşturduk. Bunu yapmak için, OLED üzerindeki her pikselin içinden geçtik ve bu piksellerin x ve y koordinatlarına dayalı olarak rastgele bir gürültü değeri aldık. Bu efektlerden ilkini, oluşturulan değeri kullanarak bir renk seçerek ürettik ve o pikseli yukarıda belirtilen renkle renklendirdik. İkinci etki de benzer şekilde üretildi, ancak rengi, oluşturulan gürültü değeriyle de çarptık. Bu, desene daha gölgeli bir etki verdi. Kullanılan kod aşağıda gösterilmiştir:

void Noise2n3(bool Noisy){ for (int y = 0; y < noiseHeight; y++) { for (int x = 0; x 8) absNoise = 8; if (Gürültülü) setNoisyColour(renkler[absGürültü], gürültü); else setBlockColour(renkler[absGürültü]); TFTscreen.point(x,y); } } } void setNoisyColour(Colour color, float noise) { TFTscreen.stroke(color.red * noise, color.green * noise, color.blue * noise); } void setBlockColour(Colour color) { TFTscreen.stroke(color.red, color.green, color.blue); }

Adım 4: Rastgele Gradyan Etkileri

Rastgele Gradyan Etkileri
Rastgele Gradyan Etkileri
Rastgele Gradyan Etkileri
Rastgele Gradyan Etkileri
Rastgele Gradyan Etkileri
Rastgele Gradyan Etkileri

Rastgele bir gradyan oluşturan iki efekt vardır. İlk efekt, pikselleri rgb renklerine göre yerleştirir ve ekranda yavaş yavaş bir degrade deseni oluşturur. İkincisi, birinciyle aynı renkli pikselleri kullanır, ancak bunları sabit bir sıraya yerleştirir ve ekran boyunca çapraz bir gradyan oluşturur.

İşte ilki (renklere göre):

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 = CurrentColour[z][0]; G = CurrentColour[z][1]; B = CurrentColour[z][2]; for(int x = 0; x < 128; x++) { for(int y = 0; y < 128; y++) { int R_Düşük = R - ((x + y) / 4); if(R_Düşük = 255) { R_Yüksek = 254; } int R_Offset = rastgele(R_Düşük, R_Yüksek); int G_Düşük = G - ((x + y) / 4); if(G_Düşük = 255) { G_Yüksek = 254; } int G_Offset = rastgele(G_Düşük, G_Yüksek); int B_Düşük = B - ((x + y) / 4); if(B_Düşük <1) { B_Düşük = 0; } int B_Yüksek = B + ((x + y) / 4); if(B_Yüksek>= 255) { B_Yüksek = 254; } int B_Offset = rastgele(B_Düşük, B_Yüksek); int çok = 2; if (z == 1) çok = 1; TFTscreen.stroke(R_Offset * çoklu, G_Offset * çoklu, B_Offset * çoklu); 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))); } } } }

Ve ikincisi (daha düzenli etki):

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 = CurrentColour[z][0]; G = CurrentColour[z][1]; B = CurrentColour[z][2]; for(int x = 0; x < 128; x++) { for(int y = 0; y < 128; y++) { int R_Düşük = R - ((x + y) / 4); if(R_Düşük = 255) { R_Yüksek = 254; } int R_Offset = rastgele(R_Düşük, R_Yüksek); int G_Düşük = G - ((x + y) / 4); if(G_Düşük = 255) { G_Yüksek = 254; } int G_Offset = rastgele(G_Düşük, G_Yüksek); int B_Düşük = B - ((x + y) / 4); if(B_Düşük <1) { B_Düşük = 0; } int B_Yüksek = B + ((x + y) / 4); if(B_Yüksek>= 255) { B_Yüksek = 254; } int B_Offset = rastgele(B_Düşük, B_Yüksek); int çok = 2; if (z == 1) çok = 1; TFTscreen.stroke(R_Offset * çoklu, G_Offset * çoklu, B_Offset * çoklu); TFTscreen.point(x,y); } } } }

Adım 5: Nihai Sonuç

Sonunda, bu efektleri bir tür gökkuşağı 'slayt gösterisi'nde birleştirdik. Bunu başarmak için, bir süre döngüsünde her işlevi birbiri ardına çağırdık:

while (doğru) { Noise2n3(yanlış); Gürültü2n3(doğru); TFTscreen.background(0, 0, 0); Gürültü1(); Gürültü4(); }

Önerilen: