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
Top Related