IEEE NTUA SB - Arduino Workshop vol 2

18
The Arduino Workshop Vol 2: Back to Analog! IEEE NTUA Student Branch

Transcript of IEEE NTUA SB - Arduino Workshop vol 2

Page 1: IEEE NTUA SB - Arduino Workshop vol 2

The Arduino Workshop

Vol 2: Back to Analog!

IEEE NTUA Student Branch

Page 2: IEEE NTUA SB - Arduino Workshop vol 2

IEEE NTUA Student Branch

Η συνάρτηση analogRead()

● Σύνταξη: analogRead(“Analog In”) ● Λειτουργία: Επιστρέφει μία ακέραια τιμή από

το 0 έως 1023 που αντιπροσωπεύει την διαφορά δυναμικού στην θύρα που έχουμε επιλέξει. (1023 = 5V)

Page 3: IEEE NTUA SB - Arduino Workshop vol 2

IEEE NTUA Student Branch

Page 4: IEEE NTUA SB - Arduino Workshop vol 2

IEEE NTUA Student Branch

+5V

GND

A0

Page 5: IEEE NTUA SB - Arduino Workshop vol 2

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

Εκκίνηση σειριακής επικοινωνίας με τον υπολογιστή.

Page 6: IEEE NTUA SB - Arduino Workshop vol 2

IEEE NTUA Student Branch

Από αριθμούς σε VoltΜε απλή μέθοδο των τριών:

Όταν η συνάρτηση analogRead() δίνει 1023, δίνουμε στην θύρα 5.0 Volt.

Όταν η συνάρτηση analogRead() δίνει α, δίνουμε στην θύρα x (?) Volt.

Άρα καταλήγουμε στον τύπο (σε γλώσσα C): x = (5.0/1023)*α

Page 7: IEEE NTUA SB - Arduino Workshop vol 2

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.

Page 8: IEEE NTUA SB - Arduino Workshop vol 2

IEEE NTUA Student Branch

Η συνάρτηση map()

● Σύνταξη: map(“value”, “fromLow”, “fromHigh”, “toLow”, “toHigh”)

● Λειτουργία: Δέχεται στο πεδίο value μια μεταβλητή, στο πεδίο fromLow το κάτω άκρο των τιμών της, στο fromHigh το άνω άκρο των τιμών της και την μετατρέπει ώστε να περιορίζεται μεταξύ δύο νέων άνω και κάτω άκρων που δίνονται στα πεδία toLow και toHigh αντίστοιχα. Οι ενδιάμεσες τιμές της, πάνε αναλογικά.

Page 9: IEEE NTUA SB - Arduino Workshop vol 2

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);}

Παράδειγμα - Εφαρμογή

Page 10: IEEE NTUA SB - Arduino Workshop vol 2

IEEE NTUA Student Branch

Fade A Led: vol. 2

GND

LED (pin 10)

Page 11: IEEE NTUA SB - Arduino Workshop vol 2

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.

Page 12: IEEE NTUA SB - Arduino Workshop vol 2

IEEE NTUA Student Branch

Λίγα λόγια για τις διαδικασίες...

void newMethod(int a; float b; ...) { ………………………...}

void setup() { ……………………….. newMethod(j, b);}

void loop() { ………………………..}

Όνομα Διαδικασίας

Δηλώσεις Παραμέτρων

Κλήση Διαδικασίας

ή

Page 13: IEEE NTUA SB - Arduino Workshop vol 2

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);}

Διαδικασία για το αναβόσβησμα

Page 14: IEEE NTUA SB - Arduino Workshop vol 2

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

Page 15: IEEE NTUA SB - Arduino Workshop vol 2

IEEE NTUA Student Branch

Big ChallengeΘέλουμε να μετρήσουμε την διαφορά δυναμικού στα άκρα του ποτενσιομέτρου (Volt) με ακρίβεια ενός δεκαδικού ψηφίου.

Όμως, θέλουμε να κάνουμε την συσκευή μέτρησής μας, φορητή. Δηλαδή, να μην χρειάζεται υπολογιστής για να προβάλουμε τα αποτελέσματα. Για τον σκοπό αυτό, επειδή γνωρίζουμε πώς να συνδέουμε και να ελέγχουμε λυχνίες LED, θα “εκτυπώνουμε” τα αποτελέσματα των μετρήσεών μας με την χρήση 2 LED ως εξής:

● Το πρώτο LED θα παρουσιάζει τις μονάδες.● Το δεύτερο LED θα παρουσιάζει τις δεκάδες.● Κάθε LED θα αναβοσβήνει τόσες φορές όσο και ο

αριθμός που πρέπει να δείξει. ● Πρώτα θα δείχνει τον αριθμό του το πρώτο LED και με

καθυστέρηση 3 δευτερολέπτων θα δείχνει τον αριθμό του το δεύτερο LED.

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

Δίνονται τα εξής: 2 LED, 1 ποτενσιόμετρο, 1 διακόπτης, 1 αντίσταση (10kΩ)

Page 16: IEEE NTUA SB - Arduino Workshop vol 2

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;}

Συνάρτηση εξαγωγής δέκατων

Page 17: IEEE NTUA SB - Arduino Workshop vol 2

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

Page 18: IEEE NTUA SB - Arduino Workshop vol 2

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