• Nenhum resultado encontrado

[PENDING] Έλεγχος φορτίων από απόσταση με χρήση Arduino.

N/A
N/A
Protected

Academic year: 2024

Share "Έλεγχος φορτίων από απόσταση με χρήση Arduino."

Copied!
82
0
0

Texto

(1)

ΤΕΧΝΟΛΟΓΙΚΟ ΕΚΠΑΙΔΕΥΤΙΚΟ ΊΔΡΥΜΑ ΑΝΑΤΟΛΙΚΗΣ ΜΑΚΕΔΟΝΙΑΣ ΚΑΙ ΘΡΑΚΗΣ

ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ Τ.Ε.

ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ

ΠΤΥΧΙΑΚΗ ΕΡΓΑΣΙΑ

Έλεγχος φορτίων από απόσταση με χρήση Arduino Control loads from distance with the use of Arduino

Αλέξανδρος Αλεξίου / 4906 Μωυσίδης Κυριάκος / 5053

ΕΠΙΒΛΕΠΩΝ ΚΑΘΗΓΗΤΗΣ: Κόγιας Παναγιώτης ΚΑΒΑΛΑ 2014

(2)
(3)

Περιεχόμενα

Πρόλογος ... 2

Περίληψη ... 3

Abstract ... 3

Εισαγωγή ... 4

ΚΕΦΑΛΑΙΟ 1 / Arduino ... 5

1.1 Γενικά ... 5

1.2 Χαρακτηριστικά του Arduino ... 6

1.3 Σειριακή θύρα ... 6

1.4 Τροφοδοσία ... 7

1.5 Μνήμες Arduino ... 8

1.6 Γλώσσα προγραμματισμού του Arduino ... 9

1.7 Ενσωματωμένα κουμπιά και LED ... 10

1.8 Σύνδεση με τον υπολογιστή Arduino IDE ... 10

1.9 Είσοδοι-Έξοδοι ... .11

1.10 Shields Arduino ... 14 1 ΚΕΦΑΛΑΙΟ 2 / ΥΛΟΠΟΙΗΣΗ ΠΤΥΧΙΑΚΗΣ ΕΡΓΑΣΙΑΣ ... 16

2.1 Υλικά κατασκευής και εργαλεία που χρησιμοποιήθηκαν ... 16

2.2 Κατασκευαστική πορεία της εργασίας ... 23

ΚΕΦΑΛΑΙΟ 3 / ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ... 32

3.1 Arduino ethernet ... 32

3.2 Προγραμματισμός εισόδου στο site ... 37

3.3 Προγραμματισμός site (δείγμα) ... 38

ΚΕΦΑΛΑΙΟ 4 ... 79

Βιβλιογραφία ... 79

(4)

Πρόλογος

Η εργασία αυτή αποτελεί το τελευταίο στάδιο της προπτυχιακής πορείας των σπουδών μας στο τμήμα Ηλεκτρολόγων Μηχανικών του ΤΕΙ Ανατολικής Μακεδονίας και Θράκης.

Έχει να κάνει με τον έλεγχο φορτίων από απόσταση με τη χρήση Αrduino.

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

Τέλος θα θέλαμε να ευχαριστήσουμε τον κ. Παναγιώτη Κόγια που μας

βοήθησε στην έμπνευση και πραγματοποίηση αυτής της πτυχιακής

εργασίας.

(5)

Περίληψη

Στην πτυχιακή αυτή εργασία έχουμε κατασκευάσει και προγραμματίσει μια μακέτα που προσομοιώνει τα ΤΟΛ του ΤΕΙ Ανατολικής Μακεδονίας και Θράκης ,στην οποία δημιουργήσαμε 8 μηχανικές πόρτες οι οποίες ανοιγοκλείνουν με τη βοήθεια κινητήρων μέσω ενός κυκλώματος που χρησιμοποιεί μικροεπεξεργαστές Arduino και το διαδίκτυο έτσι ώστε μέσω εντολών που δίνονται από ηλεκτρονικό υπολογιστή να λειτούργει.

Abstract

In this diploma thesis we have manufactured and programmed a model structure of the ΤΟΛ area from the TEI of Eastern Macedonia and Thrace, in which we created 8 mechanical doors that operate with the help of engines that connect with a circuit that uses Arduino processors and the world wide web in order to receive orders from a computer and operate.

(6)

Εισαγωγή

Το Arduino είναι ένα υπολογιστικό σύστημα αποτελούμενο από μια μητρική πλακέτα

ανοιχτού κώδικα. Με την χρήση του μικροελεγκτή μπορούμε να το προγραμματίσουμε στην γλώσσα Wiring(η οποία είναι παρεμφερής με την γλώσσα προγραμματισμού C + +) τις εισόδους / εξόδους που έχει ενσωματωμένες. Το Arduino μπορεί να γίνει εύκολα συμβατό με πληθώρα διαδραστικών αντικειμένων ανεξάρτητων μεταξύ τους αλλά και να συνδεθεί με υπολογιστή μέσω προγραμμάτων σε Processing, Max/MSP , Pure Data, SuperCollider. Είναι εύκολο να το αποκτήσει κάποιος, όπως και να το προγραμματίσει.

Πλεονεκτήματα του Arduino:

1.Οικονομία: Το Arduino είναι η φθηνότερη πλατφόρμα , ιδίως αν η αγορά του γίνει μέσω internet.

2.Συνδεσιμότητα: Μπορεί να συνδεθεί και να προγραμματιστεί εύκολα στα περισσότερα λειτουργικά συστήματα.

3.Ελεύθερο: Το υλικό και το λογισμικό του Arduino είναι ανοιχτό και ελεύθερο, με αποτέλεσμα χιλιάδες χρήστες να αναπτύσσουν βιβλιοθήκες για την υποστήριξη της πλατφόρμας ή ακόμα και να προχωρούν στην κατασκευή μιας.

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

Το Arduino διαθέτει 14 ψηφιακές εισόδους / εξόδους καθώς και 6 αναλογικές.

Όλες μπορούμε να τις διαμορφώσουμε σύμφωνα με τις εντολές του

προγράμματος και ανάλογα με την επιθυμητή λειτουργία.

(7)

ΚΕΦΑΛΑΙO 1

Arduino

1.1 Γενικά

Το Arduino αποτελείται από 14 ψηφιακές εισόδου/εξόδου που μπορούν να λειτουργούν ως είσοδοι (Input) ή ως έξοδοι (Output), χρησιμοποιώντας τις κατάλληλες εντολές. Λειτουργούν με τάση 5V.

Κάθε ακίδα μπορεί να προσφέρει ή να λάβει ένα μέγιστο ρεύμα των 40mA και έχει εσωτερικές αντιστάσεις pull-up της τάξεως των 20-50ΚΩ.

Επίσης, διαθέτει 6 αναλογικές εισόδους (Α0,Α1,Α2,Α3,Α4,Α5) που μετατρέπουν το αναλογικό σήμα εισόδου σε έναν αριθμό από 0 έως 1023. Από τους 14 ψηφιακούς λειτουργούν και ως αναλογικοί έξοδοι (P3,P5,P6,P9,P10,P11).Επιπλέον, μερικοί ακροδέκτες έχουν εξειδικευμένες λειτουργίες:

1. Σειριακή: 0 (RX) και 1 (TX). Χρησιμοποιείται για τη λήψη (RX) και την μετάδοση

(TX) TTL σειριακών δεδομένων (αυτές οι ακίδες συνδέονται με τις αντίστοιχες ακίδες του ATmega8U2 USB-to-TTL Serial chip).

2. Εξωτερικές Διακοπές : Οι ακίδες 2 και 3 μπορούν να προκαλέσουν διακοπές αν εισέρθει παλμός χαμηλής τάσης ή μια αλλαγή στην τιμή.

3. PWM : 3,5,6,9,10 και 11 παροχή 8 -bit PWM εξόδου με την analogWrite () λειτουργία (Pulse Width Modulation)

4. SPI : 10 (SS),11 (MOSI),12(MISO),13(SCK).Αυτοί οι ακροδέκτες

υποστηρίζουν την επικοινωνία SPI χρησιμοποιώντας τη βιβλιοθήκη SPI.

(8)

5. LED: 13.Υπάρχει ένα ενσωματωμένο LED που συνδέεται με την ψηφιακή ακίδα 13.Όταν η ακίδα είναι HIGH (5V) η ενδεικτική λυχνία είναι αναμμένη, ενώ όταν η ακίδα είναι LOW (0V) η λυχνία είναι σβηστή.

1.2 Χαρακτηριστικά του Arduino

Micro controller ATmega328 Operating Voltage 5V

Input Voltage (reccomended) 7-12V Input Voltage (limits) 6-20V

Digital I/O Pins 14(of which 6 provide PWM out put) Analog Input Pins 6

DC ρεύματος Ι/Ο Pin 40 mA DC τρέχουσα για 3.3V Pin 50 mA

Flash Memory 32 KB από τα οποία 0.5 ΚΒ χρησιμοποιούνται από τον

bootloader

SRAM 2KB EEPROM 1KB Clock Speed 16MHz

1.3 Σειριακή Θύρα

Χρησιμοποιείται για την επικοινωνία μεταξύ της πλακέτας Arduino και

ενός υπολογιστή ή μιας άλλης συσκευής. Όλες οι πλακέτες Arduino

έχουν τουλάχιστον μία σειριακή θύρα. Αυτή επικοινωνεί με της

ψηφιακές ακίδες 0 (RX) και 1 (TX) , καθώς και με τον υπολογιστή μέσω

USB. Έτσι, εάν βρίσκονται σε χρήση δεν γίνεται να χρησιμοποιούμε τις

ακίδες των 0 και 1.

(9)

1.4 Τροφοδοσία

Το Arduino μπορεί να τροφοδοτηθεί με ρεύμα είτε από τον υπολογιστή μέσω της σύνδεσης USB, είτε από εξωτερική τροφοδοσία που παρέχεται μέσω μιας υποδοχής φις των 2.1mm (θετικός πόλος στο κέντρο) και βρίσκεται στην κάτω-αριστερή γωνία του Arduino.

Για να μην υπάρχουν προβλήματα, η εξωτερική τροφοδοσία πρέπει να είναι από 7 ως 12V και μπορεί να προέρχεται από ένα κοινό μετασχηματιστή του εμπορίου, από μπαταρίες ή οποιαδήποτε άλλη πηγή DC.

Δίπλα από τα pin αναλογικής εισόδου, υπάρχει μια ακόμα συστοιχία από 6 pin με την σήμανση POWER. Η λειτουργία του καθενός έχει ως εξής:

1. Το πρώτο, με την ένδειξη RESET, όταν γειωθεί (σε οποιοδήποτε από τα 3 pin με την ένδειξη GND που υπάρχουν στο Arduino) έχει ως αποτέλεσμα την επανεκκίνηση του Arduino.

2. Το δεύτερο, με την ένδειξη 3.3V, μπορεί να τροφοδοτήσει τα εξαρτήματά σας με τάση 3.3V. Η τάση αυτή δεν προέρχεται από την εξωτερική τροφοδοσία αλλά παράγεται από τον ελεγκτή Serial-over-USB και έτσι η μέγιστη ένταση που μπορεί να παρέχει είναι μόλις 50mA.

3. Το τρίτο, με την ένδειξη 5V, μπορεί να τροφοδοτήσει τα εξαρτήματά σας με τάση 5V. Ανάλογα με τον τρόπο τροφοδοσίας του ίδιου του Arduino, η τάση αυτή προέρχεται είτε άμεσα από την θύρα USB (που ούτως ή άλλως λειτουργεί στα 5V),είτε από την εξωτερική τροφοδοσία αφού αυτή περάσει από ένα ρυθμιστή τάσης για να την «φέρει» στα 5V.

4. Το τέταρτο και το πέμπτο pin, με την ένδειξη GND, είναι φυσικά γειώσεις.

5. Το έκτο και τελευταίο pin, με την ένδειξη Vin έχει διπλό ρόλο. Σε

συνδυασμό με το pin γείωσης δίπλα του, μπορεί να λειτουργήσει ως

μέθοδος εξωτερικής τροφοδοσίας του Arduino, στην περίπτωση που δεν

(10)

σας βολεύει να χρησιμοποιήσετε την υποδοχή του φις των 2.1mm. Αν όμως έχετε ήδη συνδεδεμένη εξωτερική τροφοδοσία μέσω του φις, μπορείτε να χρησιμοποιήσετε αυτό το pin για να τροφοδοτήσετε εξαρτήματα με την πλήρη τάση της εξωτερικής τροφοδοσίας (7~12V), πριν αυτή περάσει από τον ρυθμιστή τάσης όπως γίνεται με το pin των 5V.

1.5 Μνήμες Arduino

Το Arduino βασίζεται στόν ATmega328, έναν 8-bit RISC μικρο ελεγκτή, τον οποίο χρονίζει στα 16MHz. Ο ATmega328 διαθέτει ενσωματωμένη μνήμη τριών τύπων:

1. 2Kb μνήμης SRAM που είναι η ωφέλιμη μνήμη που μπορούν να χρησιμοποιήσουν τα προγράμματά σας για να αποθηκεύουν μεταβλητές, πίνακες κ.λπ. κατά το runtime. Όπως και σε έναν υπολογιστή, αυτή η μνήμη χάνει τα δεδομένα της όταν η παροχή ρεύματος στο Arduino σταματήσει ή αν γίνει reset.

2. 1Kb μνήμης EEPROM η οποία μπορεί να χρησιμοποιηθεί για «ωμή»

εγγραφή/ανάγνωση δεδομένων (χωρίς datatype) ανά byte από τα προγράμματά σας κατά το runtime. Σε αντίθεση με την SRAM, η EEPROM δεν χάνει τα περιεχόμενά της με απώλεια τροφοδοσίας ή reset οπότε είναι το ανάλογο του σκληρού δίσκου.

3. 32Kb μνήμης Flash, από τα οποία τα 2Kb χρησιμοποιούνται από το firmware του Arduino που έχει εγκαταστήσει ήδη ο κατασκευαστής του.

Το firmware αυτό που στην ορολογία του Arduino ονομάζεται

bootloader είναι αναγκαίο για την εγκατάσταση των δικών σας

προγραμμάτων στον μικροελεγκτή μέσω της θύρας USB, χωρίς δηλαδή

να χρειάζεται εξωτερικός hardware programmer. Τα υπόλοιπα 30Kb της

μνήμης Flash χρησιμοποιούνται για την αποθήκευση αυτών ακριβώς

των προγραμμάτων, αφού πρώτα μεταγλωττιστούν στον υπολογιστή

σας. Η μνήμη Flash, όπως και η EEPROM δεν χάνει τα περιεχόμενά της

(11)

με απώλεια τροφοδοσίας ή reset. Επίσης, ενώ η μνήμη Flash υπό κανονικές συνθήκες δεν προορίζεται για χρήση runtime μέσα από τα προγράμματά σας, λόγω της μικρής συνολικής μνήμης που είναι διαθέσιμη σε αυτά (2Kb SRAM + 1Kb EEPROM), έχει σχεδιαστεί μια βιβλιοθήκη που επιτρέπει την χρήση όσου χώρου περισσεύει (30Kb μείον το μέγεθος του προγράμματός σας σε μεταγλωττισμένη μορφή).

Εικόνα 1.Τα μέροι του Arduino

1.6 Γλώσσα προγραμματισμού του Arduino

Η γλώσσα του Arduino βασίζεται στη γλώσσα Wiring, μια παραλλαγή C/C++ για μικροελεγκτές αρχιτεκτονικής AVR όπως ο ATmega, και υποστηρίζει όλες τις βασικές δομές της C καθώς και μερικά χαρακτηριστικά της C++. Για compiler χρησιμοποιείται ο AVR gcc και ως βασική βιβλιοθήκη C χρησιμοποιείται η AVR libc.

Λόγω της καταγωγής της από την C, στην γλώσσα του Arduino μπορείτε

να χρησιμοποιήσετε ουσιαστικά τις ίδιες βασικές εντολές και

συναρτήσεις, με την ίδια σύνταξη, τους ίδιους τύπων δεδομένων και

τους ίδιους τελεστές όπως και στην C. Πέρα από αυτές όμως, υπάρχουν

κάποιες ειδικές εντολές, συναρτήσεις και σταθερές που βοηθούν για

την διαχείριση του ειδικού hardware του Arduino.

(12)

1.7 Ενσωματωμένα κουμπιά και LED

Πάνω στην πλακέτα του Arduino υπάρχει ένας διακόπτης micro-switch και 4 μικροσκοπικά LED επιφανειακής στήριξης.

Η λειτουργία του διακόπτη (που έχει την σήμανση RESET) και του ενός LED με την σήμανση POWER είναι μάλλον προφανής.

Τα δύο LED με τις σημάνσεις TX και RX, χρησιμοποιούνται ως ένδειξη λειτουργίας του σειριακού interface, καθώς ανάβουν όταν το Arduino στέλνει ή λαμβάνει (αντίστοιχα) δεδομένα μέσω USB. Σημειώστε ότι τα LED αυτά ελέγχονται από τον ελεγκτή Serial-over-USB και συνεπώς δεν λειτουργούν όταν η σειριακή επικοινωνία γίνεται αποκλειστικά μέσω των ψηφιακών pin 0 και 1.

Τέλος, υπάρχει το LED με την σήμανση L. Η βασική δοκιμή λειτουργίας του Arduino είναι να του αναθέσετε να αναβοσβήνει ένα LED (θα το δείτε αυτό στην συνέχεια όταν θα φτιάξετε την πρώτη εφαρμογή σας).

Για να μπορείτε να το κάνετε αυτό από την πρώτη στιγμή, χωρίς να συνδέσετε τίποτα πάνω στο Arduino, οι κατασκευαστές του σκέφτηκαν να ενσωματώσουν ένα LED στην πλακέτα, το οποίο σύνδεσαν στο ψηφιακό pin 13. Έτσι, ακόμα και αν δεν έχετε συνδέσει τίποτα πάνω στο φυσικό pin 13, αναθέτοντάς του την τιμή HIGH μέσα από το πρόγραμμά σας, θα ανάψει αυτό το ενσωματωμένο LED.

1.8 Σύνδεση με τον υπολογιστή Arduino IDE

Το Arduino IDE είναι βασισμένο σε Java και συγκεκριμένα παρέχει:

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

2. αρκετά έτοιμα παραδείγματα,

3. μερικές έτοιμες βιβλιοθήκες για προέκταση της γλώσσας και για να

χειρίζεστε εύκολα μέσα από τον κώδικά σας τα εξαρτήματα που

(13)

συνδέετε στο Arduino,

4. τον compiler για την μεταγλώττιση των sketch σας,

5. ένα serial monitor που παρακολουθεί τις επικοινωνίες της σειριακής (USB), αναλαμβάνει να στείλει αλφαριθμητικά της επιλογής σας στο Arduino μέσω αυτής και είναι ιδιαίτερα χρήσιμο για το debugging των sketch σας

6. και την επιλογή να ανεβάσετε το μεταγλωττισμένο sketch στο Arduino.

Για τα δύο τελευταία χαρακτηριστικά βέβαια, το Arduino πρέπει να έχει συνδεθεί σε μια από τις θύρες USB του υπολογιστή και, λόγω του ελεγκτή Serial-over-USB, θα πρέπει να αναγνωριστεί από το λειτουργικό μας σύστημα ως εικονική σειριακή θύρα.

Για την σύνδεση θα χρειαστούμε ένα καλώδιο USB από Type A σε Type B, όπως αυτό των εκτυπωτών. Για την αναγνώριση από το λειτουργικό θα χρειαστεί να εγκαταστήσουμε τον οδηγό του FTDI chip (δηλαδή του ελεγκτή Serial-over-USB) ο οποίος υπάρχει στον φάκελο drivers του Arduino IDE που κατεβάσαμε. Την τελευταία έκδοση αυτού του οδηγού μπορούμε επίσης να κατεβάσούμε για κάθε λειτουργικό σύστημα από το site της FTDI.

Αν όλα έγιναν σωστά, το κεντρικό παράθυρο του Arduino IDE θα εμφανιστεί όταν το εκτελέσουμε και στο μενού Tools –> Serial Port θα πρέπει να εμφανίζεται η εικονική σειριακή θύρα (συνήθως COM# για τα Windows, /dev/ttyusbserial## για το MacOS και /dev/ttyusb## για το Linux). Επιλέγουμε αυτή την εικονική θύρα και στην συνέχεια επιλέγουμε τον τύπο του Arduino σας (Arduino Duemilanove w/

ATmega328) από το μενού Tools –> Board.

Το Arduino είναι πλέον έτοιμο να δεχτεί τα sketch μας. Αν εμφανίστηκε οποιοδήποτε πρόβλημα διαβάζουμε τις αναλυτικές οδηγίες εγκατάστασης για κάθε λειτουργικό σύστημα στη διεύθυνση http://arduino.cc/en/Guide/HomePage.

1.9 Είσοδοι-Έξοδοι

Καταρχήν το Arduino διαθέτει σειριακό interface. Ο μικρο ελεγκτής

ATmega υποστηρίζει σειριακή επικοινωνία, την οποία το Arduino

(14)

προωθεί μέσα από έναν ελεγκτή Serial-over-USB ώστε να συνδέεται με τον υπολογιστή μέσω USB. Η σύνδεση αυτή χρησιμοποιείται για την μεταφορά των προγραμμάτων που σχεδιάζονται από τον υπολογιστή στο Arduino αλλά και για αμφίδρομη επικοινωνία του Arduino με τον υπολογιστή μέσα από το πρόγραμμα την ώρα που εκτελείται.

Επιπλέον, στην πάνω πλευρά του Arduino βρίσκονται 14 θηλυκά pin, αριθμημένα από 0 ως 13, που μπορούν να λειτουργήσουν ως ψηφιακές είσοδοι και έξοδοι. Λειτουργούν στα 5V και καθένα μπορεί να παρέχει ή να δεχτεί το πολύ 40mA. Ως ψηφιακή έξοδος, ένα από αυτά τα pin μπορεί να τεθεί από το πρόγραμμά σας σε κατάσταση HIGH ή LOW, οπότε το Arduino θα ξέρει αν πρέπει να διοχετεύσει ή όχι ρεύμα στο συγκεκριμένο pin. Με αυτόν τον τρόπο μπορείτε λόγου χάρη να ανάψετε και να σβήσετε ένα LED που έχετε συνδέσει στο συγκεκριμένο pin. Αν πάλι ρυθμίσετε ένα από αυτά τα pin ως ψηφιακή είσοδο μέσα από το πρόγραμμά σας, μπορείτε με την κατάλληλη εντολή να διαβάσετε την κατάστασή του (HIGH ή LOW) ανάλογα με το αν η εξωτερική συσκευή που έχετε συνδέσει σε αυτό το pin διοχετεύει ή όχι ρεύμα στο pin (με αυτόν τον τρόπο λόγου χάρη μπορείτε να

«διαβάζετε» την κατάσταση ενός διακόπτη).

Μερικά από αυτά τα 14 pin, εκτός από ψηφιακές είσοδοι/έξοδοι έχουν και δεύτερη λειτουργία.

Συγκεκριμένα:

1. Τα pin 0 και 1 λειτουργούν ως RX και TX της σειριακής όταν το πρόγραμμά σας ενεργοποιεί την σειριακή θύρα. Έτσι, όταν λόγου χάρη το πρόγραμμά σας στέλνει δεδομένα στην σειριακή, αυτά προωθούνται και στην θύρα USB μέσω του ελεγκτή Serial-Over-USB αλλά και στο pin 0 για να τα διαβάσει ενδεχομένως μια άλλη συσκευή (π.χ. ένα δεύτερο Arduino στο δικό του pin 1). Αυτό φυσικά σημαίνει ότι αν στο πρόγραμμά σας ενεργοποιήσετε το σειριακό interface, χάνετε 2 ψηφιακές εισόδους/εξόδους.

2. Τα pin 2 και 3 λειτουργούν και ως εξωτερικά interrupt (interrupt 0

και 1 αντίστοιχα). Με άλλα λόγια, μπορείτε να τα ρυθμίσετε μέσα από

το πρόγραμμά σας ώστε να λειτουργούν αποκλειστικά ως ψηφιακές

είσοδοι στις οποίες όταν συμβαίνουν συγκεκριμένες αλλαγές, η

κανονική ροή του προγράμματος σταματάει *άμεσα* και εκτελείται μια

συγκεκριμένη συνάρτηση. Τα εξωτερικά interrupt είναι ιδιαίτερα

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

(15)

3. Τα pin 3, 5, 6, 9, 10 και 11 μπορούν να λειτουργήσουν και ως ψευδοαναλογικές έξοδοι με το σύστημα PWM (Pulse Width Modulation), δηλαδή το ίδιο σύστημα που διαθέτουν οι μητρικές των υπολογιστών για να ελέγχουν τις ταχύτητες των ανεμιστήρων. Έτσι, μπορείτε να συνδέσετε λόγου χάρη ένα LED σε κάποιο από αυτά τα pin και να ελέγξετε πλήρως την φωτεινότητά του με ανάλυση 8bit (256 καταστάσεις από 0-σβηστό ως 255-πλήρως αναμμένο) αντί να έχετε απλά την δυνατότητα αναμμένο-σβηστό που παρέχουν οι υπόλοιπές ψηφιακές έξοδοι. Είναι σημαντικό να καταλάβετε ότι το PWM δεν είναι πραγματικά αναλογικό σύστημα και ότι θέτοντας στην έξοδο την τιμή 127, δεν σημαίνει ότι η έξοδος θα δίνει 2.5V αντί της κανονικής τιμής των 5V, αλλά ότι θα δίνει ένα παλμό που θα εναλλάσσεται με μεγάλη συχνότητα και για ίσους χρόνους μεταξύ των τιμών 0 και 5V. Στην κάτω πλευρά του Arduino, με τη σήμανση ANALOG IN, θα βρείτε μια ακόμη σειρά από 6 pin, αριθμημένα από το 0 ως το 5. Το καθένα από αυτά λειτουργεί ως αναλογική είσοδος κάνοντας χρήση του ADC (Analog to Digital Converter) που είναι ενσωματωμένο στον μικροελεγκτή.

Για παράδειγμα, μπορείτε να τροφοδοτήσετε ένα από αυτά με μια τάση την οποία μπορείτε να κυμάνετε με ένα ποτενσιόμετρο από 0V ως μια τάση αναφοράς Vref η οποία, αν δεν κάνετε κάποια αλλαγή είναι προρυθμισμένη στα 5V. Τότε, μέσα από το πρόγραμμά σας μπορείτε να

«διαβάσετε» την τιμή του pin ως ένα ακέραιο αριθμό ανάλυσης 10-bit, από 0 (όταν η τάση στο pin είναι 0V) μέχρι 1023 (όταν η τάση στο pin είναι 5V). Η τάση αναφοράς μπορεί να ρυθμιστεί με μια εντολή στο 1.1V, ή σε όποια τάση επιθυμείτε (μεταξύ 2 και 5V) τροφοδοτώντας εξωτερικά με αυτή την τάση το pin με την σήμανση AREF που βρίσκεται στην απέναντι πλευρά της πλακέτας. Έτσι, αν τροφοδοτήσετε το pin AREF με 3.3V και στην συνέχεια δοκιμάσετε να διαβάσετε κάποιο pin αναλογικής εισόδου στο οποίο εφαρμόζετε τάση 1.65V, το Arduino θα σας επιστρέψει την τιμή 512.

Τέλος, καθένα από τα 6 αυτά pin, με κατάλληλη εντολή μέσα από το

πρόγραμμα μπορεί να μετατραπεί σε ψηφιακό pin εισόδου/εξόδου

όπως τα 14 που βρίσκονται στην απέναντι πλευρά και τα οποία

περιγράφηκαν πριν. Σε αυτή την περίπτωση τα pin μετονομάζονται από

0~5 σε 14~19 αντίστοιχα.

(16)

1.10 Shields Arduino

Τα shield είναι ολοκληρωμένες πλακέτες που είναι σχεδιασμένες ώστε να κουμπώνουν πάνω στο Arduino προεκτείνοντας την λειτουργικότητά του. Είναι η hardware αντίστοιχη έννοια των plugin, addon και extension που υπάρχουν στο software.

Μερικά από τα πιο δημοφιλή shield που κυκλοφορούν στο εμπόριο για το Arduino είναι:

1. Ethernet shield: Δίνει στο Arduino την δυνατότητα να δικτυωθεί σε ένα LAN ή στο internet μέσω ενός τυπικού καλωδίου Ethernet.

2. WiFi shield: Όμοιο με το Ethernet shield, χωρίς φυσικά το καλώδιο.

3. Διάφορα shield οθόνης: Προσθέτουν οθόνη στο Arduino.

Κυκλοφορούν από απλές οθόνες τύπου calculator μέχρι OLED touchscreen υψηλής ανάλυσης τύπου iPhone.

4. Wave shield: Δίνει στο Arduino την δυνατότητα να παίζει ήχους/μουσική από κάρτες SD.

5. GPS shield: Προσθέτει GPS δυνατότητες στο Arduino (εντοπισμό στίγματος).

6. Διάφορα Motor Shields: Σας επιτρέπουν να οδηγήσετε εύκολα μοτέρ διάφορων τύπων (απλά DC, servo, stepper κ.λπ.) από το Arduino.

7. ProtoShield: Μια προσχεδιασμένη πλακέτα πρωτοτυποποίησης, συμβατή στις διαστάσεις του Arduino και χωρίς εξαρτήματα για να φτιάξετε το δικό σας shield.

Τα shield είναι σχεδιασμένα ώστε αφού κουμπωθούν πάνω στο

Arduino να προωθούν τις υποδοχές του, ώστε να μπορείτε να

συνδέσετε επιπλέον τα δικά σας εξαρτήματα ή να κουμπώσετε και

επόμενο shield. Φυσικά, το κάθε shield χρησιμοποιεί ορισμένους από

τους πόρους συνδεσιμότητας του Arduino και έτσι δεν μπορείτε να

συνδέσετε απεριόριστα shield. Μάλιστα κάποια shield μπορεί να μην

είναι συμβατά μεταξύ τους γιατί χρησιμοποιούν τα ίδια pin του Arduino

για επικοινωνία με αυτό.

(17)

Επίσης, επειδή κάποια shield δεν προωθούν τις συνδέσεις του Arduino (όπως π.χ. οι οθόνες οι οποίες δεν έχουν νόημα αν τις καλύψετε από πάνω με ένα επόμενο shield), υπάρχουν ειδικά extender shield που κουμπώνουν στο Arduino και δίνουν την δυνατότητα σε δύο άλλα shield να κουμπώσουν πάνω τους, λειτουργώντας σαν πολύπριζα.

Όπως και για το ίδιο το Arduino, το βασικό πλεονέκτημα των shield δεν είναι τόσο το προφανές πλεονέκτημα του έτοιμου hardware όσο ότι συνοδεύονται συνήθως από έτοιμες βιβλιοθήκες που σας επιτρέπουν να προγραμματίζετε τα sketch σας σε high level.

Έτσι, λόγου χάρη, δεν χρειάζεται να διαβάζετε datasheet ή να γίνετε ηλεκτρονικός για να συνδέσετε και να λειτουργήσετε ένα GPS module πάνω στο Arduino. Απλά συνδέετε το shield, εγκαθιστάτε τη βιβλιοθήκη που το συνοδεύει και χρησιμοποιείτε μια έτοιμη συνάρτηση -του στυλ getLocation- για να πάρετε το γεωγραφικό στίγμα και να το επεξεργαστείτε περαιτέρω στο sketch σας.

Τα shield σας λύνουν τα χέρια όταν θέλετε να δημιουργήσετε εύκολα ένα πραγματικά πρακτικό project. Αυτός είναι και ο λόγος που δεν συνιστάται η αγορά κάποιας έκδοσης του Arduino που δεν είναι 100%

συμβατή με τα shield.

Εικόνα 3.Shield Arduinο

(18)

ΚΕΦΑΛΑΙΟ 2

Υλοποίηση Πτυχιακής Εργασίας

2.1 Υλικά κατασκευής και εργαλεία που χρησιμοποιήθηκαν.

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

• ARDUINO UNO

• ARDUINO MEGA

• ARDUINO ETHERNET (MEGA SHIELD)

• PCB BOARDS

• DC MOTORS

• LED’S

• DS1307 67 CHIP

• LCD DISPLAY

• SN754410 H-BRIDGE 1A CHIP

• SN754410NE QUAD HALF BRIDGE CHIP

• TO220 COOLER (FOR CHIPS)

• Καλώδια

• Μακετόχαρτο

• Κόντρα πλακέ θαλάσσης

• Διαφόρων μεγεθών κομμάτια ξύλου

• Κοιλοδοκός 10χ10 εκατοστά

• Μπογιά

• Ξυλόκολλα

• Πινέλα

• Τρυπάνι

• Γρασίδι μακέτας

• Κυανοακριλυκή κολλά

• Ακρυλικός στόκος

(19)

• Ύφασμα

• Κομμάτια λαμαρίνας

• Κλώστη

• Δέντρα μοντελοποίησης

• Ρελέ

• PLEXI-GLASS

• Κολλητήρι (ΚΑΛΑ’Ι’)

• Τρανζίστορ

• Αντιστάσεις

• Κλέμες

• Πυκνωτές

• Λίμες

• Σφυρί

• Πολύμετρο

• Πένσα

• Κατσαβίδια

• Βίδες

• Hλεκτρονικός υπολογιστής

• Κόπτης λαμαρίνας

• Μπαταρία 5V

ARDUINO MEGA

(20)

ETHERNET SHIELD

ARDUINO UNO

LCD SCREEN

(21)

COOLERS ,CHIPS & LED’s

ΞΥΛΟΚΟΛΛΑ

ΚΥΑΝΟΑΚΡΥΛΙΚΗ ΚΟΛΛΑ

ΠΟΛΥΜΕΤΡΟ

(22)

ΠΕΝΣΑ

ΣΦΥΡΙ

ΚΟΛΙΤΗΡΙ (ΚΑΛΑΙ)

PCB ΠΛΑΚΕΤΕΣ

ΚΙΝΗΤΗΡΕΣ DC

ΑΚΡΥΛΙΚΟΣ ΣΤΟΚΟΣ

ΚΑΛΩΔΙΑ

(23)

ΚΟΠΤΗΣ ΛΑΜΑΡΙΝΑΣ

ΛΑΜΑΡΙΝΑ

ΜΠΟΓΙΑ

ΔΙΑΦΟΡΕΣ ΛΙΜΕΣ

ΚΛΟΣΤΕΣ

ΚΟΝΤΡΑ ΠΛΑΚΕ ΘΑΛΑΣΣΗΣ

(24)

ΚΟΜΜΑΤΙΑ ΞΥΛΟ

ΥΦΑΣΜΑ

ΜΠΑΤΑΡΙΑ 5V BUTTON

ΚΑΤΣΑΒΙΔΙΑ

(25)

ΑΝΤΙΣΤΑΣΕΙΣ ΤΡΑΝΖΙΣΤΟΡ

ΠΥΚΝΩΤΕΣ

ΚΟΙΛΟΔΟΚΟΣ

ΔΕΝΤΡΑ ΜΟΝΤΕΛΙΣΜΟΥ

2.2 Κατασκευαστική πορεία της εργασίας.

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

Πρώτη δουλεία ήταν να σχεδιαστεί η πόρτα που θα ανοίγει με την

εντολή του Η/Υ. Μετά το σχεδιασμό της πόρτας ακλούθησε η κατασκευή

της πρώτα ενώσαμε κομμάτια λαμαρίνας με ύφασμα…

(26)

Που έπειτα κολλήθηκαν πάνω στο κομμάτι του κοιλοδοκού με αυτό το τελικό αποτέλεσμα…

Μετά ο κοιλοδοκός τρυπήθηκε σε 4 σημεία από τα όποια περαστήκαν ξύλινες σφήνες που συγκρατούσαν τον κινητήρα και τον άξονα του.

Είναι σημαντικό να τονίσουμε ότι οι άξονες έπρεπε να είναι τέλεια

ευθυγραμμισμένοι με τους κινητήρες για να λειτουργήσει το σύστημα

έτσι το τρύπημα των ξύλινων αξόνων και του κοιλοδοκού ήταν μια πολύ

αγχωτική και κουραστική δουλεία. Μετά από εξάσκηση όμως το τελικό

αποτέλεσμα ήταν το εξής…

(27)

Έπειτα στούς άξονες δέθηκαν κλώστες οι οποίες κατέληγαν σε κομβικά

σημεία της κουρτίνας (πόρτας) ώστε να μπορέσει να τη σηκώσει το

σύστημα.

(28)

Το επόμενο βήμα ήταν η κατασκευή της μακέτας το όποιο θα

παρουσιαστεί με εικόνες ανάλογα με το στάδιο της…

(29)

Με τη μακέτα σχεδόν έτοιμη το μόνο που έλειπε ήταν τα κυκλώματα που θα έδιναν ζωή σε αυτή την εργασία.

Κυκλώματα όπως αυτά…

Για χρονοπρογραμματισμό…

(30)

Για τη λειτούργεια της LCD οθόνης…

(31)

Για τη λειτουργία των κινητήρων…

Και έτσι και έγινε…

(32)
(33)

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

Μετά έλειπε μόνο το site που θα έλεγχε όλα αυτά. Και μετά από αρκετό

καιρό το τελικό αποτέλεσμα είναι το εξής…

(34)

ΚΕΦΑΛΑΙΟ 3 Προγραμματισμός

3.1 Arduino Ethernet

/*

Teleduino328EthernetClientProxy.ino - Teleduino328EthernetClientProxy example Version 328-0.6.8

Nathan Kennedy 2009 - 2013 http://www.teleduino.org

This sketch is distributed in the hope that it will be useful,

but WITHOUT ANY WARRANTY; without even the implied warranty of

MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

*/

#include <EEPROM.h>

#include <Servo.h>

#include <Wire.h>

#include <Teleduino328.h>

#include <SPI.h>

#include <Ethernet.h>

// User configurable variables byte useDhcp = true;

byte useDns = true;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress deviceIp(192, 168, 1, 100); // Only if useDhcp is false

IPAddress gatewayIp(192, 168, 1, 1); // Only if useDhcp is false

IPAddress dnsIp(192, 168, 1, 1); // Only if useDhcp is false IPAddress subnet(255, 255, 255, 0); // Only if useDhcp is false

IPAddress serverIp(173, 230, 152, 173); // Only if useDns is false

char serverName[] = "us01.proxy.teleduino.org"; // Only if useDns is true

unsigned int serverPort = 5353; // Can be set to either 53 or 5353

byte statusLedPin = 8;

(35)

// User configurable key, this is used to authenticate with the proxy server

// This is checked against the EEPROM on boot and written if necessary

// The proxy server retreives the key from the EEPROM byte key[] = { 0x6D, 0x52, 0xD6, 0x78,

0xE2, 0xBA, 0xE6, 0x85, 0x74, 0x12, 0x18, 0x45, 0xB8, 0x4C, 0xF3, 0xB9 };

// Other required variables byte data[257];

byte dataLength;

byte hexStage;

unsigned long lastInstruction = 0;

unsigned long lastRefresh = 0;

byte stage = 0;

// Declare client object EthernetClient Client;

void setup() {

// Load presets

Teleduino328.loadPresets();

// Set status LED pin

Teleduino328.setStatusLedPin(statusLedPin);

Teleduino328.setStatusLed(1); // Initialisation

// Check the EEPROM header and check to see if the key is correct

// This is to ensure the key is not cleared from the EEPROM if(EEPROM.read(0) != '#')

{

EEPROM.write(0, '#');

}

if(EEPROM.read(1) != 0) {

EEPROM.write(1, 0);

}

if(EEPROM.read(2) != '#') {

EEPROM.write(2, '#');

}

if(EEPROM.read(160) != '#') {

EEPROM.write(160, '#');

}

for(byte i = 0; i < 16; i++) {

if(EEPROM.read(161 + i) != key[i]) {

EEPROM.write(161 + i, key[i]);

} }

if(EEPROM.read(177) != '#')

(36)

{

EEPROM.write(177, '#');

}

// Start network and attempt to connect to proxy server Teleduino328.setStatusLed(2); // Network configuration if(useDhcp)

{

if(!Ethernet.begin(mac)) {

Teleduino328.setStatusLed(2, false, 10000);

Teleduino328.reset();

} } else {

Ethernet.begin(mac, deviceIp, dnsIp, gatewayIp, subnet);

}

delay(1000);

Teleduino328.setStatusLed(3); // Connect to server

if((useDns && !Client.connect(serverName, serverPort)) ||

(!useDns && !Client.connect(serverIp, serverPort))) {

Teleduino328.setStatusLed(3, false, 10000);

Teleduino328.reset();

}

lastInstruction = millis();

}

void loop() {

if(Client.connected()) {

// What we need to do depends on which 'stage' we are at switch(stage)

{

case 0: // Wait for start byte if(Client.available())

{

char c = Client.read();

if(c == '?') {

stage++;

} } break;

case 1: // Reset variables dataLength = 0;

hexStage = 0;

stage++;

break;

case 2: // Instruction byte if(Client.available()) {

char c = Client.read();

(37)

if(c == '?') {

stage = 1;

break;

}

else if(c == '\r' || c == '\n' || c == '.') {

stage = 0;

break;

}

if(!hexStage) {

data[0] = Teleduino328.hexDecode(c) * 16;

} else {

data[0] += Teleduino328.hexDecode(c);

}

hexStage = !hexStage;

if(!hexStage) {

stage++;

} } break;

case 3: // Data length byte if(Client.available()) {

char c = Client.read();

if(c == '?') {

stage = 1;

break;

}

else if(c == '\r' || c == '\n' || c == '.') {

stage = 0;

break;

}

if(!hexStage) {

data[1] = Teleduino328.hexDecode(c) * 16;

} else {

data[1] += Teleduino328.hexDecode(c);

}

hexStage = !hexStage;

if(!hexStage) {

stage++;

} } break;

case 4: // Data

if(Client.available())

(38)

{

char c = Client.read();

if(c == '?') {

stage = 1;

break;

}

else if(c == '\r' || c == '\n' || c == '.') {

if(dataLength == data[1]) {

stage++;

break;

} else {

stage = 0;

break;

} }

if(!hexStage) {

data[2 + dataLength] = Teleduino328.hexDecode(c) * 16;

} else {

data[2 + dataLength] += Teleduino328.hexDecode(c);

}

hexStage = !hexStage;

if(!hexStage) {

dataLength++;

} } break;

case 5: // Execute instruction and return result Teleduino328.instruction(data);

Client.write('!');

for(int i = 0; i < data[1] + 2; i++) {

Client.write(Teleduino328.hexEncode(data[i] / 16));

Client.write(Teleduino328.hexEncode(data[i] % 16));

}

Client.write('\n');

lastInstruction = millis();

stage = 0;

break;

} } else {

Teleduino328.setStatusLed(10);

Teleduino328.reset();

}

(39)

// Has the instruction timeout been reached?

if(millis() - lastInstruction > 30000) {

Client.flush();

Client.stop();

Teleduino328.setStatusLed(9);

Teleduino328.reset();

}

// Process refreshes every 50ms if(millis() - lastRefresh >= 50) {

Teleduino328.pinTimers();

Teleduino328.shiftRegisterTimers();

Teleduino328.shiftRegisters();

lastRefresh = millis();

}

// Check to see if reset has been requested Teleduino328.checkReset();

}

3.2 Προγραμματισμός εισόδου στο site

<html>

<head>

<p>Πατήστε το κουμπί για να εισέλθετε στην σελίδα.</p>

<SCRIPT>

function passWord(url1,url2) {

var pass1 = prompt('Εισάγετε τον κωδικό πρόσβασης','');

if(pass1 && pass1.toLowerCase() == "dose2euro") {

window.location.href = url1;

} else {

window.location.href = url2;

} }

</SCRIPT>

(40)

</head>

<body>

<button onClick="passWord('http://mkelectrical4.wix.com/lcfd#!__page- 0','index.html')" class="more">Είσοδος</button>

</body>

</html>

3.3 Προγραμματισμός site (δείγμα)

<!DOCTYPE HTML >

<html>

<head>

<body background="http://kidihou.com/wp-content/uploads/2013/09/light-blue- background-1btrk2ng.jpg">

<script language="javascript">

<!-- -->

<!--

var Alarm_0;var Alarm_1;var Alarm_2;var Alarm_3;var Alarm_4;var Alarm_5;var Alarm_6;var Alarm_7;var Alarm_8;var Alarm_9;var Alarm_10;var Alarm_11;var Alarm_12;var Alarm_13;var Alarm_14;var Alarm_15;

var txt;

var curTime;

var check=new Date();

var hNum;

var minNum;

var secNum;

var dynr var nextdaynr

var lastalarmarray=["na"];

(41)

<!-- -->

function checksetalarm(){

if(document.clock.alarm0OnOff.checked==true)alarm0Set();

if(document.clock.alarm1OnOff.checked==true)alarm1Set();

if(document.clock.alarm2OnOff.checked==true)alarm2Set();

if(document.clock.alarm3OnOff.checked==true)alarm3Set();

if(document.clock.alarm4OnOff.checked==true)alarm4Set();

if(document.clock.alarm5OnOff.checked==true)alarm5Set();

if(document.clock.alarm6OnOff.checked==true)alarm6Set();

if(document.clock.alarm7OnOff.checked==true)alarm7Set();

if(document.clock.alarm8OnOff.checked==true)alarm8Set();

if(document.clock.alarm9OnOff.checked==true)alarm9Set();

if(document.clock.alarm10OnOff.checked==true)alarm10Set();

if(document.clock.alarm11OnOff.checked==true)alarm11Set();

if(document.clock.alarm12OnOff.checked==true)alarm12Set();

if(document.clock.alarm13OnOff.checked==true)alarm13Set();

if(document.clock.alarm14OnOff.checked==true)alarm14Set();

if(document.clock.alarm15OnOff.checked==true)alarm15Set();

}

Date.prototype.getMonthName = function() {

var m = ['January','February','March','April','May','June','July', 'August','September','October','November','December'];

return m[this.getMonth()];

}

Date.prototype.getDayName = function() {

(42)

var d = ['Sunday','Monday','Tuesday','Wednesday', 'Thursday','Friday','Saturday'];

return d[this.getDay()];

}

Date.prototype.getWeek = function (dowOffset) {

dowOffset = typeof(dowOffset) == 'int' ? dowOffset : 1; //default dowOffset to zero var newYear = new Date(this.getFullYear(),0,1);

var day = newYear.getDay() - dowOffset; //the day of week the year begins on day = (day >= 0 ? day : day + 7);

var daynum = Math.floor((this.getTime() - newYear.getTime() -

(this.getTimezoneOffset()-newYear.getTimezoneOffset())*60000)/86400000) + 1;

var weeknum;

//if the year starts before the middle of a week if(day < 4) {

weeknum = Math.floor((daynum+day-1)/7) + 1;

if(weeknum > 52) {

nYear = new Date(this.getFullYear() + 1,0,1);

nday = nYear.getDay() - dowOffset;

nday = nday >= 0 ? nday : nday + 7;

/*if the next year starts before the middle of the week, it is week #1 of that year*/

weeknum = nday < 4 ? 1 : 53;

} }

(43)

else {

weeknum = Math.floor((daynum+day-1)/7);

}

return weeknum;

};

function GetTime(){

var dt=new Date();

dynr=dt.getDay();

nextdaynr=dynr;

if(dynr!=0){

dynr=dynr-1 } else { dynr=6;

}

document.clock.local.value=IfZero(dt.getHours()) + ":" + IfZero(dt.getMinutes())+ ":" + IfZero(dt.getSeconds());

setTimeout("GetTime()", 990);

curTime=(IfZero(dt.getHours()) + ":" + IfZero(dt.getMinutes())+ ":" + IfZero(dt.getSeconds()));

(44)

document.clock.datum.value=curTime+ ', ' + dt.getDayName() + ', ' + dt.getDate() + ' ' + dt.getMonthName() + ', week ' + dt.getWeek() + ', ' + dt.getFullYear();

if(Alarm_0==curTime){if(document.clock.dy0[dynr].checked==true){if(document.clock.alarm 0OnOff.checked==true)alarm0On();}}

if(Alarm_1==curTime){if(document.clock.dy1[dynr].checked==true){if(document.clock.alarm 1OnOff.checked==true)alarm1On();}}

if(Alarm_2==curTime){if(document.clock.dy2[dynr].checked==true){if(document.clock.alarm 2OnOff.checked==true)alarm2On();}}

if(Alarm_3==curTime){if(document.clock.dy3[dynr].checked==true){if(document.clock.alarm 3OnOff.checked==true)alarm3On();}}

if(Alarm_4==curTime){if(document.clock.dy4[dynr].checked==true){if(document.clock.alarm 4OnOff.checked==true)alarm4On();}}

if(Alarm_5==curTime){if(document.clock.dy5[dynr].checked==true){if(document.clock.alarm 5OnOff.checked==true)alarm5On();}}

if(Alarm_6==curTime){if(document.clock.dy6[dynr].checked==true){if(document.clock.alarm 6OnOff.checked==true)alarm6On();}}

if(Alarm_7==curTime){if(document.clock.dy7[dynr].checked==true){if(document.clock.alarm 7OnOff.checked==true)alarm7On();}}

if(Alarm_8==curTime){if(document.clock.dy8[dynr].checked==true){if(document.clock.alarm 8OnOff.checked==true)alarm8On();}}

if(Alarm_9==curTime){if(document.clock.dy9[dynr].checked==true){if(document.clock.alarm 9OnOff.checked==true)alarm9On();}}

if(Alarm_10==curTime){if(document.clock.dy10[dynr].checked==true){if(document.clock.alar m10OnOff.checked==true)alarm10On();}}

if(Alarm_11==curTime){if(document.clock.dy11[dynr].checked==true){if(document.clock.alar m11OnOff.checked==true)alarm11On();}}

if(Alarm_12==curTime){if(document.clock.dy12[dynr].checked==true){if(document.clock.alar m12OnOff.checked==true)alarm12On();}}

if(Alarm_13==curTime){if(document.clock.dy13[dynr].checked==true){if(document.clock.alar m13OnOff.checked==true)alarm13On();}}

(45)

if(Alarm_14==curTime){if(document.clock.dy14[dynr].checked==true){if(document.clock.alar m14OnOff.checked==true)alarm14On();}}

if(Alarm_15==curTime){if(document.clock.dy15[dynr].checked==true){if(document.clock.alar m15OnOff.checked==true)alarm15On();}}

var dt=new Date();

var timenu = HMStoSec1(IfZero(dt.getHours()) + ":" + IfZero(dt.getMinutes())+ ":" + IfZero(dt.getSeconds()));

var nextday=0;

if (document.clock.alarm0OnOff.checked==true &&

document.clock.dy0[dynr].checked==true){

var time0 = HMStoSec1(Alarm_0);

if (time0<=timenu){time0=time0+86400;

nextday=1;

}

var diff = time0 - timenu;

document.clock.nxtlrm0.value=(convertSecondsToHHMMSS(diff));

if (nextday==1 && document.clock.dy0[nextdaynr].checked==false){

document.clock.nxtlrm0.value="--:--:--";

}

}else{document.clock.nxtlrm0.value="--:--:--";}

var nextday=0;

if (document.clock.alarm1OnOff.checked==true &&

document.clock.dy1[dynr].checked==true){

(46)

var time1 = HMStoSec1(Alarm_1);

if (time1<=timenu){time1=time1+86400;

nextday=1;

}

var diff = time1 - timenu;

document.clock.nxtlrm1.value=(convertSecondsToHHMMSS(diff));

if (nextday==1 && document.clock.dy1[nextdaynr].checked==false){

document.clock.nxtlrm1.value="--:--:--";

}

}else{document.clock.nxtlrm1.value="--:--:--";}

var nextday=0;

if (document.clock.alarm2OnOff.checked==true &&

document.clock.dy2[dynr].checked==true){

var time2 = HMStoSec1(Alarm_2);

if (time2<=timenu){time2=time2+86400;

nextday=1;

}

var diff = time2 - timenu;

document.clock.nxtlrm2.value=(convertSecondsToHHMMSS(diff));

if (nextday==1 && document.clock.dy2[nextdaynr].checked==false){

document.clock.nxtlrm2.value="--:--:--";

}

(47)

}else{document.clock.nxtlrm2.value="--:--:--";}

var nextday=0;

if (document.clock.alarm3OnOff.checked==true &&

document.clock.dy3[dynr].checked==true){

var time3 = HMStoSec1(Alarm_3);

if (time3<=timenu){time3=time3+86400;

nextday=1;

}

var diff = time3 - timenu;

document.clock.nxtlrm3.value=(convertSecondsToHHMMSS(diff));

if (nextday==1 && document.clock.dy3[nextdaynr].checked==false){

document.clock.nxtlrm3.value="--:--:--";

}

}else{document.clock.nxtlrm3.value="--:--:--";}

var nextday=0;

if (document.clock.alarm4OnOff.checked==true &&

document.clock.dy4[dynr].checked==true){

var time4 = HMStoSec1(Alarm_4);

if (time4<=timenu){time4=time4+86400;

nextday=1;

}

var diff = time4 - timenu;

document.clock.nxtlrm4.value=(convertSecondsToHHMMSS(diff));

(48)

if (nextday==1 && document.clock.dy4[nextdaynr].checked==false){

document.clock.nxtlrm4.value="--:--:--";

}

}else{document.clock.nxtlrm4.value="--:--:--";}

var nextday=0;

if (document.clock.alarm5OnOff.checked==true &&

document.clock.dy5[dynr].checked==true){

var time5 = HMStoSec1(Alarm_5);

if (time5<=timenu){time5=time5+86400;

nextday=1;

}

var diff = time5 - timenu;

document.clock.nxtlrm5.value=(convertSecondsToHHMMSS(diff));

if (nextday==1 && document.clock.dy5[nextdaynr].checked==false){

document.clock.nxtlrm5.value="--:--:--";

}

}else{document.clock.nxtlrm5.value="--:--:--";}

var nextday=0;

if (document.clock.alarm6OnOff.checked==true &&

document.clock.dy6[dynr].checked==true){

var time6 = HMStoSec1(Alarm_6);

if (time6<=timenu){time6=time6+86400;

nextday=1;

(49)

}

var diff = time6 - timenu;

document.clock.nxtlrm6.value=(convertSecondsToHHMMSS(diff));

if (nextday==1 && document.clock.dy6[nextdaynr].checked==false){

document.clock.nxtlrm6.value="--:--:--";

}

}else{document.clock.nxtlrm6.value="--:--:--";}

var nextday=0;

if (document.clock.alarm7OnOff.checked==true &&

document.clock.dy7[dynr].checked==true){

var time7 = HMStoSec1(Alarm_7);

if (time7<=timenu){time7=time7+86400;

nextday=1;

}

var diff = time7 - timenu;

document.clock.nxtlrm7.value=(convertSecondsToHHMMSS(diff));

if (nextday==1 && document.clock.dy7[nextdaynr].checked==false){

document.clock.nxtlrm7.value="--:--:--";

}

}else{document.clock.nxtlrm7.value="--:--:--";}

var nextday=0;

if (document.clock.alarm8OnOff.checked==true &&

document.clock.dy8[dynr].checked==true){

(50)

var time8 = HMStoSec1(Alarm_8);

if (time8<=timenu){time8=time8+86400;

nextday=1;

}

var diff = time8 - timenu;

document.clock.nxtlrm8.value=(convertSecondsToHHMMSS(diff));

if (nextday==1 && document.clock.dy8[nextdaynr].checked==false){

document.clock.nxtlrm8.value="--:--:--";

}

}else{document.clock.nxtlrm8.value="--:--:--";}

var nextday=0;

if (document.clock.alarm9OnOff.checked==true &&

document.clock.dy9[dynr].checked==true){

var time9 = HMStoSec1(Alarm_9);

if (time9<=timenu){time9=time9+86400;

nextday=1;

}

var diff = time9 - timenu;

document.clock.nxtlrm9.value=(convertSecondsToHHMMSS(diff));

if (nextday==1 && document.clock.dy9[nextdaynr].checked==false){

document.clock.nxtlrm9.value="--:--:--";

}

(51)

}else{document.clock.nxtlrm9.value="--:--:--";}

var nextday=0;

if (document.clock.alarm10OnOff.checked==true &&

document.clock.dy10[dynr].checked==true){

var time10 = HMStoSec1(Alarm_10);

if (time10<=timenu){time10=time10+86400;

nextday=1;

}

var diff = time10 - timenu;

document.clock.nxtlrm10.value=(convertSecondsToHHMMSS(diff));

if (nextday==1 && document.clock.dy10[nextdaynr].checked==false){

document.clock.nxtlrm10.value="--:--:--";

}

}else{document.clock.nxtlrm10.value="--:--:--";}

var nextday=0;

if (document.clock.alarm11OnOff.checked==true &&

document.clock.dy11[dynr].checked==true){

var time11 = HMStoSec1(Alarm_11);

if (time11<=timenu){time11=time11+86400;

nextday=1;

}

var diff = time11 - timenu;

document.clock.nxtlrm11.value=(convertSecondsToHHMMSS(diff));

(52)

if (nextday==1 && document.clock.dy11[nextdaynr].checked==false){

document.clock.nxtlrm11.value="--:--:--";

}

}else{document.clock.nxtlrm11.value="--:--:--";}

var nextday=0;

if (document.clock.alarm12OnOff.checked==true &&

document.clock.dy12[dynr].checked==true){

var time12 = HMStoSec1(Alarm_12);

if (time12<=timenu){time12=time12+86400;

nextday=1;

}

var diff = time12 - timenu;

document.clock.nxtlrm12.value=(convertSecondsToHHMMSS(diff));

if (nextday==1 && document.clock.dy12[nextdaynr].checked==false){

document.clock.nxtlrm12.value="--:--:--";

}

}else{document.clock.nxtlrm12.value="--:--:--";}

var nextday=0;

if (document.clock.alarm13OnOff.checked==true &&

document.clock.dy13[dynr].checked==true){

var time13 = HMStoSec1(Alarm_13);

if (time13<=timenu){time13=time13+86400;

nextday=1;

(53)

}

var diff = time13 - timenu;

document.clock.nxtlrm13.value=(convertSecondsToHHMMSS(diff));

if (nextday==1 && document.clock.dy13[nextdaynr].checked==false){

document.clock.nxtlrm13.value="--:--:--";

}

}else{document.clock.nxtlrm13.value="--:--:--";}

var nextday=0;

if (document.clock.alarm14OnOff.checked==true &&

document.clock.dy14[dynr].checked==true){

var time14 = HMStoSec1(Alarm_14);

if (time14<=timenu){time14=time14+86400;

nextday=1;

}

var diff = time14 - timenu;

document.clock.nxtlrm14.value=(convertSecondsToHHMMSS(diff));

if (nextday==1 && document.clock.dy14[nextdaynr].checked==false){

document.clock.nxtlrm14.value="--:--:--";

}

}else{document.clock.nxtlrm14.value="--:--:--";}

var nextday=0;

if (document.clock.alarm15OnOff.checked==true &&

document.clock.dy15[dynr].checked==true){

(54)

var time15 = HMStoSec1(Alarm_15);

if (time15<=timenu){time15=time15+86400;

nextday=1;

}

var diff = time15 - timenu;

document.clock.nxtlrm15.value=(convertSecondsToHHMMSS(diff));

if (nextday==1 && document.clock.dy15[nextdaynr].checked==false){

document.clock.nxtlrm15.value="--:--:--";

}

}else{document.clock.nxtlrm15.value="--:--:--";}

var alarms =

[document.clock.nxtlrm0.value,document.clock.nxtlrm1.value,document.clock.nxtlrm2.valu e,document.clock.nxtlrm3.value,document.clock.nxtlrm4.value,document.clock.nxtlrm5.valu e,document.clock.nxtlrm6.value,document.clock.nxtlrm7.value,document.clock.nxtlrm8.valu e,document.clock.nxtlrm9.value,document.clock.nxtlrm10.value,document.clock.nxtlrm11.v alue,document.clock.nxtlrm12.value,document.clock.nxtlrm13.value,document.clock.nxtlrm 14.value,document.clock.nxtlrm15.value,];

var strv=(alarms.sort());

var strv2="";

j=0;for(i=0;i<=15;i++){

if(alarms[i]!="--:--:--"){

strv2=strv2+(alarms[i]+" ");

j++;if(j>=10){break;}}}

document.clock.alarmlist.value=strv2;

var tst="";

(55)

for(i=lastalarmarray.length-1;i>=1;i--){

tst=tst+lastalarmarray[i]+" ";

}

if(lastalarmarray.length>=12)lastalarmarray.shift();

document.clock.lastalarmbutton.value=tst;

hr= dt.getHours()+100;

mn= dt.getMinutes()+100;

se= dt.getSeconds()+100;

tot=''+hr+mn+se;

document.clock.hr1.src='b'+tot.substring(1,2)+'.gif';

document.clock.hr2.src='b'+tot.substring(2,3)+'.gif';

document.clock.mn1.src='b'+tot.substring(4,5)+'.gif';

document.clock.mn2.src='b'+tot.substring(5,6)+'.gif';

document.clock.se1.src='b'+tot.substring(7,8)+'.gif';

document.clock.se2.src='b'+tot.substring(8,9)+'.gif';

document.clock.dgc1.src="bnocolon.gif";

document.clock.dgc2.src="bnocolon.gif";

setTimeout("blink()",500);

}

function blink(){

(56)

document.clock.dgc1.src="bcolon.gif";

document.clock.dgc2.src="bcolon.gif";

}

function IfZero(num){

return ((num <= 9) ? ("0" + num) : num);

}

var secondsPerMinute = 60;

var minutesPerHour = 60;

function convertSecondsToHHMMSS(intSecondsToConvert) { var hours = convertHours(intSecondsToConvert);

var minutes = getRemainingMinutes(intSecondsToConvert);

minutes = (minutes == 60) ? "00" : minutes;

var seconds = getRemainingSeconds(intSecondsToConvert);

seconds = (seconds == 60) ? "00" : seconds;

return IfZero(hours)+":"+IfZero(minutes)+":"+IfZero(seconds);

}

function convertHours(intSeconds) { var minutes = convertMinutes(intSeconds);

var hours = Math.floor(minutes/minutesPerHour);

(57)

return hours;

}

function convertMinutes(intSeconds) {

return Math.floor(intSeconds/secondsPerMinute);

}

function getRemainingSeconds(intTotalSeconds) { return (intTotalSeconds%secondsPerMinute);

}

function getRemainingMinutes(intSeconds) { var intTotalMinutes = convertMinutes(intSeconds);

return (intTotalMinutes%minutesPerHour);

}

function HMStoSec1(T) { // h:m:s

var A = T.split(/\D+/) ; return (A[0]*60 + +A[1])*60 + +A[2]

}

(58)

<!---->

function alarm0Set(){

h0Num=document.clock.h0Opt[document.clock.h0Opt.selectedIndex].value;

min0Num=document.clock.min0Opt[document.clock.min0Opt.selectedIndex].value;

sec0Num=document.clock.sec0Opt[document.clock.sec0Opt.selectedIndex].value;

Alarm_0=h0Num + ":" + min0Num+ ":" + sec0Num;

//document.clock.alarm0OnOff.checked=true;

}

function alarm0On(){

lastalarmarray.push(Alarm_0);

if(document.clock.alarm0S.value==""){

window.open

(document.clock.S0.value,"window","menubar=1,resizable=1,top=1,left=1,width=200,height

=100");

}else{

(59)

window.open

(document.clock.alarm0S.value,"window","menubar=1,resizable=1,top=1,left=1,width=200, height=100");

}

}

function alarm0Off(){nop();}

Referências

Documentos relacionados