Τρίτη 29 Οκτωβρίου 2019

Αλλαγή κατάστασης LED με την βοήθεια κουμπιού


Σήμερα στο συγκεκριμένο επεισόδιο θα δούμε πως με την βοήθεια ενός κουμπιού μπορούμε να αλλάξουμε την κατάσταση του LED και να την διατηρήσουμε μέχρι να ξαναπατήσουμε το κουμπί.

Ο κώδικας που χρησιμοποιήθηκε είναι:

const int LED = 13;
const int BUTTON = 7;
int val = 0;
int old_val = 0;
int state = 0;
void setup() {
 pinMode(LED, OUTPUT);
 pinMode(BUTTON, INPUT);
}
void loop(){
val = digitalRead(BUTTON);
if ((val == HIGH) && (old_val == LOW)){
 state = 1 - state;
 delay(10);
}
old_val = val;
if (state == 1) {
 digitalWrite(LED, HIGH);
} else {
 digitalWrite(LED, LOW);
}
}


Ενώ το κύκλωμα που υλοποιήθηκε είναι:


Πως να αναβοσβήσουμε το LED στο Arduino


Στο επεισόδιο αυτό θα μάθουμε τον κώδικα αλλά και το κύκλωμα οπου θα μπορούμε να ορίσουμε να αναβοσβήνει ένα LED με συγκεκριμένη συχνότητα που θα του ορίσουμε εμείς.

Ο κώδικας που χρησιμοποιήθηκε είναι ο εξής:


const int LED = 13;
void setup()
{
 pinMode(LED, OUTPUT);
}
void loop()
{
 digitalWrite(LED, HIGH);
 delay(1000);
 digitalWrite(LED, LOW);
 delay(1000);
}


Ενώ το κύκλωμα που υλοποιήθηκε είναι:

Βασικές Έννοιες


Στο πρώτο επεισόδιο της σειράς θα μάθουμε κάποιες βασικές έννοιες για την γλώσσα προγραμματισμου που αναγνωρίζει το Arduino πριν προχωρήσουμε στα project που θα κάνουμε.

Η γλώσσα ονομάζεται Wiring και είναι όμοια με την C++ ευρέως διαδεδομένη για προγραμματισμό σε υπολογιστές.


Συναρτήσεις

Οι συναρτήσεις και πληροφορίες για τις εντολές της γλώσσας προγραμματισμού μπορούν να βρεθούν εδώ: Official Page Language Reference


Γράφοντας προγράμματα στο Arduino IDE

Θα ξεκινήσουμε χωρίζοντας το πρόγραμμα μας σε τρία μέρη: την δομή, τις μεταβλητές & σταθερές και τις συναρτήσεις. Πρώτα θα δούμε το κομμάτι της δομής. Η δομή ενός προγράμματος Arduino χωρίζετε σε τρία μέρη με την ακόλουθη σειρά: την δήλωση μεταβλητών, το κομμάτι κώδικα που περιέχει την αρχικοποίηση καταστάσεων και μεταβλητών καθώς και τον κώδικα που θέλουμε να τρέξει μόνο μια φορά στο Arduino και το κομμάτι του κώδικα loop() που περιέχει το κυρίως πρόγραμμα μας και θα τρέχει συνέχεια, μέχρι να βγάλουμε το Arduino απ' το ρεύμα. Δείτε την παρακάτω εικόνα:
Picture
Οι μεταβλητές παίζουν πολύ σημαντικό ρόλο στην σύνταξη του κώδικα μας καθώς αλλάζοντας τις τιμές τους κατά την διάρκεια εκτέλεσης του προγράμματος μπορούμε να επιτύχουμε διάφορες λειτουργίες. Μπορούν να πάρουν διάφορες τιμές όπως νούμερα, χαρακτήρες, και τα δύο ή να έχουν λογική τιμή True ή False (αληθής-ψευδής). Ανάλογα με την τιμή αυτή τις αρχικοποιούμε ή τις δηλώνουμε αντίστοιχα στο πρώτο τμήμα της δομής του προγράμματος μας όπως παρακάτω (τύπος όνομα_μεταβλητής):
  • int number  Ακέραιους αριθμούς απ' το -32.768 μέχρι 32.768
    ( π.χ. int number = 500 ;  ή int arnitikos = -5 ; )
  • float number1 Δεκαδικούς αριθμούς
    ( π.χ. float number1 = 0.0015 ; ή float number_2 = 15.025 ; )
  • char onoma Γράμματα αλλά και αριθμούς
    ( π.χ. char onoma='Michalis'; ή char gramma='A'; ή char allo='AB32b'; )
  • boolean state Τιμή true ή false
    ( π.χ.boolean state1 = true ; ή boolean state2 = false ; )
Κάθε όνομα που δίνουμε σε μια μεταβλητή ή σταθερή θα πρέπει να υπάρχει μόνο μια φορά μέσα στον κώδικα μας. Το όνομα που θα δώσουμε πρέπει να είναι γραμμένο με αγγλικούς χαρακτήρες και δεν μπορεί να ξεκινάει με νούμερο. Όπως παρατηρήσατε στα παραπάνω παραδείγματα μετά την χρήση κάποιας μεταβλητής βάζουμε το ελληνικό ερωτηματικό ';' ως χαρακτήρα τερματισμού.
Στις σταθερές ισχύει ότι και παραπάνω αλλά πριν τον τύπο βάζουμε το χαρακτηριστικό 'const' (const τύπος όνομα_σταθερής). Μια σταθερή την χρησιμοποιούμε σαν συντόμευση μέσα στο πρόγραμμα μας αποφεύγοντας να γράφουμε τιμές τις οποίες μπορεί να ξεχάσουμε παρακάτω.
( π.χ. const int statheri_timi = 58 ; ) Μια μεταβλητή μπορεί να μην έχει αρχική τιμή και η τιμή της να υπολογίζεται μετά από εκτέλεση κάποιας εντολής μέσα στο πρόγραμμα, όμως μια σταθερή πρέπει να έχει υποχρεωτικά τιμή, αλλιώς τι σταθερή είναι?

Φυσικά δεν μπορούμε να δούμε όλες τις συναρτήσεις που υπάρχουν, θα αναφερθούμε στις πιο σημαντικές - βασικές. Οι συναρτήσεις του Arduino αποτελούν βασικό παράγοντα στον προγραμματισμό του μικρο ελεγκτή μας καθώς αυτές συνδέουν πολύ εύκολα το Arduino uno με τα υπόλοιπα στοιχεία του κυκλώματος μας. (π.χ. led, κουμπιά/διακόπτες, οθόνη LCD, ηχείο).

  • pinMode(pin, mode) ;
    Είναι πολύ σημαντικό να "πούμε" στο Arduino εάν ο ακροδέκτης/pin που έχουμε συνδέσει με το στοιχείο του κυκλώματος μας είναι είσοδος ή έξοδος, εάν δηλαδή θα λάβει ή θα στείλει κάποιο σήμα. Για παράδειγμα εάν έχουμε κάποιο led, θέλουμε να στείλουμε σήμα να ανάψει ή να σβήσει, άρα το pin που το έχουμε συνδέσει στο Arduino uno θα πρέπει να το δηλώσουμε ως έξοδο. Αντίστοιχα, εάν έχουμε ένα κουμπί/διακόπτη, θέλουμε να λάβουμε ένα σήμα στο Arduino uno όταν ενεργοποιηθεί για να κάνει κάποια λειτουργία, άρα το pin θα το δηλώσουμε ως είσοδο. π.χ. pinMode(5,INPUT); ή pinMode(2,OUTPUT);
  • digitalWrite(pin, value); 
    Αφού έχουμε δηλώσει τον ρόλο του pin που μας ενδιαφέρει με την συνάρτηση pinMode πρέπει τώρα να πούμε στο Arduino τι να κάνει με αυτό. Ας δούμε τις λειτουργίες μέσα απο κάποια παραδείγματα. Έστω οτι έχουμε ένα led και θέλουμε να το ανάψουμε, όπως στην εικόνα δίπλα, θα κάνουμε χρήση της συνάρτησης digitalWrite ως εξής: digitalWrite(2, HIGH); Εάν θέλουμε να το σβήσουμε τότε η συνάρτηση αλλάζει και γίνεται: digitalWrite(2, LOW); Με την τιμή HIGH δίνουμε λογικό '1' ή 5V ή Vcc και με την LOW λογικό '0' ή 0V ή GND.
  • όνομα_μεταβλητής=digitalRead(pin);
    Με την digitalRead αντίστοιχα λέμε στο Arduino να διαβάσει μια τιμή. Η τιμή αυτή και εδώ μπορεί να είναι HIGH ή LOW. Έτσι για παράδειγμα εάν έχουμε ένα κουμπί, όπως στην εικόνα παραπάνω, το οποίο όταν τον πατάμε περνάει ρεύμα, τότε το διαβάζουμε ως εξής:
    timi=digitalRead(5); και η τιμή που θα πάρει θα είναι HIGH. Μόλις σταματήσουμε να τον πατάμε η τιμή θα γίνει LOW.
  • analogWrite(pin, value);
    Με την συνάρτηση digitalWrite είδαμε οτι μπορούμε να δώσουμε έξοδο με μόνο δυο τιμές, HIGH και LOW. Τι γίνεται όμως όταν θέλουμε να χαμηλώσουμε τον φωτισμό σε ένα led ή να περιστρέψουμε ένα DC μοτερ με λιγότερη ταχύτητα; Σαν σκέψη θα λέγαμε να δώσουμε λιγότερη τάση, π.χ. 2.5V αντί για 5V στο μοτέρ μας για να περιστρέφετε με την μισή ταχύτητα, αλλά δεν γίνεται αυτό. Έτσι για να το πετύχουμε στο Arduino χρησιμοποιούμε την συνάρτηση analogWrite η οποία μπορεί να πάρει τιμές από 0 έως 255. Η λειτουργία αυτή λέγετε Pulse Width Modulation - PWM και στo Arduino uno μπορούμε να την χρησιμοποιήσουμε στα pin 3, 5, 6, 9, 10 και 11. Αυτό που κάνει είναι να στέλνει παλμούς, φανταστείτε το σαν έναν διακόπτη που ανοιγοκλείνει πολύ γρήγορα. Έτσι εάν θέλαμε να περιστρέψουμε ένα μοτέρ με την μισή ταχύτητα θα κάναμε χρήση της συνάρτησης ως εξής: analogWrite(3,127); Η εικόνα δίπλα θα σας βοηθήσει να καταλάβετε την λειτουργία των παλμών.
  • όνομα_μεταβλητής=analogRead(pin);
    Την συνάρτηση analogRead την χρησιμοποιούμε όταν θέλουμε να διαβάσουμε μια αναλογική τιμή, π.χ. από ένα αισθητήρα θερμοκρασίας, αισθητήρα υπερήχων, αισθητήρα υπερύθρων. Οι τιμές που μπορεί να διαβάσει είναι από 0 έως 1023. Τα διαθέσιμα analog pins του Arduino uno είναι απ'το Α0 έως το Α5. 




Συγκριτικοί τελεστές

Το αποτέλεσμα των συγκριτικών τελεστών είναι πάντα λογικού τύπου. (αληθής ή ψευδής)
  • <= ή ≤ (μικρότερο ή ίσο)
  • < (μικρότερο)
  • = (ίσον)
  • <> (διάφορο)
  • > (μεγαλύτερο)
  • >= ή ≥ (μεγαλύτερο ή ίσο)

Λογικοί τελεστές

Οι λογικοί τελεστές, ΚΑΙ, Ή, ΟΧΙ, εφαρμόζονται πάνω σε λογικές εκφράσεις (δηλαδή εκφράσεις που το αποτέλεσμά τους είναι αληθής ή ψευδής). Το αποτέλεσμά τους είναι πάλι λογικού τύπου δεδομένων.
  • && (και)
  • || (ή)
  • ΝΟΤ (όχι)




Θα ήθελα να ευχαριστήσω το https://www.ardumotive.com/ για τα λαμπρά άρθρα και παραδείγματα που έχει διότι ήταν η πηγή έμπνευσης για να ασχολήθω και εγώ με Arduino.