• Nenhum resultado encontrado

[PENDING] Έλεγχος τεντών κατοικίας με τη χρήση Arduino μέσω GSM με εφαρμογή Android σε κινητό τηλέφωνο.

N/A
N/A
Protected

Academic year: 2024

Share "Έλεγχος τεντών κατοικίας με τη χρήση Arduino μέσω GSM με εφαρμογή Android σε κινητό τηλέφωνο."

Copied!
68
0
0

Texto

(1)
(2)

Περιεόμενα

1 Θέμα 1

1.1 Γενική Περιραφή Θέματος . . . 1

2 Υικά 1 2.1 Εξαρτήματα και Τενοοίες . . . 1

2.2 Συνδεσμοοία . . . 2

3 Arduino 5 3.1 Μικροεεκτής - η καρδιά του Arduino . . . 8

3.2 Είσοδοι - Έξοδοι . . . 8

3.3 Τροφοδοσία . . . 10

3.4 Ενσματμένα κουμπιά και LED . . . 11

3.5 Arduino IDE και σύνδεση με τον υποοιστή . . . 11

3.6 Γώσσα προραμματισμού . . . 12

3.7 Shields . . . 13

4 Λειτουρία Μικροεπεξεραστή 15 4.1 Αόριμος Λήψης Απόφασης . . . 15

4.2 Χειροκίνητη Λειτουρία . . . 16

5 Κώδικας Arduino 18 5.1 Αποστοή μηνύματος . . . 18

5.2 Ενεροποιήση GPRS και άντηση μετεροοικών μετρήσεν . . . 18

5.3 Έεος ια εισερόμενα SMS . . . 21

6 Εφαρμοή Android 22 6.1 Γενική Λειτουρία . . . 22

6.2 Επεξήηση ασικότερν τμημάτν του κώδικα . . . 23

6.2.1 Αρικοποιήση εφαρμοής . . . 23

6.2.2 Αποστοή μηνύματος . . . 24

6.2.3 Λήψη και εμφάνιση μετρήσεν . . . 24

7 Hardware 26 7.1 Έεος του DC κινητήρα . . . 26

7.1.1 Μικροεεκτής . . . 26

7.1.2 Οοκηρμένο κύκμα ια την οδήηση του κινητήρα . . . 26

7.1.3 Δίοδοι . . . 27

7.1.4 Κινητήρας . . . 27

7.2 Στήνοντας το σύστημα εέου του κινητήρα . . . 27

8 Μακέτα 30

9 Όος ο κώδικας του Arduino 35

(3)

10 Όος ο κώδικας του Android 42

10.1 Application . . . 42

10.2 MainActivity . . . 43

10.3 Broadcast Receivers . . . 44

10.4 PreferenceAcitivity and other Java classes . . . 46

11 Arduino Manual 53 11.1 Overview . . . 53

11.2 Power . . . 53

11.3 Memory . . . 54

11.4 EEPROM Library . . . 54

11.5 Input and Output . . . 54

11.6 Communication . . . 56

11.7 Programming . . . 57

11.8 Automatic (Software) Reset . . . 57

11.9 USB Overcurrent Protection . . . 58

11.10Physical Characteristics . . . 58

12 HTTP Requests 59 12.1 What’s an HTTP request . . . 59

12.2 Analysis . . . 59

12.3 Summary . . . 59

13 Οδηίες Χρήσης - Εκατάστασης 61

14 Οδηίες Εκατάστασης εφαρμοής σε κινητό Android 62

15 Συμπεράσματα - Μεοντική ρήση 63

(4)

Περίηψη

Στο παίσιο αυτής της πτυιακής ερασίας δημιουρήηκε ένα σύστημα εέου κι- νητήρα τέντας καώς και μία μακέτα ια την προσομοίση αυτής. Το σύστημα εέ-

ου αποτεείται από επεξεραστή Arduino Uno, Arduino GSM module, ερμίστορ και φτοαντίσταση. Στόος του είναι να παίρνει αν τακτά ρονικά διαστήματα μετρήσεις

ερμοκρασίας και φτεινότητας ια την κοντινή περιοή της τέντας καώς και άες μετεροοικές προέψεις ια την ευρύτερη περιοή μέσ server και άσει αυτών να

αμάνει αποφάσεις ια την έση της τέντας. Το σύστημα ενημερώνει τον κάτοο της τέντας ια τις καιρικές συνήκες μέσ android εφαρμοής και του δίνει τη δυνατότητα να ορίσει την κατάσταση της τέντας.

Summary

As a part of the current thesis, a motor control system of an awning was developed, as well as a model in order to simulate the system. The control system is consisted of an AVR microprocessor on an Arduino Uno board, an Arduino GSM module, a thermistor and a photoresistor. The goal of this system is to measure, at regular intervals, the temperature and the luminosity near the awning and, also, receive the weather forecast for the surrounding area via a server in order to make decisions about the position of the awning. This system can also inform the holder of the awning about the weather conditions through an android application and also gives him the ability to set the desired awning’s position.

(5)

1 Θέμα

Έεος τεντών κατοικίας με ρήση Arduino μέσ GSM με εφαρμοή Android σε κινητό τηέφνο.

1.1 Γενική Περιραφή Θέματος

Σε μια εποή που η τενοοία έει μπει ια τα καά στην ζή μας, εμφανίζονται οο- ένα και περισσότερες ανάκες οι οποίες διευκούνουν και ανεάζουν το ιτικό επίπεδο του ανρώπου. Η έννοια του ”έξυπνου σπιτιού” είναι μια από αυτές τις τενοοίες που προσπαεί να εξοικονομήσει ενέρεια, ρήματα και ενικά να διευκούνει το νοικοκυριό.

Στα παίσια του έξυπνου σπιτιού η ερασία αυτή παρουσιάζει μια ύση ια τον έεο τέντας από απόσταση, με την ρήση GSM/GPRS τενοοίας, Arduino και smartphone με οισμικό Android.

Μια ενική εικόνα του συστήματος είναι η ειτουρία του Arduino ς το κεντρικό σύστημα εέου. Δηαδή, το Arduino αμάνει τις κιματοοικές συνήκες που επι- κρατούν στην περιοή και αναός αποφασίζει εάν η τέντα πρέπει να παραμείνει ανοι- κτή ή κειστή. Το Arduino απο μόνο του δεν διαέτει την τενοοία GSM/GPRS και

ι’αυτό συνδέεται πάν του ένα modem κινητής τηεφνίας το οποίο αποκαείται και GSM shield. Τώρα που ο κεντρικός εεκτής έει την δυνατότητα να επικοιννεί με το δίκτυο κινητής τηεφνίας και άρα και με το Internet αμάνει τις πηροφορίες ια τις κιματοοικές συνήκες από εκεί. Ωστόσο, στο Arduino προστέηκαν και δύο αιση- τήρες ερμοκρασίας και φτεινότητας ια μια καύτερη εκτίμηση τν καιρικών συνηκών που επικρατούν τοπικά. Η εφαρμοή ια κινητό Android παρέει στον ρήστη της την δυνατότητα παρακοούησης της έσης της τέντας και τν καιρικών συνηκών με άση τα οποία πήρε ο εεκτής την απόφαση. Επίσης του δίνει την ευκαιρία να ανεάσει/κατεά- σει την τέντα παρακάμπτντας το σύστημα εέου. Το Arduino εέει έναν οδηητή κινητήρα ια το άνοιμα/κείσιμο της τέντας.

2 Υικά

Αν και παραπάν αναφέρονται αρκετά από τα υικά και τις τενοοίες που ρησιμο- ποιήηκαν, παρακάτ ακοουεί μια αναυτική περιραφή του κάε υικού.

2.1 Εξαρτήματα και Τενοοίες

Arduino Είναι μια οικοένεια πακετών ανάπτυξης με επεξεραστή Atmel AVR. Στη ερασία αυτή ρησιμοποιήηκε το Arduino Uno με επεξεραστή ATmega328, 32kB flash memory, 2kB RAM, 1kB EEPROM. To Arduino διαέτει ένα περιάον ανάπτυξης οισμικού και η προραμματιστική ώσσα που ρησιμοποιείται είναι ένας συνδιασμός C/C++.

GSM Shield Για την οικοένεια πακετών ανάπτυξης Arduino έουν δημιουρηεί ποά περιφερειακά σε μορφή έτοιμης πακέτας και τα ονομάζουνε shield. Αυτά, προσφέ-

(6)

ρουν διάφορες ειτουρικότητες και σε αυτή την περίπτση σύνδεση με το δίκτυο κινητής τηεφνίας. Το GSM shield προσφέρει σύνδεση σε GSM/GPRS δίκτυο και στην ερασία αυτή ρησιμοποιείται ια να συνδέεται στο Internet και ια να

αμάνει/στένει SMS από/πρός την εφαρμοή Android.

Motor Στην αηινό σενάριο α έπρεπε να είναι ένας κινητήρας διαστασιοοημένος στο να μπορεί να κινήσει την τέντα. Ωστόσο, σε επίπεδο προσομοίσης ρησιμοποιήηκε ένα μικρό DC κινητηράκι με ονομαστική τάση 5V και ονομαστικό ρεύμα κανονικής

ειτουρίας 0.4Α.

L293d Είναι ένα τσιπάκι της εταιρίας Texas Instruments και ειτουρεί σαν οδηητής

ια DC κινητήρες με αρακτηριστικά όμοια με αυτά που περιράφονται παραπάν.

Το τσιπάκι δίνει την δυνατότητα εέου της φοράς περιστροφής του κινητήρα.

Δίοδος Χρησιμοποιούνται σε συνδεσμοοία έφυρας ια τον έεο του κινητήρα.

Αισητήρας Φτεινότητας Είναι μια απή αά φτοευαίσητη αντίσταση. Η τιμή της αάζει όταν εκτεεί στο φς.

Αισητήρας ερμοκρασίας Είναι ένα ραμμικό αισητήριο ερμοκρασίας που ρησιμο- ποιείται ια την μέτρηση περιαοντικών ερμοκρασιών.

Smartphone Android Έξυπνο κινητό τηέφνο με οισμικό Android. To Android είναι ένα οισμικό τύπου ανοικτού κώδικα και παρέει δρεάν περιάον ανά- πτυξης οισμικού καώς και η ώσσα προραμματισμού είναι η Java με κάποιες

ιιοήκες που απευύνονται στο Android.

Raster Μια πακέτα ανάπτυξης ηεκτρικών/ηεκτρονικών κυκμάτν. Δίνει την δυ- νατότητα στο ηεκτροόο μηανικό να πειραματιστεί και να τεστάρει το σύστημα του.

Μακέτα Με σκοπό τον έεο της εύρυμης ειτουρίας του συστήματος σεδιάστηκε μια μακέτα σε μικρή κίμακα και προσομοιώνει την κανονική ειτουρία του συ- στήματος εέου της τέντας.

2.2 Συνδεσμοοία

Στο σήμα 2 φαίνεται το οικό διάραμμα του συστήματος. Η ραμμή που ενώνει δύο

οικά μποκ δείνει την δίοδο επικοιννίας μεταξύ τν δύο μποκ.

Στο σήμα 3 φαίνεται η πραματική συνδεσμοοία πάν στο Raster.

(7)

Σήμα 1: Arduino με GSM Shield

Σήμα 2: Λοικό μποκ

(8)

Σήμα 3: Συνδεσμοοία σε Raster (ρίς τον Arduino)

(αʹ) Δίοδος (ʹ) Φτορεσίστορ (μέτρηση φ- τεινότητας)

(ʹ) Συσκευή Android

Σήμα 4: Εξαρτήματα

(9)

Σήμα 5: Arduino

3 Arduino

Όπς το περιράφει ο δημιουρός του, το Arduino είναι μια ανοικτού κώδικα πατ- φόρμα πρτοτυποποίησης ηεκτρονικών ασισμένη σε ευέικτο και εύκοο στη ρήση hardware και software που προορίζεται ια οποιονδήποτε έει ίη προραμματιστική εμπειρία, στοιειώδεις νώσεις ηεκτρονικών και ενδιαφέρεται να δημιουρήσει διαδρα- στικά αντικείμενα ή περιάοντα.

Το Arduino Duemilanove, όπς προδίδει και το όνομά του (που στα ιταικά είναι ο αριμός 2009 οοράφς), είναι η πιο πρόσφατη ασική έκδοση του Arduino.Στην ουσία, πρόκειται ια ένα ηεκτρονικό κύκμα που ασίζεται στον μικροεεκτή ATmega της Atmel και του οποίου όα τα σέδια, καώς και το software που ρειάζεται ια την

ειτουρία του, διανέμονται εεύερα και δρεάν ώστε να μπορεί να κατασκευαστεί από τον καένα (απ’ όπου και ο περίερος -ια hardware- αρακτηρισμός ανοικτού κώδικα).

Αφού κατασκευαστεί, μπορεί να συμπεριφερεί σαν ένας μικροσκοπικός υποοιστής, αφού ο ρήστης μπορεί να συνδέσει επάν του ποαπές μονάδες εισόδου/εξόδου και να προραμματίσει τον μικροεεκτή να δέεται δεδομένα από τις μονάδες εισόδου, να τα επεξεράζεται και να στένει κατάηες εντοές στις μονάδες εξόδου. Μάιστα κάποιος α μπορούσε να ισυριστεί - και α ήταν ένας αρκετά πετυημένος παραηισμός - ότι ειτουρικά το Arduino μοιάζει πού με το NXT Brick τν Lego Mindstorms NXT. Άστε η ρομποτική είναι μια από τις ποές εφαρμοές στις οποίες το Arduino διαπρέπει.

(10)

Το Arduino έαια, δεν είναι ούτε ο μοναδικός, ούτε και ο καύτερος δυνατός τρόπος

ια την δημιουρία μιας οποιασδήποτε διαδραστικής ηεκτρονικής συσκευής. Όμς το κύριο πεονέκτημά του είναι η τεράστια κοινότητα που το υποστηρίζει και η οποία έει δημιουρήσει, συντηρεί και επεκτείνει μια ανάοου μεέους online νσιακή άση.

Έτσι, παρότι ένας έμπειρος ηεκτρονικός μπορεί να προτιμήσει διαφορετική πατφόρμα ή εξαρτήματα ανάοα με την εφαρμοή που έει στον νου του, το Arduino, με το εκτενές documentation, καταφέρνει να κερδίσει όους αυτούς τν οποίν οι νώσεις στα ηεκτρονικά περιορίζονται στα όσα ία έμααν στο σοείο.

Η αορά ενός πήρους Starter Kit, όπς αυτό της εικόνας, συνιστάται έντονα -αντί μιας σκέτης πακέτας Arduino- αν αυτή είναι η πρώτη σας επαφή με ηεκτρονικά.Ακριώς επειδή απευύνεται κυρίς σε αράριους τν ηεκτρονικών και επειδή, παρά τις αναυτι- κότατες οδηίες που υπάρουν, δεν έουν όοι τις νώσεις και τα μέσα να κατασκευάσουν μια ηεκτρονική πακέτα, κυκοφορούν έτοιμες, προκατασκευασμένες πακέτες Arduino που μπορείτε να προμηευτείτε ια περίπου €25. Με ία ρήματα παραπάν μάιστα, οι περισσότεροι προμηευτές διαέτουν Arduino Starter Kit, τα οποία, εκτός από το ίδιο το Arduino, περιέουν διάφορα άα εξαρτήματα και εραεία που μπορεί να ρειαστείτε

ια τις πρώτες σας εφαρμοές (όπς το απαραίτητο καώδιο USB ια την σύνδεση με τον υποοιστή, ράστερ, καώδια, LED, διακόπτες, ποτενσιόμετρα, αντιστάσεις, διόδους, τρανζίστορ κ.π.).

Μπορείτε να ρείτε μια ίστα με προμηευτές του Arduino σε όο τον κόσμο, κάνοντας κικ στον σύνδεσμο Buy στον επίσημο ιστοτόπο του Arduino. Στην ίστα δεν υπάρ-

ει έηνας προμηευτής αά ποά καταστήματα του εξτερικού στένουν και στην Εάδα με αρκετά οικά μεταφορικά κόστη. Αν πάι έετε οπσδήποτε να το προμη-

ευτείτε από την Εάδα, το εηνικό ηεκτρονικό κατάστημα BuyARobot διαέτει το Arduino αά δεν διαέτει Starter Kit ή συνοδευτικά shield (α διαάσετε ια αυτά σε σετικό παίσιο στην συνέεια).

Το LilyPad είναι μια από τις ποές εκδόσεις Arduino που κυκοφορούν. Όσο τρεό και αν ακούεται, προορίζεται ια διαδραστικές εφαρμοές πάν στα ρούα σας! Ράεται πάν σε αυτά, επικοιννεί μέσ ειδικής αώιμης κστής με ανάοους αισητήρες που είναι ραμμένοι σε διαφορετικά σημεία και είναι ασφαές ακόμα και… στο πύσιμο!Αυτό που μπορεί να σας μπερδέψει ψάνοντας να αοράσετε το Arduino σε αυτά τα καταστή- ματα είναι οι διαφορετικές εκδόσεις στις οποίες κυκοφορεί, επίσημες και ανεπίσημες.

Από τις επίσημες εκδόσεις (Duemilanove, Diecimila, Nano, Mega, Bluetooth, LilyPad, Mini, Mini USB, Pro, Pro Mini, Serial και Serial SS) συνιστάται κυρίς η αορά του Arduino Duemilanove ή τουάιστον τν Diecimila ή Mega επειδή διαέτουν υποδοή USB και είναι συματές με τα shield. Για τους ίδιους όους, από τις ανεπίσημες εκδό- σεις (Freeduino, Boarduino, Sanguino, Seeeduino, BBB, RBBB κ.α.) συνιστάται μόνο το Freeduino v1.16 και το Seeeduino. Δείτε το σετικό παίσιο με τις κυριότερες διαφο- ρές ανάμεσα στις εκδόσεις που προτείνονται εδώ.

Εκτός και αν επισημανεί διαφορετικά, όσα α αναφερούν παρακάτ αφορούν την πέον πρόσφατη ασική έκδοση του Arduino, δηαδή το Arduino Duemilanove.

(11)

Σήμα 6: Βασικά υικά ια τη ειτουρία ενός Arduino

Σήμα 7: Είσοδοι & Έξοδοι Arduino

(12)

3.1 Μικροεεκτής - η καρδιά του Arduino

Το Arduino ασίζεται στον ATmega328, έναν 8-bit RISC μικροεεκτή, τον οποίο

ρονίζει στα 16MHz. Ο ATmega328 διαέτει ενσματμένη μνήμη τριών τύπν:

• 2Kb μνήμης SRAM που είναι η φέιμη μνήμη που μπορούν να ρησιμοποιήσουν τα προράμματά σας ια να αποηκεύουν μεταητές, πίνακες κ.π. κατά το runtime.

Όπς και σε έναν υποοιστή, αυτή η μνήμη άνει τα δεδομένα της όταν η παροή ρεύματος στο Arduino σταματήσει ή αν ίνει reset.

• 1Kb μνήμης EEPROM η οποία μπορεί να ρησιμοποιηεί ια μή εραφή/α- νάνση δεδομένν (ρίς datatype) ανά byte από τα προράμματά σας κατά το runtime. Σε αντίεση με την SRAM, η EEPROM δεν άνει τα περιεόμενά της με απώεια τροφοδοσίας ή reset οπότε είναι το ανάοο του σκηρού δίσκου.

• 32Kb μνήμης Flash, από τα οποία τα 2Kb ρησιμοποιούνται από το firmware του Arduino που έει εκαταστήσει ήδη ο κατασκευαστής του. Το firmware αυτό που στην οροοία του Arduino ονομάζεται bootloader είναι ανακαίο ια την εκα- τάσταση τν δικών σας προραμμάτν στον μικροεεκτή μέσ της ύρας USB,

ρίς δηαδή να ρειάζεται εξτερικός hardware programmer. Τα υπόοιπα 30Kb της μνήμης Flash ρησιμοποιούνται ια την αποήκευση αυτών ακριώς τν προ-

ραμμάτν, αφού πρώτα μεταττιστούν στον υποοιστή σας. Η μνήμη Flash, όπς και η EEPROM δεν άνει τα περιεόμενά της με απώεια τροφοδοσίας ή reset. Επίσης, ενώ η μνήμη Flash υπό κανονικές συνήκες δεν προορίζεται ια

ρήση runtime μέσα από τα προράμματά σας, ό της μικρής συνοικής μνή- μης που είναι διαέσιμη σε αυτά (2Kb SRAM + 1Kb EEPROM), έει σεδιαστεί μια ιιοήκη που επιτρέπει την ρήση όσου ώρου περισσεύει (30Kb μείον το μέεος του προράμματός σας σε μεταττισμένη μορφή).

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

Καταρήν το Arduino διαέτει σειριακό interface. Ο μικροεεκτής ATmega υποστη- ρίζει σειριακή επικοιννία, την οποία το Arduino προεί μέσα από έναν εεκτή Serial- over-USB ώστε να συνδέεται με τον υποοιστή μέσ USB. Η σύνδεση αυτή ρησιμο- ποιείται ια την μεταφορά τν προραμμάτν που σεδιάζονται από τον υποοιστή στο Arduino αά και ια αμφίδρομη επικοιννία του Arduino με τον υποοιστή μέσα από το πρόραμμα την ώρα που εκτεείται. Η ανατομία ενός Arduino Duemilanove.Επιπέον, στην πάν πευρά του Arduino ρίσκονται 14 ηυκά pin, αριμημένα από 0 ς 13, που μπορούν να ειτουρήσουν ς ψηφιακές είσοδοι και έξοδοι. Λειτουρούν στα 5V και καένα μπορεί να παρέει ή να δετεί το πού 40mA. Ως ψηφιακή έξοδος, ένα από αυτά τα pin μπορεί να τεεί από το πρόραμμά σας σε κατάσταση HIGH ή LOW, οπότε το Arduino α ξέρει αν πρέπει να διοετεύσει ή όι ρεύμα στο συκεκριμένο pin. Με αυτόν τον τρόπο μπορείτε όου άρη να ανάψετε και να σήσετε ένα LED που έετε συνδέσει στο συκεκριμένο pin. Αν πάι ρυμίσετε ένα από αυτά τα pin ς ψηφιακή είσοδο μέσα από το πρόραμμά σας, μπορείτε με την κατάηη εντοή να διαάσετε την κατάστασή

(13)

του (HIGH ή LOW) ανάοα με το αν η εξτερική συσκευή που έετε συνδέσει σε αυτό το pin διοετεύει ή όι ρεύμα στο pin (με αυτόν τον τρόπο όου άρη μπορείτε να διαάζετε την κατάσταση ενός διακόπτη). Μερικά από αυτά τα 14 pin, εκτός από ψηφιακές είσοδοι/έξοδοι έουν και δεύτερη ειτουρία. Συκεκριμένα:

• Τα pin 0 και 1 ειτουρούν ς RX και TX της σειριακής όταν το πρόραμμά σας ενεροποιεί την σειριακή ύρα. Έτσι, όταν όου άρη το πρόραμμά σας στένει δεδομένα στην σειριακή, αυτά προούνται και στην ύρα USB μέσ του εεκτή Serial-Over-USB αά και στο pin 0 ια να τα διαάσει ενδεομένς μια άη συσκευή (π.. ένα δεύτερο Arduino στο δικό του pin 1). Αυτό φυσικά σημαίνει ότι αν στο πρόραμμά σας ενεροποιήσετε το σειριακό interface, άνετε 2 ψηφιακές εισόδους/εξόδους.

• Τα pin 2 και 3 ειτουρούν και ς εξτερικά interrupt (interrupt 0 και 1 αντί- στοια). Με άα όια, μπορείτε να τα ρυμίσετε μέσα από το πρόραμμά σας ώστε να ειτουρούν αποκειστικά ς ψηφιακές είσοδοι στις οποίες όταν συμαί- νουν συκεκριμένες ααές, η κανονική ροή του προράμματος σταματάει *άμεσα*

και εκτεείται μια συκεκριμένη συνάρτηση. Τα εξτερικά interrupt είναι ιδιαίτερα

ρήσιμα σε εφαρμοές που απαιτούν συρονισμό μεάης ακρίειας.

• Τα 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 α σας

(14)

επιστρέψει την τιμή 512. Τέος, καένα από τα 6 αυτά pin, με κατάηη εντοή μέσα από το πρόραμμα μπορεί να μετατραπεί σε ψηφιακό pin εισόδου/εξόδου όπς τα 14 που

ρίσκονται στην απέναντι πευρά και τα οποία περιράφηκαν πριν. Σε αυτή την περίπτση τα pin μετονομάζονται από 0 5 σε 14 19 αντίστοια.

3.3 Τροφοδοσία

Το Arduino μπορεί να τροφοδοτηεί με ρεύμα είτε από τον υποοιστή μέσ της σύνδεσης USB, είτε από εξτερική τροφοδοσία που παρέεται μέσ μιας υποδοής φις τν 2.1mm (ετικός πόος στο κέντρο) και ρίσκεται στην κάτ-αριστερή νία του Arduino.

Για εφαρμοές μακριά από τον υποοιστή α ρειαστείτε ένα μετασηματιστή -σαν αυτό της εικόνας- ια να τροφοδοτήσετε το Arduino με ρεύμα. Μπορείτε να ρησιμο- ποιήσετε ένα παιό φορτιστή ή ένα τροφοδοτικό που σας έει περισσέψει από κάποια άη συσκευή, αρκεί να παρέει από 7 ς 12 Volt.Αν πάι έετε μια εντεώς αυτόνομη εφαρμοή που δεν εξαρτάται ούτε από πρίζα, μια κοινή μπαταρία τν 9 Volt συνδεδε- μένη όπς στην εικόνα είναι η ιδανική τροφοδοσία. Για να μην υπάρουν προήματα, η εξτερική τροφοδοσία πρέπει να είναι από 7 ς 12V και μπορεί να προέρεται από ένα κοινό μετασηματιστή του εμπορίου, από μπαταρίες ή οποιαδήποτε άη πηή DC. Δίπα από τα pin αναοικής εισόδου, υπάρει μια ακόμα συστοιία από 6 pin με την σήμανση POWER. Η ειτουρία του καενός έει ς εξής:

• Το πρώτο, με την ένδειξη RESET, όταν ειεί (σε οποιοδήποτε από τα 3 pin με την ένδειξη GND που υπάρουν στο Arduino) έει ς αποτέεσμα την επανεκκίνηση του Arduino.

• Το δεύτερο, με την ένδειξη 3.3V, μπορεί να τροφοδοτήσει τα εξαρτήματά σας με τάση 3.3V. Η τάση αυτή δεν προέρεται από την εξτερική τροφοδοσία αά παρά-

εται από τον εεκτή Serial-over-USB και έτσι η μέιστη ένταση που μπορεί να παρέει είναι μόις 50mA.

• Το τρίτο, με την ένδειξη 5V, μπορεί να τροφοδοτήσει τα εξαρτήματά σας με τάση 5V.

Ανάοα με τον τρόπο τροφοδοσίας του ίδιου του Arduino, η τάση αυτή προέρεται είτε άμεσα από την ύρα USB (που ούτς ή άς ειτουρεί στα 5V), είτε από την εξτερική τροφοδοσία αφού αυτή περάσει από ένα ρυμιστή τάσης ια να την

φέρει στα 5V.

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

• Το έκτο και τεευταίο pin, με την ένδειξη Vin έει διπό ρόο. Σε συνδυασμό με το pin είσης δίπα του, μπορεί να ειτουρήσει ς μέοδος εξτερικής τροφοδοσίας του Arduino, στην περίπτση που δεν σας οεύει να ρησιμοποιήσετε την υποδοή του φις τν 2.1mm. Αν όμς έετε ήδη συνδεδεμένη εξτερική τροφοδοσία μέσ

του φις, μπορείτε να ρησιμοποιήσετε αυτό το pin ια να τροφοδοτήσετε εξαρτήματα με την πήρη τάση της εξτερικής τροφοδοσίας (7 12V), πριν αυτή περάσει από τον ρυμιστή τάσης όπς ίνεται με το pin τν 5V.

(15)

3.4 Ενσματμένα κουμπιά και 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.

3.5 Arduino IDE και σύνδεση με τον υποοιστή

Ότι ρειάζεστε ια την διαείριση του Arduino από τον υποοιστή σας το παρέει το Arduino IDE, την τεευταία έκδοση του οποίου μπορείτε να κατεάσετε από το επίσημο site ια καένα από τα τρία δημοφιέστερα ειτουρικά συστήματα.

Το Arduino IDE είναι ασισμένο σε Java και συκεκριμένα παρέει:Το κεντρικό πα- ράυρο του Arduino IDE ρίζεται σε δύο μέρη. Στο πάν μέρος ράφετε τα sketch σας και στο κάτ μέρος εμφανίζονται πιανά άη κατά την διαδικασία της μεταώττισης.

Αμέσς μετά την πρώτη του εκτέεση, δηώστε την έκδοση του Arduino σας (όπς φαίνεται στην εικόνα) και την εικονική σειριακή που ρησιμοποιεί.

ένα πρακτικό περιάον ια την συραφή τν προραμμάτν σας (τα οποία ονομά- ζονται sketch στην οροοία του Arduino) με συντακτική ρματική σήμανση, αρκετά έτοιμα παραδείματα, μερικές έτοιμες ιιοήκες ια προέκταση της ώσσας και ια να

ειρίζεστε εύκοα μέσα από τον κώδικά σας τα εξαρτήματα που συνδέετε στο Arduino, τον compiler ια την μεταώττιση τν sketch σας, ένα serial monitor που παρακοουεί τις επικοιννίες της σειριακής (USB), ανααμάνει να στείει αφαριμητικά της επιο-

ής σας στο Arduino μέσ αυτής και είναι ιδιαίτερα ρήσιμο ια το debugging τν sketch σας και την επιοή να ανεάσετε το μεταττισμένο sketch στο Arduino.

Για τα δύο τεευταία αρακτηριστικά έαια, το Arduino πρέπει να έει συνδεεί σε μια από τις ύρες USB του υποοιστή και, ό του εεκτή Serial-over-USB, α πρέπει να ανανριστεί από το ειτουρικό σας σύστημα ς εικονική σειριακή ύρα. Αν ο οδηός του εεκτή Serial-over-USB είναι σστά εκατεστημένος στα Windows, το Arduino

α ανανρίζεται από τον Device Manager όπς στην εικόνα. Εκεί μπορείτε να δείτε και τον αριμό της εικονικής σειριακής ύρας που του ανατέηκε.Για την σύνδεση α

ρειαστείτε ένα καώδιο USB από Type A σε Type B, όπς αυτό τν εκτυπτών. Για την ανανώριση από το ειτουρικό α ρειαστεί να εκαταστήσετε τον οδηό του FTDI

(16)

chip (δηαδή του εεκτή Serial-over-USB) ο οποίος υπάρει στον φάκεο drivers του Arduino IDE που κατεάσατε. Την τεευταία έκδοση αυτού του οδηού μπορείτε επίσης να κατεάσετε ια κάε ειτουρικό σύστημα από το site της FTDI. Σημειώστε ότι στους τεευταίους πυρήνες του Linux υπάρει εενής υποστήριξη του συκεκριμένου εεκτή. Αν όα έιναν σστά, το κεντρικό παράυρο του 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.

3.6 Γώσσα προραμματισμού

Η ώσσα του Arduino ασίζεται στη ώσσα Wiring, μια παρααή C/C++ ια μικροεεκτές αριτεκτονικής AVR όπς ο ATmega, και υποστηρίζει όες τις ασικές δομές της C καώς και μερικά αρακτηριστικά της C++. Για compiler ρησιμοποιείται ο AVR gcc και ς ασική ιιοήκη C ρησιμοποιείται η AVR libc. Λό της καταής της από την C, στην ώσσα του Arduino μπορείτε να ρησιμοποιήσετε ουσιαστικά τις ίδιες ασικές εντοές και συναρτήσεις, με την ίδια σύνταξη, τους ίδιους τύπν δεδομένν και τους ίδιους τεεστές όπς και στην C. Πέρα από αυτές όμς, υπάρουν κάποιες ειδικές εντοές, συναρτήσεις και σταερές που οηούν ια την διαείριση του ειδικού hardware του Arduino.

Επιπέον, στην ώσσα του Arduino κάε πρόραμμα αποτεείται από δύο ασικές ρουτίνες ώστε να έει την ενική δομή: // Ενσματώσεις ιιοηκών, δηώσεις μετα-

ητών...

void setup() {

// ...

}

void loop() {

// ...

}

// Υπόοιπεςσυναρτήσεις...

Η ασική ρουτίνα setup() εκτεείται μια φορά μόνο κατά την εκκίνηση του προράμ- ματος ενώ η ασική ρουτίνα loop() περιέει τον ασικό κορμό του προράμματος και η εκτέεσή της επανααμάνεται συνέεια σαν ένας ρόος while(true). Αν και πρόκειται μόνο ια τις πιο ασικές ειτουρίες της ώσσας του Arduino, με αυτές και με ίες α- σικές νώσεις C α μπορέσετε να δημιουρήσετε το sketch ακόμα και ια κάποιο αρκετά περίποκο project (όπς αυτά που α ακοουήσουν σε επόμενα τεύη). Για το πήρες

(17)

reference πάντς, επισκεφτείτε την σετική σείδα ενώ ακόμα περισσότερες πηροφορίες μπορείτε να ρείτε στο site της Wiring καώς και στο εειρίδιο της ιιοήκης AVR Libc.

3.7 Shields

Τα shield είναι οοκηρμένες πακέτες που είναι σεδιασμένες ώστε να κουμπώνουν πάν στο Arduino προεκτείνοντας την ειτουρικότητά του. Είναι η hardware αντίστοιη έννοια τν plugin, addon και extension που υπάρουν στο software. Μερικά από τα πιο δημοφιή shield που κυκοφορούν στο εμπόριο ια το Arduino είναι:

Ethernet shield Δίνει στο Arduino την δυνατότητα να δικτυεί σε ένα LAN ή στο internet μέσ ενός τυπικού καδίου Ethernet.

WiFi shield Όμοιο με το Ethernet shield, ρίς φυσικά το καώδιο.

Διάφορα shield οόνης Προσέτουν οόνη στο Arduino. Κυκοφορούν από απές οόνες τύπου calculator μέρι OLED touchscreen υψηής ανάυσης τύπου iPhone.

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

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

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

ProtoShield Μια προσεδιασμένη πακέτα πρτοτυποποίησης, συματή στις διαστάσεις του Arduino και ρίς εξαρτήματα ια να φτιάξετε το δικό σας shield.

Τα shield είναι σεδιασμένα ώστε αφού κουμπούν πάν στο Arduino να προούν τις υποδοές του, ώστε να μπορείτε να συνδέσετε επιπέον τα δικά σας εξαρτήματα ή να κουμπώσετε και επόμενο shield. Φυσικά, το κάε shield ρησιμοποιεί ορισμένους από τους πόρους συνδεσιμότητας του Arduino και έτσι δεν μπορείτε να συνδέσετε απεριόριστα shield. Μάιστα κάποια shield μπορεί να μην είναι συματά μεταξύ τους ιατί ρησιμο- ποιούν τα ίδια pin του Arduino ια επικοιννία με αυτό. Επίσης, επειδή κάποια shield δεν προούν τις συνδέσεις του Arduino (όπς π.. οι οόνες οι οποίες δεν έουν νόημα αν τις καύψετε από πάν με ένα επόμενο shield), υπάρουν ειδικά extender shield που κουμπώνουν στο Arduino και δίνουν την δυνατότητα σε δύο άα shield να κουμπώσουν πάν τους, ειτουρώντας σαν πούπριζα.

Όπς και ια το ίδιο το Arduino, το ασικό πεονέκτημα τν shield δεν είναι τόσο το προφανές πεονέκτημα του έτοιμου hardware όσο ότι συνοδεύονται συνής από έτοι- μες ιιοήκες που σας επιτρέπουν να προραμματίζετε τα sketch σας σε high level.

Έτσι, όου άρη, δεν ρειάζεται να διαάζετε datasheet ή να ίνετε ηεκτρονικός ια να συνδέσετε και να ειτουρήσετε ένα GPS module πάν στο Arduino. Απά συνδέετε το shield, εκαιστάτε τη ιιοήκη που το συνοδεύει και ρησιμοποιείτε μια έτοιμη

(18)

συνάρτηση -του στυ getLocation- ια να πάρετε το εραφικό στίμα και να το επε- ξεραστείτε περαιτέρ στο sketch σας.

Τα shield σας ύνουν τα έρια όταν έετε να δημιουρήσετε εύκοα ένα πραματικά πρακτικό project. Αυτός είναι και ο όος που δεν συνιστάται η αορά κάποιας έκδοσης του Arduino που δεν είναι 100% συματή με τα shield.

(19)

4 Λειτουρία Μικροεπεξεραστή

Σε αυτήν την ενότητα α περιραφεί ο αόριμος που ρησιμοποιήηκε, τεικά, ια τη

ήψη απόφασης από τον μικρο-εεκτή συναρτήσει τν τιμών τν δεδομένν που ανα-

νώσηκαν είτε από τοπικές μετρητικές διατάξεις, είτε από τοAPI τουOpenWeatherMap.

4.1 Αόριμος Λήψης Απόφασης

Η οική σε μορφή σεδιαράμματος φαίνεται στο σήμα 8.

Σήμα 8: Αόριμος ήψης απόφασης σε μορφή σεδιαράμματος

Επιπέον, ο αντίστοιος κώδικας ια την υοποίηση του παραπάν αορίμου, είναι ο ακόουος:

boolean decisionMaking(){

if (wind>=10.5){

return false;

}else{

if (temperature<=273){

return false;

}else{

if (precipitation==true){

return true;

}else{

if (humidity>=80){

return true;

(20)

}else{

if (luminosity<20000){

return false;

}else{

return true;

} } } } } }

Έτσι, αρικά κοιτάμε αν ο αέρας είναι μεαύτερος του 10.5m/s (που αντιστοιεί σε περισσότερο από 6 μποφόρ) και αν ισύει δεν την ανοίουμε. Στη συνέεια, αν η ερμο- κρασία είναι μικρότερη τν 273 Kelvin (δηαδή 0 Celcius), τότε και πάι δεν ανοίει η τέντα, καώς υπάρει κίνδυνος πάου. Έπειτα, αν ρέει ανοίει, ενώ, στην αντίετη περίπτση, αν η σετική υρασία είναι μεαύτερη από 80 ανοίει (επειδή υπάρει μεάη πιανότητα ροής) και, τέος, αν η φτεινότητα είναι μεαύτερη από 20000 lux τότε και πάι ανοίει (ό έντονης ηιοφάνειας).

Έτσι η τέντα ρησιμοποιείται μόνο όταν ρειάζεται και ταυτόρονα προστατεύεται από δυσμενείς δυσμενείς καιρικές συνήκες που α μπορούσαν να την καταστρέψουν.

Οι μετρήσεις της ροής (precipitation), της υρασίας (humidity) και του αέρα (wind)

αμάνονται από το site OpenWeatherMap.

Οι υπόοιπες δύο μετρήσεις (φτεινότητα -luminosity και ερμοκρασία - temperature) διαάζονται από διατάξεις που είναι εκατεστημένες τοπικά.

4.2 Χειροκίνητη Λειτουρία

Ο παραπάν αόριμος ρησιμοποιείται μόνο στην περίπτση που ο ρήστης έει δηώσει ότι έει να ίνεται αυτόματα ο έεος της τέντας. Σε αντίετη περίπτση είναι δυνατή η παράκαμψή του, ώστε να επιέει ο ρήστης την εκάστοτε επιυμητή κατάσταση της τέντας.

Η παραπάν ειτουρία έει υοποιηεί ς μέρος μίας εφαρμοής Android, ώστε όταν ο ρήστης αποστείει αίτηση ια ανέασμα(Up) ή κατέασμα(Down) της τέντας, να

ειτουρεί πέον ειροκίνητα η συσκευή.

Αντίστοια, ο ρήστης μπορεί από το κινητό να στείει αίτηση ια Auto, ώστε να επιστρέψει η συσκευή σε αυτόματη ειτουρία1.

Στη συνέεια φαίνεται ο κώδικας που είναι υπεύυνος ια την ανάνση τν εντοών απόAndroid και ια την την κατάηη επιοή της επιυμητής κατάστασης.

void checkSms(){

char c;

String command;

// If there are any SMSs available()

1Κατά την επανεκκίνηση της συσκευής, η αρική μέοδος ειτουρίας είναι η αυτόματη.

(21)

if (sms.available()) {

Serial.println("Message received from:");

// Get remote number

sms.remoteNumber(remoteNumber2, 20);

Serial.println(remoteNumber2);

// This is just an example of message disposal // Messages starting with # should be discarded if(sms.peek()=='#')

{

Serial.println("Discarded SMS");

sms.flush();

}

// Read message bytes and print them int j=0;

while(c=sms.read()) {

command.concat(c);

}

Serial.println(command);

if(command.equals("up")){

statusAuto = false;

Serial.println("up-if");

digitalWrite(led, LOW);

if (digitalRead(top)==HIGH){

motor_right();

while(digitalRead(top)==HIGH){

}

sendSms("closed");

stop_motor();

} }

if(command.equals("down")){

statusAuto = false;

Serial.println("down-if");

digitalWrite(led, HIGH);

if (digitalRead(bottom)==HIGH){

motor_left();

while(digitalRead(bottom)==HIGH){

}

sendSms("open");

stop_motor();

} }

if (command.equals("auto")){

statusAuto = true;

}

(22)

// delete message from modem memory sms.flush();

Serial.println("MESSAGE DELETED");

} }

Στον παραπάν αόριμο ρησιμοποιούνται διάφορες συναρτήσεις (όπς ηsendSms() και η stop_motor()) που δεν επεξηούνται εδώ, καώς ρίσκονται στον πηαίο κώδικα και δεν έουν σέση με τον συκεκριμένο αόριμο.

5 Κώδικας Arduino

5.1 Αποστοή μηνύματος

void sendSms(String m){

Serial.print("Sending sms");

// send the message

sms.beginSMS(REMOTENUMBER);

sms.print(m);

sms.println();

sms.endSMS();

Serial.println("\nCOMPLETE!\n");

}

Χρησιμοποιώντας τον παραπάν κώδικα της ιιοήκης του Arduino GSM Module έουμε την δυνατότητα να στένουμε sms. Το αντικείμενο sms του παραπάν κώδικα είναι τύπου GSM_SMS και στη μετάητή REMOTENUMBER α πρέπει να ορίσουμε τον αριμό του παραήπτη.

5.2 Ενεροποιήση GPRS και άντηση μετεροοικών μετρήσεν

void connectGPRS(){

// initialize serial communications

Serial.println("Starting Arduino web client.");

// connection state

boolean notConnected = true;

// Start GSM shield

// pass the PIN of your SIM as a parameter of gsmAccess.begin() while(notConnected)

{

if((gsmAccess.begin(PINNUMBER)==GSM_READY) &&

(gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD)==GPRS_READY)) notConnected = false;

else {

(23)

Serial.println("Not connected");

delay(1000);

} } }

Με την συνάρτηση gsmAccess.begin(PINNUMBER) προσπαούμε να συνδεούμε με το gsm module σε περίπτση που η σύνδεση έπεσε σε sleep. Με την gprs.attachGPRS (GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD) προσπαούμε να ενεροποιή- σουμε το gprs του gsm μας. Οι τιμές τν ορισμάτν εξαρτώνται από τον εκάστοτε πάροο κινητής τηεφνίας. Στην περίπτσή μας είναι οι τιμές της Cosmote.

GPRS_APN "internet"

GPRS_LOGIN ""

GPRS_PASSWORD ""

void getWeatherInfo(){

Serial.println("connecting...");

// if you get a connection, report back via serial:

if (client.connect(server, port)) {

Serial.println("connected");

// Make a HTTP request:

client.print("GET ");

client.print(path);

client.println(" HTTP/1.0");

client.println();

} else {

// if you didn't get a connection to the server:

Serial.println("connection failed");

}

// if there are incoming bytes available

// from the server, read them and print them:

long init_time=millis();

while((millis()-init_time)<6000){

if (client.available()) {

if (client.find("<temperature value=")) {

temperature = client.parseFloat();

Serial.println("Found Temperature");

Serial.println(temperature);

}

if (client.find("<humidity value=")) {

humidity = client.parseInt();

Serial.println("Found Humidity");

Serial.println(humidity);

(24)

}

if (client.find("<speed value=")) {

wind = client.parseFloat();

Serial.println("Found Wind speed");

Serial.println(wind);

}

if (client.find("<precipitation value=")) {

precipitation_vol = client.parseFloat();

Serial.println("Found precipitation volume");

Serial.println(precipitation_vol);

precipitation=true;

}else{

precipitation_vol = 0;

precipitation=false;

Serial.println("precipitation volume not found");

} } }

disconnectGPRS();

}

Με την συνάρτηση getWeatherInfo() αντούμε τις μετρήσεις από το open API της openweathermap.org. Σύμφνα με το documentation του API ο server μας παρέει τις πηροφορίες έπειτα από http request στο api.openweathermap.org/data/2.5/weather με ορίσματα q=”Τόπος Ενδιαφέροντος” και mode=”μορφη απάντησης”. Στην περίπτσή μας στο q δώσαμε την τιμή Kavala και στο mode την τιμή xml. Μία τυπική απάντηση σε ένα http request με url api.openweathermap.org/data/2.5/weather?q=Kavala&mode=xml είναι:

<current>

<city id="735861" name="Kavala">

<coord lon="24.4" lat="40.94"/>

<country>GR</country>

<sun rise="2014-09-24T04:12:15" set="2014-09-24T16:16:18"/></city>

<temperature value="293.07" min="292.15" max="293.71" unit="kelvin"/>

<humidity value="68" unit="%"/>

<pressure value="1016" unit="hPa"/>

<wind><speed value="3.1" name="Light breeze"/>

<direction value="240" code="WSW" name="West-southwest"/>

</wind>

<clouds value="20" name="few clouds"/><visibility/>

<precipitation mode="no"/>

<weather number="801" value="few clouds" icon="02n"/>

<lastupdate value="2014-09-24T16:20:00"/>

</current>

Εμείς με την ρήση της εντοής client.find(”LABEL”) όπου στην τιμή LABEL α δώσουμε το όνομα της μέτρησης που επιυμούμε να εξάουμε από το xml αρειό. Π.

client.find(”humidity value=”) μας δίνει το ποσοστό υρασίας.

(25)

Δεδομένου ότι η άντηση πηροφοριών από τον server α ίνεται κάε 30 επτά και ότι το gprs μειώνει την απόδοση του gsm module σε άες ειτουρίες, επιέουμε να κάνουμε disconnect μετά το τέος ροής της πηροφορίας από τον server. Η αποσύνδεση

ίνεται σταματώντας τον client τύπου GSMClient με την εντοή client.stop().

5.3 Έεος ια εισερόμενα SMS

void checkSms(){

char c;

String command;

// If there are any SMSs available() if (sms.available())

{

Serial.println("Message received from:");

// Get remote number

sms.remoteNumber(remoteNumber2, 20);

Serial.println(remoteNumber2);

// This is just an example of message disposal // Messages starting with # should be discarded if(sms.peek()=='#')

{

Serial.println("Discarded SMS");

sms.flush();

}

// Read message bytes and print them int j=0;

while(c=sms.read()) {

command.concat(c);

}

Με το παραπάν κομμάτι κώδικα αμάνουμε τα sms που στάηκαν στην SIM κάρτα που τοποετήσαμε στο gsm module. Στην μεταητή remotenumber2 περιέεται ο απο- στοέας του μηνύματος και με τον ρόο

while(c=sms.read()) {

command.concat(c);

}

έουμε την δυνατότητα να αμάνουμε όο το μήνυμα και όι μόνο το μήκος τν bytes που ρούν στο buffer.

(26)

6 Εφαρμοή Android

Για τη διαείριση της συσκευής από απόσταση, υοποιήηκε αντίστοιη εφαρμοή Android τόσο ια την αποστοή αιτήσεν στη συσκευή, όσο και ια την ανάνση τν μετρήσεν από απόσταση (ια ενημέρση του ρήστη ια την τρέουσα κατάσταση).

6.1 Γενική Λειτουρία

Η εφαρμοή Android που αναπτύηκε είε ς σκοπό την ευρηστία, ειτουρικότητα και την φερευότητα. Για αυτό το όο αποτεείτε από μία κύρια οόνη που καύπτει όα τα σενάρια ρήσης της.

Στην εικόνα 9(αʹ) έπετε την κύρια οόνη στην οποία διακρίνονται τέσσερις ειτουρ-

ίες.

• UP

• DOWN

• AUTO

• INFO

Όες οι εντοές στένονται στον Arduino μέσ SMS. Για αυτό το όο είναι δυνατή η εισαή του αριμού της SIM του Arduino στις ρυμίσεις της εφαρμοής, όπς φαίνεται στην εικόνα 9(ʹ).

(αʹ) Αρική εικόνα (ʹ) Ρύμιση κινητού τηεφώνου

Σήμα 9: Εικόνες εφαρμοής Android

(27)

Το κουμπί UP στένει εντοή στον Arduino να σηκώσει τη τέντα, ενώ το κουμπί DOWN να την κατεάσει. Οι εντοές αυτές είναι απαραίτητες ια τον manual ειρισμό της τέντας. Το κουμπί AUTO αφήνει την τέντα να αποφασίζει μόνη της ια το πότε πρέπει να σηκεί ή είναι ασφαές να κατέει. Τέος, με το κουμπί INFO η εφαρμοή

αμάνει όες τις πηροφορίες της τέντας. Αυτές περιαμάνουν τα εξής:

1. Θερμοκρασία σε C 2. Υρασία σε %

3. Ταύτητα αέρα σε m/s

4. Κατάσταση ροής (αν ρέει δείνει και τα εκατοστά ροής) 5. Φτεινότητα σε lux

6. Κατάσταση τέντας, UP ή DOWN

Όες αυτές οι πηροφορίες φαίνονται στο κάτ μέρος της κύριας οόνης και ανανεώ- νονται αυτόματα αφού ηφούν οι νέες τιμές από το Arduino μέσ SMS.

6.2 Επεξήηση ασικότερν τμημάτν του κώδικα

6.2.1 Αρικοποιήση εφαρμοής

Κάε οόνη της εφαρμοής αντιστοιεί σε ένα αντικείμενο τύπου Activity. Το ασι- κότερο κομμάτι μίας Activity είναι αυτό της αρικοποίησής της, το οποίο πρέπει να ίνει κατά την εκτέεση της συνάρτησης onCreate(). Η συνάρτηση αυτή καείται αυτόματα κατά την εκκίνηση της εκάστοτε Activity. Η onCreate() της εφαρμοής μας φαίνεται παρακάτ:

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

setContentView(R.layout.activity_my);

tentControl = (TentControl) getApplication();

messageTextView = (TextView) findViewById(R.id.message_text_view);

messageTextView.setText(Measurements.getMeasurements());

progressBar = (ProgressBar) findViewById(R.id.progress_bar);

upButton = (Button) findView

Referências

Documentos relacionados