Έλεγχος arduino, αισθητήρων και ενεργοποιητών με σειριακή επικοινωνία

Έλεγχος arduino, αισθητήρων και ενεργοποιητών με σειριακή επικοινωνία

Επίπεδο Δυσκολίας

Στο εργαστήριο αυτό, θα μάθουμε πώς να συνδέουμε στο Arduino διάφορους αισθητήρες, λαμπάκια LED και laser, και να τα ελέγχουμε μέσω σειριακής επικοινωνίας. Θα χρησιμοποιήσουμε είτε τον υπολογιστή μας είτε το κινητό μας τηλέφωνο μέσω Bluetooth για να στέλνουμε εντολές στα εξαρτήματα και να τα ενεργοποιούμε ή να τα απενεργοποιούμε.

Βήμα 1ο σύνδεση με breadboard

Καθώς θα συνδέσουμε αρκετά εξαρτήματα στο Arduino, που όλα χρειάζονται παροχή ρεύματος και γείωση, θα χρησιμοποιήσουμε ένα breadboard. Αρχικά, θα συνδέσουμε τις υποδοχές 5V και GND από το Arduino και στις δύο πλευρές του breadboard, ώστε να μπορούμε να τροφοδοτήσουμε τα εξαρτήματα εύκολα. Προτείνουμε, πριν ξεκινήσετε, να μελετήσετε πρώτα το εργαστήριο για το breadboard που υπάρχει στο site μας.

Από την υποδοχή 5V του Arduino συνδέουμε ένα κόκκινο καλώδιο στην κόκκινη ράγα του breadboard, ενώ από την υποδοχή GND (γείωση) του Arduino συνδέουμε ένα μαύρο καλώδιο στη μπλε ράγα. Ενώνουμε επίσης τις δύο κόκκινες ράγες με ένα κόκκινο καλώδιο και τις δύο μπλε ράγες με ένα μαύρο καλώδιο. Τώρα, όλα τα pin στις κόκκινες ράγες θα παρέχουν 5V και όλα τα pin στις μπλε ράγες θα λειτουργούν ως γείωση.

Βήμα 2ο σύνδεση με ένα απλό led λαμπάκι

Αρχικά, θα συνδέσουμε ένα απλό LED στο Arduino, το οποίο θα ανάβει όταν κάποιοι αισθητήρες ανιχνεύουν επικίνδυνες τιμές. Τα LED έχουν δύο ποδαράκια: το μακρύ ποδαράκι είναι η άνοδος, απ’ όπου περνάει το ρεύμα, και το κοντό είναι η κάθοδος, που συνδέεται με τη γείωση για να ολοκληρωθεί το κύκλωμα.

Αν και η σύνδεση είναι εύκολη, είναι σημαντικό να ξέρουμε ότι τα LED δεν αντέχουν μεγάλη ένταση ρεύματος. Έτσι, υπάρχει ο κίνδυνος να τα κάψουμε αν τα συνδέσουμε κατευθείαν στο Arduino χωρίς μια μικρή αντίσταση. Η μόνη υποδοχή που δεν χρειάζεται αντίσταση είναι η D13, καθώς έχει ήδη ενσωματωμένη. Για όλες τις άλλες υποδοχές, προσθέτουμε μια αντίσταση περίπου 200Ω. Σημείωση: Καλό είναι να δείτε το εργαστήριο για τα LED πριν προχωρήσετε.

Από την υποδοχή D2 του Arduino φέρνω ένα μπλε καλώδιο το οποίο θα συνδεθεί αρχικά με μια αντίσταση 200Ω. Η αντίσταση με την σειρά της θα συνδεθεί στο μακρύ πόδι από το led και το κοντό πόδι του led θα συνδεθεί με την γείωση.

Βήμα 3ο δοκιμή με το Arduino IDE

Το Arduino IDE είναι το κύριο πρόγραμμα που χρησιμοποιούμε για να προγραμματίσουμε τις πλακέτες Arduino και μπορούμε να το κατεβάσουμε δωρεάν από τη διεύθυνση https://www.arduino.cc/en/software/. Για να ξεκινήσουμε τον προγραμματισμό, συνδέουμε το Arduino στον υπολογιστή μας με το καλώδιο USB και επιλέγουμε την πλακέτα μας από το μενού ‘Select Board’

Στην δική μου περίπτωση επειδή χρησιμοποιώ έναν κλώνο Arduino και όχι την επίσημη πλακέτα μου βγάζει ότι η συσκευή είναι άγνωστη. Επιλέγω την θύρα και συνεχίζω
Αφού δεν αναγνώρισε την πλακέτα θα πρέπει εγώ να επιλέξω ποια είναι από τις διαθέσιμες.
Πληκτρολογώ την λέξη uno και βρίσκω την πλακέτα Arduino Uno. Την τσεκάρω και πατάω το OK
Τώρα πλέον πάνω από τον κώδικα μου γράφει την σωστή πλακέτα (Arduino Uno)

Τώρα θα γράψω το παρακάτω πρόγραμμα για να δοκιμάσω το κύκλωμα μου. Θα προσπαθήσω να κάνω το λαμπάκι να αναβοσβήνει κάθε δευτερόλεπτο.

void setup() {
  // Ότι γράφουμε στο setup εκτελείται μια φορά στην αρχή
  pinMode(2, OUTPUT);
}

void loop() {
  // Ότι γράφουμε στο loop εκτελείται συνέχεια
  digitalWrite(2, HIGH);
  delay(1000);
  digitalWrite(2, LOW);
  delay(1000);
}

Κάθε πρόγραμμα που γράφουμε για το Arduino χωρίζεται σε δύο βασικά μέρη:

  1. Η συνάρτηση setup: Εδώ βάζουμε εντολές που θα εκτελεστούν μόνο μία φορά, όταν το Arduino ξεκινήσει. Στο παράδειγμά μας, δηλώνουμε το pinMode για να δείξουμε στο Arduino ότι το pin 2 θα χρησιμοποιηθεί ως έξοδος (δηλαδή, για να στέλνουμε εντολές).
  2. Η συνάρτηση loop: Αυτή η συνάρτηση εκτελείται συνεχώς όσο το Arduino είναι ανοιχτό. Εδώ χρησιμοποιούμε την εντολή digitalWrite για να στέλνουμε είτε 5V (HIGH) είτε 0V (LOW) στο pin που δηλώνουμε. Με την εντολή delay προσθέτουμε καθυστέρηση (σε χιλιοστά του δευτερολέπτου) ανάμεσα στις εντολές μας.

Κάθε εντολή τελειώνει με ελληνικό ερωτηματικό (;). Η συνάρτηση setup και η συνάρτηση loop περιέχουν τις εντολές τους μέσα σε αγκύλες { }. Κάθε συνάρτηση έχει επίσης παρενθέσεις () δίπλα από το όνομά της, όπου μπορούμε να βάλουμε παραμέτρους αν χρειαστεί (εδώ δεν χρειάζονται). Η λέξη void πριν από το όνομα κάθε συνάρτησης σημαίνει ότι δεν επιστρέφει κάποιο αποτέλεσμα, αλλά απλώς εκτελεί εντολές.

Για να στείλω το πρόγραμμά μου στο Arduino, πρέπει πρώτα να κάνω επαλήθευση (verify) και μετά να το φορτώσω στην πλακέτα (upload), χρησιμοποιώντας τα δύο κουμπιά που βρίσκονται πάνω αριστερά στο IDE

Το πλήκτρο με το “τικ” κάνει την επαλήθευση του κώδικα και το πλήκτρο με το δεξί βέλος το στέλνει στο Arduino

Αν όλα πάνε καλά μετά την αποστολή του προγράμματος θα πρέπει να βλέπουμε το λαμπάκι μας να αναβοσβήνει κάθε δευτερόλεπτο.

Βήμα 4ο προσθήκη αισθητήρα φωτός

Ο αισθητήρας φωτός που θα χρησιμοποιήσουμε είναι μια μονάδα που περιλαμβάνει έναν φωτοαντιστάτη (LDR – Light Dependent Resistor). Οι LDR είναι υλικά που αλλάζουν την ηλεκτρική τους αντίσταση ανάλογα με το φως που δέχονται. Το βασικό υλικό που χρησιμοποιείται είναι το θειούχο κάδμιο (CdS), το οποίο αυξάνει ή μειώνει την αγωγιμότητά του ανάλογα με την ένταση του φωτός.

  • Όταν υπάρχει πολύ φως, η αντίσταση του LDR μειώνεται, κι έτσι το ρεύμα περνάει πιο εύκολα.
  • Όταν υπάρχει λίγο φως ή σκοτάδι, η αντίσταση αυξάνεται, κι έτσι το ρεύμα περνάει πιο δύσκολα.

Η μονάδα του αισθητήρα έχει 4 pin:

  1. 5V: Συνδέεται στην κόκκινη ράγα του breadboard.
  2. GND: Συνδέεται στην μπλε ράγα του breadboard.
  3. A0: Επιστρέφει μια αριθμητική τιμή από 0 έως 1024, ανάλογα με το φως. Συνδέεται σε αναλογική θύρα του Arduino (εδώ θα χρησιμοποιήσουμε το A0).
  4. D0: Επιστρέφει είτε 0 είτε 1, ανάλογα με το αν περνάει ρεύμα ή όχι. Η ευαισθησία του μπορεί να ρυθμιστεί με κατσαβίδι στο ποτενσιόμετρο.
Συνδέουμε το GND του αισθητήρα με την μπλε ράγα, το 5V του αισθητήρα με την κόκκινη ράγα και την υποδοχή A0 του αισθητήρα με το pin Α0 του Arduino

Αφού κάνουμε τις συνδέσεις θα φορτώσουμε τώρα ένα νέο πρόγραμμα στο Arduino το οποίο θα διαβάζει διαρκώς (με μια καθυστέρηση μισού δευτερολέπτου) την τιμή που έρχεται από τον αισθητήρα στην θύρα Α0 και θα την στέλνει στον υπολογιστή μέσω σειριακής επικοινωνίας (Serial Communication)

void setup() {
  // Ενεργοποιούμε την σειριακή επικοινωνία με ταχύτητα 9600bps
  Serial.begin(9600);
}

void loop() {
  // Διαβάζουμε τα δεδομένα στην θύρα A0 τα οποία στέλνει ο αισθητήρας φωτός και τα στέλνουμε την σειριακή επικοινωνία
  Serial.println(analogRead(A0));
  // Κάνουμε μια μικρή καθυστέρυση μισού δευτερολέπτου
  delay(500); 
}

Αφού φορτώσουμε το πρόγραμμα, μπορούμε τώρα να ανοίξουμε το σειριακό μόνιτορ στον υπολογιστή και να δούμε τι τιμές μας στέλνει το Arduino

Από το μενού tools διαλέγω Serial Monitor

Αν όλα πάνε καλά στο κάτω μέρος του παραθύρου θα βλέπω τις τιμές που μου στέλνει ο αισθητήρας. Δοκιμάστε να καλύψετε πλήρως τον αισθητήρα με το χέρι σας ώστε να μην βλέπει καθόλου φως. Τι τιμή επιστρέφει; Επίσης δοκιμάστε να φωτίσετε με φακό τον αισθητήρα ώστε να δείτε ποια είναι η μέγιστη τιμή του; Οι τιμές αυτές θα μας χρειαστούν παρακάτω.

Βήμα 5ο προσθήκη αισθητήρα φωτιάς

Ο αισθητήρας φλόγας μπορεί να ανιχνεύσει το φως που προέρχεται από μια φλόγα και να μετρήσει την έντασή του. Είναι ειδικά σχεδιασμένος να εντοπίζει το υπεριώδες (UV) ή το υπέρυθρο (IR) φως που εκπέμπει μια φλόγα.

Όπως και ο αισθητήρας φωτός, η μονάδα του αισθητήρα φλόγας έχει 4 pin:

  1. 5V: Συνδέεται στην κόκκινη ράγα του breadboard.
  2. GND: Συνδέεται στην μπλε ράγα του breadboard.
  3. A0: Επιστρέφει μια αριθμητική τιμή από 0 έως 1024, ανάλογα με την ένταση της φλόγας. Συνδέεται σε αναλογική θύρα του Arduino (εδώ θα χρησιμοποιήσουμε το A1).
  4. D0: Επιστρέφει είτε 0 είτε 1, ανάλογα με το αν υπάρχει φλόγα. Η ευαισθησία του μπορεί να ρυθμιστεί με κατσαβίδι στο ποτενσιόμετρο.

Τώρα θα κάνουμε μερικές προσθήκες στο πρόγραμμα μας ώστε να διαβάζει ταυτόχρονα και τους δύο αισθητήρες και να στέλνει το αποτέλεσμα στην σειριακή επικοινωνία. Θα προσθέσουμε άλλη μια εντολή Serial.println και εκτός από τις τιμές θα βάζουμε και τίτλους για να ξέρουμε τι δεδομένα έρχονται.

void setup() {
  // Ενεργοποιούμε την σειριακή επικοινωνία με ταχύτητα 9600bps
  Serial.begin(9600);
}

void loop() {
  // Διαβάζουμε τα δεδομένα στην θύρα A0 τα οποία στέλνει ο αισθητήρας φωτός και τα στέλνουμε την σειριακή επικοινωνία
  Serial.print("Light Sensor: ");
  Serial.println(analogRead(A0));
  Serial.print("Flame Sensor: ");
  Serial.println(analogRead(A1));
  // Κάνουμε μια μικρή καθυστέρυση μισού δευτερολέπτου
  delay(500); 
}

Δοκιμάστε τώρα να δείτε τι τιμές έρχονται για τον αισθητήρα φλόγας όταν δεν υπάρχει φωτιά και όταν ανάψουμε έναν αναπτήρα κοντά του. Προσοχή μην τον κάψετε!

Βήμα 6ο προσθήκη lazer

Η μονάδα laser λειτουργεί παρόμοια με τα LED. Λαμβάνει σήμα από τις ψηφιακές θύρες του Arduino και μπορεί να ανάβει και να σβήνει. Έχει ενσωματωμένα κυκλώματα αντίστασης, γι’ αυτό η σύνδεσή της είναι πολύ εύκολη.

  1. 5V ή +: Συνδέεται στην κόκκινη ράγα του breadboard.
  2. GND ή -: Συνδέεται στην μπλε ράγα του breadboard.
  3. S (Signal): Συνδέεται στην ψηφιακή θύρα D3 του Arduino για να λαμβάνει το σήμα.

Βήμα 7ο προσθήκη αισθητήρα θερμοκρασίας και υγρασίας

Η μονάδα που θα χρησιμοποιήσουμε περιλαμβάνει τον αισθητήρα DHT11, ο οποίος είναι οικονομικός και μπορεί να μετρήσει τη θερμοκρασία και την υγρασία στον αέρα. Ο αισθητήρας έχει ένα θερμίστορ, που αλλάζει την αντίστασή του ανάλογα με τη θερμοκρασία, ώστε να μετράει πόσο ζεστό ή κρύο είναι το περιβάλλον. Χρησιμοποιεί επίσης ένα υλικό που απορροφά την υγρασία από τον αέρα, αλλάζοντας την αντίστασή του ανάλογα με την ποσότητα της υγρασίας. Έτσι, μπορεί να μετρήσει πόση υγρασία υπάρχει στον αέρα.

Για να τον συνδέσουμε με το Arduino:

  1. Συνδέουμε το + στην κόκκινη ράγα του breadboard.
  2. Συνδέουμε το στην μπλε ράγα του breadboard.
  3. Συνδέουμε το S ή OUT σε μια ψηφιακή θύρα του Arduino (εδώ θα χρησιμοποιήσουμε την D4).

Για να προγραμματίσουμε τον συγκεκριμένο αισθητήρα θα χρειαστεί αρχικά να προσθέσουμε και μια επιπλέον βιβλιοθήκη στο Arduino IDE. Από αριστερά διαλέγουμε το εικονίδιο της βιβλιοθήκης, κάνουμε αναζήτηση με την λέξη dht11 και επιλέγουμε να κάνουμε εγκατάσταση την βιβλιοθήκη DHT11 by Dhruba Saha.

Πάμε τώρα να κάνουμε τις τροποποιήσεις στο πρόγραμμα μας

// Δηλώνουμε ότι θα χρησιμοποιήσουμε την βιβλιοθήκη DHT11
#include <DHT11.h>

// Δημιουργούμε ένα αντικείμενο τύπου DHT11 με όνομα dht11 το οποίο συνδέετε στην θύρα 4
DHT11 dht11(4);

void setup() {
  // Ενεργοποιούμε την σειριακή επικοινωνία με ταχύτητα 9600bps
  Serial.begin(9600);
}

void loop() {

  // Δημιουργούμε δύο μεταβλητές για θερμοκρασία και υγρασία και τις μηδενίζουμε
  int temperature = 0;
  int humidity = 0;

  // Ζητάμε από τον αισθητήρα να διαβάσει τιμές θεμροκρασίας και υγρασίας
  int result = dht11.readTemperatureHumidity(temperature, humidity);


  // Διαβάζουμε τα δεδομένα στην θύρα A0 τα οποία στέλνει ο αισθητήρας φωτός και τα στέλνουμε την σειριακή επικοινωνία
  Serial.print("Light Sensor: ");
  Serial.println(analogRead(A0));
  Serial.print("Flame Sensor: ");
  Serial.println(analogRead(A1));
  Serial.print("Temperature: ");
  Serial.println(temperature);
  Serial.print("Humidity: ");
  Serial.println(humidity);
  // Κάνουμε μια μικρή καθυστέρυση μισού δευτερολέπτου
  delay(500); 
}

Βήμα 8ο Σειριακές εντολές

Τώρα, ας φτιάξουμε ένα πρόγραμμα που θα περιμένει εντολές από τη σειριακή θύρα του υπολογιστή. Ανάλογα με την εντολή που θα δίνουμε, το Arduino θα μας επιστρέφει τιμές από τους αισθητήρες ή θα ανάβει το λαμπάκι και το laser. Τις εντολές θα τις δίνουμε μέσω πληκτρολογίου στο σειριακό μόνιτορ, και μπορούμε να ορίσουμε ποιες εντολές θα χρησιμοποιούμε. Η πρότασή μου είναι οι εξής εντολές:

  • led on: για να ανάβει το λαμπάκι
  • led off: για να σβήνει το λαμπάκι
  • laser on: για να ανάβει το laser
  • laser off: για να σβήνει το laser
  • light sensor: για να ζητάμε την τιμή του αισθητήρα φωτός
  • flame sensor: για να ζητάμε την τιμή του αισθητήρα φλόγας
  • temperature: για να ζητάμε τη θερμοκρασία
  • humidity: για να ζητάμε την υγρασία

Με αυτόν τον τρόπο, θα μπορούμε εύκολα να ελέγχουμε το Arduino και να λαμβάνουμε δεδομένα από τους αισθητήρες.

// Δηλώνουμε ότι θα χρησιμοποιήσουμε την βιβλιοθήκη DHT11
#include <DHT11.h>

// Δημιουργούμε ένα αντικείμενο τύπου DHT11 με όνομα dht11 το οποίο συνδέετε στην θύρα 4
DHT11 dht11(4);

// Η μεταβλητή command θε έχει την εντολή που έρχεται από την σειριακή θύρα
String command;

void setup() {
  // Ενεργοποιούμε την σειριακή επικοινωνία με ταχύτητα 9600bps
  Serial.begin(9600);
  pinMode(2, OUTPUT);
	pinMode(3, OUTPUT);
}

void loop() {
  //Ελέγχουμε αν υπάρχουν εισερχόμενα δεδομένα και θα αποθηκεύουμε στην μεταβλητή command
  if(Serial.available()) {
		command = Serial.readString();
		//Κάνω trim και κόβω κενά και χαρακτήρες enter
    command.trim();
    //Εκτυτπώνω την εντολή που έχει έρθει για έλεγχο
    Serial.print("Command arrived:");
    Serial.println(command);
    //Αν η εντολή είναι led on τότε ανάβω το led
		if(command == "led on") {
			digitalWrite(2, true);
			Serial.println("Led is now on");
		}
		//Αν η εντολή είναι led off τότε σβήνω το led
    if(command.equals("led off")) {
			digitalWrite(2, false);
			Serial.println("Led is now off");
		}
  	//Αν η εντολή είναι laser on τότε ανάβω το laser
		if(command == "laser on") {
			digitalWrite(3, true);
			Serial.println("Laser is now on");
		}
		//Αν η εντολή είναι laser off τότε σβήνω το laser
		if(command == "laser off") {
			digitalWrite(3, false);
			Serial.println("Laser is now off");
		}
		//Αν η εντολή είναι light sensor τότε εκτυπώνω την τιμή του φωτός
    if(command == "light sensor") {
      Serial.print("Light: ");
      Serial.println(analogRead(0));
    }
 		//Αν η εντολή είναι flame sensor τότε εκτυπώνω την τιμή της φλόγας
    if(command == "flame sensor") {
      Serial.print("Flame: ");
      Serial.println(analogRead(1));
    }
 		//Αν η εντολή είναι temperature τότε εκτυπώνω την θερμοκρασία
    if(command == "temperature") {
      int temperature = 0;
      int humidity = 0;
      int result = dht11.readTemperatureHumidity(temperature, humidity);
      Serial.print("Temperature: ");
      Serial.print(temperature);
      Serial.println(" C");
    }
     		//Αν η εντολή είναι humidity τότε εκτυπώνω την υγρασία
    if(command == "humidity") {
      int temperature = 0;
      int humidity = 0;
      int result = dht11.readTemperatureHumidity(temperature, humidity);
      Serial.print("Humidity: ");
      Serial.print(humidity);
      Serial.println(" %");
    }
  }
}

Το πρόγραμμα μας επιτρέπει να δίνουμε εντολές από το σειριακό μόνιτορ για να ελέγχουμε το LED και το laser, και να παίρνουμε τιμές από τους αισθητήρες. Ο αισθητήρας θερμοκρασίας και υγρασίας χρησιμοποιεί μια ειδική βιβλιοθήκη και μας δίνει έτοιμες τιμές: σε βαθμούς Κελσίου για τη θερμοκρασία και σε ποσοστό % για την υγρασία.

Οι αισθητήρες φωτός και φλόγας, όμως, είναι απλοί αναλογικοί και επιστρέφουν τιμές από 0 έως 1024, χωρίς άμεση σύνδεση με κάποια μονάδα μέτρησης. Για να τους κατανοήσουμε καλύτερα, μπορούμε να μετατρέψουμε αυτές τις τιμές σε ποσοστά % με τη συνάρτηση map(τιμή για μετατροπή, από - ελάχιστη, από - μέγιστη, σε - ελάχιστη, σε - μέγιστη). Εδώ θα χρειαστούμε τις τιμές που έχουμε καταγράψει στους δύο αισθητήρες κατά τις δοκιμές μας, για να βρούμε την ελάχιστη και τη μέγιστη τιμή τους

Βήμα 9ο Προσθήκη bluetooth

Ξέρατε ότι και το Bluetooth είναι στην ουσία σειριακή επικοινωνία, μόνο που γίνεται ασύρματα; Αυτό σημαίνει ότι, αφού ρυθμίσαμε τη σειριακή επικοινωνία για το USB καλώδιο και ελέγχουμε το Arduino από τον υπολογιστή, μπορούμε με λίγες αλλαγές να το προσαρμόσουμε ώστε να στέλνει και να λαμβάνει δεδομένα μέσω Bluetooth με το κινητό μας! Έτσι, θα μπορούμε να το ελέγχουμε ασύρματα, κάνοντας τη χρήση του ακόμα πιο διασκεδαστική!

Αρχικά, ας συνδέσουμε τη μονάδα Bluetooth HC-05. Η μονάδα αυτή έχει έξι υποδοχές, αλλά θα χρησιμοποιήσουμε μόνο τις τέσσερις:

  1. VCC: Συνδέεται με την παροχή ρεύματος από το Arduino.
  2. GND: Συνδέεται με τη γείωση.
  3. RX (Receive): Θα λαμβάνει δεδομένα από το Arduino, άρα πρέπει να συνδεθεί σε υποδοχή που στέλνει δεδομένα.
  4. TX (Transmit): Θα στέλνει δεδομένα στο Arduino, οπότε πρέπει να συνδεθεί σε υποδοχή που λαμβάνει δεδομένα.

Το Arduino έχει δύο θύρες επικοινωνίας (RX και TX) στις θέσεις 0 και 1. Όμως, επειδή θέλουμε να κρατήσουμε αυτές για τη σύνδεση με το USB, μπορούμε να χρησιμοποιήσουμε τη βιβλιοθήκη SoftwareSerial, ώστε να ορίσουμε άλλες θύρες για τη σύνδεση Bluetooth.

Επίσης, είναι σημαντικό να ξέρουμε ότι η μονάδα Bluetooth λειτουργεί στα 3.3V, ενώ το Arduino στα 5V. Η θύρα VCC προστατεύεται, αλλά η RX χρειάζεται προστασία. Για να την προστατέψουμε, θα φτιάξουμε ένα κύκλωμα διαιρετή τάσης με δύο αντιστάσεις, μία 1ΚΩ και μία 2ΚΩ.

Προσοχή στη σύνδεση της θύρας RX του Bluetooth. Το καλώδιο που έρχεται από την θύρα 9 του Arduino πρώτα συναντάει μια αντίσταση 1KΩ. Η αντίσταση αυτή πηγαίνει στην θύρα RX του Bluetooth και παράλληλα διακλαδώνεται με μια αντίσταση 2KΩ η οποία πάει στην γείωση. Με αυτόν τον τρόπο τα δεδομένα που έρχονται στην RX έρχονται με τάση 3.3V και έτσι δεν δημιουργούμε πρόβλημα στην μονάδα.

Τώρα θα κάνω και μερικές αλλαγές στο πρόγραμμα μου. Θα χρησιμοποιήσω ένα νέο σειριακό αντικείμενο που θα το ονομάσω btSerial το οποίο θα δουλεύει από τα pin 8 και 9 του Arduino και θα ορίσω να γίνεται η επικοινωνία από αυτό.

// Δηλώνουμε ότι θα χρησιμοποιήσουμε την βιβλιοθήκη DHT11 για τον αισθητήρα θερμοκρασίας και υγρασίας
#include <DHT11.h>

// Δηλώνουμε ότι θα χρησιμοποιήσουμε την βιβλιοθήκη SoftwareSerial
#include <SoftwareSerial.h>

// Δημιουργούμε ένα αντικείμενο τύπου DHT11 με όνομα dht11 το οποίο συνδέετε στην θύρα 4
DHT11 dht11(4);

// Δημιουργούμε ένα αντικείμενο τύπου SoftwareSerial. Δηλώνουμε πως η θύρα υποδοχής (RX) θα είναι η 8 και αποστολής (TX) η 9
SoftwareSerial btSerial (8, 9);

// Η μεταβλητή command θε έχει την εντολή που έρχεται από την σειριακή θύρα
String command;

void setup() {
  // Ορίζουμε τα pin που χρησιμοποιούμε αν είναι για αποστολή ή υποδοχή δεδομένων
  pinMode(2, OUTPUT);  // Στέλνει εντολή στο LED
	pinMode(3, OUTPUT);  // Στέλνει εντολή στο laser
  pinMode(4, INPUT);   // Δέχεται θερμοκρασία - υγρασία
  pinMode(8, INPUT);   // Δέχεται δεδομένα από την μονάδα bluetooth
  pinMode(9, OUTPUT);  // Στέλνει δεδομένα στην μονάδα bluetooth
  
  // Ενεργοποιούμε την σειριακή επικοινωνία με ταχύτητα 9600bps για την απλή θύρα - Καλώδιο USB
  Serial.begin(9600);
  // Ενεργοποιούμε την σειριακή επικοινωνία με ταχύτητα 9600bps για την μονάδα bluetooth
  btSerial.begin(9600);
}

void loop() {
  //Ελέγχουμε αν υπάρχουν εισερχόμενα δεδομένα στην σειριακή επικοινωνία bluetooth και θα αποθηκεύουμε στην μεταβλητή command
  if(btSerial.available()) {
		command = btSerial.readString();
		//Κάνω trim και κόβω κενά και χαρακτήρες enter
    command.trim();
    //Εκτυτπώνω την εντολή που έχει έρθει στο Serial monitor του υπολογιστή για έλεγχο
    Serial.print("Command arrived:");
    Serial.println(command);
    //Αν η εντολή είναι led on τότε ανάβω το led
		if(command == "led on") {
			digitalWrite(2, true);
			Serial.println("Led is now on");
		}
		//Αν η εντολή είναι led off τότε σβήνω το led
    if(command.equals("led off")) {
			digitalWrite(2, false);
			Serial.println("Led is now off");
		}
  	//Αν η εντολή είναι laser on τότε ανάβω το laser
		if(command == "laser on") {
			digitalWrite(3, true);
			Serial.println("Laser is now on");
		}
		//Αν η εντολή είναι laser off τότε σβήνω το laser
		if(command == "laser off") {
			digitalWrite(3, false);
			Serial.println("Laser is now off");
		}
		//Αν η εντολή είναι light sensor τότε στέλνω στο BT και εκτυπώνω την τιμή του φωτός
    if(command == "light sensor") {
      int light = map(analogRead(0),700,20,0,100);
      btSerial.print(light);
      Serial.print("Light: ");
      Serial.println(light);
    }
 		//Αν η εντολή είναι flame sensor τότε στέλνω στο BT και εκτυπώνω την τιμή της φλόγας
    if(command == "flame sensor") {
      int flame = map(analogRead(1),700,20,0,100);
      btSerial.print(flame);
      Serial.print("Flame: ");
    }
 		//Αν η εντολή είναι temperature τότε στέλνω στο BT και εκτυπώνω την θερμοκρασία
    if(command == "temperature") {
      int temperature = 0;
      int humidity = 0;
      int result = dht11.readTemperatureHumidity(temperature, humidity);
      btSerial.print(temperature);
      Serial.print("Temperature: ");
      Serial.print(temperature);
      Serial.println(" C");
    }
     		//Αν η εντολή είναι humidity τότε στέλνω στο BT και εκτυπώνω την υγρασία
    if(command == "humidity") {
      int temperature = 0;
      int humidity = 0;
      int result = dht11.readTemperatureHumidity(temperature, humidity);
      btSerial.print(humidity);
      Serial.print("Humidity: ");
      Serial.print(humidity);
      Serial.println(" %");
    }
  }
}

Βήμα 10ο Δημιουργία εφαρμογής στο AppInventor

Τώρα θα δημιουργήσω μια εφαρμογή στο AppInventor η οποία θα στέλνει μηνύματα μέσω bluetooth στο Arduino και θα δέχεται πίσω τις τιμές των αισθητήρων. Η εφαρμογή θα έχει διάφορα πλήκτρα για να στέλνουν εντολές και label στα οποία θα επιστρέφουν οι τιμές των αισθητήρων. Επίσης θα χρειαστώ και ένα List picker για να διαλέγω την συσκευή με την οποία θα συνδέομαι. Για την επικοινωνία με bluetooth θα χρειαστώ ένα Bluetooth client, ενώ θα χρειαστώ και ένα ρολόι για να ελέγχω αν έρχονται δεδομένα από το arduino. Τέλος θα προσθέσω και ένα notifier για να δείχνω μηνύματα λάθους.

Χρησιμοποιώ 7 horizontal arrangements. Στο πρώτο βάζω ένα list picker και ένα label για να κάνω την σύνδεση σε συσκευή bluetooth. Από κάτω θα έχω τα δυο κουμπιά για την ενεργοποίηση και απενεργοποίηση του led, μετά τα κουμπιά για το laser και στα επόμενα 4 horizontal arrangements θα έχω ένα button και ένα label
Ονομάζω τα buttons και τα labels έτσι ώστε να τα ξεχωρίζω εύκολα
Ονομάζω τα buttons και τα labels έτσι ώστε να τα ξεχωρίζω εύκολα
Τα horizontal arrangements τα κάνω να είναι στοιχισμένα στο κέντρο και να έχουν πλάτος που γεμίζει την οθόνη
Το ρολόι αρχικά το έχω απενεργοποιημένο

Πάμε τώρα να δούμε πως θα δομήσουμε των κώδικα της εφαρμογής. Αρχικά θα χρειαστούμε 3 μεταβλητές. Η bytes θα κρατάει των αριθμών των bytes που διαβάζει η μονάδα bluetooth έτσι ώστε να καταλαβαίνουμε αν έχουν έρθει δεδομένα. Η μεταβλητή data θα αποθηκεύει τα δεδομένα που έρχονται από το arduino, ενώ την μεταβλητή waitFor θα την χρειαστούμε για να καταλάβουμε τι δεδομένα περιμένουμε από το Arduino (φως, φλόγα, θερμοκρασία ή υγρασία;).

Οι τρεις μεταβλητές μας

Για να γίνει η σύνδεση της εφαρμογής με το Arduino θα πρέπει πρώτα από όλα να έχουμε κάνει ήδη pair την μονάδα bluetooth HC-05 με το κινητό μας. Οι μονάδες αυτές εμφανίζονται με το όνομα HC-05 εκτός αν το έχουμε αλλάξει, και συνήθως έχουν έναν κωδικό για να γίνει η σύνδεση (0000 ή 1234). Ο κώδικας της εφαρμογής για την σύνδεση αρχικά φορτώνει όλες τις συσκευές που έχουν γίνει pair στο List picker που έχουμε βάλει. Αφού διαλέξουμε από την λίστα την συσκευή τότε καλούμε το συμβάν connect του bluetooth client το οποίο επιστρέφει true αν επιτύχει η σύνδεση και false αν αποτύχει. Για αυτόν τον λόγο χρησιμοποιούμε και το LabelStatus ώστε να εμφανίζουμε την επιτυχία ή την αποτυχία σύνδεσης.

Τα δυο σενάρια για τη σύνδεση

Τώρα θα χρειαστούμε σενάρια για τα πλήκτρα που ανάβουν και σβήνουν το led και το laser. Στην ουσία τα πλήκτρα αυτά απλά στέλνουν την κατάλληλη εντολή έτσι όπως την έχουμε προγραμματίσει στο Arduino. Για να είμαστε και πιο σωστοί θα επιτρέπουμε την εκτέλεση των εντολών μόνο αν έχουμε συνδεθεί ήδη στο Arduino, αλλιώς θα χρησιμοποιούμε το notifier για να βγάζουμε ένα μήνυμα στον χρήστη.

Ο κώδικας για τα πλήκτρα που ελέγχουν το LED
Ο κώδικας για τα πλήκτρα που ελέγχουν το Laser

Τα πλήκτρα που ζητάν δεδομένα από το Arduino θα έχουν λίγο διαφορετικό κώδικα. Θα στέλνουν το μήνυμα όπως και πριν αλλά επειδή τώρα θα περιμένουμε απάντηση θα ενεργοποιούν το ρολόι το οποίο θα ελέγχει κάθε δευτερόλεπτο αν ήρθαν δεδομένα. Επίσης επειδή όλα τα πλήκτρα ενεργοποιούν το ίδιο ρολόι, θα χρησιμοποιήσουμε την μεταβλητή waitFor ώστε να κάνει την διαφοροποίηση. Έτσι το πλήκτρο ButtonGetLight θα ορίζει την μεταβλητή αυτή σε light, το πλήκτρο ButtonGetFlame σε flame κ.ο.κ.

Ο κώδικας για τα 4 πλήκτρα που ζητάν δεδομένα

Και τώρα πάμε στον κώδικα του ρολογιού. Αυτός ο κώδικας θα εκτελείται συνέχεια όσο το ρολόι είναι ενεργοποιημένο κάθε δευτερόλεπτο. Αρχικά αποθηκεύουμε στην μεταβλητή bytes τον αριθμό των διαθέσιμων byte που έχουν έρθει στην μονάδα bluetooth. Αν υπάρχουν δεδομένα αυτή η τιμή θα είναι μεγαλύτερη από μηδέν, αλλιώς θα είναι μηδενική. Στην περίπτωση λοιπόν που έχουμε δεδομένα τα αποθηκεύουμε στην μεταβλητή data. Το θέμα είναι τώρα να τα βάλουμε στην σωστή ετικέτα. Για να το πετύχουμε αυτό θα ελέγξουμε την μεταβλητή waitFor η οποία θα μας πει ποια τιμή περιμένουμε. Στο τέλος καθαρίζουμε την μεταβλητή waitFor και απενεργοποιούμε το ρολόι.

Ο κώδικας του ρολογιού

Σχόλια

Δεν υπάρχουν ακόμη σχόλια. Γιατί δεν ξεκινάτε τη συζήτηση;

Αφήστε μια απάντηση