Σήμερα, με δεδομένη την κλιματική κρίση, το νερό γίνεται όλο και πιο πολύτιμο αγαθό. Αυτό το καλοκαίρι η Ευρώπη κατέγραψε τρομακτική μείωση της στάθμης των ποταμών της, εξαιτίας της ανομβρίας. Συνεπώς, οι όποιες διαρροές στο σύστημα ύδρευσης των οικιών, των βιομηχανιών ή των συστημάτων ποτίσματος των χωραφιών κλπ, είναι αναγκαίο να εντοπίζονται και να εξουδετερώνονται άμεσα. Διαφορετικά, γίνεται σπατάλη νερού σε μία περίοδο κρίσιμη σε ό,τι αφορά τα υδάτινα αποθέματα. Επιπλέον, αν η διαρροή δεν γίνει έγκαιρα αντιληπτή, ο λογαριασμός ύδρευσης θα επιβαρυνθεί με μεγάλα ποσά, συνεπώς θα υπάρξει και οικονομική επιβάρυνση του ιδιοκτήτη. Τέλος, διαρροές μέσα στο οίκημα, συνεπάγονται σοβαρές ζημιές (π.χ. δάπεδα, ταβάνι, τοίχοι κλπ).
Η λύση που προτείνεται είναι η συνεχής παρακολούθηση της τιμής της ροής του ύδατος εντός μιας εγκατάστασης (π.χ. σωληνώσεις οικίας), χρησιμοποιώντας μετρητή ροής νερού για Arduino, τοποθετημένο αμέσως μετά το υδρόμετρο. O Έλεγχος θα γίνεται από το Arduino. Κάθε φορά που θα υπάρχει ροή, ένας μετρητής θα μετράει κάθε δευτερόλεπτο την διάρκειά της. Αν η ροή μηδενιστεί, ο μετρητής θα μηδενίζεται . Ωστόσο, αν η ροή καταγράφεται συνεχώς για ένα χρονικό διάστημα που ορίζει ο χρήστης χωρίς να μηδενίζεται, σημαίνει ότι υπάρχει διαρροή, οπότε θα δίνεται εντολή σε μία βαλβίδα και θα σταματά η παροχή νερού αμέσως μετά το υδρόμετρο, ειδοποιώντας τον ιδιοκτήτη με διάφορους τρόπους. Ο χρήστης, πατώντας ένα κουμπί, κάνει reset οπότε η βαλβίδα ανοίγει και ο μετρητής ξεκινά να μετράει τη διάρκεια της ροής όπως πριν.
Παρακάτω δίνεται ο κώδικας για Arduino:
volatile int flow_frequency; // Measures flow sensor pulses
H τιμή μιας φωτοαντίστασης μεταβάλλεται με το φως. Δηλαδή όσο πέφτει φως πάνω της ελευθερώνονται ηλεκτρόνια, συνεπώς γίνεται πιο αγώγιμη, επομένως η τιμή της (σε Ω)μειώνεται. Αυτό σημαίνει, φυσικά, ότι η τιμή του ρεύματος που την διαρρέει αυξάνει (Ι=V/R). Προφανώς η πτώση τάσης V στην φωτοαντίσταση μειώνεται. Η πτώση τάσης στην κανονική αντίσταση, όμως, αυξάνεται, αφού η αντίσταση διαρρέεται από περισσότερο ρεύμα.
Στο παρακάτω πρόβλημα στόχος είναι να δίνεται εντολή από το Arduino να ανάψει μία LED, όταν η τιμή του ρεύματος πέσει κάτω από μία τιμή.
Στο κύκλωμα ελέγχου βάζουμε μία φωτοαντίσταση και μία αντίσταση 10KΩ σε σειρά.
Το άκρο της φωτοαντίστασης συνδέεται με τα 5V του Arduino.
Το κοινό άκρο αντίστασης και φωτοαντίστασης συνδέεται στην αναλογική είσοδο A0 του Arduino.
Το άκρο της αντίστασης συνδέεται με την γείωση.
Ο παρακάτω κώδικας δίνει εντολή να ανάψει η LED (συνδέστε κύκλωμα LED στο pin 3) όταν η τιμή που διαβάζει η αναλογική είσοδος A0 (αντιστοίχιση τάσης 0-5V σε αριθμό από 0 ως 1024) είναι μικρότερη από 200 (περίπου 0,97V). Μετράμε την πτώση τάσης στην κανονική αντίσταση.
Η τιμή 200 μπορεί να αλλάξει, αναλόγως τη φωτεινότητα που θέλουμε, παρακολουθώντας τις τιμές της σειριακής.
int presistor = A0; // Photoresistor at Arduino analog pin A0
int ledPin=3; // Led pin at Arduino pin 9
//Variables
int value; // Store value from photoresistor (0-1023)
void setup(){
pinMode(ledPin, OUTPUT); // Set lepPin - 9 pin as an output
pinMode(presistor, INPUT);// Set pResistor - A0 pin as an input (optional)
O αισθητήρας ροής διαθέτει μία φτερωτή που παρεμβάλλεται στην ροή του νερού μέσα στον σωλήνα ύδρευσης. Όταν γυρίζει η φτερωτή παράγει ηλεκτρικούς παλμούς, χάρη στο φαινόμενο Χολ(Hall).
Από την συχνότητα αυτών των παλμών μπορούμε να έχουμε εικόνα σχετικά με την ποσότητα του νερού που περνάει μέσα από τον σωλήνα στη μονάδα του χρόνου.
Από την άλλη, αν δεν υπάρχει ροή, δεν δημιουργούνται παλμοί.
Στο παρακάτω πρόγραμμα, αν υπάρχουν παλμοί (δηλαδή ροή νερού) αυξάνουμε ένα μετρητή κάθε δευτερόλεπτο. Αν δεν υπάρχουν, ο μετρητής μηδενίζεται. Στόχος είναι να καταγραφεί η διάρκεια ροής, ώστε αν αυτή ξεπερνάει κάποιο χρονικό διάστημα, να δίνεται η πληροφορία διαρροής από κάποιο σημείο του δικτύου.
Το κύκλωμα φαίνεται παρακάτω:
Το κόκκινο καλώδιο συνδέεται με τάση 5V
Το μαύρο με την γείωση
Το πράσινο σε ένα pin (στο συγκεκριμένο το 2) του Arduino που έχει οριστεί ως είσοδος.
Το πρόγραμμα φαίνεται παρακάτω:
volatile int flow_frequency; // Measures flow sensor pulses
Σημαίνει, πρακτικά, ότι όταν έχεις αίτημα διακοπής (ηλεκτρικό παλμό) και μάλιστα "RISING", δηλαδή από 0V προς 5V, τότε κάλεσε την συνάρτηση flow, η οποία αυξάνει τον μετρητή flow_frequency κατά ένα, σημάδι ότι υπάρχει ροή νερού.
2) currentTime = millis();
// Every second,
if(currentTime >= (cloopTime + 1000))
Βρίσκει την τρέχουσα ώρα και κάνει την επόμενη κίνηση αν ο χρόνος ισούται με τρέχουσα ώρα + 1000ms, δηλαδή ελέγχει κάθε sec.
3) Ο μετρητής flowcounter αυξάνει κατά 1 κάθε sec, όσο υπάρχει ροή( flowfrequency !=0). Διαφορετικά (flowfrequency==0) μηδενίζεται.
4) Έχουμε θέσει το pin 5 ως έξοδο, ώστε να στείλουμε σήμα σε μία ηλεκτροβάνα και να κλείσει την ροή νερού, αν ο μετρητής flowcounter ξεπεράσει μια τιμή, γεγονός που σημαίνει ότι υπάρχει συνεχής ροή για υπερβολικό χρονικό διάστημα, συνεπώς εικάζεται διαρροή νερού.
Στο προηγούμενο παράδειγμα με το κουμπί, όσο πατάμε το κουμπί, ανάβει η LED.
Συνήθως, θέλουμε να πατάμε ένα κουμπί ΟΝ μία φορά και να λειτουργεί συνέχεια μια συσκευή.
Για να γίνει αυτό, χρησιμοποιείται μια μεταβλητή (π.χ. flag) που αρχικά έχει μία συγκεκριμένη τιμή (π.χ. 0) και όταν συμβεί ένα γεγονός, παίρνει μιαν άλλη τιμή (π.χ. 1).
Είναι σαν τον επόπτη γραμμών που σηκώνει την σημαία όταν η μπάλα έχει βγει εκτός γραμμής.
Προφανώς, το πάτημα του κουμπιού είναι στιγμιαίο, αλλά η τιμή της μεταβλητής μόνιμη.
Άρα, μπορούμε να πούμε ότι το flag θα παίρνει την τιμή 1 όταν πατηθεί το κουμπί. Αν πούμε ότι η LED θα ανάβει όσο η μεταβλητή flag έχει τιμή 1, τότε πετυχαίνουμε αυτή να ανάβει μόνιμα.
Ο κώδικας για να γίνει το παραπάνω σενάριο, δίνεται ακολούθως:
const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 3; // the number of the LED pin
int buttonState = 0;
int flag=0;
void setup() {
// put your setup code here, to run once:
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn LED on:
flag=1;
while (flag ==1) {
digitalWrite(ledPin, HIGH);
}}
else {
digitalWrite(ledPin, LOW);
}
}
Το αποτέλεσμα φαίνεται εδώ:
Για να σβήνει η LED, πρέπει να προσθέσουμε νέο κουμπί OFF που, όταν πατηθεί, η τιμή του flag θα γίνεται 0. Αυτό, προφανώς, θα συμβαίνει μέσα στο while.
Είναι φορές που ο έλεγχος πρέπει να γίνεται χειροκίνητα.
Π.χ. όταν πατάει ένα κουμπί ο χρήστης να ξεκινάει ένας κινητήρας, ή αντίθετα να σταματάει.
Το κουμπί του arduino είναι κανονικά ανοικτός διακόπτης μόνο στα διαγώνια ποδαράκια!
Στα ποδαράκια που βρίσκονται στην ίδια πλευρά είναι κλειστός διακόπτης
Άσκηση
Να γίνεται έλεγχος LED με χρήση κουμπιού του Arduino. Να ανάβει όταν πατιέται το κουμπί και να σβήνει όταν δεν πατιέται.
Συνδέουμε τα 5V του arduino σε ένα ποδαράκι του κουμπιού και το διαγώνιο ποδαράκι το ενώνουμε με μία ψηφιακή είσοδο του arduino (π.χ. την 2). Στο τελευταίο αυτό ποδαράκι συνδέουμε και μία αντίσταση 10 ΚΩ, το άλλο άκρο της οποίας καταλήγει στην γείωση (αν δεν υπήρχε η αντίσταση, πάντα η τάση της γείωσης 0V θα κατέληγε στην είσοδο 3, ενώ με κλειστό διακόπτη θα γινόταν βραχυκύκλωμα.)
Σε μία ψηφιακή έξοδο του Arduino (π.χ. την 3 ) συνδέουμε όπως έχουμε ήδη διδαχθεί στο πρώτο μάθημα (βλ. παλιότερες αναρτήσεις) μία LED.
Το κύκλωμα για τη σύνδεση του κουμπιού φαίνεται παρακάτω:
Ο Κώδικας για τον έλεγχο φαίνεται παρακάτω:
const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 3; // the number of the LED pin
int buttonState = 0;
void setup() {
// put your setup code here, to run once:
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
Υπάρχουν περιπτώσεις όπου είναι αναγκαίο να ελεγχθούν κυκλώματα μεγαλύτερης ισχύος από όση μπορεί να παρέχει ένα Arduino.
Αφενός το ρεύμα και η τάση που παράγει το Arduino είναι ανεπαρκή για να ελέγξουν τέτοια κυκλώματα, αφετέρου αν το ισχυρό ρεύμα ή η τάση τέτοιων κυκλωμάτων έρθουν σε επαφή με το Arduino, θα το καταστρέψουν.
Για το λόγο αυτό, υπάρχει ο ηλεκτρονόμος (relay - ρελέ) που ανοιγοκλείνει ένα διακόπτη, αναλόγως τις εντολές που λαμβάνει από το arduino (5V), αλλά αυτός ο διακόπτης ελέγχει ένα άλλο κύκλωμα ισχύος, που είναι εντελώς ανεξάρτητο από το Arduino.
H δεξιά πλευρά του παραπάνω ρελέ συνδέεται με το Arduino,
Στο ΙΝ ενώνεται το pin του Arduino που στέλνει το σήμα ελέγχου, αναλόγως το πρόγραμμα που έχουμε γράψει.
Το DC+ ενώνεται με τα 5V του Arduino
To DC- ενώνεται με τη γείωση του arduino
Στην Αριστερή πλευρά διακρίνονται το NO που σημαίνει Normally Open (Κανονικά Ανοικτός Διακόπτης). Δηλαδή, αν δε στείλουμε σήμα ελέγχου από το Arduino, αυτός ο διακόπτης θα είναι πάντα ανοικτός, επομένως δεν θα διαρρέει ρεύμα το κύκλωμα ισχύος.
Το NC (Normally Closed)είναι ένας κανονικά κλειστός διακόπτης, που σημαίνει ότι αν δεν έρθει σήμα ελέγχου από το Arduino στο ΙΝ του ρελέ, το εξωτερικό κύκλωμα ισχύος θα διαρρέεται συνεχώς από ρεύμα.
Αναλόγως, λοιπόν αν θέλουμε ανοικτό ή κλειστό διακόπτη, συνδέουμε το καλώδιο στο COM και αντίστοιχα στο ΝΟ ή NC.
Στο παρακάτω παράδειγμα, ένα ρελέ χρησιμοποιείται για τον έλεγχο μιας αντλίας νερού.
Υπάρχει Αισθητήρας στάθμης νερού.
Όσο η στάθμη έχει τιμή πάνω από 200, το Arduino δίνει εντολή να ξεκινήσει η αντλία, διαφορετικά να σταματήσει.
Ο αισθητήρας μέτρησης στάθμης νερού παρουσιάζεται στην παρακάτω φωτογραφία:
Παρατηρήστε ότι έχει τρία pin.
Το ένα έχει σύμβολο - και συνδέεται με τη γείωση του Arduino.
Το μεσαίο έχει σύμβολο + και συνδέεται με τα 5V του Arduino.
To τρίτο έχει σύμβολο S και συνδέεται με μία αναλογική είσοδο (π.χ. A5) του Arduino.
O κώδικας για ανάγνωση του αισθητήρα στάθμης νερού δίνεται παρακάτω:
int water=A5;// Arduino pin for water level sensor
int wl=0; // variable that holds the water level value
void setup() {
// put your setup code here, to run once
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
wl=analogRead(water);
Serial.print ("Water Level: ");
Serial.println(wl);
delay(1000);
}
Αρχικά ορίζεται η μεταβλητή water που κρατάει την τιμή της αναλογικής εισόδου (Α5) που διαβάζουμε.
Η ακέραια μεταβλητή wl θα δεχθεί την τιμή της στάθμης του νερού.
Ακολούθως διαβάζουμε την σειριακή με ρυθμό 9600 bits/sec
Οι τιμές παρουσιάζονται στην οθόνη επιλέγοντας Εργαλεία-Παρακολούθηση Σειριακής.
Παρακολουθήστε τις τιμές και αποφασίστε από πιο σημείο και κάτω θα θεωρείτε ότι η δεξαμενή θα είναι γεμάτη και πότε θα τη θεωρείτε άδεια.
Ασκήσεις
1. Να κάνετε ένα σύστημα το οποίο όταν θα ξεπερνάει το νερό μια συγκεκριμένη στάθμη να ανάβει ένα LED
2. Χρησιμοποιήστε και έναν αισθητήρα θερμότητας LM35 και όταν η στάθμη είναι πάνω από μία τιμή και η θερμοκρασία πάνω από μια συγκεκριμένη τιμή, τότε να ανάβει ένα LED
Η λύση που προτείνουμε στοχεύει
στον έλεγχο λειτουργίας των φωτεινών σηματοδοτών σε περίπτωση δασικής
πυρκαγιάς, ώστε να απεγκλωβιστούν όσοι είναι σε οδό που διέρχεται από δάσος
(οδός 1) και καταλήγει σε αστικό ιστό (οδός 2). Στη διασταύρωση όπου καταλήγει
η οδός που διέρχεται από δάσος υπάρχουν φανάρια. Προτεραιότητα έχουν όσοι
κινούνται στην οδό που είναι σε αστικό ιστό.
Κοντά
στο φανάρι της οδού 1 τοποθετείται αισθητήρας υπερήχων, με στόχο την ανίχνευση
ύπαρξης αυτοκινήτου. Σε επιλεγμένα σημεία της ίδιας οδού τοποθετείται
αισθητήρας θερμοκρασίας (LM
35 - arduino) και
αισθητήρας ανίχνευσης φλόγας (Chipμε LEDυπερύθρων - Arduino).
Ο έλεγχος γίνεται με το ArduinoUNO.
1) Σενάριο μη ύπαρξης πυρκαγιάς:
- Αν ο αισθητήρας υπερήχων
ανιχνεύσει αυτοκίνητο στο φανάρι της οδού που διέρχεται από το δάσος, μετά από
λογικό χρονικό διάστημα, θα μεταβεί το φανάρι της οδού του αστικού ιστού σε
κίτρινο και κόκκινο, ενώ εκείνο της οδού 1 σε πράσινο και μετά κίτρινο,
κόκκινο. Κατόπιν, θα δοθεί πράσινο στην οδό 2.
2)Σενάριο ύπαρξης φωτιάς στο
δάσος:
Αν ο αισθητήρας ανίχνευσης φλόγας ή της θερμοκρασίας εντοπίσουν
πυρκαγιά, τότε:
α) Αυτόματα θα ενεργοποιηθεί ο
κρουνός και θα αρχίσει να ρίχνει νερό. Με προσαρμογή περιστρεφόμενου
ποτιστηριού στον κρουνό, είναι δυνατό να δημιουργηθεί ζώνη προστασίας από φωτιά
για τοδρόμο 1.
β) Αν ο αισθητήρας υπερήχων έχει
εντοπίσει αυτοκίνητο, σε σύντομο χρονικό διάστημα (συντομότερο από το σενάριο
1) θα ανάψει πράσινο στην οδό που διέρχεται από το δάσος. Ο αισθητήρας υπερήχων
θα ελέγξει σε λίγο και πάλι για ύπαρξη αυτοκινήτου και αν δεν υπάρχει, θα δώσει
εντολή τελικά για πράσινο στην οδό του αστικού ιστού. Και συνεχίζεται ο κύκλος
του σεναρίου β.
γ) Αν ο αισθητήρας υπερήχων
εξακολουθεί να εντοπίζει αυτοκίνητα, τότε:
Παρατείνεται το πράσινο στο
δασικό δρόμο για αρκετό χρονικό διάστημα, όμως όχι μόνιμα (δεν έχει νόημα να
αποκλειστούν τα αυτοκίνητα του αστικού ιστού). Μετά από ικανό χρονικό διάστημα,
ο σηματοδότης της αστικής οδού θα σβήσει και εκείνος της δασικής θα αναβοσβήνει
συνεχώς κίτρινο (τα αυτοκίνητα της οδού 1 περνάνε παραχωρώντας προτεραιότητα). Επίσης
στα φανάρια θα υπάρχουν και κατάλληλα σήματα προτεραιότητας.
Ο κρουνός , αν έχει ενεργοποιηθεί, θα σταματάει μόνο χειροκίνητα. Αυτό διότι αν καούν οι αισθητήρες, δε θα δίνουν ένδειξη, οπότε το σύστημα ελέγχου θα θεωρεί ότι η φωτιά έσβησε .
Υπάρχει και ανεξάρτητος διακόπτης ενεργοποίησης του κρουνού, σε περίπτωση αποτυχίας του συστήματος αυτομάτου ελέγχου.
Το πρόγραμμα δίνεται παρακάτω:
//trsffic lights
int citygreen = 7;
int cityyellow = 2;
int cityred = 3;
int forestgreen = 4;
int forestyellow = 5;
int forestred = 6;
int flamepin = 8;
int flameval;
int carcount = 0;
//ultrasonic
int trig = 9;
int echo = 10;
long duration;
int distance;
int dist;
int distold;
//temperature
int val;
int temp = 1; //Analog input 1
float mv;
float c;
float celcius;
//fire
int fireflag = 0;
//water
int water = 11;
//reset button
int button = 12;
int buttonval = 0;
// manual button
int manual=13;
int manualval=0;
//checking the flame sensor
flameval = digitalRead(flamepin); //checking for fire indication
if (flameval == HIGH) {
delay (3000);
flameval = digitalRead(flamepin); //doublechecking for fire
if (fireflag == 1) {
digitalWrite (water, HIGH); // start throwing water, if fire alarm is on
}
else
{
digitalWrite (water, LOW);
}
//check if reset button is pressed.
buttonval = digitalRead(button);
if (buttonval == HIGH) {
fireflag = 0;
}
// checking the existance of the car under the sensor
dist = ultrasonic();
if (dist < 10 && fireflag == 0) {
delay (3000);
// double checking the exestance of the car under the sensor to avoid wrong entry
dist = ultrasonic();
manualval = digitalRead(manual);
if (manualval == HIGH) {
fireflag = 1;
}
if (dist < 10 && fireflag == 0) {
delay (4000);
digitalWrite (citygreen, LOW);
digitalWrite (cityyellow, HIGH);
delay (2000);
digitalWrite (cityyellow, LOW);
digitalWrite (cityred, HIGH);
delay (1000);
digitalWrite (forestgreen, HIGH);
digitalWrite (forestred, LOW);
delay (3000);
digitalWrite (forestyellow, HIGH);
digitalWrite (forestgreen, LOW);
delay(2000);
digitalWrite (forestyellow, LOW);
digitalWrite (forestred, HIGH);
delay (1000);
}
}
manualval = digitalRead(manual);
if (manualval == HIGH) {
fireflag = 1;
}
// checking the existance of car under the sensor with fire alarm on.
if (dist < 10 && fireflag != 0) {
//after adequate time, the city road cars must be released
//and the drivers must drive without traffic lights, with the
//drivers of the forest road giving way.
if (carcount > 3) {
while (fireflag != 0 ) {
digitalWrite (citygreen, LOW);
digitalWrite (cityyellow, LOW);
digitalWrite (cityred, LOW);
Ο αισθητήρας αυτός ανιχνεύει υπέρυθρες ακτίνες. Όπως είναι γνωστό, ακόμη και ο ήλιος εκπέμπει υπέρυθρες ακτίνες, γι αυτό πρέπει να ληφθεί μέριμνα ώστε να μην υπάρχουν παρεμβολές που θα επηρεάσουν τις μετρήσεις.
Ο αισθητήρας φλόγας διαθέτει τέσσερις ακροδέκτες. Ένας συνδέεται με τη γείωση, ένας με την πηγή 5V και ένας συνδέεται σε μία ψηφιακή είσοδο του Arduino.
Αν θέλουμε να έχουμε και σειριακή μέτρηση για περισσότερη ακρίβεια, μπορούμε να συνδέσουμε τον αντίστοιχο ακροδέκτη με μία αναλογική είσοδο του Arduino (π.χ. A0)
Στο παρακάτω παράδειγμα, χρησιμοποιείται μόνο η ψηφιακή είσοδος (η 13)
στην έξοδο 3 συνδέεται μία αντίσταση 220Ω και μία LED. Το παρακάτω πρόγραμμα, θα ανάψει τη LED μόνο όταν η ψηφιακή είσοδος 13 έχει λογικό 1(High), δηλαδή έχει ανιχνευτεί φλόγα.:
int led = 13; // define the LED pin
int DPin = 3; // KY-026 digital interface
int DVal1; // digital readings
void setup() {
// put your setup code here, to run once:
pinMode(led, OUTPUT);
pinMode(DPin, INPUT);
}
void loop() {
// put your main code here, to run repeatedly:
DVal1 = digitalRead(DPin);
if(DVal1 == HIGH) // if flame is detected
{
digitalWrite(led, HIGH); // turn ON Arduino's LED
}
else
{
digitalWrite(led, LOW); // turn OFF Arduino's LED
}
}
Ασκήσεις
1. Προσθέστε ένα buzzer ο οποίος θα ενεργοποιείται όταν ανάβει φωτιά .
2. Φτιάξτε με LED ένα φανάρι που αρχικά θα είναι κόκκινο και θα γίνεται πράσινο όταν πιάνει φωτιά.
3. Προσθέστε αισθητήρα υπερήχων ώστε το παραπάνω φανάρι να γίνεται πράσινο όταν πιάνει φωτιά και ο αισθητήρας υπερήχων εντοπίζει όχημα.
Οι υπέρηχοι είναι ήχοι που έχουν συχνότητα πάνω από 20ΚΗz γι αυτό δε γίνονται αντιληπτοί από το ανθρώπινο αυτί.
Είναι κύματα αέρα που τρέχουν με την ταχύτητα του ήχου (340 m/sec)
O αισθητήρας υπερήχων στέλνει υπερήχους που ανακλώνται σε ένα αντικείμενο και επιστρέφουν.
Μετρώντας το χρόνο που απαιτείται για να επιστρέψουν, βρίσκουμε την απόσταση του αντικειμένου πάνω στο οποίο ανακλάστηκε το κύμα των υπερήχων.
Αν t είναι ο απαιτούμενος χρόνος ώσπου να επιστρέψει το σήμα,πρέπει να ληφθεί υπόψη ότι ο υπέρηχος πήγε ως το αντικείμενο και επέστρεψε! Συνεπώς είναι διπλάσιος από το χρόνο που έκανε να φτάσει στο αντικείμενο. Άρα ο χρόνος μέχρι το αντικείμενο είναι t/2.
με γνωστή την ταχύτητα του ήχου (340 m/sec), βρίσκουμε την απόσταση S:
S= 340*t/2
αλλά ισχύει ότι: 340m/sec=0,034 cm/ms.
Επομένως, η απόσταση του αντικειμένου από τον αισθητήρα σε cm δίνεται από τον τύπο:
S=0,034*t/2
Ο αισθητήρας έχει τέσσερις ακροδέκτες.
Ο Vcc συνδέεται στα 5V του Arduino
O GND με τη γείωση
Ο Trig και ο Echo με εισόδους/εξόδους του Arduino
Στέλνουμε στην έξοδο που είναι συνδεδεμένος ο Trig ένα παλμό διάρκειας 10 μs.
Αυτός παράγει ένα σήμα υπερήχων.
Μετράμε το χρόνο ώσπου να εμφανιστεί είσοδος από τον ακροδέκτη Echo (ένδειξη ότι το κύμα επέστρεψε έχοντας ανακλαστεί)
Υπολογίζουμε και εμφανίζουμε στη σειριακή την απόσταση του αντικειμένου:
Ο Κώδικας δίνεται εδώ:
int trig=3; int echo=5; long duration; int distance;
void setup() { // put your setup code here, to run once: pinMode(trig, OUTPUT); pinMode (echo, INPUT); Serial.begin(9600); }
void loop() { // put your main code here, to run repeatedly: digitalWrite(trig,LOW); delayMicroseconds (2); digitalWrite(trig,HIGH); delayMicroseconds (10); digitalWrite(trig,LOW);
1. Να προστεθεί LED στο κύκλωμα που θα ανάβει από ένα όριο απόστασης και μετά.
2. Να προστεθεί βομβητής (buzzer) στο κύκλωμα που θα δίνει σήματα διαφορετικής συχνότητας, ανάλογα την απόσταση του αντικειμένου.
3. Να προστεθούν τρεις LED που θα ανάβει η πράσινη από κάποιο όριο απόστασης και πάνω, η κίτρινη από το κατώτατο όριο της πράσινης ως ένα κάποιο χαμηλότερο και η κόκκινη από κάποιο όριο απόστασης και κάτω.
3. Να προστεθεί φανάρι κυκλοφορίας οχημάτων με LED, που θα γίνεται πράσινο μόνο όταν ένα αντικείμενο (αυτοκίνητο) πλησιάσει τον αισθητήρα, το πράσινο θα διαρκεί κάποια δευτερόλεπτα και κατόπιν θα μεταβαίνει σε κίτρινο και κόκκινο. Μετά τον πρώτο κύκλο να μεσολαβούν οπωσδήποτε 10 δευτερόλεπτα ως τον επόμενο, αν και εφόσον εντοπιστεί νέο αυτοκίνητο.
Τον τοποθετούμε έτσι ώστε να βλέπουμε το επίπεδο μέρος του.
Το αριστερό ποδαράκι συνδέεται με τα 5 V
Το δεξί ποδαράκι συνδέεται με τη γείωση (GND)
To κεντρικό ποδαράκι συνδέεται με την αναλογική είσοδο μέτρησης Α1 .
Ο παρακάτω κώδικας δίνει το πως θα διαβάζουμε την ένδειξη του αισθητήρα από την είσοδο 3 του Arduino UNO και πως η μέτρηση μετατρέπεται σε βαθμούς Κελσίου.
int val; //integer variable that will accept the value of temperature int temp=1; // Number of port for temperature sensor reading void setup() { // put your setup code here, to run once: Serial.begin (9600); // speed 9600 bits per sec }
void loop() { // put your main code here, to run repeatedly: val= analogRead (temp); float mv= (val/1024.0)*5000; //conversion to Celcius Degrees float c=mv/10; //conversion to Celcius Degrees Serial.print("Temperature= "); Serial.print(c); Serial.print("oC"); Serial.println(); delay (1000); }
Αρχικά ορίζουμε μία ακέραιη μεταβλητή (val) που θα δεχθεί τη μέτρηση.
Ορίζουμε μία ακέραια μεταβλητή για τη θύρα εισόδοου (temp).
Δηλώνουμε ότι θέλουμε ταχύτητα εισόδου 9600 baud (bits per sec).
Διαβάζουμε τη θύρα τρία και τοποθετούμε την τιμή στη μεταβλητή val.
Κάνουμε μαθηματικούς υπολογισμούς για μετατροπή της τιμής σε βαθμούς Κελσίου.
Εμφανίζουμε την ένδειξη στην οθόνη ( Serial.print(c);)
Για να δούμε την τιμή πρέπει να πάμε Εργαλέια → Παρακολούθηση σειριακής.
Ο παρακάτω κώδικας επιδιώκει μόλις η θερμοκρασία ξεπεράσει τους 20 βαθμούς Κελσίου, να ανάβει ένα κόκκινο LED και να χτυπάει ένας buzzer.
if (c> 20.0){
digitalWrite(ledPin, .....); //Turn led on
}
else{
digitalWrite(ledPin, ....); //Turn led off
}
Με βάση τις γνώσεις σας από την πρώτη άσκηση, κατασκευάστε το κύκλωμα και συμπληρώστε τον κώδικα σωστά.
Ερευνήστε στο διαδίκτυο και βρείτε τις εντολές ενεργοποίησης του buzzer (π.χ. για σήμα 1KHz ¨¨:
tone(buzzer, 1000);)
.
Προσοχή! Το κοντό ποδαράκι του Buzzer, πηγαίνει στη γείωση και το μακρύ σε μία ψηφιακή έξοδο του Arduino. Μεταξύ της ψηφιακής εξόδου παρεμβάλλεται αντίστασή 220 Ω.
To Κύκλωμα περιλαμβάνει μία αντίσταση 330Ω συνδεδεμένη με την έξοδο 3 του Arduinο σε σειρά με μία LED.
(To μακρύ ποδαράκι της LED αντιστοιχεί στο +)
Το παρακάτω πρόγραμμα αναβοσβήνει μία LED κάθε 3 sec .Η Led συνδέεται με την ψηφιακή έξοδο 3 του Arduino.
int led =3; void setup() { // initialisation pinMode(led, OUTPUT); }
void loop() { // send 5V to output 3 digitalWrite (led, HIGH); //Wait for 3 secs delay (3000); // send 0V to output 3 digitalWrite (led, LOW); delay (3000); }
Δηλώνουμε μία ακέραια μεταβλητή led και της δίνουμε αρχική τιμή 3
Κατόπιν, βάζουμε αρχική κατάσταση της εξόδου 3 να είναι 5V.
Εισάγουμε 3 sec καθυστέρηση
Τέλος, βάζουμε την έξοδο 3 σε κατάσταση LOW (0V)
Εισάγουμε 3 sec καθυστέρηση .
H διαδικασία επαναλαμβάνεται επ' συνεχώς.
Ασκήσεις
1. Βάλτε άλλη μία LED και συνδέστε την στην έξοδο 4. Κάντε τις να ανάβουν εναλλάξ κάθε 2 secs.
2. Ελέγξτε τη λειτουργία ενός φαναριού ελέγχου κυκλοφορίας, με τρία LED.
3. Προσθέστε LED ώστε να υπάρχει φανάρι για τους πεζούς.