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

Μετεωρολογικός σταθμός: ESP8266 με βαθύ ύπνο, SQL, γραφική παράσταση κατά φιάλη & συνοπτικά: 3 βήματα
Μετεωρολογικός σταθμός: ESP8266 με βαθύ ύπνο, SQL, γραφική παράσταση κατά φιάλη & συνοπτικά: 3 βήματα

Βίντεο: Μετεωρολογικός σταθμός: ESP8266 με βαθύ ύπνο, SQL, γραφική παράσταση κατά φιάλη & συνοπτικά: 3 βήματα

Βίντεο: Μετεωρολογικός σταθμός: ESP8266 με βαθύ ύπνο, SQL, γραφική παράσταση κατά φιάλη & συνοπτικά: 3 βήματα
Βίντεο: Weather Station with ESP8266-WiFi 2024, Νοέμβριος
Anonim
Μετεωρολογικός Σταθμός: ESP8266 Με βαθύ ύπνο, SQL, Γραφήματα κατά Flask & Plotly
Μετεωρολογικός Σταθμός: ESP8266 Με βαθύ ύπνο, SQL, Γραφήματα κατά Flask & Plotly

Θα ήταν διασκεδαστικό να γνωρίζετε τη θερμοκρασία, την υγρασία ή την ένταση του φωτός στο μπαλκόνι σας; Ξέρω ότι θα το έκανα. Έτσι έφτιαξα έναν απλό μετεωρολογικό σταθμό για να συλλέξω τέτοια δεδομένα. Οι ακόλουθες ενότητες είναι τα βήματα που έκανα για να δημιουργήσω ένα.

Ας αρχίσουμε!

Βήμα 1: Μετεωρολογικός σταθμός με αισθητήρες φωτός, θερμοκρασίας και υγρασίας

Μετεωρολογικός σταθμός με αισθητήρες φωτός, θερμοκρασίας και υγρασίας
Μετεωρολογικός σταθμός με αισθητήρες φωτός, θερμοκρασίας και υγρασίας
Μετεωρολογικός σταθμός με αισθητήρες φωτός, θερμοκρασίας και υγρασίας
Μετεωρολογικός σταθμός με αισθητήρες φωτός, θερμοκρασίας και υγρασίας
Μετεωρολογικός σταθμός με αισθητήρες φωτός, θερμοκρασίας και υγρασίας
Μετεωρολογικός σταθμός με αισθητήρες φωτός, θερμοκρασίας και υγρασίας
Μετεωρολογικός σταθμός με αισθητήρες φωτός, θερμοκρασίας και υγρασίας
Μετεωρολογικός σταθμός με αισθητήρες φωτός, θερμοκρασίας και υγρασίας

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

Εδώ είναι τα μέρη:

1. Η μάρκα ESP8266 Wemos κοστίζει $ 2.39 τεμάχια στο Aliexpress. Θα πρότεινα τη μάρκα Wemos επειδή το EPS8266 είναι ευκολότερο να προγραμματιστεί, να ενημερωθεί και να έχει φλας 4MB ή περισσότερο.

2. Το Wemos Charger-Boost Shield κοστίζει 1,39 δολάρια τεμ. Αυτό είναι ένα άλλο πλεονέκτημα για τη χρήση αυτής της μάρκας. Διαθέτει πλακέτα ενίσχυσης για μπαταρία λιθίου (ονομαστική τάση = 3,7V) σε 5V για ESP8266. Ο πίνακας διαθέτει επίσης επιλογή φόρτισης με μέγιστο ρεύμα φόρτισης = 1M.

*Σημείωση: Υπάρχει μια φθηνότερη επιλογή για φόρτιση/ενίσχυση μπαταρίας λιθίου. Αυτό κοστίζει 1,77 $ για 5 τεμάχια. Ωστόσο, όταν χρησιμοποίησα αυτόν τον πίνακα για το ESP8266 (είτε του Wemos είτε του γυμνού ESP8266), η λειτουργία βαθύ ύπνου του ESP8266 ενεργοποίησε μια επαναφορά αμέσως μετά την πραγματοποίηση του ESP8266 σε έναν κύκλο ύπνου-επαναφοράς ύπνου, κάτι που είναι πολύ ενοχλητικό. Αν γνωρίζετε τι συνέβαινε, στείλτε μου inbox.

3. Το Wemos έχει επίσης αρκετές ασπίδες για τη θερμοκρασία και την υγρασία, αλλά πρόκειται να κατασκευάσω από μεμονωμένα εξαρτήματα. Φωτοαντίσταση (ή αντίσταση εξαρτώμενη από το φως-ldr, φθηνό), ένας αισθητήρας φωτεινότητας όπως ο BH1780 ή ο TSL2561 (περίπου 0,87-0,89c τεμ), ένας αισθητήρας θερμοκρασίας όπως ο DS18B20 (75c το καθένα) και ένας συνδυασμός υγρασίας και θερμοκρασίας όπως DHT22 ($ 2.35 εδώ) ή SHT21 ($ 2.20 εδώ). Συνολικό κόστος για τον αισθητήρα ~ 4 $.

4. Μπαταρία λιθίου. Έσωσα ένα από μια μπαταρία Canon 7.4V που είναι δύο μπαταρίες 3.7V σε σειρά ή μπαταρία λιθίου 18650. Κάθε 18650 κοστίζει περίπου $ 5 το καθένα. Έχω μια εικόνα που δείχνει την αποσύνθεση της μπαταρίας της κάμερας. Προσοχή όμως, το βραχυκύκλωμα κατά το κόψιμο του πλαστικού καλύμματος μπορεί να προκαλέσει υπερβολική θερμότητα και να καεί.

5. Πίνακας PCB, άλτης, σύρμα, συγκόλληση, ο χρόνος σας, ίσως κάποιες δεξιότητες εντοπισμού σφαλμάτων.

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

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

void setup () {Serial.begin (115200); Serial.println ("Έναρξη κόμβου με όνομα" + String (SENSORNAME)); setup_wifi (); καθυστέρηση (100)? Wire.begin (); pinMode (ldrPin, INPUT); SHT21.begin (); if (! tsl.begin ()) {Serial.print ("TSL2561 δεν βρέθηκε"); ενώ (1)? } καθυστέρηση (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (αληθινό); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); καθυστέρηση (100)? sensors_event_t event? tsl.getEvent (& event); if (event.light) lux = event.light; else Serial.println ("Υπερφόρτωση αισθητήρα");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (false); tempSensor.begin (); καθυστέρηση (100)? if (tempSensor.getDeviceCount () == 0) {Serial.printf ("Το DS18x20 δεν βρέθηκε στην καρφίτσα %d / n", ds18b20); Serial.flush (); καθυστέρηση (1000)? } καθυστέρηση (100); tempSensor.requestTemperatures (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nΦως: %d lux / t", lux); Serial.printf ("LDR: %d /1024 / t", ldr); Serial.printf ("T: %0.2f *C / t", t); Serial.printf ("H:%0.2f / t", h); Serial.printf ("HIC: %0.2f / t", hic); καθυστέρηση (100)? client.setServer (mqtt_server, mqtt_port); client.setCallback (επανάκληση); επανασύνδεση (); καθυστέρηση (100)? ESP.deepSleep (3e8); // 300 εκατομμύρια μικρο δευτερόλεπτα, 300 δευτερόλεπτα, 5 λεπτά. }

Κατά τη διάρκεια της ρύθμισης σφαλμάτων ή της ρύθμισης, δώστε εντολή στο ESP.deepsleep () για να γίνεται συνεχόμενη ανάγνωση σειριακών. Όπως πάντα, ο πλήρης κωδικός για μεταφόρτωση στο ESP8266 φιλοξενείται εδώ (GitHub).

Θυμηθείτε να βάλετε το βραχυκυκλωτήρα μεταξύ RST και D0/GPIO16 για ενεργοποίηση αφύπνισης μετά από μια περίοδο βαθύ ύπνου.

Τώρα, ήρθε η ώρα να ανεβάσετε τον κωδικό χρησιμοποιώντας το Arduino IDE στο ESP8266.

Βήμα 2: MQTT: ένα ευέλικτο μέσο δημοσίευσης και εγγραφής δεδομένων

MQTT: ένα ευέλικτο μέσο δημοσίευσης και εγγραφής δεδομένων
MQTT: ένα ευέλικτο μέσο δημοσίευσης και εγγραφής δεδομένων
MQTT: ένα ευέλικτο μέσο δημοσίευσης και εγγραφής δεδομένων
MQTT: ένα ευέλικτο μέσο δημοσίευσης και εγγραφής δεδομένων

Πρώτον, λατρεύω τη χρήση του MQTT για την αποστολή και λήψη δεδομένων σε διαφορετικούς αισθητήρες και πελάτες στο σπίτι μου. Αυτό οφείλεται στο γεγονός ότι η ευελιξία αποστολής απεριόριστων δεδομένων κατηγοριοποιημένων κατά ένα θέμα και απεριόριστων πελατών για εγγραφή σε ένα θέμα από έναν μεσίτη MQTT. Δεύτερον, δεν είμαι ικανός να συζητήσω σε βάθος το MQTT. Γνώρισα το MQTT μερικές φορές πέρυσι (2017) όταν ακολουθούσα σεμινάρια για τη δημιουργία ενός μετεωρολογικού σταθμού και αισθητήρων χρησιμοποιώντας το Node-RED. Όπως και να έχει, θα προσπαθήσω να σας δώσω κάποιες πληροφορίες. Ένα άλλο καλό μέρος για να ξεκινήσετε είναι η Wikipedia.

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

Για να εξηγήσω τι είναι το Message Queuing Telemetry Transport (MQTT) κατά τη γνώμη μου, ετοίμασα ένα διάγραμμα όπως παραπάνω. Εν ολίγοις, το MQTT είναι ένα πρότυπο ISO και ένα προϊόν όπως τα κουνούπια και τα κουνούπια-πελάτη, δύο πακέτα που χρησιμοποίησα για να δημιουργήσω τον μεσίτη MQTT σε ένα Raspberry Pi, πρέπει να συμμορφώνονται με αυτό το πρότυπο. Ο μεσίτης MQTT γίνεται έπειτα ένα μέσο για τους εκδότες να προωθήσουν ένα μήνυμα και τους συνδρομητές να ακούσουν ένα θέμα -στόχο.

Ο συνδυασμός της βιβλιοθήκης Arduino PubSubclient με το ArduinoJson, χάρη στο knolleary και bblanchon του δημιουργού, διευκολύνει τους εργάτες και τους προγραμματιστές ένα σύνολο εργαλείων από αισθητήρες έως εξοπλισμό -στόχο ή τελικό πελάτη.

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

Βήμα 3: Αποθηκεύστε δεδομένα σε SQL και εμφανίστε τα σε διακομιστή Web

Αποθηκεύστε δεδομένα σε SQL και εμφανίστε τα σε διακομιστή Web
Αποθηκεύστε δεδομένα σε SQL και εμφανίστε τα σε διακομιστή Web
Αποθηκεύστε δεδομένα σε SQL και εμφανίστε τα σε διακομιστή Web
Αποθηκεύστε δεδομένα σε SQL και εμφανίστε τα σε διακομιστή Web

Χρησιμοποίησα το sqlite3 για να δημιουργήσω μια βάση δεδομένων για τον διακομιστή ιστού. Εγκαταστήστε το sqlite3 στο Rapberry Pi από:

sudo apt-get install sqlite3

δημιούργησε μια βάση δεδομένων και έναν πίνακα πληκτρολογώντας το τερματικό:

sqlite3 weatherstation.db

ΔΗΜΙΟΥΡΓΙΑ ΠΙΝΑΚΑΣ weatherdata (id INT PRIMARY KEY, thetime DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // για έξοδο από τη γραμμή εντολών sqlite και επιστροφή στο τερματικό Linux

Για να ακούσω ένα θέμα που δημοσιεύτηκε από τον μετεωρολογικό σταθμό, χρησιμοποίησα μια βιβλιοθήκη Paho με την Python:

#! /usr/bin/python3# υιοθετήθηκε από: > # binh nguyen, august 04, 2018, from time import localtime, strftime, sleep import paho.mqtt.client as mqtt import sqlite3, json

mqtt_topic = 'balcony/weatherstation'

mqtt_username = "johndoe" mqtt_password = "password" dbfile = "/path/to/databse/weatherstation.db" mqtt_broker_ip = '192.168.1.50'

# the callback for when the client receives a connack response from the server.

def on_connect(client, userdata, flags, rc): print("connected with result code "+str(rc)) client.subscribe(mqtt_topic) # the callback for when a publish message is received from the server. def on_message(client, userdata, msg): thetime = strftime("%y-%m-%d %h:%m:%s", localtime())

topic = msg.topic

payload = json.dumps(msg.payload.decode('utf-8')) sql_cmd = sql_cmd = """insert into weatherdata values ({0}, '{1}', {2[ldr]}, {2[tsl2561]}, {2[ds18b20]}, {2[tsht21]}, {2[hsht21]})""".format(none, time_, payload) writetodb(sql_cmd) print(sql_cmd) return none

def writetodb(sql_cmd):

conn = sqlite3.connect(dbfile) cur = conn.cursor() cur.execute(sql_command) conn.commit()

client = mqtt.client()

client.on_connect = on_connect client.on_message = on_message client.username_pw_set(username=mqtt_username, password=mqtt_password) client.connect(mqtt_broker_ip, 1883, 60) sleep(1) client.loop_forever()

to display data from use another sql command to query data from the database such as:

sql_command = """ select * from weatherdata order by thetime desc limit 1000;"

this sql command is included in the app.py that uses flask framework and plotty to make a web server and plotting a graph.

the complete code is hosted on the github.

if the esp8266 cannot read the ds18b20, it assigned a value of -127 as the temperature which skews the relative range of other readable temperatures. i cleaned up those values by set a null value to those equals to -127:

sqlite3 weatherstation.db

sqlite3> update weatherdata set ds18b20 = null where ds18b20 = -127;

to set up an environment for this mini web server, i used the shared libraries on raspberry pi. a virtualenv is a better option if the web server is hosted on a powerful computer. start the web server by:

python3 app.py

press control + c to stop the server.

the web server is set to auto-refreshed for every 60 seconds. you can change the interval in index.html file:

battery performance:

i did not measure the current between the normal state or sleep state of esp8266. many others did so. the first google search turned to this page. the normal state of esp8266 consumes about 100ma depends on the rate of transmitting and wifi activity. the deep-sleep state needs in the range of micro a, which a thousand times less.

for 5-minute interval between sleeping and waking up, one single lithium 18650 (2000mah) could fuel my weather station for 12 days. the same battery only enough for esp 8266 ran less than a day with a normal working state. the one i took from the camera battery pack (did not know the capacity) was enough to run the weather station with deep sleep for 5-6 days.

thank you for spending time with me to this end.

Συνιστάται: