Πίνακας περιεχομένων:

Παρακολουθήστε την ποιότητα του αέρα χρησιμοποιώντας Grafana και Raspberry Pi: 7 βήματα
Παρακολουθήστε την ποιότητα του αέρα χρησιμοποιώντας Grafana και Raspberry Pi: 7 βήματα

Βίντεο: Παρακολουθήστε την ποιότητα του αέρα χρησιμοποιώντας Grafana και Raspberry Pi: 7 βήματα

Βίντεο: Παρακολουθήστε την ποιότητα του αέρα χρησιμοποιώντας Grafana και Raspberry Pi: 7 βήματα
Βίντεο: NetApp DE6600 Homelab Datacenter JBOD Extreme - Dell SAS Controllers to the rescue?? 2024, Ιούλιος
Anonim
Παρακολουθήστε την ποιότητα του αέρα χρησιμοποιώντας Grafana και Raspberry Pi
Παρακολουθήστε την ποιότητα του αέρα χρησιμοποιώντας Grafana και Raspberry Pi

Έψαχνα για ένα μικρό μικρό έργο IOT και ένας φίλος μου συνέστησε να δω αυτό το σεμινάριο:

dzone.com/articles/raspberry-pi-iot-sensor…

Συνιστώ ανεπιφύλακτα να ακολουθήσετε το σεμινάριο για να συνεχίσετε στη δημιουργία ενός Raspberry Pi για παρακολούθηση. Αυτό το σεμινάριο θα ολοκληρώσει περαιτέρω βήματα στο σχεδιασμό μιας απλής συσκευής IoT που επιτρέπει υψηλή ανοχή σε σφάλματα, καθώς και πόσο χρήσιμο μπορεί να είναι ένα Raspberry Pi όταν συνδυάζεται με το Arduino.

Εξετάζω επίσης την αποτελεσματικότητα και τον περιορισμό των μοντέλων MQ* των αισθητήρων αέρα. Οι αισθητήρες MQ* είναι φθηνοί και αρκετά αποτελεσματικοί και είναι εξαιρετικά εύκολο να εγκατασταθούν.

Συνολικά, αυτό θα σας βοηθήσει να ξεκινήσετε τη σύνδεση ενός Arduino στο Διαδίκτυο με τον απλούστερο δυνατό τρόπο και θα θέσει το δρόμο για τη χρήση ελαφρύτερων μονάδων αποτυπώματος (εκ νέου: ESP8266).

Καλα να περνατε!

Βήμα 1: Εξοπλισμός + Ρύθμιση

Εξοπλισμός

  • Raspberry Pi με εγκατεστημένο το Raspbian
  • Τροφοδοτικό Raspberry Pi
  • Arduino Uno/Equivalent
  • Αρσενικό σε αρσενικό USB τύπου Β σε Τύπο Α (θα πρέπει να συνοδεύεται από το Arduino σας)
  • Οποιοσδήποτε από τους αισθητήρες MQ* (χρησιμοποίησα τα MQ-2, 4, 5 και 135)
  • Ανάμικτα καλώδια άλτη
  • μίνι πλάκα ψωμιού

Στήνω

Αυτό το σεμινάριο εννοείται ως μια απαλή εισαγωγή στη χρήση του Arduino και του Raspberry Pi - θα σας βοηθήσει να μάθετε πώς να χρησιμοποιείτε το τερματικό linux. Ωστόσο, δεν υποθέτω μεγάλη εμπειρία στη δουλειά σε Arduino ή Raspberry Pi - το μόνο που χρειάζεστε πραγματικά είναι ο παρεχόμενος εξοπλισμός και μια περίεργη στάση.

  • Θα χρειαστεί να ολοκληρώσετε τα βήματα σε αυτό το σεμινάριο.
  • Σας συνιστώ να χρησιμοποιήσετε το Secure Shell (SSH) για διασύνδεση με το Raspberry Pi, καθώς αυτό σας επιτρέπει να εισάγετε εύκολα εντολές. Η σύνδεση μέσω SSH διαφέρει αν χρησιμοποιείτε Windows, Linux ή Mac. Το Linux και το Mac είναι αρκετά εύκολο στη χρήση όσον αφορά το ssh (η εντολή για το άνοιγμα του SSH είναι κυριολεκτικά ssh). Ρίξτε μια ματιά στο Putty for Windows. Σας συνιστώ να ελέγξετε την οθόνη ως τρόπο διατήρησης της συνεδρίας σας κατά τη διάρκεια του έργου.
  • Θα χρειαστεί επίσης να εγκαταστήσετε την Python στο Raspbian. Όταν ολοκλήρωσα αυτά τα βήματα, έκανα ένα αντίγραφο μιας παλιάς κάρτας SD που είχα από ένα προηγούμενο έργο, το οποίο είχε ήδη εγκαταστήσει την Python. Εάν η διανομή του NOOBS/Raspbian δεν διαθέτει Python 3.7 ή παραπάνω, ελέγξτε αυτά τα βήματα για να μεταγλωττίσετε Python από την πηγή.
  • Γνωρίστε το git και εγκαταστήστε το σε περίπτωση που δεν είναι ήδη εγκατεστημένο στη διανομή του Raspbian.

Βήμα 2: Ρύθμιση του κυκλώματος

Ρύθμιση του κυκλώματος
Ρύθμιση του κυκλώματος

Υπάρχει ένα κύκλωμα που θα χρειαστεί να ρυθμίσετε στο Arduino.

Έχω δώσει ένα σχηματικό σχήμα που μπορείτε να χρησιμοποιήσετε ως αναφορά.

Η ομορφιά όλων των αισθητήρων αερίου MQ-* είναι ότι μόλις πραγματοποιηθεί σύνδεση 5 Volt και Ground, η αντίσταση εισόδου των αναλογικών ακίδων του Arduino επιτρέπει στον αισθητήρα να λειτουργεί σωστά.

Να είστε προσεκτικοί για να βεβαιωθείτε ότι η αναλογική σύνδεση από την πλακέτα διαρροής στον αισθητήρα είναι συνδεδεμένη στο Arduino και όχι στην ψηφιακή σύνδεση. Εάν αντιμετωπίζετε ένα πολύ περιορισμένο εύρος τιμών κατά τη δοκιμή, σας συνιστώ να ελέγξετε πρώτα τη σύνδεσή σας εδώ.

Βήμα 3: Κωδικός Arduino και αναβοσβήνει

Στο βήμα που ακολουθεί αυτό, θα συνδέσουμε την πλακέτα Arduino με το Raspberry Pi. Πριν το κάνουμε αυτό, πρέπει να αναβοσβήσουμε το Arduino με κωδικό για να διαβάσουμε τον αισθητήρα καθώς και να μεταδώσουμε δεδομένα αισθητήρα στο Raspberry Pi. Αυτό μπορεί να γίνει με οποιονδήποτε τρόπο πιέζετε κανονικά τον κώδικα στο Arduino. Χρησιμοποίησα ένα εργαλείο τρίτου μέρους εκτός από το Arduino IDE - ως εκ τούτου, συμπεριλαμβάνω τη βιβλιοθήκη Arduino στο επάνω μέρος. Αυτό δεν είναι απαραίτητο για άλλα έργα.

Ελέγξτε τον κώδικα για αντιγραφή/επικόλληση στο τέλος αυτής της ενότητας.

Τι κάνει ο κώδικας

Ο κώδικας έχει ρυθμιστεί για τη λήψη δεδομένων από τέσσερις διαφορετικούς αισθητήρες - εάν χρησιμοποιείτε διαφορετικούς τύπους αισθητήρων, θα είναι λογικό να αλλάξετε τις ονομασίες στο σήμα εξόδου που αποστέλλεται από τη σειριακή θύρα.

Στο βρόχο ελέγχουμε αν το Raspberry Pi ζητά δεδομένα από εμάς. Ως εκ τούτου, χρησιμοποιούμε μια πολύ απλή διαμόρφωση Master/Slave όπου το Raspberry Pi θα υποβάλλει συνεχώς αιτήματα στο Arduino για δεδομένα. Αυτό είναι πολύ πιο απλό από το να έχετε έναν μετρητή στον κώδικα Arduino επειδή είναι ευκολότερο να ελέγξετε ποιες τιμές λειτουργούν από το Raspberry Pi, αντί να χρειάζεται να αναβοσβήνει νέες τιμές στο Arduino.

Το arduino, μόλις λάβει ένα αίτημα για δεδομένα, θα μορφοποιήσει την έξοδο ως παράμετρο GET - αυτό σχετίζεται με μεθόδους HTTP και είναι απλώς μια επιλογή σχεδιασμού. Εάν σχεδιάζατε ένα σχήμα επικοινωνίας από το Arduino μέσω Serial Port, θα μπορούσατε εύκολα να χρησιμοποιήσετε οτιδήποτε άλλο, αρκεί να το σχεδιάσετε έτσι ώστε τα δεδομένα να διαχωρίζονται εύλογα. Επέλεξα το GET επειδή είναι οικείο και στιβαρό.

Απλή δοκιμή…

Μόλις το Arduino αναβοσβήνει και ο κώδικας εκτελείται, ανοίξτε τη σειριακή οθόνη του Arduino IDE. Εάν στείλετε τον χαρακτήρα "H" (διασφαλίστε το κεφάλαιο του!) Θα λάβετε το ωφέλιμο φορτίο δεδομένων. Συγχαρητήρια, λειτουργεί!

Ένα δείγμα, ασύγχρονος συλλέκτης δεδομένων MQ-*

#περιλαμβάνω
int mq2 = A2;
int mq4 = A3;
int mq5 = A4;
int mq135 = A5;
int incomingByte;
voidsetup () {
pinMode (mq2, INPUT);
pinMode (mq4, INPUT);
pinMode (mq5, INPUT);
pinMode (mq135, INPUT);
Serial.begin (9600);
}
/* valuePrint εκτυπώνει την τιμή για αυτήν την ετικέτα.
* Δημιουργεί μόνο παρενέργειες.
*/
voidvaluePrint (ετικέτα συμβολοσειράς, int ανάγνωση) {
Serial.print (ετικέτα);
Serial.print ("=");
Serial.print (ανάγνωση);
}
voidloop () {
// δείτε αν υπάρχουν εισερχόμενα σειριακά δεδομένα:
εάν (Serial.available ()> 0) {
// διαβάστε το παλαιότερο byte στο σειριακό buffer:
// "Όταν καλείτε το Serial.read, ένα byte αφαιρείται από το buffer λήψης και επιστρέφεται στον κωδικό σας"
incomingByte = Serial.read ();
// αν είναι κεφαλαίο H (ASCII 72), διαβάστε τις τιμές και στείλτε τις στον κεντρικό υπολογιστή βατόμουρου.
// TODO: βεβαιωθείτε ότι το μήνυμα έχει πάντα το ίδιο μήκος, κάθε φορά
εάν (εισερχόμεναByte == 72) {
int mq2Reading = analogRead (mq2);
int mq4Reading = analogRead (mq4);
int mq5Reading = analogRead (mq5);
int mq135Reading = analogRead (mq135);
Serial.print ("?");
valuePrint ("mq2", mq2Reading);
Serial.print ("&");
valuePrint ("mq4", mq4Reading);
Serial.print ("&");
valuePrint ("mq5", mq5Reading);
Serial.print ("&");
valuePrint ("mq135", mq135Reading);
Serial.print ("\ n");
}
}
// διαβάστε το σίριαλ μόνο κάθε δευτερόλεπτο
καθυστέρηση (1000)?
}

δείτε το rawmain.cpp που φιλοξενείται με ❤ από το GitHub

Βήμα 4: Κωδικός Raspberry Pi

Τώρα που έχετε διαμορφώσει το Raspberry Pi σύμφωνα με το https://dzone.com/articles/raspberry-pi-iot-sensor…, μπορείτε τώρα να εκτελέσετε τον κωδικό Raspberry Client που θα στέλνει δεδομένα μέσω MQTT στη βάση δεδομένων μας, ο οποίος επίσης συνδέεται με τη Grafana.

  1. Βεβαιωθείτε ότι το βατόμουρό σας είναι συνδεδεμένο στο διαδίκτυο και, στη συνέχεια, εκτελέστε μια εντολή κλωνοποίησης git για να αντιγράψετε ολόκληρο τον κώδικα στο Raspberry Pi. Η εντολή σας θα μοιάζει λίγο:

    git clone

  2. Στο τερματικό του raspberry Pi, εκτελέστε μια εντολή αλλαγής καταλόγου (cd) σε "raspberry_client":

    cd raspberry_client.

  3. Θα χρειαστεί να χρησιμοποιήσετε ένα εικονικό περιβάλλον*. Απλός. Τρέξιμο

    python3 -m venv envΤο Αυτό θα δημιουργήσει ένα εικονικό περιβάλλον που ονομάζεται "env" το οποίο θα χρησιμοποιήσουμε για την εγκατάσταση εξαρτήσεων.

  4. Τώρα, πρέπει να εισέλθουμε στο εικονικό μας περιβάλλον. Τρέξιμο:

    πηγή env/bin/activΤο Είστε τώρα έτοιμοι να εγκαταστήσετε τις εξαρτήσεις του έργου.

  5. Στο πακέτο που μόλις κλωνοποιήσατε υπάρχει ένα αρχείο που ονομάζεται Requires.txt. Ανοίξτε αυτό το αρχείο. θα δείτε ότι απαιτούμε τα πακέτα paho-mqtt και pyserial, καθώς και τις αντίστοιχες εκδοχές τους. Μπορείτε να δείτε τα περιεχόμενα του αρχείου εκτελώντας

    απαιτήσεις γάτας.txtΤο Για να εγκαταστήσετε αυτά τα πακέτα, ru

    pip install -r απαιτήσεις.txt.

  6. Αυτό ολοκληρώνει τη διαμόρφωση.

Κυριολεκτικά κάθε σεμινάριο που χρησιμοποιεί python κάνει μια αναφορά στο Virtual env και ακόμη και για αυτό το μικρό έργο, θα κάνω μια αναφορά. Τα εικονικά περιβάλλοντα σάς επιτρέπουν να διαχωρίζετε εκδόσεις εξαρτήσεων, καθώς και να διαχωρίζετε τη ροή εργασίας σας python - Είναι ένας καλός τρόπος για να τακτοποιήσετε τους χώρους εργασίας σας στην Python. Εάν αυτή είναι η πρώτη φορά που χρησιμοποιείτε εικονικά περιβάλλοντα, διαβάστε τα σύντομα εδώ.

Τι κάνει ο κώδικας…

Το αρχείο client.py θα εισαγάγει ένα απλό σύνολο βιβλιοθηκών, συμπεριλαμβανομένου του δικού μας arduinosensor. Στην κύρια συνάρτηση, θα λάβουμε τις τιμές από το Arduino, θα δημοσιεύσουμε τα δεδομένα στον μεσίτη MQTT και μετά θα κοιμηθούμε για 10 δευτερόλεπτα.

Το αρχείο arduinosensor.py είναι ένα σύνολο βοηθητικών μεθόδων που περιτυλίγονται γύρω από τη βιβλιοθήκη paho.mqtt, καθώς και παρέχουν κάποιο χρήσιμο σχήμα επικοινωνίας για επικοινωνία με το ωφέλιμο φορτίο του Arduino (βλ.: parse_payload). Φυσικά, ο κώδικας επισυνάπτεται στο τέλος αυτής της ενότητας.

Ένας απλός πελάτης που επικοινωνεί με ένα στοιχείο arduino μέσω Serial monitor. Περιμένετε να βρείτε τον κωδικό εδώ όταν δημοσιοποιηθεί:

fromimportlibimportimport_module
εισαγωγές
ώρα εισαγωγής
importarduinosensor
defmain ():
# άνοιγμα καθορισμένου πελάτη
start_time = time.time ()
ενώ Αλήθεια:
ανάγνωση = arduinosensor.get_values (os.environ.get ('PORT', "/dev/ttyUSB0"))
arduinosensor.pub ("python_client", ωφέλιμο φορτίο = ανάγνωση)
time.sleep (10.0- ((time.time () -start_time) %10.0))
if_name _ == "_ main_":
κύριος()

προβολή rawclient.py που φιλοξενείται με ❤ από το GitHub

Βήμα 5: Το βάζουμε όλα μαζί

Έχουμε ρυθμίσει τον κώδικα Raspberry Python και έχουμε ρυθμίσει τον κωδικό πελάτη Arduino. Ας προχωρήσουμε στη σύνδεση και των δύο οντοτήτων μαζί.

Αρχικά, ας συνδέσουμε το Arduino και να ορίσουμε τη σωστή διαμόρφωση:

  1. Στο τερματικό Raspberry Pi, τρέξτε

    python -m serial.tools.list_portsΤο Αυτό θα απαριθμήσει όλες τις θύρες USB που υποστηρίζουν σειριακή επικοινωνία.

  2. Τώρα, συνδέστε το Arduino σας και περιμένετε περίπου 2 δευτερόλεπτα για να το αναγνωρίσει το Raspberry. Πληκτρολογώντας

    python -m serial.tools.list_ports για άλλη μια φορά θα σας δείξει ξανά τις θύρες. Ενδέχεται να εμφανιστεί μια πρόσθετη καταχώριση - αν όντως συμβαίνει αυτό, τότε αυτή η νέα καταχώριση είναι η καταχώριση στην οποία είναι συνδεδεμένο το Arduino σας. Αυτό πιθανότατα θα είναι "/dev/ttyUSB0".

  3. Δοκιμάστε να εκτελέσετε τον κώδικα python στο εικονικό σας περιβάλλον εκτελώντας python3.7 client.py. Περιμένετε μερικά δευτερόλεπτα (το πολύ δέκα) - εάν αντιμετωπίζετε μια εξαίρεση, αυτό σημαίνει ότι θα πρέπει να αλλάξουμε την τιμή για τη θύρα com μας στο raspberry pi. Αν δείτε ότι ο κώδικας εκτυπώνει μια γραμμή που ξεκινά με "Αποστολή μετά από ωφέλιμο φορτίο: …" Τότε, καλό θα είναι να προχωρήσετε στο τελευταίο βήμα με τη Grafana. Συμβουλή: φροντίστε να τρέξετε

    οθόνη -S python πριν ξεκινήσετε τον πελάτη python, διαφορετικά, όταν τερματίσετε τη σύνδεσή σας με το raspberry pi, θα χάσετε το τρέχον πρόγραμμα python. Τεχνικά, δεν χρειάζεται να χρησιμοποιείτε αυστηρά το "python" ως τελευταία παράμετρο, αλλά μου αρέσει να ονομάζω τις συνεδρίες οθόνης μου ανάλογα.

    1. Για να αλλάξετε την τιμή για τη θύρα COM, θα πρέπει να ορίσετε μια μεταβλητή περιβάλλοντος πριν εκτελέσετε τον κώδικα. Θα πρέπει να το δοκιμάσετε για κάθε πιθανή τιμή εξόδου που λάβατε κατά την εκτέλεση python -m serial.tools.list_ports. Για παράδειγμα, εάν ο αριθμός των συμμετοχών που έλαβα ήταν δύο και ήταν οι ακόλουθοι:

      • /dev/ttyUSB6
      • /dev/acm0

τότε οι εντολές που θα εκτελούσα θα ήταν:

PORT = "/dev/ttyUSB6" πελάτης python3.7.py, και αν αυτό δεν λειτουργούσε, στη συνέχεια θα έκανα ru

PORT = "/dev/acm0" python3.7 client.py

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

Βήμα 6: Διαμόρφωση Grafana και Προβολή πίνακα ελέγχου

Διαμόρφωση Grafana και προβολή πίνακα ελέγχου
Διαμόρφωση Grafana και προβολή πίνακα ελέγχου

Εντάξει, είμαστε τώρα στην τελική ευθεία! Τώρα θα χρησιμοποιήσουμε το Grafana για να δημιουργήσουμε ένα απλό ταμπλό.

  1. Συνδεθείτε με την παρουσία σας Grafana. Εφόσον ακολουθήσατε τα βήματα από το αρχικό άρθρο dzone, θα πρέπει να μπορείτε να συνδεθείτε με τον χρήστη διαχειριστή σας. Προχωρήστε και συνδεθείτε.
  2. Στο αριστερό παράθυρο, τοποθετήστε το δείκτη του ποντικιού πάνω από το εικονίδιο "πίνακες εργαλείων" - τα τέσσερα τετράγωνα. Κάντε κλικ στο "Διαχείριση".
  3. Στη νέα σελίδα, κάντε κλικ στο "Νέος πίνακας ελέγχου". Επιπλέον, κάντε κλικ στην επιλογή "Προσθήκη νέου πίνακα".
  4. Αυτό ανοίγει τον επεξεργαστή Grafana. Θα δημιουργήσουμε μια απλή προβολή που θα δείχνει μια μετρική.

    1. Στο δεξιό παράθυρο, αλλάξτε τον τίτλο του πίνακα σε κάτι ουσιαστικό, όπως "Αναγνώσεις κουζίνας". Μπορείτε επίσης να εισαγάγετε μια προαιρετική περιγραφή.
    2. Κάτω αριστερά, "Ερώτημα", θα προσθέσουμε μία μόνο χρονική σειρά. Η Grafana πραγματικά λάμπει εδώ καθώς μπορούμε εύκολα να δημιουργήσουμε δηλώσεις SQL με μια διεπαφή που βασίζεται σε κλικ. Στην ενότητα "προεπιλογή", επιλέξτε InfluxDB.
    3. Τώρα, για ανάγνωση του "A" - στην ρήτρα FROM, επιλέξτε μέτρηση "airtestt". Αν κοιτάξετε τον αρχικό κώδικα python στη συνάρτηση get_values του arduinosensor.py, θα δείτε ότι ορίζουμε αυτόν τον πίνακα airtestt μέσα στον κώδικα.
    4. Για ένα δείγμα, ας πάμε στη ρήτρα "SELECT" και επιλέγουμε πεδίο (mq4). Αρχικά ο πίνακας ελέγχου θα μας δώσει την επιλογή "mean ()" - κάντε κλικ σε αυτήν την επιλογή και επιλέξτε "Κατάργηση". στη συνέχεια, κάντε κλικ στο σύμβολο συν και, στην ενότητα "Συγκεντρώσεις", επιλέξτε "ξεχωριστό ()". Αυτό θα δείξει συγκεκριμένα χρονικά σημεία. Μπορούμε να επιλέξουμε άλλα μέτρα, αλλά προς το παρόν, το πάνελ μας θα εμφανίζει ξεχωριστές ενδείξεις από το mq4.
    5. Κάντε κλικ στην επιλογή Αποθήκευση επάνω δεξιά και τελειώσατε!

Σε περίπτωση που αντιμετωπίσετε πρόβλημα, μπορείτε να επαληθεύσετε τις ρυθμίσεις σας με αυτές στο συνημμένο στιγμιότυπο οθόνης.

Βήμα 7: Ολοκληρώστε

Τύλιξε
Τύλιξε

Σε αυτό το σεμινάριο μπορέσατε να δημιουργήσετε ένα ισχυρό δίκτυο MQTT που αποτελείται από έναν μόνο κόμβο και μεσίτη. Είχατε επίσης τη δυνατότητα να απεικονίσετε τα δεδομένα σας IOT χρησιμοποιώντας το Grafana. Τέλος, καταφέρατε να συνθέσετε αυτήν την απλή αρχιτεκτονική συστήματος από (ελπίζουμε) την άνεση του προγράμματος περιήγησης και του υπολογιστή σας χρησιμοποιώντας μια σύνδεση SSH.

Υπάρχουν κάποια πράγματα στα οποία ίσως θέλουμε να βελτιωθούμε.

  • Οι ενδείξεις των αισθητήρων στο γράφημα μας δεν είναι στην πραγματικότητα ακριβείς μετρήσεις αισθητήρα - είναι η τάση εξόδου από τον αισθητήρα μας. Πρέπει να βαθμονομηθούν, συμβουλευτείτε αυτήν την ανάρτηση ιστολογίου για περισσότερες λεπτομέρειες.
  • Η διαμόρφωση raspberry pi μπορεί να γίνει πολύ πιο ελαφριά χρησιμοποιώντας μια πλακέτα ESP8266 που είναι συνδεδεμένη στο arduino και αφαιρώντας πλήρως το pi. Δείτε μια εισαγωγή στη μονάδα ESP8266.
  • Μπορεί να θέλουμε να προσθέσουμε ειδοποιήσεις για συγκεκριμένα συμβάντα. Ευτυχώς, η Grafana προσφέρει έναν τρόπο να το κάνουμε αυτό.

Θα αφήσω κάποια περαιτέρω ανάγνωση για να προσελκύσω τη φαντασία σας με τον κόσμο του IOT. Ανυπομονώ να σας δω στο επόμενο διδακτικό!

Περαιτέρω αναγνώσεις:

Συνιστάται: