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

Τοπικός μετεωρολογικός σταθμός: 8 βήματα (με εικόνες)
Τοπικός μετεωρολογικός σταθμός: 8 βήματα (με εικόνες)

Βίντεο: Τοπικός μετεωρολογικός σταθμός: 8 βήματα (με εικόνες)

Βίντεο: Τοπικός μετεωρολογικός σταθμός: 8 βήματα (με εικόνες)
Βίντεο: OK Mag: Η Ιωάννα Τούνη κάνει πεντικιούρ και θηλάζει τον γιο της 2024, Ιούλιος
Anonim
Τοπικός Μετεωρολογικός Σταθμός
Τοπικός Μετεωρολογικός Σταθμός

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

Αργότερα σκέφτηκα να φτιάξω έναν Μετεωρολογικό Σταθμό που θα είχε κάτι ξεχωριστό. Wantedθελα να μπορώ να αποθηκεύσω όλα τα δεδομένα μου και αργότερα να τα χρησιμοποιήσω για στατιστικά. Αυτό το έργο θα γίνει ειδικά για άτομα που ενδιαφέρονται για τη μετεωρολογία και θέλουν έναν μετεωρολογικό σταθμό που να δημιουργείται στο σπίτι και δεν κοστίζει τόσο πολύ όσο αυτά που διατίθενται στην αγορά. Το έργο έχει επίσης σχεδιαστεί για να διατηρεί τη δυνατότητα προσθήκης ή αφαίρεσης αισθητήρων ανά πάσα στιγμή.

Wasμουν πολύ χαρούμενος όταν είδα το τελικό μου αποτέλεσμα που ήταν καλύτερο από το αναμενόμενο.

Είναι κατασκευασμένο από ένα Raspberry Pi 4 που τρέχει linux.

  • Ιστότοπος Apache (html css js)
  • Eventlet (ιστότοπος διακομιστή backend)
  • MariaDB (διακομιστής βάσης δεδομένων)

Προμήθειες

  • Raspberry Pi 4:

    sd-card (min 16gb)

  • Αισθητήρες:

    1. Αισθητήρας ταχύτητας ανέμου QS-FS
    2. Wind Sensor Garden Signal Output Aluminium Alloy Alleny Direction Sensor Wind Vane Speed Measurement Instrument -Measuring-Instrument-p-1624988.html? Rmmds = myorder & cur_warehouse = CN
    3. DHT22 (υγρασία)
    4. BMP280 (πίεση αέρα)
    5. DS18B20 (θερμοκρασία)
  • Τροφοδοτικό

    • Τροφοδοσία 5V (RPi)
    • Τροφοδοσία 9v (σε εξωτερικό τροφοδοτικό)
  • Breadboard (x2)

    T-cobbler plus για RPi 4

  • καλώδια βραχυκυκλωτήρων
  • IC's

    • MCP3008
    • PCF8574AN
  • Οθόνη LCD 16x2
  • LED (κόκκινο
  • Περίβλημα (οπτικό)

    • κιβώτια κρασιού
    • ξύλινος στύλος (2μ)
    • ξύλινη σανίδα (1μ)

Βήμα 1: Ετοιμάστε τα πράγματα

Είναι πάντα πολύ σημαντικό να αποκτήσετε όλα τα αντικείμενα που χρειάζεστε πριν ξεκινήσετε να εργάζεστε σε ένα βήμα. Αυτό θα σας εξοικονομήσει πολύ χρόνο ενώ εργάζεστε σε αυτό.

Πρώτα λοιπόν, Τι χρειάζεσαι:

  • Raspberry Pi 4:

    sd-card (min 16gb)

  • Αισθητήρες:

    1. Αισθητήρας ταχύτητας ανέμου QS-FS
    2. Αισθητήρας ανέμου κήπου σήμα εξόδου κράμα αλουμινίου Αισθητήρας κατεύθυνσης ανέμου Αισθητήρας ταχύτητα μέτρησης ταχύτητας
    3. DHT22 (υγρασία)
    4. BMP280 (πίεση αέρα)
    5. DS18B20 (θερμοκρασία)
  • Τροφοδοτικό

    • Τροφοδοσία 5V (RPi)
    • Τροφοδοσία 9v (σε εξωτερικό τροφοδοτικό breadboard)
  • Breadboard (x2)
  • T-cobbler plus για RPi 4
  • καλώδια βραχυκυκλωτήρων
  • IC's

    • MCP3008
    • PCF8574AN
  • Οθόνη LCD 16x2
  • LED (κόκκινο)
  • Περίβλημα (οπτικό)

    • καφενείο από κρασί ξύλο
    • ξύλινη σανίδα (1μ)
    • πόλος (2μ)

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

Βήμα 2: Ρύθμιση του RPi

Ρύθμιση του RPi
Ρύθμιση του RPi

Για το έργο μας χρειαζόμαστε ένα RPi με εγκατεστημένο το δεδομένο λογισμικό.

  • Ιστότοπος Apache (html css js)
  • Flask Socket-IO (ιστότοπος διακομιστή backend)
  • MariaDB (διακομιστής βάσης δεδομένων)

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

sudo apt ενημέρωση

Απάχης:

Αρχικά ας μιλήσουμε για το Apache. Το Apache είναι ένας διακομιστής ιστού που χρησιμοποιείται σε όλο τον κόσμο. Λειτουργεί άψογα τον ιστότοπό σας. Το μόνο που χρειάζεται να κάνετε είναι να το εγκαταστήσετε και να βάλετε τον ιστότοπό σας στο σωστό φάκελο και εκεί είναι.

sudo apt install apache2 -y

Αυτό είναι!

Για να βεβαιωθείτε ότι όλα έχουν εγκατασταθεί σωστά, περιηγηθείτε στη διεύθυνση IP του raspberry pi στο πρόγραμμα περιήγησής σας και δείτε εάν λαμβάνετε τον προεπιλεγμένο ιστότοπο. Εάν έχετε προβλήματα σχετικά με αυτό το βήμα, μπορείτε να ελέγξετε τον ιστότοπο RPi εδώ.

Eventlet:

Τώρα ας εγκαταστήσουμε το Eventlet. Θα τρέξει τον διακομιστή backend μας και θα κάνει τη σύνδεση από τους αισθητήρες μας στον ιστότοπό μας. Για αυτό χρειαζόμαστε μερικά πακέτα.

Φιάλη-υποδοχήIO:

pip3 install flask-socketio

Eventlet:

pip3 εγκατάσταση eventlet

Gevent:

pip3 εγκατάσταση gevent

Mariadb:

Το Mariadb είναι μια βάση δεδομένων που βασίζεται σε MySQL και δημιουργεί σχεσιακές βάσεις δεδομένων. Χρησιμοποιείται συχνά στο RPi και επομένως υπάρχει μεγάλη βοήθεια που μπορείτε να βρείτε στο διαδίκτυο. Για περισσότερες πληροφορίες μπορείτε να μεταβείτε σε αυτόν τον σύνδεσμο.

apt install mariadb-server

Βήμα 3: Σύνδεση αισθητήρων και προσθήκη κώδικα

Σύνδεση αισθητήρων και προσθήκη κώδικα
Σύνδεση αισθητήρων και προσθήκη κώδικα
Σύνδεση αισθητήρων και προσθήκη κώδικα
Σύνδεση αισθητήρων και προσθήκη κώδικα
Σύνδεση αισθητήρων και προσθήκη κώδικα
Σύνδεση αισθητήρων και προσθήκη κώδικα

Για να συνδέσετε τους αισθητήρες στο RPi μας μπορούμε να χρησιμοποιήσουμε ένα T-Cobbler plus. Αυτό είναι ένα εύχρηστο μικρό εργαλείο που καθιστά δυνατή τη χρήση όλων των καρφιτσών σας στο RPi σας σε ένα breadboard.

Στο έργο μου έχω 5 αισθητήρες:

  1. Αισθητήρας ταχύτητας ανέμου QS-FS
  2. Αισθητήρας ανέμου κήπου Έξοδος σήματος αλουμινίου κράματος Αισθητήρας Αισθητήρας ταχύτητας Wind Vane μέτρο μέτρησης
  3. DHT22 (υγρασία)
  4. BMP280 (πίεση αέρα)
  5. DS18B20 (θερμοκρασία)

Αισθητήρας ταχύτητας ανέμου:

Πρώτα απ 'όλα ξεκίνησα με τον αισθητήρα ταχύτητας ανέμου επειδή ήμουν ενθουσιασμένος κυρίως με αυτόν τον αισθητήρα. Είναι ένας αισθητήρας με αναλογικό σήμα εξόδου 0-5v και χρειάζεται τάση τουλάχιστον 7 βολτ για να λειτουργήσει. Επιλέγω τον προσαρμογέα 9 βολτ για να τον τροφοδοτήσω.

Για να διαβάσω σε αυτόν τον αισθητήρα χρησιμοποίησα ένα MCP3008 που είναι ένα IC για ανάγνωση σε αναλογικά σήματα. Το IC μπορεί να λειτουργήσει σε 3.3V ή 5V αλλά επιλέγω 3.3V για να το κάνω συμβατό με το RPi. Αυτό σήμαινε ότι έπρεπε να αλλάξω την τάση εξόδου από 5V σε 3.3V. Το έκανα αυτό προσθέτοντας ένα διαχωριστή τάσης που δημιουργήθηκε από 2 αντιστάσεις (2k και 1k ohm).

Αισθητήρας κατεύθυνσης ανέμου:

Η κατεύθυνση του ανέμου είναι εξίσου σημαντική με την ταχύτητα του ανέμου, επομένως θα το συνδέσω στη συνέχεια.

Αυτός ο αισθητήρας έχει τις ίδιες προδιαγραφές με τον αισθητήρα ταχύτητας ανέμου. Θα λειτουργήσει επίσης σε 9V και έχει τάση εξόδου 5 βολτ. Επίσης αυτόν τον αισθητήρα θα συνδέσουμε στο MCP3008 μέσω διαχωριστή τάσης.

DHT22 (υγρασία):

Το DHT22 διαβάζει την υγρασία. Σας δίνει μια τιμή σε ποσοστό και η τιμή της μπορεί να διαβαστεί χρησιμοποιώντας το πρωτόκολλο I2C στο RPi. Επομένως, πρέπει να ενεργοποιήσετε τις θύρες I2C στο Raspi-config. Περισσότερες πληροφορίες εδώ.

BMP280 (πίεση αέρα):

Το BMP280 χρησιμοποιείται για την ανάγνωση της πίεσης του αέρα. Η τιμή του διαβάζεται μέσω του διαύλου SPI στο RPi. Αυτό το πρωτόκολλο πρέπει επίσης να είναι ενεργοποιημένο στο Raspi-config. Για τον κωδικό μου χρησιμοποίησα τη βιβλιοθήκη Adafruit.

DS18B20 (θερμοκρασία):

Ο τελευταίος αισθητήρας μετρά τη θερμοκρασία. αυτός ο αισθητήρας είναι από το Ντάλας και αν είχατε μια μικρή εμπειρία με το Ντάλας θα πρέπει πιθανότατα να γνωρίζετε ήδη ότι χρησιμοποιούν το 1Wire-bus. Μην εκπλαγείτε αν πω ότι αυτό το πρωτόκολλο πρέπει επίσης να είναι ενεργοποιημένο στο Raspi-config.

Πώς συνδέω τους αισθητήρες:

Ως pdf ανέβασα ένα σχέδιο ηλεκτρικού και ψωμιού για να το κάνω λίγο πιο εύκολο.

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

Βήμα 4: Σχεδιάζοντας ένα Web Ui

Σχεδιάζοντας ένα Web Ui
Σχεδιάζοντας ένα Web Ui
Σχεδιάζοντας ένα Web Ui
Σχεδιάζοντας ένα Web Ui
Σχεδιάζοντας ένα Web Ui
Σχεδιάζοντας ένα Web Ui

Τώρα συνδέσαμε τους αισθητήρες που χρειαζόμαστε ένα σχέδιο για τον ιστότοπό μας.

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

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

Έτσι Πρώτα άρχισα να ψάχνω στον ιστό για έμπνευση. Πάνω απ 'όλα, όπου υπάρχουν μόνο ιστοσελίδες πληροφοριών χωρίς πραγματικά το σχέδιο που έψαχνα. Οι μετεωρολογικοί σταθμοί που ήταν ήδη στην αγορά είχαν πιθανότατα μια οθόνη. Και από εκείνη την οθόνη ήρθε η έμπνευσή μου. Οι περισσότερες οθόνες έχουν σχέδιο με πλέγμα. Αυτό μου έδωσε την ιδέα να δημιουργήσω την αρχική σελίδα όπου θα εμφανίζονταν όλοι οι αισθητήρες.

Αλλά, είπα επίσης ότι ήθελα να φτιάξω μια σελίδα όπου μπορείτε να δείτε το ιστορικό κάθε αισθητήρα με τις τιμές του.

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

Μετά από λίγες ώρες είχα τον πλήρη σχεδιασμό μου επεξεργασμένο!

Ο σχεδιασμός έγινε με χρήση του Adobe XD.

Βήμα 5: Δημιουργία βάσης δεδομένων

Δημιουργία βάσης δεδομένων
Δημιουργία βάσης δεδομένων

Για να κάνω ένα διάλειμμα από το σχεδιαστικό μέρος ξεκίνησα στη βάση δεδομένων μου.

Αυτή η βάση δεδομένων θα περιέχει όλους τους αισθητήρες (5), όλους τους ενεργοποιητές (2) και τις τιμές που είχαν αυτοί οι αισθητήρες.

Η βάση δεδομένων είναι αρκετά εύκολη και έχει μερικές σχέσεις.

Μπορείτε να δείτε το μοντέλο της βάσης δεδομένων στη φωτογραφία.

Βήμα 6: Κωδικοποίηση του ιστότοπου: Frontend (html Css)

Επιστροφή στην Ιστοσελίδα!

Τώρα έχω ένα σχέδιο που μπορώ να ξεκινήσω να το κωδικοποιώ ως html css για να το χρησιμοποιήσω πραγματικά.

Στην αρχική σελίδα:

Ξεκίνησα εξετάζοντας κάθε αισθητήρα ως στοιχείο στον ιστότοπό μου. Για να μπορέσω αργότερα να αφήσω αυτό το μέρος να δημιουργηθεί από τον κώδικα Javascript.

Έβαλα επίσης τυχαίες κλάσεις JS-holder στα στοιχεία. Αυτά θα επέτρεπαν την αλλαγή του περιεχομένου αυτού του στοιχείου

Αυτό μου πήρε πολύ χρόνο γιατί δεν είμαι τόσο καλός στη συγκεκριμένη γλώσσα.

Έχοντας κάνει την αρχική σελίδα, ήρθε η ώρα να ξεκινήσουμε από τη σελίδα ιστορικού.

Στη σελίδα ιστορικού:

Αυτή η σελίδα ήταν λίγο πιο εύκολη στην αναδημιουργία. Σε αυτήν τη σελίδα υπήρχαν επίσης js-holders για να λάβετε πληροφορίες σχετικά με τον αισθητήρα, μια υποδοχή τιμής σε πραγματικό χρόνο και να εμφανίσετε τον πίνακα με τις μετρημένες τιμές.

Για να δημιουργήσω μια επιλογή καρτέλας στον ιστότοπό μου για να επιλέξω μεταξύ Πίνακα ή Διάγραμμα, έπρεπε να προσθέσω λίγο Javascript για να μην εμφανίζονται ή να μην εμφανίζονται τα στοιχεία.

Τώρα έχουμε έναν εκπληκτικό ιστότοπο, αλλά δεν μπορούμε να δείξουμε τίποτα σε αυτόν; Ας το διορθώσουμε.

Μπορείτε να βρείτε τον κωδικό μου στο αποθετήριο github μου:

Βήμα 7: Κωδικοποίηση του ιστότοπου: Backend (eventlet) + Coding Frontend (javascript)

Backend:

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

από φιάλη εισαγωγής Φιάλη, αίτημα, jsonify από flask_socketio εισαγωγή SocketIO από φιάλη_cors εισαγωγή CORS

Για να ξεκινήσει ο διακομιστής πρέπει να προσθέσουμε τα εξής:

socketio.run (app, debug = False, host = '0.0.0.0')

Τώρα ο διακομιστής είναι συνδεδεμένος, αλλά δεν θα μπορεί να μιλήσει με το frontend.

Δεν λαμβάνει ούτε επιστρέφει τίποτα. Ας το αλλάξουμε αυτό.

Για να ζητήσετε όλους τους αισθητήρες στη βάση δεδομένων, θα προσθέσετε μια διαδρομή:

@app.route (τελικό σημείο + '/αισθητήρες', μέθοδοι = ['GET']) def get_sensors (): if request.method == 'GET': s = DataRepository.get_sensors () return jsonify (sensors = s), 200

Αυτός ο κώδικας χρησιμοποιεί μια κλάση που ονομάζεται DataRepository και μιλά στη βάση δεδομένων. Εδώ μας επιστρέφει τους αισθητήρες που ζητήσαμε.

Χρειαζόμαστε επίσης μια διαδρομή για να ζητήσουμε τις πληροφορίες σχετικά με 1 συγκεκριμένο αισθητήρα και έναν άλλο για τις τιμές ενός δεδομένου αισθητήρα.

Αυτές είναι όλες οι διαδρομές, αλλά για να καταστούν δυνατά τα δεδομένα σε πραγματικό χρόνο. Πρέπει να στέλνουμε κάθε διάστημα τα δεδομένα που μόλις διαβάζουν οι αισθητήρες. Για να το κάνουμε αυτό χρησιμοποιούμε τη σύνδεση Socket-IO. Είναι μια σύνδεση που δημιουργείται από τη στιγμή που κάποιος φορτώνει τον ιστότοπο με JS και διατηρεί αυτήν τη σύνδεση ανοιχτή. Αυτή είναι μια σύνδεση διπλής όψης που σημαίνει ότι είναι μια σύνδεση που λειτουργεί και με τους δύο τρόπους (αποστολή και λήψη) ταυτόχρονα. Για να το χρησιμοποιήσουμε πρέπει να προσθέσουμε τον ακόλουθο κώδικα.

@socketio.on ('Connect') def initial_connection (): print ('A new client connect') socketio.send ("U bent geconnecteerd") # # Αποστολή στον πελάτη!

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

Για να λάβετε οποιοδήποτε μήνυμα από το frontend, μπορείτε να χρησιμοποιήσετε αυτόν τον κωδικό.

@socketio.on ('μήνυμα') def message_recived (): pass

Μπορείτε επίσης να στείλετε μηνύματα. Αυτό γίνεται με τα παρακάτω.

socketio.emit ('Update_RTD', dict_results, broadcast = True)

Το πρώτο δεδομένο επιχείρημα μπορεί να είναι οτιδήποτε θέλετε, αλλά θα αντιστοιχεί σε αυτό που βάζετε στο JS σας και μπορείτε να στείλετε αντικείμενα μαζί του επίσης. Αυτό είναι προαιρετικό.

Javascript:

Είναι σημαντικό να προσθέσετε λίγο JS για να συνδέσετε τον διακομιστή με τον διακομιστή backend για να μπορείτε να εμφανίζετε τα τρέχοντα δεδομένα και να λαμβάνετε πληροφορίες από τη βάση δεδομένων.

Θα καλέσουμε τις λειτουργίες socketIO που κάναμε για λήψη και αποστολή δεδομένων.

Όταν λαμβάνουμε δεδομένα ως αντικείμενο Json, θα τα διαλύσουμε για να πάρουμε τις πληροφορίες που θέλουμε και στη συνέχεια θα τα τοποθετήσουμε στους κατόχους JS που τοποθετήσαμε στον ιστότοπό μας.

Μπορείτε να βρείτε τον κωδικό μου στο αποθετήριο github μου:

Βήμα 8: Δημιουργία περιβλήματος

Κάνοντας ένα περίβλημα
Κάνοντας ένα περίβλημα
Κάνοντας ένα περίβλημα
Κάνοντας ένα περίβλημα
Κάνοντας ένα περίβλημα
Κάνοντας ένα περίβλημα
Κάνοντας ένα περίβλημα
Κάνοντας ένα περίβλημα

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

Πήρα μερικά κιβώτια κρασιού.

Ένα από αυτά χρησιμοποίησα ως κουτί για να περιέχει το RPi και τους περισσότερους αισθητήρες μου.

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

Μπορείτε να δείτε πώς τελείωσα το έργο μου κοιτάζοντας τις φωτογραφίες.

Αυτό είναι φυσικά ένα παράδειγμα για το πώς μπορείτε να το κάνετε. Μπορείτε να κάνετε με αυτό ό, τι θέλετε.

Συνιστάται: