import processing.serial.*; Serial mp; float[] val = {-1, -1}; float angle, dist; float x, y; float x1, y1, d1; void setup() { size(600, 600); mp = new Serial (this, Serial.list()[1], 9600); mp.bufferUntil ('\n'); } void draw() { background(0); // εμφανιση κυκλων noFill(); stroke(255); line(0, 300, 600, 300); for (int i=1; i<=6; i++ ) ellipse (300, 300, 100*i, 100*i); // Αν έχουμε τιμές γωνίας και απόστασης, δείχνουμε σημεία if (val[0] > 0 && val[1] >= 0 ) { angle = val[1]; dist = val[0]; } x = 300 * cos(radians(angle)) + 300; y = 300 - 300 * sin(radians(angle)); stroke(#5DF507); strokeWeight(3); line(300, 300, x, y); if (val[0] > 0 && val[1] >= 0 ) { x1 = dist * cos(radians(angle)) + 300; y1 = 300 - dist * sin(radians(angle)); fill(#F70202); noStroke(); ellipse(x1, y1, 20, 20); } } // Το arduino στέλνει ένα string, της μορφής: DαποστασησεεκατοστάΑγωνίασεμοίρες // πχ D3.4A125 // Η function getData() φτιάνει τον πίνακα val με 2 πραγματικούς αριθμούς. // Στη θέση 0 του πίνακα θα είναι η απόσταση. // Στη θέση 1 του πίνακα θα είναι η γωνία. void getData() { String data; // Στο string data θα πάρουμε τα δεδομένα που ήρθαν στη σειριακή θύρα // μέχρι το newline. data = mp.readStringUntil('\n'); if (data != null) // Ελέγχουμε αν όντως πήραμε κάτι. { data = data.trim(); // Κόβουμε κενούς χαρακτήρες από το τέλος της συμβολοσειράς. // Βρίσκουμε σε ποια θέση μέσα στη συμβολοσειρά data είναι το γράμμα Α και το D int indexA = data.indexOf("A"); int indexD = data.indexOf("D"); // Ο σκοπός είναι να βρούμε που βρίσκονται μέσα στην συμβολοσειρά data // οι δύο αριθμοί (απόσταση, γωνία). // Ο αριθμός που δείχνει την απόσταση ξεκινάει μία θέση μετά το D // και φτάνει μία θέση πριν το Α. try { val[0] = Float.valueOf(data.substring(indexD+1, indexA)); } catch(Exception e) { ; } //if (val[0] >= 0 && val[0] <= 200) val[0]= map(val[0], 0, 200, 0, 300); // val[0]= constrain(val[0], 0, 300 ); // Ο αριθμός που δείχνει τη γωνία ξεκινάει μία θέση μετά το Α // και φτάνει μέχρι το τέλος της συμβολοσειράς. try { val[1] = Float.valueOf(data.substring(indexA+1)); } catch(Exception e) { ; } } // Καθαρίζουμε τη θύρα, καλού κακού mp.clear(); print("D: "); print(val[0]); print("A: "); println(val[1]); } // Η function serialEvent() εκτελείται κάθε φορά που έρχεται κάτι στην σειριακή θύρα. // Εμείς εδώ, απλά παίρνουμε τα δεδομένα, καλώντας την function getData(). // Tα δεδομένα η getData() τα τοποθετεί στον πίνακα val, ο οποίος είναι ένας πίνακας // που χωράει 2 πραγματικούς αριθμούς. (δείτε πάνω πάνω στη δήλωση των μεταβλητών) void serialEvent(Serial mp) { if (mp.available() > 0 ) getData(); }