Оглавление:

Отображение шума радуги Arduino TFT: 5 шагов
Отображение шума радуги Arduino TFT: 5 шагов

Видео: Отображение шума радуги Arduino TFT: 5 шагов

Видео: Отображение шума радуги Arduino TFT: 5 шагов
Видео: Уроки Arduino #7 - подключение светодиода 2024, Июль
Anonim
Image
Image
Эффекты с использованием плавного шума
Эффекты с использованием плавного шума

Мы создали этот радужный проект, используя различные методы «шума», которые создают контролируемые случайные эффекты. Добавив немного цвета, можно получить эффект радуги. Он использует Arduino Nano и OLED-дисплей 128x128. Мы отображали эффекты с помощью библиотеки TFT. Мы также использовали разные компоненты, такие как макет и несколько проводов.

Шаг 1. Подключение

Самой простой задачей было подключение OLED к Arduino. Мы подключили GND и VCC к соответствующим шинам на макетной плате; SCL к цифровому выводу 13; SDA к цифровому выводу 11; RES на цифровой вывод 8; DC к цифровому выводу 9; CS к цифровому выводу 10 и, наконец, BL к 3,3 В на Arduino. Используя контакты 5v и GND от Arduino, мы смогли запитать всю макетную плату.

Шаг 2: ровный шум

После инициализации требований к TFT-дисплею. Чтобы создать эффект плавного шума, нам сначала нужна базовая функция шума. Это возвращает относительно случайное значение от 0 до 1 на основе переданных значений x и y. Важно отметить, что компьютер никогда не может выдать действительно случайный результат, и эта случайность просто достигается путем изменения числа в максимально возможной степени., отсюда и очень большие числа в уравнении.

шум с плавающей точкой (int x, int y) {int n; п = х + у * 57; п + = (п << 13) ^ п; return (1.0 - ((n * ((n * n * 15731) + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0); }

Затем мы «сглаживаем» шум с помощью другой функции. Это достигается путем создания значения, основанного не только на результате координаты, переданной в функцию, но и на окружающих координатах. В результате близкие друг к другу координаты дают одинаковое значение.

float smoothNoise (float x, float y) {float фрактX = x - (int) x; floatractY = 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; значение + = фрактX * фракY * шум (x1, y1); значение + = (1 - фрактX) * фракция * шум (x2, y1); значение + = фрактX * (1 - фрактY) * шум (x1, y2); значение + = (1 - фрактX) * (1 - фрактY) * шум (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 (colors [absNoise], noise); еще setBlockColour (цвета [absNoise]); TFTscreen.point (x, y); }}} void setNoisyColour (Color color, float noise) {TFTscreen.stroke (colour.red * noise, colour.green * noise, colour.blue * noise); } void setBlockColour (Color color) {TFTscreen.stroke (colour.red, colour.green, colour.blue); }

Шаг 4: Эффекты случайного градиента

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

Есть два эффекта, которые создают случайный градиент. Первый эффект размещает пиксели по отношению к их цвету rgb, медленно отображая узор градиента на экране. Второй использует пиксели того же цвета, что и первый, но размещает их в фиксированном порядке, создавая диагональный градиент вдоль экрана.

Вот первый (по цветам):

void Noise1 () {для (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 ++) {для (int y = 0; y <128; y ++) {int R_Lower = R - ((x + y) / 4); если (R_Lower = 255) {R_Higher = 254; } int R_Offset = случайный (R_Lower, R_Higher); int G_Lower = G - ((х + у) / 4); если (G_Lower = 255) {G_Higher = 254; } int G_Offset = случайный (G_Lower, G_Higher); int B_Lower = B - ((х + у) / 4); если (B_Lower <1) {B_Lower = 0; } int B_Higher = B + ((x + y) / 4); если (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 () {для (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 ++) {для (int y = 0; y <128; y ++) {int R_Lower = R - ((x + y) / 4); если (R_Lower = 255) {R_Higher = 254; } int R_Offset = случайный (R_Lower, R_Higher); int G_Lower = G - ((х + у) / 4); если (G_Lower = 255) {G_Higher = 254; } int G_Offset = случайный (G_Lower, G_Higher); int B_Lower = B - ((х + у) / 4); если (B_Lower <1) {B_Lower = 0; } int B_Higher = B + ((x + y) / 4); если (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 (истина) {Noise2n3 (ложь); Noise2n3 (правда); TFTscreen.background (0, 0, 0); Шум1 (); Шум4 (); }

Рекомендуемые: