The Arduino Workshop : NTUA Greek vol2
-
Upload
christos-panagiotakopoulos -
Category
Devices & Hardware
-
view
204 -
download
3
Transcript of The Arduino Workshop : NTUA Greek vol2
The Arduino
Workshop
Vol 2: Back to Analog!
IEEE NTUA Student Branch
IEEE NTUA Student Branch
Η συνάρτηση analogRead()
● Σύνταξη: analogRead(“Analog In”)
● Λειτουργία: Επιστρέφει μία ακέραια τιμή από
το 0 έως 1023 που αντιπροσωπεύει την
διαφορά δυναμικού στην θύρα που έχουμε
επιλέξει. (1023 = 5V)
IEEE NTUA Student Branch
IEEE NTUA Student Branch
+5V
GND
A0
IEEE NTUA Student Branch
void setup() {Serial.begin(9600);
}
void loop() {int sensorValue = analogRead(A0);Serial.println(sensorValue);delay(1);
}
Εδώ διαβάζουμε την τιμή στην
θύρα A0. Άρα η sensorValue
κυμαίνεται από 0 έως 1023!
Καθυστέρηση 1ms
Εκκίνηση σειριακής επικοινωνίας
με τον υπολογιστή.
IEEE NTUA Student Branch
Από αριθμούς σε Volt
Με απλή μέθοδο των τριών:
Όταν η συνάρτηση analogRead() δίνει 1023, δίνουμε στην θύρα 5.0 Volt.
Όταν η συνάρτηση analogRead() δίνει α, δίνουμε στην θύρα x (?) Volt.
Άρα καταλήγουμε στον τύπο (σε γλώσσα C):
x = (5.0/1023)*α
IEEE NTUA Student Branch
void setup() {Serial.begin(9600);
}
void loop() {int sensorValue = analogRead(A0);float voltage = sensorValue * (5.0/1023);Serial.println(voltage);delay(1);
}
Το αποτέλεσμα της προηγούμενης παράστασης όμως, είναι δεκαδικός αριθμός.
Άρα θα χρησιμοποιήσουμε τον τύπο μεταβλητής float.
IEEE NTUA Student Branch
Η συνάρτηση map()
● Σύνταξη:
map(“value”, “fromLow”, “fromHigh”, “toLow”, “toHigh”)
● Λειτουργία: Δέχεται στο πεδίο value μια μεταβλητή, στο
πεδίο fromLow το κάτω άκρο των τιμών της, στο
fromHigh το άνω άκρο των τιμών της και την
μετατρέπει ώστε να περιορίζεται μεταξύ δύο νέων άνω
και κάτω άκρων που δίνονται στα πεδία toLow και
toHigh αντίστοιχα. Οι ενδιάμεσες τιμές της, πάνε
αναλογικά.
IEEE NTUA Student Branch
void setup() {Serial.begin(9600);
}
void loop() {int sensorValue = analogRead(A0);int newValue = map(sensorValue, 0, 1023, 0, 255);Serial.println(newValue);delay(1);
}
Παράδειγμα - Εφαρμογή
IEEE NTUA Student Branch
Fade A Led: vol. 2
GND
LED (pin 10)
IEEE NTUA Student Branch
void setup() {pinMode(10, OUTPUT);
}
void loop() {int sensorValue = analogRead(A0);int ledValue = map(sensorValue, 0, 1023, 0, 255);analogWrite(10, ledValue);delay(1);
}
Θα χρησιμοποιήσουμε την συνάρτηση analogWrite για να ανάβουμε το LED σε
διαφορετικές εντάσεις. Όμως δεν μπορούμε να βάλουμε κατευθείαν την τιμή που
λαμβάνουμε από το ποτενσιόμετρο στην συνάρτηση analogWrite διότι ενώ η τελευταία
δέχεται τιμές από 0 έως 255, η συνάρτηση analogRead δίνει από 0 έως 1023.
Εδώ χρειαζόμαστε την συνάρτηση map().
“Γράφουμε” στο LED
την τιμή που μας
δίνει η ledValue.
IEEE NTUA Student Branch
Λίγα λόγια για τις διαδικασίες...
void newMethod(int a; float b; ...) {………………………...
}
void setup() {………………………..newMethod(j, b);
}
void loop() {………………………..
}
Όνομα Διαδικασίας
Δηλώσεις Παραμέτρων
Κλήση Διαδικασίας
IEEE NTUA Student Branch
Βlink A Led: vol. 2Θα ρυθμίσουμε τον ρυθμό που αναβοσβήνει το LED με το ποτενσιόμετρο, ρυθμίζοντας την
καθυστέρηση ανάμεσα στο αναβόσβημα από τα 50ms έως τα 2000ms (2s).
void blink(int time) {digitalWrite(10, HIGH);delay(time);digitalWrite(10, LOW);delay(time);
}
Διαδικασία για το
αναβόσβησμα
IEEE NTUA Student Branch
Βlink A Led: vol. 2
Κυρίως Πρόγραμμα
void setup() {pinMode(10, OUTPUT);
}
void loop() {int sensorValue = analogRead(A0);int timeValue = map(sensorValue, 0, 1023, 50, 2000);blink(timeValue);delay(1);
}
Χρήση της
συνάρτησης map()
για την μετατροπή
της τιμής της
sensorValue από 0
- 1023 σε 50 - 2000
IEEE NTUA Student Branch
Big Challenge
Θέλουμε να μετρήσουμε την διαφορά δυναμικού στα άκρα του
ποτενσιομέτρου (Volt) με ακρίβεια ενός δεκαδικού ψηφίου.
Όμως, θέλουμε να κάνουμε την συσκευή μέτρησής μας, φορητή.
Δηλαδή, να μην χρειάζεται υπολογιστής για να προβάλουμε τα
αποτελέσματα. Για τον σκοπό αυτό, επειδή γνωρίζουμε πώς να
συνδέουμε και να ελέγχουμε λυχνίες LED, θα “εκτυπώνουμε” τα
αποτελέσματα των μετρήσεών μας με την χρήση 2 LED ως εξής:
● Το πρώτο LED θα παρουσιάζει τις μονάδες.
● Το δεύτερο LED θα παρουσιάζει τις δεκάδες.
● Κάθε LED θα αναβοσβήνει τόσες φορές όσο και ο
αριθμός που πρέπει να δείξει.
● Πρώτα θα δείχνει τον αριθμό του το πρώτο LED και με
καθυστέρηση 3 δευτερολέπτων θα δείχνει τον αριθμό του
το δεύτερο LED.
Η παρουσίαση του αποτελέσματος της μέτρησης θα γίνεται μόλις
πατηθεί ο διακόπτης.
Δίνονται τα εξής: 2 LED, 1 ποτενσιόμετρο, 1 διακόπτης, 1 αντίσταση (10kΩ)
IEEE NTUA Student Branch
Υπόδειξη 1
Συνάρτηση εξαγωγής μονάδων
int monades(float volt;) {int mon = (int) volt;return mon;
}
Κόβει το
δεκαδικό
μέρος μιας
float
μεταβλητής.
int dekata(float volt;) {float dec = volt - monades(volt);dec = dec * 10;int decimal = (int) dec;return decimal;
}
Συνάρτηση εξαγωγής δέκατων
IEEE NTUA Student Branch
Υπόδειξη 2
Διαδικασία Αναβοσβήσματος
void blink(int times; int pin;) {for(int i = 1; i <= times; i++;) {
digitalWrite(pin, HIGH);delay(500);digitalWrite(pin, LOW);delay(500);
}}
Δομή επανάληψης για να
αναβοσβήσει το LED όσες
φορές ζητήσαμε.
Πόσες φορές θα
αναβοσβήσει
Η ψηφιακή θύρα του
κάθε LED
IEEE NTUA Student Branch Υπόδειξη 3int led1 = 13;int led2 = 12;int switch = 2;
void setup() {pinMode(led1, OUTPUT);pinMode(led2, OUTPUT);pinMode(switch, INPUT);
}
void loop() {int switchState = digitalRead(switch);if (switchState == HIGH) {
int sensorValue = analogRead(A0);float voltage = sensorValue * (5.0/1023);int a = monades(voltage);int b = dekata(voltage);blink(a, led1);delay(3000);blink(b, led2);
}delay(1);
}
Μπορείτε να βάλετε ότι pins θέλετε
αρκεί στο πρόγραμμα να
αντιστοιχούν ακριβώς με τα διάφορα
υλικά.
Αν πατηθεί ο διακόπτης εκτέλεσε
τον παρακάτω κώδικα.
Βρες τα Volt.
Εξαγωγή μονάδων
Εξαγωγή δέκατων
Πρώτο LED
Καθυστέρηση 3s
Δεύτερο LED