Съдържание:

Arduino TFT Rainbow Noise Display: 5 стъпки
Arduino TFT Rainbow Noise Display: 5 стъпки

Видео: Arduino TFT Rainbow Noise Display: 5 стъпки

Видео: Arduino TFT Rainbow Noise Display: 5 стъпки
Видео: My Top 5 Arduino Displays 2024, Юли
Anonim
Image
Image
Ефекти, използващи плавен шум
Ефекти, използващи плавен шум

Създадохме този проект на дъгата, използвайки различни техники за „шум“, които създават контролирани случайни ефекти. Като добавите малко цвят, може да се получи ефект на дъга. Той използва Arduino Nano и 128x128 OLED дисплей. Показахме ефектите с помощта на TFT библиотеката. Използвахме и някои различни компоненти като дъска за хляб и няколко жици.

Стъпка 1: Окабеляване

Най -основната задача беше свързването на OLED към Arduino. Свързахме GND и VCC със съответните автобуси на дъската за хляб; SCL към цифров пин 13; SDA към цифров пин 11; RES към цифров пин 8; DC към цифров пин 9; CS към цифров пин 10 и накрая BL до 3.3V на Arduino. Използвайки щифтовете 5v и GND от Arduino, успяхме да захранваме цялата дъска за хляб.

Стъпка 2: Плавен шум

След инициализиране на изискванията за TFT дисплея. За да създадем плавен шумов ефект, първо се нуждаехме от основна шумова функция. Това връща относително случайна стойност между 0 и 1 въз основа на предадените стойности x и y. Важно е да се отбележи, че компютърът никога не може да произведе наистина случаен резултат и тази случайност се постига само чрез промяна на числото, доколкото е възможно, оттук и много големите числа в уравнението.

плаващ шум (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); }

След това „изглаждаме“шума с друга функция. Това се постига чрез създаване на стойност, базирана не само на резултата от координатата, предадена във функцията, но и на околните координати. В резултат на това координатите в близост една до друга произвеждат подобна стойност.

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; плаваща стойност = 0.0f; стойност += fractX * fractY * шум (x1, y1); стойност += (1 - fractX) * fractY * шум (x2, y1); стойност += fractX * (1 - fractY) * шум (x1, y2); стойност += (1 - fractX) * (1 - fractY) * шум (x2, y2); възвращаема стойност; }

Стъпка 3: Ефекти, използващи плавен шум

Ефекти, използващи плавен шум
Ефекти, използващи плавен шум

С това създадохме два ефекта. За да направим това, претърсихме всеки пиксел на OLED и взехме произволна стойност на шума въз основа на координатите x и y на тези пиксели. Първият от тези ефекти произведохме, като използваме генерираната стойност, за да изберем цвят, и оцветихме този пиксел с гореспоменатия цвят. Вторият ефект беше произведен по подобен начин, но също така умножихме цвета по генерираната стойност на шума. Това даде на модела по -засенчен ефект. Използваният код е показан по -долу:

void Noise2n3 (bool Noisy) {for (int y = 0; y <noiseHeight; y ++) {for (int x = 0; x 8) absNoise = 8; if (Noisy) setNoisyColour (цветове [absNoise], шум); else setBlockColour (цветове [absNoise]); TFTscreen.point (x, y); }}} void setNoisyColour (Цветен цвят, плаващ шум) {TFTscreen.stroke (color.red * шум, colour.green * шум, color.blue * шум); } void setBlockColour (цветен цвят) {TFTscreen.stroke (color.red, colour.green, colour.blue); }

Стъпка 4: Случайни градиентни ефекти

Случайни градиентни ефекти
Случайни градиентни ефекти
Случайни градиентни ефекти
Случайни градиентни ефекти
Случайни градиентни ефекти
Случайни градиентни ефекти

Има два ефекта, които произвеждат случаен градиент. Първият ефект поставя пикселите спрямо техния rgb цвят, бавно изобразявайки градиентен модел към екрана. Вторият използва същите цветни пиксели като първия, но ги поставя във фиксиран ред, създавайки диагонален градиент по екрана.

Ето първото (въз основа на цветовете):

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_Lower = R - ((x+y) / 4); if (R_Lower = 255) {R_Higher = 254; } int R_Offset = произволен (R_Lower, R_Higher); int G_Lower = G - ((x + y) / 4); ако (G_Lower = 255) {G_Higher = 254; } int G_Offset = произволен (G_Lower, G_Higher); int B_Lower = B - ((x + y) / 4); ако (B_Lower <1) {B_Lower = 0; } int B_Higher = B + ((x + y) / 4); if (B_Higher> = 255) {B_Higher = 254; } int B_Offset = произволен (B_Lower, B_Higher); int mult = 2; ако (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))); }}}}

И второто (по -подреден ефект):

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 = Текущ цвят [z] [1]; B = CurrentColour [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 = произволен (R_Lower, R_Higher); int G_Lower = G - ((x + y) / 4); ако (G_Lower = 255) {G_Higher = 254; } int G_Offset = произволен (G_Lower, G_Higher); int B_Lower = B - ((x + y) / 4); ако (B_Lower <1) {B_Lower = 0; } int B_Higher = B + ((x + y) / 4); if (B_Higher> = 255) {B_Higher = 254; } int B_Offset = произволен (B_Lower, B_Higher); int mult = 2; ако (z == 1) mult = 1; TFTscreen.stroke (R_Offset * mult, G_Offset * mult, B_Offset * mult); TFTscreen.point (x, y); }}}}

Стъпка 5: Крайният резултат

В крайна сметка комбинирахме тези ефекти в нещо като „слайдшоу“на дъгите. За да постигнем това, просто извикахме всяка функция след друга в цикъл while:

while (true) {Noise2n3 (false); Noise2n3 (вярно); TFTscreen.background (0, 0, 0); Шум1 (); Шум4 (); }

Препоръчано: