Mục lục:

Arduino TFT Rainbow Noise Display: 5 bước
Arduino TFT Rainbow Noise Display: 5 bước

Video: Arduino TFT Rainbow Noise Display: 5 bước

Video: Arduino TFT Rainbow Noise Display: 5 bước
Video: Amazing arduino project 2024, Tháng bảy
Anonim
Image
Image
Hiệu ứng sử dụng tiếng ồn mượt mà
Hiệu ứng sử dụng tiếng ồn mượt mà

Chúng tôi đã tạo ra dự án cầu vồng này bằng cách sử dụng các kỹ thuật 'nhiễu' khác nhau, tạo ra các hiệu ứng ngẫu nhiên có kiểm soát. Bằng cách thêm một số màu, hiệu ứng cầu vồng có thể được tạo ra. Nó sử dụng Arduino Nano và màn hình OLED 128x128. Chúng tôi đã hiển thị các hiệu ứng bằng thư viện TFT. Chúng tôi cũng sử dụng một số thành phần linh tinh như bảng mạch bánh mì và một vài dây dẫn.

Bước 1: Đấu dây

Nhiệm vụ cơ bản nhất là đấu dây màn hình OLED với Arduino. Chúng tôi đã kết nối GND và VCC với các bus tương ứng trên bảng mạch bánh mì; SCL đến chân số 13; SDA đến chân số 11; RES đến chân số 8; DC đến chân số 9; CS đến chân số 10 và cuối cùng là BL thành 3.3V trên Arduino. Sử dụng các chân 5v và GND từ Arduino, chúng tôi đã có thể cấp nguồn cho toàn bộ bảng mạch bánh mì.

Bước 2: Làm mịn tiếng ồn

Sau khi khởi tạo các yêu cầu cho màn hình TFT. Để tạo ra hiệu ứng tiếng ồn mượt mà, trước tiên chúng tôi cần một chức năng tiếng ồn cơ bản. Điều này trả về một giá trị tương đối ngẫu nhiên giữa 0 và 1 dựa trên các giá trị x và y được chuyển vào. Điều quan trọng cần lưu ý là máy tính không bao giờ có thể tạo ra kết quả thực sự ngẫu nhiên và sự ngẫu nhiên này chỉ đạt được bằng cách thay đổi số càng nhiều càng tốt, do đó các số rất lớn trong phương trình.

nhiễu float (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); }

Sau đó, chúng tôi 'làm dịu' tiếng ồn bằng một chức năng khác. Điều này đạt được bằng cách tạo ra một giá trị không chỉ dựa trên kết quả từ tọa độ được truyền vào hàm, mà còn cả các tọa độ xung quanh. Do đó, các tọa độ gần nhau tạo ra một giá trị tương tự.

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; giá trị float = 0.0f; giá trị + = fractX * fractY * nhiễu (x1, y1); giá trị + = (1 - fractX) * fractY * nhiễu (x2, y1); giá trị + = fractX * (1 - fractY) * nhiễu (x1, y2); giá trị + = (1 - fractX) * (1 - fractY) * nhiễu (x2, y2); giá trị trả về; }

Bước 3: Hiệu ứng sử dụng tiếng ồn mượt mà

Hiệu ứng sử dụng tiếng ồn mượt mà
Hiệu ứng sử dụng tiếng ồn mượt mà

Với điều này, chúng tôi tạo ra hai hiệu ứng. Để làm điều này, chúng tôi lặp lại từng pixel trên OLED và lấy một giá trị nhiễu ngẫu nhiên dựa trên tọa độ x và y của các pixel này. Hiệu ứng đầu tiên chúng tôi tạo ra bằng cách sử dụng giá trị đã tạo để chọn một màu và tô màu pixel đó bằng màu đã nói ở trên. Hiệu ứng thứ hai được tạo ra theo cách tương tự, nhưng chúng tôi cũng nhân màu sắc với giá trị nhiễu được tạo ra. Điều này đã làm cho mẫu có hiệu ứng bóng mờ hơn. Mã được sử dụng được hiển thị bên dưới:

void Noise2n3 (bool Noisy) {for (int y = 0; y <noiseHeight; y ++) {for (int x = 0; x 8) absNoise = 8; if (Noisy) setNoisyColour (Colors [absNoise], nhiễu); else setBlockColour (màu sắc [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); }

Bước 4: Hiệu ứng Gradient ngẫu nhiên

Hiệu ứng Gradient ngẫu nhiên
Hiệu ứng Gradient ngẫu nhiên
Hiệu ứng Gradient ngẫu nhiên
Hiệu ứng Gradient ngẫu nhiên
Hiệu ứng Gradient ngẫu nhiên
Hiệu ứng Gradient ngẫu nhiên

Có hai hiệu ứng tạo ra một gradient ngẫu nhiên. Hiệu ứng đầu tiên đặt các pixel liên quan đến màu rgb của chúng, từ từ hiển thị một mẫu gradient lên màn hình. Thứ hai sử dụng các pixel có màu giống như thứ nhất, nhưng đặt chúng theo một thứ tự cố định, tạo ra một gradient đường chéo dọc theo màn hình.

Đây là cái đầu tiên (dựa trên màu sắc):

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 = Màu hiện tại [z] [0]; G = Màu sắc hiện tại [z] [1]; B = Màu hiện tại [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 = random (R_Lower, R_Higher); int G_Lower = G - ((x + y) / 4); if (G_Lower = 255) {G_Higher = 254; } int G_Offset = random (G_Lower, G_Higher); int B_Lower = B - ((x + y) / 4); if (B_Lower <1) {B_Lower = 0; } int B_Higher = B + ((x + y) / 4); if (B_Higher> = 255) {B_Higher = 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))); }}}}

Và thứ hai (hiệu ứng có trật tự hơn):

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 = Màu hiện tại [z] [0]; G = Màu sắc hiện tại [z] [1]; B = Màu hiện tại [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 = random (R_Lower, R_Higher); int G_Lower = G - ((x + y) / 4); if (G_Lower = 255) {G_Higher = 254; } int G_Offset = random (G_Lower, G_Higher); int B_Lower = B - ((x + y) / 4); if (B_Lower <1) {B_Lower = 0; } int B_Higher = B + ((x + y) / 4); if (B_Higher> = 255) {B_Higher = 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); }}}}

Bước 5: Kết quả cuối cùng

Cuối cùng, chúng tôi kết hợp những hiệu ứng này thành một loại 'trình chiếu' cầu vồng. Để đạt được điều này, chúng tôi chỉ cần gọi từng hàm sau hàm kia trong vòng lặp while:

while (true) {Noise2n3 (false); Noise2n3 (true); TFTscreen.background (0, 0, 0); Tiếng ồn1 (); Tiếng ồn4 (); }

Đề xuất: