Aiolos 12 Ιανουαρίου 2012 #1 Share 12 Ιανουαρίου 2012 Στον κύριο φωτισμό μας την προσομοίωση ανατολής/δύσης λίγο πολύ την έχουμε πετύχει, είτε με έτοιμα συστήματα, είτε με την χρήση χρονοδιακοπτών που κάνουν και αυτοί εν μέρη τη δουλειά τους, που πιο πολύ εξυπηρετεί τις δικές μας οπτικές ανάγκες και λιγότερο τα ψάρια. Πιο σημαντικό όμως σε ένα θαλασσινό ενυδρείο είναι ο κύκλος του φεγγαριού που έχει να κάνει με την αναπαραγωγική διαδικασία των οργανισμών. Στην αγορά υπάρχουν τέτοια συστήματα, (συνήθως προσαρμοσμένα στον κύριο φωτισμό) που αναλαμβάνουν αυτόν τον κύκλο, αλλά οι τιμές είναι μάλλον απαγορευτικές. Κάποιο "ηλεκτρονικό" παλικάρι μέσα απ εδώ που έχει τις γνώσεις για κάτι τέτοιο, δεν θα μπορούσε να κατασκευάσει ένα σύστημα με led που να ακολουθεί τους μηνιαίους κύκλους της σελήνης? Αν η κατασκευή είναι απλή (που θα μπορεί να την κάνει ο καθένας μας) ας μας την παρουσιάσει ως μορφή οδηγού, ειδάλλως ας αναλάβει την κατασκευή για όσους το επιθυμούν..... (ευκαιρία και για καλυτέρευση των οικονομικών του) Link to comment Share on other sites More sharing options...
Delta 12 Ιανουαρίου 2012 #2 Share 12 Ιανουαρίου 2012 (edited) Βαγγέλη, με απασχόλησε το θέμα πρόσφατα, και έφτιαξα κάτι το οποίο θα προσπαθήσω να βρω χρόνο να το παρουσιάσω. Η δική μου λύση (επειδή είχα ήδη ένα arduino για ντιμάρισμα του φωτιστικού μου) http://www.aquazone....ndpost&p=586534 Ήταν απλά να του αλλάξω το πρόγραμμα ώστε να οδηγεί 2 σειρές από LED τα οποία προμηθεύτηκα και κόλλησα ο ίδιος. Τα υλικά/βήματα είναι σχετικά απλά για κάποιον που πιάνουν λίγο τα χέρια του από ηλεκτρονικά. 1) 2 σωλήνες διαφανές πλεξι, διάμμετρος 2εκ περίπου εσωτερικά. Μήκος όσο θέλουμε (για να χωράνε όσα led θέλουμε στη σειρά). + μικρά πλακάκια/κομματάκια διαφανές πλεξι για να να φτιάξουμε βάση ή ποδαράκια για να μην κατρακυλάνε οι σωλήνες ή να τους στηρίξουμε τέλος πάντων όπως θέλουμε. 3) Blue LED και αντιστάσεις, τα οποία έβαλα σε διάταξη ανά 3, όπως αυτός εδώ http://pcbheaven.com..._1282211658.png 4) Τα LED και τις αντιστάσεις τα κόλλησα σε μια στενή λωρίδα πλακέτας ίσα για να χωράει στο διαφανές plexi. Τα έκλεισα μέσα και τράβηξα καλώδιο προς το arduino όπου έκανα σύνδεση με ένα φτηνό τρανζιστοράκι (εγώ έβαλα το 2Ν2222Α), και με ρεύμα/γείωση όπως δείχνει η εικόνα © σε αυτό το σύνδεσμο: http://www.opensourc.../img/ledctl.gif Η παροχή ρεύματος και γείωση υπάρχουν ήδη στην πλακέτα του arduino - το σήμα που οδηγεί το τρανζιστοράκι (και ντιμάρει τα LED) είναι μια από τις εξόδους του arduino. 5) για τον κύκλο της σελήνης: ο υπολογισμός του είναι πιό πολύπλοκος απ'ότι έχω χρόνο να εξηγήσω εδώ, αλλά υπάρχουν κάποιοι σχετικά απλοί αλγόριθμοι (π.χ. Conway) οι οποίοι παρεκλίνουν "λίγο" από τον πραγματικό κύκλο (στην πράξη αυτό σημαίνει ότι μπορεί να είσαι συγχρονισμένος +/1 καμμιά μέρα σε σχέση με τη σελήνη, αλλά για ενυδρείο δε μας νοιάζει). Το πλήρες πρόγραμμα προσπαθώ να το επισυνάψω εδώ αλλά δε μου επιτρέπει λέει "Σφάλμα Δεν σας επιτρέπεται να ανεβάσετε αυτό το είδος αρχείου". Προς MODS: η κατάληξη είναι .pde και περιέχει σκέτο κείμενο... Έγινε επεξεργασία 12 Ιανουαρίου 2012 - Delta Link to comment Share on other sites More sharing options...
Aiolos 12 Ιανουαρίου 2012 Author #3 Share 12 Ιανουαρίου 2012 Δηλαδή.... με απλά λόγια, έχεις κατασκευάσει ένα σύστημα που χοντρικά ακολουθεί τους κύκλους της σελήνης, αυξομειώνοντας μέρα με τη μέρα τον φωτισμό (led στη περίπτωση αυτή) σύμφωνα με τον προγραμματισμό που του έχεις δώσει. Ακολουθεί (προσομοιώνει) δηλαδή σε μηνιαία σταθερή βάση της φάσεις της σελήνης... σωστά? Η διαφορά του +/- μιας ημέρας όντως δεν θα δημιουργήσει κανένα πρόβλημα. Την στιγμή που πρόκειται για αρχείο κειμένου κάνε το αντιγραφή και επικόλληση ως κείμενο. Link to comment Share on other sites More sharing options...
Delta 12 Ιανουαρίου 2012 #4 Share 12 Ιανουαρίου 2012 Δηλαδή.... με απλά λόγια, έχεις κατασκευάσει ένα σύστημα που χοντρικά ακολουθεί τους κύκλους της σελήνης, αυξομειώνοντας μέρα με τη μέρα τον φωτισμό (led στη περίπτωση αυτή) σύμφωνα με τον προγραμματισμό που του έχεις δώσει. Ακολουθεί (προσομοιώνει) δηλαδή σε μηνιαία σταθερή βάση της φάσεις της σελήνης... σωστά? Η διαφορά του +/- μιας ημέρας όντως δεν θα δημιουργήσει κανένα πρόβλημα. Την στιγμή που πρόκειται για αρχείο κειμένου κάνε το αντιγραφή και επικόλληση ως κείμενο. Ακριβώς έτσι είναι. Μάλιστα μπορεις να ορίσεις και τις ώρες στις οποίες θα "ανατέλει" και θα "δύει" η σελήνη. Δηλαδή ξεκινάει από κάποια ώρα και σταδιακά αυξάνει την ένταση των led ως μια φωτεινότητα η οποία είναι ανάλογη του ποσοστού της σελήνης που φωτίζεται τη συγκεκριμένη μέρα (0% νέα σελήνη - 100% πανσέληνος). Μετά κάποιες ώρες η ένταση σταδιακά πέφτει ξανά στο 0. (όλα αυτά ρυθμίζονται στο πρόγραμμα). Το αρχείο το κάνω paste εδώ - είναι "σεντόνι" αν θέλουν οι mods μπορούν να το διαγράψουν και να το κάνουμε επισυναπτόμενο αν λυθεί το θέμα με το ανέβασμα αρχείου. --Αρχή αρχείου moonlight.pde-------------------------------------------------------------------------------------------- /* Moonlight LED driver Requires DS1407 real-time clock Reads date, estimates moon phase and dims the LED accordingly. For simplicity, moon "rises" and "sets" within a given period which is always the same. Copyright 2011 Delta (aquazone.gr forum) */ //for DS1307 RTC #include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 #define DS1307_RAM_BASE 0x08 #define DAYLIGHT_SAVINGS //MOONLIGHT PARAMETERS #define MAX 0.40 //maximum intensity to be reached at full moon double pctfull; double rise_or_set; double con; // Output int redPin = 3; // PWM pin 3 int ledPin = 13; // Program variables int redVal = 255; // Variables to store the values to send to the pins //clock variables long int sec; //current time in seconds byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; byte DST; //binary flag for Daylight Savings Time float floatHour; int i = 0; // Loop counter int wait = 30000; // ms loop delay int DEBUG = 1; void setup() { pinMode(redPin, OUTPUT); // sets the pins as output if (DEBUG) { // If we want to see the pin values for debugging... Serial.begin(9600); // ...set up the serial ouput on 0004 style Serial.println("Hello"); } //DS1307 setup Wire.begin(); check_clock_ok(); //check if clock lost power - if so, freeze. //use next line only to set/correct time when needed //setDateDs1307((byte)0,(byte)04,(byte)23,(byte)2,(byte)9,(byte)1,(byte)12); //if this is a reset in the middle of the photoperiod, set correct time getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); sec= ((long int)hour*3600+(long int)minute*60+(long int)second); if (DEBUG) { Serial.println(" "); Serial.print("Time now:"); Serial.print(hour, DEC); Serial.print(":"); Serial.print(minute, DEC); Serial.print(":"); Serial.print(second, DEC); Serial.print(", DST:"); Serial.println(DST, DEC); Serial.println(" "); Serial.print("Day:"); Serial.print(dayOfMonth, DEC); Serial.print(" Month:"); Serial.print(month, DEC); Serial.print(" Year:"); Serial.print(year, DEC); } //NOTE: THIS CODE COMPUTES THE MOON PHASE. It assumes that //the arduino is switched off during the day. Otherwise, this //code must be placed in the main loop section con=Conway(year, month, dayOfMonth); //Serial.print(con, DEC); con=(con-(14.5))/(14.5); pctfull= 1.0-abs(con); } // Main program void loop() { ///////////////////// GET DATE/SET CLOCK if NECESSARY //get the date getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); //get DST status DST=get_ram_byte(0); //current time of day in seconds //sec= ((long int)hour*3600+(long int)minute*60+(long int)second); #ifdef DAYLIGHT_SAVINGS //if we are on Fall time and it's the last sunday in march, spring ahead 1 hr if ((DST==0) && (dayOfWeek>=1) && (month>=3) && ((dayOfMonth+7)>31) && (hour>3)) { DST=1; set_ram_byte(0,DST); setDateDs1307(second, minute, hour+1, dayOfWeek, dayOfMonth, month, year); } //if we are on Spring time and it's last sunday in october, fall back 1 hr if ((DST==1) && (dayOfWeek>=1) && (month>=10) && ((dayOfMonth+7)>31) && (hour>3)) { DST=0; set_ram_byte(0,DST); setDateDs1307(second, minute, hour-1, dayOfWeek, dayOfMonth, month, year); } #endif ////////////////////// end clock code //pctfull is the fraction of moonlight intensity (1 full, 0 new moon) //start at 11pm with moonrise, go up to pctfull at 11:30, stay there for 5 hrs //then at 4:30am moonset until 5am floatHour=(float)hour+( (float)minute)/60; if (floatHour>=22 && floatHour<=22.5) { // moonrise rise_or_set=(floatHour-22)/(22.5-22); } else if ((floatHour>22.5) || (floatHour<=2.0)) { //moon high rise_or_set=1.0; } else if (floatHour<2.5) { //moon set rise_or_set=(2.5-floatHour)/(2.5-2.0); } else rise_or_set=0.0; //convert to 0...255 and send to analog out (PWM) redVal=(int) 255*rise_or_set*MAX*pctfull; analogWrite(redPin, redVal); // Write current values to LED pins if (DEBUG) { // If we want to read the output //DEBUG += 1; // Increment the DEBUG counter //if (DEBUG > 10) // Print every 10 loops //{ // DEBUG = 1; // Reset the counter //Serial.print(i); // Serial commands in 0004 style Serial.print("\n"); // Print a tab Serial.print("R:"); // Indicate that output is red value Serial.print(redVal); // Print red value Serial.print("\n"); Serial.print("Hour:"); // Indicate that output is red value Serial.print(floatHour); // Print red value Serial.print("\n"); Serial.print("RoS:"); // Indicate that output is red value Serial.print(rise_or_set); // Print red value Serial.print("\n"); Serial.print("PctFull:"); // Indicate that output is red value Serial.print(pctfull); // Print red value Serial.print("\n"); Serial.print("Conway:"); // Indicate that output is red value Serial.print(con); // Print red value //} } delay(wait); // Pause for 'wait' milliseconds before resuming the loop } ///////////////////////////////////////////////////// // Moon Phase - Conway algorithm ///////////////////////////////////////////////// // returns age of the moon from 0-29. double Conway(byte yr, byte mo, byte da) { double r; //r = yr % 100; r=(double) yr; //Serial.println(" "); //Serial.print("yr:"); //Serial.print(yr, DEC); //Serial.print(" mo:"); //Serial.print(mo, DEC); //Serial.print(" da:"); //Serial.print(da, DEC); r =fmod(r,19); if (r>9){ r -= 19;} r = fmod(r * 11,30) + mo + da; if (mo<3){r += 2;} r = r-8.3; r = fmod(floor(r+0.5),30); // Serial.print(" r:"); // Serial.print(r, DEC); return ((r < 0) ? r+30 : r); } //////////////////////////////////////////////////////////// //DS1307 functions /////////////////////////////////////////////////////////////// // Convert normal decimal numbers to binary coded decimal byte decToBcd(byte val) { return ( (val/10*16) + (val%10) ); } // Convert binary coded decimal to normal decimal numbers byte bcdToDec(byte val) { return ( (val/16*10) + (val%16) ); } // Gets the date and time from the ds1307 void getDateDs1307(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { // Reset the register pointer Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.send(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); // A few of these need masks because certain bits are control bits *second = bcdToDec(Wire.receive() & 0x7f); *minute = bcdToDec(Wire.receive()); *hour = bcdToDec(Wire.receive() & 0x3f); // Need to change this if 12 hour am/pm *dayOfWeek = bcdToDec(Wire.receive()); *dayOfMonth = bcdToDec(Wire.receive()); *month = bcdToDec(Wire.receive()); *year = bcdToDec(Wire.receive()); } // 1) Sets the date and time on the ds1307 // 2) Starts the clock // 3) Sets hour mode to 24 hour clock // Assumes you're passing in valid numbers void setDateDs1307(byte second, // 0-59 byte minute, // 0-59 byte hour, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28/29/30/31 byte month, // 1-12 byte year) // 0-99 { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.send(0); Wire.send(decToBcd(second)); // 0 to bit 7 starts the clock Wire.send(decToBcd(minute)); Wire.send(decToBcd(hour)); // If you want 12 hour am/pm you need to set // bit 6 (also need to change readDateDs1307) Wire.send(decToBcd(dayOfWeek)); Wire.send(decToBcd(dayOfMonth)); Wire.send(decToBcd(month)); Wire.send(decToBcd(year)); Wire.endTransmission(); } void check_clock_ok() { // Make sure the clock has valid data Wire.beginTransmission( DS1307_I2C_ADDRESS); Wire.send(0x00); Wire.endTransmission(); Wire.requestFrom( DS1307_I2C_ADDRESS, 1); byte runningflag = Wire.receive(); // Make sure that at least the clock didn't lose power // by checking the CH (Clock Halt) flag if (runningflag & (1<<7)) { Serial.println("ERROR: RTC DEAD!"); // We don't want to do anything without valid data int ledflag = 1; while (1) { delay(1000); digitalWrite(ledPin, ledflag = !ledflag); } } } void set_ram_byte(int idx, byte val) { //SET RAM BYTE //////////////////////////////////////////////////////// Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.send(DS1307_RAM_BASE+idx); Wire.send(val); Wire.endTransmission(); } byte get_ram_byte(int idx) { // GET RAM BYTE ////////////////////////////////////////// Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.send(DS1307_RAM_BASE+idx); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 1); return (Wire.receive()); } --Τέλος αρχείουρχή αρχείου moonlight.pde-------------------------------------------------------------------------------------------- Link to comment Share on other sites More sharing options...
Aiolos 12 Ιανουαρίου 2012 Author #5 Share 12 Ιανουαρίου 2012 Πάρα πολύ ωραία !!!, (αν και από προγραμματισμό δεν καταλαβαίνω και πολλά). Και ερχόμαστε τώρα στο ζητούμενο.... κατά πόσο είναι εφικτό για κάποιους που πιάνουν τα χέρια τους να κατασκευάσουν κάτι τέτοιο?... που θα βρουν τα υλικά και πια είναι αυτά που χρειάζονται?... και πόσο θα τους κοστίσει?.... Κάτι τέτοια συστήματα πρέπει να τα προωθήσουμε με οδηγίες κατασκευής βήμα προς βήμα... και φυσικά με φωτογραφικό υλικό. Link to comment Share on other sites More sharing options...
Delta 12 Ιανουαρίου 2012 #6 Share 12 Ιανουαρίου 2012 Το κόστος του arduino είναι γύρω στο 20ευρο από ebay (ή και Ελλάδα). Τα υπόλοιπα, led, τρανζιστοράκια κλπ είναι κανα 5 ευρώ όλα μαζί (εγώ έβαλα 24 led) από οποιοδήποτε κατάστημα ηλεκτρονικών. Πλεξι άλλα 2-3 ευρώ, και άλλα τόσα για καμμιά πλακέτα. Από κει και πέρα πρέπει να χρησιμοιποιήσεις κολητήρι. Φωτο θα βάλω αλλά θα αργήσει γιατί έχει πέσει δουλειά... Link to comment Share on other sites More sharing options...
Aiolos 12 Ιανουαρίου 2012 Author #7 Share 12 Ιανουαρίου 2012 Αναμένουμε την παρουσίαση όποτε βρεις τον χρόνο.... είναι κάτι που σίγουρα ενδιαφέρει. Link to comment Share on other sites More sharing options...
Delta 12 Ιανουαρίου 2012 #8 Share 12 Ιανουαρίου 2012 (edited) Βάζω ένα σχεδιάγραμμα που δείχνει πως συνδέονται τα ηλεκτρονικά. Στα δεξιά έχω βάλει 3άδες led, η κάθε μια με την αντίστασή της. Μπορούμε να έχουμε όσες από αυτές θέλουμε, συνδεδεμένες παράλληλα όπως φαίνεται στο διάγραμμα, αρκεί το τροφοδοτικό (12V) που θα δίνει ρεύμα να τις "σηκώνει" από άποψης αμπερ. Εγώ έβαλα 4 τέτοιες 3άδες. Στα αριστερά του διαγράμματος φαίνεται ο τρόπος που συνδέονται τα 2 καλώδια που φεύγουν από τα LED στο τρανζιστοράκι, το οποίο πρέπει να τοποθετηθεί στο ίδιο "κουτί" με το arduino και το DS307 RTC (real-time clock) και να συνδεθεί με το pin 3 του arduino, καθώς και με το τροφοδοτικό (το οποίο θα υπάρχει έτσι κι αλλιώς για το arduino). Ένα καλό λινκ για το DS307 και το πως ακριβώς συνδέεται με το arduino είναι αυτό: http://www.ladyada.n.../ds1307rtc.html Φωτογραφίες του arduino+DS307 φαίνονται στο λινκ που έβαλα παραπάνω (2ο μήνυμα του thread). Αργότερα θα κοιτάξω να βάλω και φωτο της κατασκευής των LED. Έγινε επεξεργασία 12 Ιανουαρίου 2012 - Delta Link to comment Share on other sites More sharing options...
Delta 12 Ιανουαρίου 2012 #9 Share 12 Ιανουαρίου 2012 Να και 2 πρόχειρες φωτογραφίες του κομματιού που κάθεται πάνω στο ενυδρείο.... Link to comment Share on other sites More sharing options...
Samian 10 Μαρτίου 2012 #10 Share 10 Μαρτίου 2012 Αν και το είδα τώρα, θεωρώ πολύ καλή και αξιέπαινη προσπάθεια. Μπορεί κάτι τέτοιο να γίνει εάν αντί για DIY κατασκευή LED, χρησιμοποιήσουμε ταινία...πχ Aqualum ?? Link to comment Share on other sites More sharing options...
Alexpsycho 10 Μαρτίου 2012 #11 Share 10 Μαρτίου 2012 Πολύ ωραίο project. Link to comment Share on other sites More sharing options...
Aiolos 10 Μαρτίου 2012 Author #12 Share 10 Μαρτίου 2012 (edited) Χωρίς να έχω ηλεκτρονικές γνώσεις η ταινία led πρέπει να έχει τη δυνατότητα να αυξομειώνεται η ένταση της.... αλλά τον βασικό ρόλο τον έχει το κύκλωμα και το ballast..... αν κάνω λάθος ας με διορθώσει κάποιος γνώστης !!! Έτσι θα μάθουμε Έγινε επεξεργασία 10 Μαρτίου 2012 - Aiolos Link to comment Share on other sites More sharing options...
Alexpsycho 11 Μαρτίου 2012 #13 Share 11 Μαρτίου 2012 Νομίζω οτι για λίγα λέντ φτάνει η τροφοδοσία του adruino&δεν χρειάζεται μπάλαστ. Link to comment Share on other sites More sharing options...
Lamprosk 11 Μαρτίου 2012 #14 Share 11 Μαρτίου 2012 Αν δεν κάνω λάθος γιαυτο μπαίνει το τρανζιστορ ( 2N2222A )μεταξύ led και arduino. Λειτουργεί σαν ενισχυτής/σταθεροποιητής. Link to comment Share on other sites More sharing options...
Recommended Posts
Δημιουργήστε ένα λογαριασμό ή κάντε είσοδο για να σχολιάσετε
Πρέπει να είστε μέλος για να προσθέσετε ένα σχόλιο
Δημιουργία λογαριασμού
Δημιουργήστε ένα νέο λογαριασμό. Είναι εύκολο!
Δημιουργία λογαριασμούΣύνδεθείτε
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Είσοδος