Πίνακας περιεχομένων:

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 και οθόνη OLED 128x128. Εμφανίσαμε τα εφέ χρησιμοποιώντας τη βιβλιοθήκη TFT. Χρησιμοποιήσαμε επίσης διάφορα εξαρτήματα, όπως μια σανίδα ψωμιού και μερικά καλώδια.

Βήμα 1: Καλωδίωση

Το πιο βασικό έργο ήταν η καλωδίωση της OLED στο Arduino. Συνδέσαμε το GND και το VCC στα αντίστοιχα λεωφορεία της σανίδας ψωμιού. SCL στην ψηφιακή ακίδα 13; SDA στην ψηφιακή ακίδα 11; RES στην ψηφιακή ακίδα 8; DC σε ψηφιακό pin 9; CS σε ψηφιακό pin 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; επιστροφή (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 + θόρυβος Πλάτος - 1) % θόρυβος Πλάτος; int y2 = (y1 + θόρυβος eψος - 1) % θόρυβος eψος; float value = 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 αυτών των εικονοστοιχείων. Το πρώτο από αυτά τα εφέ δημιουργήσαμε χρησιμοποιώντας την τιμή που δημιουργήθηκε για να επιλέξετε ένα χρώμα και χρωματίσαμε αυτό το pixel με το προαναφερθέν χρώμα. Το δεύτερο αποτέλεσμα δημιουργήθηκε με παρόμοιο τρόπο, αλλά επίσης πολλαπλασιάσαμε το χρώμα με την παραγόμενη τιμή θορύβου. Αυτό έδωσε στο μοτίβο ένα πιο σκιασμένο αποτέλεσμα. Ο κωδικός που χρησιμοποιείται φαίνεται παρακάτω:

void Noise2n3 (bool Noisy) {for (int y = 0; y <noiseHeight; y ++) {for (int x = 0; x 8) absNoise = 8; εάν (Noisy) setNoisyColour (χρώματα [absNoise], θόρυβος)? else setBlockColour (χρώματα [absNoise]); TFTscreen.point (x, y); }}} void setNoisyColour (Χρώμα χρώματος, θόρυβος πλωτήρα) {TFTscreen.stroke (colour.red * noise, colour.green * noise, colour.blue * noise); } void setBlockColour (Χρώμα χρώματος) {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 ++) {για (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 - ((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 = τυχαίο (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 = CurrentColour [z] [1]; B = CurrentColour [z] [2]; για (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 - ((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 = τυχαίο (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: Το τελικό αποτέλεσμα

Στο τέλος, συνδυάσαμε αυτά τα εφέ σε ένα είδος "slideshow" ουράνιων τόξων. Για να το πετύχουμε αυτό, απλώς καλέσαμε κάθε συνάρτηση μετά την άλλη σε λίγο βρόχο:

ενώ (αληθές) {Noise2n3 (false); Noise2n3 (αληθινό); TFTscreen.background (0, 0, 0); Θόρυβος 1 (); Θόρυβος 4 (); }

Συνιστάται: