5. Επικοινωνία με το Serial Monitor Λήψη δεδομένων

Το Serial Monitor είναι ένα από τα σημαντηκότερα εργαλεία του Arduino IDE 2. Επιτρέπει την επικοινωνία μεταξύ του υπολογιστή και της πλακέτας Arduino μέσω σειριακής σύνδεσης και χρησιμοποιείται τόσο για την εμφάνιση πληροφοριών από το Arduino προς τον υπολογιστή όσο και για την αποστολή δεδομένων από τον υπολογιστή προς το Arduino.

Η εμφάνισή του είναι απλή και οργανωμένη, καθώς παρέχει έναν χώρο όπου εμφανίζονται τα μηνύματα και οι τιμές που στέλνει το Arduino, ενώ διαθέτει επίσης πεδίο για την αποστολή δεδομένων προς την πλακέτα. Επιπλέον, μπορούμε να επιλέξουμε την ταχύτητα επικοινωνίας (baud rate) και τη μορφή με την οποία αποστέλλονται τα δεδομένα. Για να ανοίξουμε το παράθυρο του Serial Monitor του υπολογιστή πλοηγούμαστε ως εξής: Tools>Serial Monitor.

Με την βοήθεια του Serial Monitor μπορούμε για παράδειγμα να εμφανίζουμε τις τιμές ενός αισθητήρα, να ελεγχουμε αν ένα πρόγραμμα δουλεύει σωστά, να εντοπίζουμε σφάλματα, να παρακολουθούμε μεταβλητές κ.ά. Το περιβάλλον Arduino IDE 2 διαθέτει ενσωματωμένο Serial Monitor. Το Serial Monitor λειτουργεί σαν ένα παράθυρο αμφίδρομης σειριακής επικοινωνίας μεταξύ Arduino και Υπολογιστή.

Πριν χρησιμοποιήσουμε τη σειριακή επικοινωνία, πρέπει να την αρχικοποιήσουμε. Η βασική εντολή γι’ αυτό το σκοπό είναι:

Serial.begin(9600);

Συνήθως τοποθετείται μέσα στη setup()

void setup() {
   Serial.begin(9600);
}

Το 9600 είναι η ταχύτητα επικοινωνίας, γνωστή ως band rate και καθορίζει την ταχύτητα με την οποία πραγματοποιείται η σειριακή επικοινωνία. Συνηθισμένες τιμές είναι: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 Θα πρέπει να προσέξουμε ότι η ταχύτητα που χρησιμοποιεί το Arduino να αντιστοιχεί στη ρύθμιση ταχύτητας που έχουμε κάνει στο Serial Monitor

Ένα πολύ απλό πρόγραμμα αποστολής δεδομένων στο Serial Monitor είναι το ακόλουθο:

void setup(){
   Serial.begin(9600);
}
void loop(){
   Serial.println(“Hello from Arduino”);
   delay(1000);
}

Το πρόγραμμα αυτό χρησιμοποιεί την εντολή: Serial.println(“Hello from Arduino”); για να στείλει στο παράθυρο του Serial Monitor το αλφαριθμητικό: “Hello from Arduino” κάθε δευτερόλεπτο.

Η εντολή Serial.print() στέλνει δεδομένα χωρίς να προσθέσει αυτόματα αλλαγή γραμμής. Για παράδειγμα:

Serial.print(“Hello “);
Serial.print(“Arduino”);

θα εμφανίσει:
Hello Arduino

Η εντολή Serial.println() λειτουργεί όπως η Serial.print(), αλλά στο τέλος προσθέτει αλλαγή γραμμής. Για παράδειγμα:

Serial.println(“Hello”);
Serial.println(“Arduino”);

εμφανίζει στο Serial Monitor το αποτέλεσμα:
Hello
Arduino

Μπορούμε να εμφανίσουμε στο Serial Monitor την τιμή μιας μεταβλητής με την συνάρτηση println() όπως στο ακόλουθο παράδειγμα:

int counter = 10;
void setup(){
   Serial.begin(9600);
   Serial.println(counter);
}
void loop(){
}

και έχουμε το ακόλουθο αποτέλεσμα:
10

Για την εμφάνιση διαδοχικών δεδομένων στο Serial Monitor, όπως αλφαριθμηκών και τιμών μεταβλητών, πρέπει να χρησιμοποιούμε ξεχωριστές συναρτήσεις print() ή println()

int temperature = 25;
int humidity = 60;
void setup() {
   Serial.begin(9600);
   Serial.print("Temperature: ");
   Serial.print(temperature);
   Serial.println(" C");
   Serial.print("Humidity: ");
   Serial.print(humidity);
   Serial.println(" %");
}
void loop() {
}

Αυτό έχει ως αποτέλεσμα:
Temperature: 25 C
Humidity: 60 %

Το Arduino μπορεί να εμφανίσει αριθμούς κινητής υποδιαστολής στο Serial Monitor όπως στο ακόλουθο παράδειγμα:

float voltage=3.14159
void setup() {
   Serial.begin(9600);
   Serial.println(voltage);
}
void loop() {
}

Μπορούμε επίσης να καθορίσουμε πόσα δεκαδικά ψηφία θέλουμε. π.χ η συνάρτηση Serial.println(voltage, 2);

θα εμφανίσει:
3.14

ενώ η συνάρτηση: Serial.println(voltage, 4); θα εμφανίσει:
3.1416

Οι Serial.print() και Serial.println() μπορούν να εμφανίσουν ακέραιους αριθμούς σε διαφορετικές βάσεις. Για παράδειγμα:

int number = 255;
void setup() {
   Serial.begin(9600);
   Serial.println(number);
   Serial.println(number, DEC);
   Serial.println(number, HEX);
   Serial.println(number, OCT);
   Serial.println(number, BIN);
}
void loop() {
}

Αυτό έχει το ακόλουθο αποτάλεσμα στο Serial Monitor
255
255
FF
377
11111111

Ακολουθεί ένας πίνακας βάσεων αριθμών που χρησιμοποιούνται στην πλατφόρμα Arduino

ΌνομαΒάσηΠεριγραφή
DEC10Δεκαδικό σύστημα
HEX16Δεκαεξαδικό σύστημα
OCT8Οκταδικό σύστημα
BIN2Δυαδικό σύστημα

Για την εμφάνιση ακεραίων αριθμών σε δυαδική μορφή, έχουμε το ακόλουθο παράδειγμα:

int value = 10;
void setup() {
   Serial.begin(9600);
   Serial.print("Decimal: ");
   Serial.println(value, DEC);
   Serial.print("Binary: ");
   Serial.println(value, BIN);
}
void loop() {
}

Έχουμε το αποτέλεσμα:
Decimal: 10
Binary: 1010

Αυτό είναι ιδιαίτερα χρήσιμο όταν δουλεύουμε με: bit, registers, flags, ψηφιακά πρωτόκολλα, low-level προγραμματισμό.

Η συνάρτηση Serial.write() είναι διαφορετική από την Serial.print(). Η συνάρτηση print() είναι σχεδιασμένη για αναγνωσιμη μορφή κειμένου, ενώ η write() στέλνει δεδομένα bytes σε μορφή χαρακτήρων ASCII.

Για παράδειγμα η συνάρτηση με όρισμα την τιμή 65 και συγκεκριμένα η Serial.write(65); στέλνει το byte 65 όπου το ASCII 65 αντιστοιχει στον χαρακτήρα Α. Έτσι το Serial Monitor μπορεί να εμφανίσει:
Α

Η συνάρτηση Serial.write(‘A’) στέλνει τον χαρακτήρα Α. Για παράδειγμα:

void setup() {
   Serial.begin(9600);
   Serial.write('H');
   Serial.write('i');
}
void loop() {
}

Έχουμε το αποτέλεσμα:
Hi

Μπορούμε να στείλουμε έναν πίνακα bytes στο Serial Monitor, όπως στο ακόλουθο παράδειγμα:

byte data[] = {65, 66, 67, 68};
void setup() {
   Serial.begin(9600);
   Serial.write(data, 4);
}
void loop() {
}

Στο Serial Monitor έχουμε το αποτέλεσμα:
ABCD

Στον κώδικα αυτό το data είναι ένας δείκτης στην πρώτη τιμή του πίνακα data[] ο οποίος έχει 4 στοιχεία τύπου byte. Η Serial.write() είναι ιδιαίτερα σημαντική όταν επικοινωνούμε με άλλες συσκευές μέσω πρωτοκόλλων όπου τα δεδομένα δεν είναι απλό κείμενο.