Jump to content
Aiolos

Φωτισμός Led Για Κύκλο Φεγγαριού.

Recommended Posts

Στον κύριο φωτισμό μας την προσομοίωση ανατολής/δύσης λίγο πολύ την έχουμε πετύχει, είτε με έτοιμα συστήματα, είτε με την χρήση χρονοδιακοπτών που κάνουν και αυτοί εν μέρη τη δουλειά τους, που πιο πολύ εξυπηρετεί τις δικές μας οπτικές ανάγκες και λιγότερο τα ψάρια.

Πιο σημαντικό όμως σε ένα θαλασσινό ενυδρείο είναι ο κύκλος του φεγγαριού που έχει να κάνει με την αναπαραγωγική διαδικασία των οργανισμών.

Στην αγορά υπάρχουν τέτοια συστήματα, (συνήθως προσαρμοσμένα στον κύριο φωτισμό) που αναλαμβάνουν αυτόν τον κύκλο, αλλά οι τιμές είναι μάλλον απαγορευτικές.

Κάποιο "ηλεκτρονικό" παλικάρι μέσα απ εδώ που έχει τις γνώσεις για κάτι τέτοιο, δεν θα μπορούσε να κατασκευάσει ένα σύστημα με led που να ακολουθεί τους μηνιαίους κύκλους της σελήνης?

Αν η κατασκευή είναι απλή (που θα μπορεί να την κάνει ο καθένας μας) ας μας την παρουσιάσει ως μορφή οδηγού, ειδάλλως ας αναλάβει την κατασκευή για όσους το επιθυμούν..... (ευκαιρία και για καλυτέρευση των οικονομικών του)

Share this post


Link to post
Share on other sites

Βαγγέλη, με απασχόλησε το θέμα πρόσφατα, και έφτιαξα κάτι το οποίο θα προσπαθήσω να βρω χρόνο να το παρουσιάσω.

Η δική μου λύση (επειδή είχα ήδη ένα 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 και περιέχει σκέτο κείμενο...

Edited by Delta

Share this post


Link to post
Share on other sites

Δηλαδή.... με απλά λόγια, έχεις κατασκευάσει ένα σύστημα που χοντρικά ακολουθεί τους κύκλους της σελήνης, αυξομειώνοντας μέρα με τη μέρα τον φωτισμό (led στη περίπτωση αυτή) σύμφωνα με τον προγραμματισμό που του έχεις δώσει.

Ακολουθεί (προσομοιώνει) δηλαδή σε μηνιαία σταθερή βάση της φάσεις της σελήνης... σωστά?

Η διαφορά του +/- μιας ημέρας όντως δεν θα δημιουργήσει κανένα πρόβλημα.

Την στιγμή που πρόκειται για αρχείο κειμένου κάνε το αντιγραφή και επικόλληση ως κείμενο.

Share this post


Link to post
Share on other sites

Δηλαδή.... με απλά λόγια, έχεις κατασκευάσει ένα σύστημα που χοντρικά ακολουθεί τους κύκλους της σελήνης, αυξομειώνοντας μέρα με τη μέρα τον φωτισμό (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--------------------------------------------------------------------------------------------

Share this post


Link to post
Share on other sites

Πάρα πολύ ωραία !!!, (αν και από προγραμματισμό δεν καταλαβαίνω και πολλά).

Και ερχόμαστε τώρα στο ζητούμενο.... κατά πόσο είναι εφικτό για κάποιους που πιάνουν τα χέρια τους να κατασκευάσουν κάτι τέτοιο?... που θα βρουν τα υλικά και πια είναι αυτά που χρειάζονται?... και πόσο θα τους κοστίσει?....

Κάτι τέτοια συστήματα πρέπει να τα προωθήσουμε με οδηγίες κατασκευής βήμα προς βήμα... και φυσικά με φωτογραφικό υλικό.

Share this post


Link to post
Share on other sites

Το κόστος του arduino είναι γύρω στο 20ευρο από ebay (ή και Ελλάδα). Τα υπόλοιπα, led, τρανζιστοράκια κλπ είναι κανα 5 ευρώ όλα μαζί (εγώ έβαλα 24 led) από οποιοδήποτε κατάστημα ηλεκτρονικών. Πλεξι άλλα 2-3 ευρώ, και άλλα τόσα για καμμιά πλακέτα. Από κει και πέρα πρέπει να χρησιμοιποιήσεις κολητήρι.

Φωτο θα βάλω αλλά θα αργήσει γιατί έχει πέσει δουλειά...

Share this post


Link to post
Share on other sites

Αναμένουμε την παρουσίαση όποτε βρεις τον χρόνο.... είναι κάτι που σίγουρα ενδιαφέρει.

Share this post


Link to post
Share on other sites

Βάζω ένα σχεδιάγραμμα που δείχνει πως συνδέονται τα ηλεκτρονικά.

Στα δεξιά έχω βάλει 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.

post-44192-0-49557900-1326375196_thumb.jpg

Edited by Delta

Share this post


Link to post
Share on other sites

Να και 2 πρόχειρες φωτογραφίες του κομματιού που κάθεται πάνω στο ενυδρείο....

post-44192-0-54946000-1326401233_thumb.jpg

post-44192-0-32105200-1326401245_thumb.jpg

post-44192-0-09623300-1326401251_thumb.jpg

Share this post


Link to post
Share on other sites

Αν και το είδα τώρα, θεωρώ πολύ καλή και αξιέπαινη προσπάθεια.

Μπορεί κάτι τέτοιο να γίνει εάν αντί για DIY κατασκευή LED, χρησιμοποιήσουμε ταινία...πχ Aqualum ??

Share this post


Link to post
Share on other sites

Πολύ ωραίο project. :bigemo_harabe_net-122:

Share this post


Link to post
Share on other sites

Χωρίς να έχω ηλεκτρονικές γνώσεις η ταινία led πρέπει να έχει τη δυνατότητα να αυξομειώνεται η ένταση της.... αλλά τον βασικό ρόλο τον έχει το κύκλωμα και το ballast..... αν κάνω λάθος ας με διορθώσει κάποιος γνώστης !!!

Έτσι θα μάθουμε

Edited by Aiolos

Share this post


Link to post
Share on other sites

Νομίζω οτι για λίγα λέντ φτάνει η τροφοδοσία του adruino&δεν χρειάζεται μπάλαστ.

Share this post


Link to post
Share on other sites

Αν δεν κάνω λάθος γιαυτο μπαίνει το τρανζιστορ ( 2N2222A )μεταξύ led και arduino. Λειτουργεί σαν ενισχυτής/σταθεροποιητής.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×