import processing.serial.*; Serial mp; char val[] = {' ', ' ', ' '}; // πίνακας για τις 3 τιμές των αισθητήρων PImage photo, MTML, HTML, LTML, LTHL, LTLL, MTHL, MTLL, HTLL, HTHL; color fonto, xr_hliou; // μεταβλητές για τα χρώματα που θέλουμε να επηρεάζουμε int speed1 = 0; // μεταβλητή για ταχύτητα του 1ου σύννεφου int x1 = 770; // μεταβλητές για την αρχική θέση στον άξονα x int x2 = 850; // για καθέναν από τους 6 κύκλους που αποτελούν το int x3 = 740; // 1ο σύννεφο int x4 = 870; int x5 = 996; int x6 = 940; float x7 = 1323; float x8 = 1290; float x9 = 1430; float x10 = 1372; float x11 = 1472; void setup() { // Καθορίζουμε την επικοινωνία με το Arduino // Ρυθμός: 9600 bit ανά second mp = new Serial (this, Serial.list()[1], 9600); mp.bufferUntil ('\n'); // Μέγεθος παραθύρου // size(2000, 800); fullScreen(); // φορτώνουμε στη μνήμη, στη μεταβλητή photo την εικόνα με το βραχάκι και τις εικόνες του εξωγήινου //Medium Temp-Medium Light(MTML), Medium Temp-Low Light(MTLL) κ.ο.κ photo = loadImage("bg3.png"); MTML= loadImage("Mtemp.Mlight.PNG"); MTLL= loadImage("Mtemp.Llight.PNG"); MTHL= loadImage("Mtemp.Hlight.PNG"); HTML= loadImage("Htemp.Mlight.PNG"); HTLL= loadImage("Htemp.Llight.PNG"); HTHL= loadImage("Htemp.Hlight.PNG"); LTML= loadImage("Ltemp.Mlight.PNG"); LTLL= loadImage("Ltemp.Llight.PNG"); LTHL= loadImage("Ltemp.Hlight.PNG"); // αρχική τιμή για το χρωμα του φόντου (ουρανός), γαλάζιο fonto = #1DACCE; // αρχική τιμή για το χρώμα του ήλιου, άσπρο xr_hliou = #FFFFFF; } // τέλος της setup void draw() { // εμφανίζουμε το χρώμα του φόντου, άρα όλα σβήνονται background(fonto); // εμφανίζουμε το βραχάκι κάτω δεξιά image(photo, 1114, 670); // εκτελούμε την function ilios(), που έχει τις εντολές για ζωγραφική του ήλιου if (val[2] != 'L') ilios(); if (val[2] == 'L') { fegari(); asteria(); } // εκτελούμε την function synnefo1(), που έχει τις εντολές για ζωγραφική του κινούμενου σύννεφου synnefo1(); // εκτελούμε την function synnefo2(), που έχει τις εντολές για ζωγραφική του ακίνητου σύννεφου synnefo2(); alien(); } // τέλος της draw // Η function που ονομάσαμε ilios() περιέχει // όλες τις εντολές που χρειάζονται για να // ζωγραφιστεί ο ήλιος. void ilios() { fill(xr_hliou); noStroke(); circle(224, 210, 280); strokeWeight(25); stroke(xr_hliou); line(224, 20 + 36, 224, 70 + 36); line(224, 297 + 36, 224, 342 + 36); line(334, 184 + 36, 396, 183 + 36); line(114, 184 + 36, 47, 182 + 36); line(145, 103 + 36, 100, 53 + 36); line(142, 256 + 36, 87, 298 + 36); line(295, 100 + 36, 340, 60 + 36); line(308, 254 + 36, 347, 292 + 36); } // τέλος της ilios() void alien() { if (val[0] == 'H' && val[2] == 'H') image(HTHL, 1344, 440); if (val[0] == 'H' && val[2] == 'M') image(HTML, 1344, 440); if (val[0] == 'H' && val[2] == 'L') image(HTLL, 1344, 440); if (val[0] == 'M' && val[2] == 'H') image(MTHL, 1344, 440); if (val[0] == 'M' && val[2] == 'M') image(MTML, 1344, 440); if (val[0] == 'M' && val[2] == 'L') image(MTLL, 1344, 440); if (val[0] == 'L' && val[2] == 'H') image(LTHL, 1344, 440); if (val[0] == 'L' && val[2] == 'M') image(LTML, 1344, 440); if (val[0] == 'L' && val[2] == 'L') image(LTLL, 1344, 440); } //τέλος της alien() // Η function που ονομάσαμε synnefo2() περιέχει // όλες τις εντολές που χρειάζονται για να // ζωγραφιστεί το ακίνητο σύννεφο. void synnefo2() { fill(255); noStroke(); circle(x7, 186 + 36, 130); circle(x8, 280 + 36, 150); circle(x9, 210 + 36, 120); circle(x10, 272 + 36, 120); circle(x11, 281 + 36, 130); x7 = x7 + speed1+0.5; x8 = x8 + speed1+ 0.5; x9 = x9 + speed1+ 0.5; x10 = x10 + speed1+0.5; x11= x11 + speed1+ 0.5; if (x8> width ) { x7 = 1323 - 1500; x8 = 1290 - 1500; x9 = 1430 - 1500; x10 = 1372 - 1500; x11 = 1472 - 1500; } } // τέλος της synnefo2() // H function που ονομάσαμε Light_logic() περιέχει τις εντολές που // ελέγχουν την τιμή val[2] (φωτεινότητα από arduino) και ενημερώνουν // κατάλληλα την μεταβλητή fonto. void Light_logic() { if (val[2] == 'M') fonto = #FCD594; else if (val[2] == 'L') fonto = #121852; else if (val[2] == 'H') fonto = #AAD8FF; } // τέλος της Light_logic() // H function που ονομάσαμε Temp_logic() περιέχει τις εντολές που // ελέγχουν την τιμή val[0] (θερμοκρασία από arduino) και ενημερώνουν // κατάλληλα την μεταβλητή xr_hliou. void Temp_logic() { if (val[0] == 'M') xr_hliou = #F0C472; else if (val[0] == 'L') xr_hliou = #FCEF5C; else if (val[0] == 'H') xr_hliou = #FC502E; } // τέλος της Temp_logc() void Sound_logic() { if (val[1] == 'H') speed1 = 6 ; else if (val [1] == 'M') speed1 = 3 ; else if (val[1] == 'L') speed1 = 1 ; } // τέλος της Sound_logic // To serialEvent() εκτελείται αυτόματα όποτε ο υπολογιστής καταλάβει // ότι ήρθαν δεδομένα σε κάποια σειριακή θύρα, δηλ. μέσω USB. // Είναι event, δηλ. εκτελείται χωρίς να το ελέγχουμε εμείς. void serialEvent(Serial mp) { if (mp.available() > 0 ) // εάν έχουν έρθει δεδομενα στη σειριακή θύρα { // καλούμε την function getData() για να ξεχωρίσουμε τις τρεις τιμές getData(); // καλούμε την function Light_logic() για ελέγξουμε την τιμή του φωτός // και να ενημερώσουμε τη μεταβλητή fonto Light_logic(); // καλούμε την function Temp_logic() για ελέγξουμε την τιμή της θερμοκρασίας // και να ενημερώσουμε τη μεταβλητή xr_hliou Temp_logic(); // καλούμε την function Sound_logic() για να ελεγξουμε την τιμη του ηχου // και να ενημερωσουμε την μεταβλητη speed1 Sound_logic(); } } // τελος της serialEvent() // H function που ονομάσαμε getData() περιλαμβάνει όλες τις εντολές // που χρειάζονται ώστε οι τιμές που έρχονται μέσω της σειριακής θύρας // (δηλ. μέσα από το USB καλώδιο), να ξεχωριστούν και αποθηκευτούν στο // πινακάκι val, ώστε να έχουμε στο val[0] τη θερμοκρασία, στο val[1] // τον θόρυβο και το val[2] το φως. void getData() { String data; // Στο string data θα πάρουμε τα δεδομένα που ήρθαν στη σειριακή θύρα // μέχρι το newline. data = mp.readStringUntil('\n'); if (data != null) // Ελέγχουμε αν όντως πήραμε κάτι. { data = data.trim();// Κόβουμε κενούς χαρακτήρες από το τέλος της συμβολοσειράς. for (int i = 0; i<3; i++) { val[i] = data.charAt(i); // Ξεχωρίζουμε τις τρεις τιμές, val[0] θερμοκρασία } // val[1] θόρυβος και val[2] φως } // Καθαρίζουμε τη θύρα, καλού κακού mp.clear(); // Τυπώνουμε τις τιμές που ήρθαν println("TIMES: ", val[0], "-", val[1], "-", val[2]); } // τέλος της getData() // Η function που ονομάσαμε synnefo1() περιέχει // όλες τις εντολές που χρειάζονται για να // ζωγραφιστεί το κινούμενο σύννεφο. void synnefo1() { fill(255); noStroke(); circle(x1, 242 + 36, 130); circle(x2, 355 + 36, 150); circle(x3, 308 + 36, 120); circle(x4, 244 + 36, 150); circle(x5, 347 + 36, 160); circle(x6, 280 + 36, 150); x1 = x1 + speed1; x2 = x2 + speed1; x3 = x3 + speed1; x4 = x4 + speed1; x5 = x5 + speed1; x6 = x6 + speed1; if (x3 > width) { x1 = 770-1200; x2 = 850-1200; x3 = 740-1200; x4 = 870-1200; x5 = 996-1200; x6 = 940-1200; } } // τέλος της synnefo1() void mousePressed() { exit(); print(mouseX); print("-"); println(mouseY); } void fegari() { fill(255); noStroke(); circle(1727, 145, 256); fill(fonto); noStroke(); circle(1799, 145, 256); } void asteria() { fill (255); noStroke(); circle(340, 160, 10); circle(500, 160, 10); circle(150, 50, 10); circle(200, 200, 10); circle(230, 500, 10); circle(340, 700, 10); circle(290, 450, 10); circle(1100, 340, 10); circle(1000, 260, 10); circle(1200, 500, 10); circle(1500, 450, 10); circle(850, 360, 10); circle(100, 160, 10); circle(950, 380, 10); circle(470, 50, 10); circle(580, 470, 10); circle(570, 560, 15); circle(450, 580, 10); circle(1381, 140, 10); circle(1450, 200, 15); circle(1500, 300, 10); circle(1230, 200, 10); circle(1450, 50, 10); circle(1675, 434, 10); circle(884, 704, 10); circle(800, 630, 15); circle(890, 630, 10); circle(570, 650, 10); circle(720, 570, 15); circle(925, 532, 10); circle(1000, 600, 10); circle(860, 490, 10); circle(542, 291, 10); circle(773, 70, 15); circle(600, 40, 10); circle(300, 50, 10); circle(1801, 380, 10); circle(1950, 560, 10); circle(760, 480, 10); circle(1318, 355, 10); circle(180, 455, 10); circle(230, 790, 10); circle(170, 890, 10); circle(754, 226, 10); circle(334, 294, 10); circle(956, 180, 10); circle(1821, 163, 10); circle(132, 627, 10); circle(1132, 64, 10); circle(901, 44, 10); circle(450, 400, 15); circle(660, 600, 10); circle(170, 330, 15); circle(20, 400, 13); circle(740, 734, 12); circle(1025, 866, 10); circle(520, 780, 10); circle(670, 890, 10); circle(1070, 491, 14); circle(673, 310, 10); circle(325, 576, 10); circle(1360, 560, 10); circle(1500, 620, 10); circle(1770, 520, 10); circle(1586, 500, 10); circle(1012, 721, 10); circle(100, 500, 10); circle(1142, 600, 12); circle(390, 858, 9); circle(835, 860, 10); circle(600, 200, 15); circle(1677, 600, 15); circle(1890, 500, 7); circle(1857, 705, 12); circle(86, 738, 10); circle(1223, 400, 15); }