جدول المحتويات:

عرض ضوضاء قوس قزح بتقنية TFT من Arduino: 5 خطوات
عرض ضوضاء قوس قزح بتقنية TFT من Arduino: 5 خطوات

فيديو: عرض ضوضاء قوس قزح بتقنية TFT من Arduino: 5 خطوات

فيديو: عرض ضوضاء قوس قزح بتقنية TFT من Arduino: 5 خطوات
فيديو: Объяснение прошивки Marlin 2.0.x 2024, شهر نوفمبر
Anonim
Image
Image
تأثيرات باستخدام الضجيج السلس
تأثيرات باستخدام الضجيج السلس

لقد أنشأنا مشروع قوس قزح هذا باستخدام تقنيات "ضوضاء" مختلفة ، والتي تخلق تأثيرات عشوائية محكومة. بإضافة بعض الألوان ، يمكن إنتاج تأثير قوس قزح. يستخدم Arduino Nano وشاشة OLED بحجم 128 × 128. عرضنا التأثيرات باستخدام مكتبة TFT. استخدمنا أيضًا بعض المكونات المتنوعة مثل لوح الخبز وبعض الأسلاك.

الخطوة 1: الأسلاك

كانت المهمة الأساسية هي توصيل أسلاك OLED بـ Arduino. قمنا بتوصيل GND و VCC بالحافلات المعنية على لوح الخبز ؛ SCL إلى رقم التعريف الشخصي 13 ؛ SDA إلى الرقم الرقمي 11 ؛ RES إلى الرقم الرقمي 8 ؛ DC إلى الرقم الرقمي 9 ؛ CS إلى الرقم الرقمي 10 وأخيراً BL إلى 3.3V على Arduino. باستخدام دبابيس 5v و GND من Arduino ، تمكنا من تشغيل لوحة الخبز بالكامل.

الخطوة الثانية: ضوضاء سلسة

بعد تهيئة متطلبات شاشة TFT. لإنشاء تأثير ضوضاء سلس ، احتجنا أولاً إلى وظيفة ضوضاء أساسية. يُرجع هذا قيمة عشوائية نسبيًا بين 0 و 1 بناءً على قيم x و y التي تم تمريرها. من المهم ملاحظة أن الكمبيوتر لا يمكنه أبدًا إنتاج نتيجة عشوائية حقًا ، ويتم تحقيق هذه العشوائية فقط عن طريق تغيير الرقم قدر الإمكان ، ومن هنا تأتي الأعداد الكبيرة جدًا في المعادلة.

ضوضاء عائمة (int x، int y) {int n؛ ن = س + ص * 57 ؛ ن + = (ن << 13) ^ ن ؛ إرجاع (1.0 - ((n * ((n * n * 15731) + 789221) + 1376312589) & 0x7fffffff) / 1073741824.0) ؛ }

ثم نقوم بـ "تلطيف" الضوضاء بوظيفة أخرى. يتم تحقيق ذلك من خلال إنتاج قيمة لا تستند فقط إلى النتيجة من الإحداثيات التي تم تمريرها إلى الوظيفة ، ولكن أيضًا على الإحداثيات المحيطة. نتيجة لذلك ، تنتج الإحداثيات القريبة من بعضها البعض قيمة مماثلة.

float smoothNoise (float x، float y) {float fractX = x - (int) x؛ تعويم 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) {لـ (int y = 0؛ y <NoiseHeight؛ y ++) {for (int x = 0؛ x 8) absNoise = 8 ؛ إذا (صاخبة) setNoisyColour (الألوان [absNoise] ، الضوضاء) ؛ آخر setBlockColour (الألوان [absNoise]) ؛ TFTscreen.point (x، y) ؛ }}} void setNoisyColour (Color color، floatنسية) {TFTscreen.stroke (colour.red * الضوضاء، colour.green * Noise، colour.blue * Noise)؛ } void setBlockColour (Color color) {TFTscreen.stroke (colour.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] ، لـ (int x = 0؛ x <128؛ x ++) {for (int y = 0؛ y <128؛ y ++) {int R_Lower = R - ((x + y) / 4) ؛ إذا (R_Lower = 255) {R_Higher = 254 ؛ } int R_Offset = random (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) ؛ إذا (B_Higher> = 255) {B_Higher = 254 ؛ } int B_Offset = random (B_Lower، B_Higher) ؛ int مولت = 2 ؛ إذا (ض == 1) متعدد = 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 = CurrentColour [z] [1] ، B = CurrentColour [z] [2] ، لـ (int x = 0؛ x <128؛ x ++) {for (int y = 0؛ y <128؛ y ++) {int R_Lower = R - ((x + y) / 4) ؛ إذا (R_Lower = 255) {R_Higher = 254 ؛ } int R_Offset = random (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) ؛ إذا (B_Higher> = 255) {B_Higher = 254 ؛ } int B_Offset = random (B_Lower، B_Higher) ؛ int مولت = 2 ؛ إذا (ض == 1) متعدد = 1 ؛ TFTscreen.stroke (R_Offset * mult ، G_Offset * mult ، B_Offset * mult) ؛ TFTscreen.point (x، y) ؛ }}}}

الخطوة 5: النتيجة النهائية

في النهاية ، قمنا بدمج هذه التأثيرات في نوع من "عرض الشرائح" لأقواس قزح. لتحقيق ذلك ، قمنا ببساطة باستدعاء كل دالة بعد الأخرى في حلقة while:

بينما (صواب) {Noise2n3 (خطأ) ؛ Noise2n3 (صحيح) ؛ TFTscreen.background (0 ، 0 ، 0) ؛ Noise1 () ؛ الضوضاء 4 () ؛ }

موصى به: