{nbsp}{nbsp}{nbsp}{nbsp} Ο σκοπός της εργασίας μας είναι η η ανάγνωση δεδομένων απο έναν αισθητήρα κίνησης η αποθήκευση ή και αποστολή τους σε έναν server σε ένα σμήνος.
{nbsp}{nbsp}{nbsp}{nbsp} Για την επικοινωνία μεταξύ raspberry και arduino, επιλέχθηκε να γίνει χρήση του πρωτόκολλου I2C και όχι του πρωτόκολλου σειριακής επικοινωνίας.
{nbsp}{nbsp}{nbsp}{nbsp} Το arduino χρησιμοποιεί λογική των 5V στις εισόδους/εξόδους του ενώ το raspberry 3,3V, αυτό έχει ως αποτέλεσμα ενώ μπορέι το arduino να διαβάσει τα δεδομένα
που του αποστέλλονται απο το raspberry στην αποστολή των δεδομένων απο το arduino προς το raspberry υπάρχει μεγάλος κίνδυνος να δημιουργήσουμε μόνιμη καταστροφή
στις εισόδους του ή και ολοκληρωτική καταστροφή του μικροεπεξεργαστη του raspberry. Για την αποφυγή οποιουδήποτε προβλήματος και την ακεραιότητα των δεδομένων μας
παρεμβάλλουμε στην μεταξύ τους σύνδεση εναν logic level converter.
<1> Βιβλιοθήκες για την λειτουργία του προγραμμάτος
<2> Δήλωση διέυθυνσης του Arduino στο δίκτύο I2C, Ένταξη στο δικτυο I2C ως slave, Ορισμός της ταχύτητας επικοινωνίας μεταξύ master και slave
<3> Ονοματοδοσία ακροδεκτών
<4> Μετρητής
<5> Πίνακας για την αποθήκευση των προς αποστολή δεδομένων
<6> Εκκίνηση σειριακής επικοινωνίας
<7> Δήλωση των ακροδεκτών ως είσοδο
<8> Δήλωση ποιας συνάρτησης θα χρησιμοποιηθεί όταν ο master του I2C δικτυώματος ζητήσει δεδομένα
<9> Κλήση συνάρτησης read_lilypad
<10> Αποστολή των δεδομένων στον master 1Byte κάθε φορά
<11> Διάβασμα των τιμών απο τον αισθητήρα.
<12> Οι τιμές zero_G είναι οι τιμές που πρέπει αναμένουμε απο τους αισθητήρες όταν βρίσκονται σε ακινησία.
Τις αφαιρούμε απο τις μετρήσεις μας για να έχουμε σωστά αποτέλεσμα στις μετρήσεις μας.
<13> Scale είναι το μέγεθος που περιμένουμε να μεταβληθεί η τιμή απο τον αισθητήρα μας όταν η επιτάχυνση σε κάποιον άξονα είναι ίση με 1G
<14> Αφαιρώντας απο την τιμή του αισθητήρα την τιμή _zero και το αποτέλεσμα τους το διαιρέσουμε με το scale έχουμε ώς αποτέλεσμα την επιτάχυνση ως προς το κάθε άξονα σε G έπειτα περναμε με την τιμή αυτή σε ένα string.
<15> Δημιουργία string με κατάλληλα μηνύματα και τις τιμές απο τον αισθητήρα
<16> Αποθήκευση του string στον πίνακα Data, ώστε να γίνει η αποστολή του στον master.
<1> Βιβλιοθήκες για την λειτουργία του προγραμμάτος.
<2> Επιλογή ποιου απο τα 2 I2C κανάλια χρησιμοποιούμε.
<3> Δήλωση της διέυθυνσης του Slave που θα ζητήσουμε δεδομένα.
<4> Δημιουργία Timestamp και αποθήκευση της τιμής στην μεταβλητη now.
<5> Δημιουργία μεταβλητης για την αποθήκευση των δεδομένων που θα ληφθούν απο το Arduino.
<6> Βρογχος για την λήψη των 50 Bytes από το Arduino 1 προς 1.
<7> Μορφοποίησει του Timestamp.
<8> Άνοιγμα του αρχείου έαν υπάρχει και εγγραφή των τιμών στο τέλος του αρχείου, αλλιώς δημιουργία του αρχέιου και εγγραφή των τιμών.
<9> Εγγραφή των δεδομένων με Timestamp στο αρχείου.
<10> Κλείσιμο του αρχέιου.
<11> "Καθαρισμός" του αρχέιου με χρήση Regex ώστε να απομονώσουμε μόνο τις τιμές.
<12> Δημιουργία λίστας με τις απομονωμένες τιμες.
<13> Ανάθεση των τιμών της λίστας σε μεταβλητή.
<14> Περίμενε ένα δευτερόλεπτο μέχρι να διαβάσεις πάλι τιμές (εάν δεν το βάλουμε ο κανάλι επικοινωνίας θα μέινει μόνιμα ανοιχτό και θα πέρνουμε συνέχεια δεδομένα).
<15> Αναγνωρίζει την διακόπή του προγραμμάτος απο τον χρήστη και "καθαρίζει" ότι προσωρινό αρχείο είχε δημιουργηθεί κατά την εκτέλεση του προγραμμάτος μας.
{nbsp}{nbsp}{nbsp}{nbsp} Για την πραγματοποίηση της εργασίας μας χρησιμοποιήθηκε το εργαλέιο Graphana για την εικονικοποίηση των δεδομένων σε γραφήματα
Η InfluxDB είναι σχεδιασμένη ειδικα για να διαχειρίζεται δεδομένα προσανατολισμένα προς τον χρόνο.
Ενώ και οι κλασσικές SQL βάσεις έχουν την ικανοτητα να διαχειριστούν τέτοιου τύπου δεδομένα δεν έχουν
την ικανότητα να διαχειριστούν μεγάλο όγκο και υψηλής συχνότητα τέτοιου τύπου δεδομένα.
Αυτό το κενό ήρθε να καλύψει η InfluxDB με την ικανότητα της για ανάλυση και αποθήκευση τέτοιου τύπου δεδομένων σε πραγματικό χρόνο. https://www.influxdata.com/
=== Εγκατάσταση Graphana & influxDB
[WARNING]
[.text-justify]
4 years ago
{nbsp}{nbsp}{nbsp}{nbsp} Ο οδηγός αυτός απευθύνεται για Εγκατάσταση είτε σε Raspberry Pi 3 και νεότερο, είτε σε υπολογιστές που έχουν εγκαταστήσει το Raspberry Pi OS
για οποιαδήποτε, άλλη χρήση θα δημιουργηθούν μικροπροβλήματα που θα πρέπει να αντιμετωπιστούν απο εσάς ανάλογα το σύστημα σας. +
[.text-center]
Η Εγκατάσταση καθώς και η χρήση των παραπάνω εργαλέιων έγινε σε Raspberry Pi 4
[.text-justify]
4 years ago
{nbsp}{nbsp}{nbsp}{nbsp} To script εγκαθιστά και περαιτερω εργαλέια που ίσως να μην είναι χρήσιμα για όλους όπως Node RED, Log2ram, Mosquitto MQTT Broker etc. Δίνεται όμως η επιλογή για μη εγκατάσταση τους
{nbsp}{nbsp}{nbsp}{nbsp} Η Εγκατάσταση θα ξεκινήσει και μετά απο την ολοκλήρωση κάποιων πρώτων εγκαταστάσεων θα γίνει η πρώτη διακοπή για να μας ρωτήσει τι θα χρειαστούμε
Μετά απο αυτές τις διακοπές η εγκατάσταση θα συνεχίστεί και θα διαρκέσει αρκετή ώρα κατά πάσα πιθανότητα πάνω απο 25 λεπτά.
[NOTE]
[.text-justify]
Υπάρχει πιθανότητα η εγκατάσταση να διακοπέι ώστε να μας γίνουν περαιτερω ερωτήσεις για την εγκατάσταση επιλέγουμε ανάλογα με της ιδιοσυγκρασίες του συστηματός μας
Τέλος αφού ολοκληρωθέι η εγκατάσταση κάνουμε επανεκκίνηση του συστήματος μας.
=== Ρύθμιση InfluxDB
[.text-justify]
4 years ago
{nbsp}{nbsp}{nbsp}{nbsp} Αφού ολοκληρωθέι η επανεκκίνηση του συστήματος μας χρειάζονται 2 αλλαγές στο αρχείο ρυθμίσεων της InfluxDB. +
image::./script_install_photos/add_data_source.png[750,750,title="Add data source"]
Και μετά InfluxDB
[.text-center]
image::./script_install_photos/select_InfluxDB.png[750,750,title="Add data source"]
Στις ρυθμίσεις για το influxDB βάζουμε
[.text-center]
image::./script_install_photos/15th_graphana_data_source_config.png[750,750,title="Add data source",link="./script_install_photos/15th_graphana_data_source_config.png"]
Στην συνέχεια επιστρέφουμε στο κεντρικό μενου και επιλεγουμε Create import
και ανεβάζουμε το αρχείο link:json{ext-relative}[JSON]
== Προσθήκες στον κώδικα της Python
4 years ago
{nbsp}{nbsp}{nbsp}{nbsp} Για να μπορέσουμε να τοποθετήσουμε τα δεδομένα στην βάση που μόλις δημιουργήσαμε θα πρέπει να γίνουν κάποιες προσθήκες στον κώδικα μας έτσι ώστε να στέλνονται τα δεδομένα ταυτόχρονα με τις άλλες λειτουργίες.
<1> Δημιουργία Σύνδεσης με την βάση (IP που βρίσκεται η βάση δεδομένων μας, Port που βρίσκεται η βάση δεδομένων μας, username του χρήστη για την βάση, password του χρήστη για την βάση, επιλογή βάσης)
<2> Αποστολή δεδομένων με την βάση (δημιουργία entry στην βάση sensor με τα δεδομένα που στάλθηκαν απο το Arduino)
4 years ago
[.text-justify]
{nbsp}{nbsp}{nbsp}{nbsp} Με τις προσθήκες αυτές πλέον ο κώδικας της Python λαμβάνει τα δεδομένα, τα γράφει σε ένα αρχείο τοπικά, τα εμφανίζει στην οθόνη μας και τα στέλνει προς την βάση δεδομένων για αποθήκευση.