Inhaltsverzeichnis:

Wetterstation: ESP8266 mit Tiefschlaf, SQL, Graphing von Flask&Plotly - Gunook
Wetterstation: ESP8266 mit Tiefschlaf, SQL, Graphing von Flask&Plotly - Gunook

Video: Wetterstation: ESP8266 mit Tiefschlaf, SQL, Graphing von Flask&Plotly - Gunook

Video: Wetterstation: ESP8266 mit Tiefschlaf, SQL, Graphing von Flask&Plotly - Gunook
Video: Amazing arduino project 2024, Juli
Anonim
Wetterstation: ESP8266 mit Deep Sleep, SQL, Graphing von Flask&Plotly
Wetterstation: ESP8266 mit Deep Sleep, SQL, Graphing von Flask&Plotly

Wäre es lustig, die Temperatur, Luftfeuchtigkeit oder Lichtintensität auf Ihrem Balkon zu kennen? Ich weiß, ich würde. Also habe ich eine einfache Wetterstation gebaut, um solche Daten zu sammeln. Die folgenden Abschnitte sind die Schritte, die ich unternommen habe, um einen zu erstellen.

Lass uns anfangen!

Schritt 1: Wetterstation mit Licht-, Temperatur- und Feuchtigkeitssensoren

Wetterstation mit Licht-, Temperatur- und Feuchtigkeitssensoren
Wetterstation mit Licht-, Temperatur- und Feuchtigkeitssensoren
Wetterstation mit Licht-, Temperatur- und Feuchtigkeitssensoren
Wetterstation mit Licht-, Temperatur- und Feuchtigkeitssensoren
Wetterstation mit Licht-, Temperatur- und Feuchtigkeitssensoren
Wetterstation mit Licht-, Temperatur- und Feuchtigkeitssensoren
Wetterstation mit Licht-, Temperatur- und Feuchtigkeitssensoren
Wetterstation mit Licht-, Temperatur- und Feuchtigkeitssensoren

Als ich plante, eine Wetterstation zu bauen, träumte ich von einer vollwertigen Wetterstation mit Windgeschwindigkeit, Regenmessung, Vollspektrum-Solarsensor, aber es stellte sich heraus, dass das nicht billig war und die Anschaffungskosten enden konnten mindestens 100 US-Dollar aufbringen. Ich gab die vollen Optionen auf und begann mit 10 Dollar mehr oder weniger eine zu bauen. 10 US-Dollar sind die Kosten für die Grundkomponenten der Wetterstation wie die folgenden Teile.

Hier die Teile:

1. ESP8266 Die Marke Wemos kostet 2,39 USD bei Aliexpress. Ich würde die Marke Wemos empfehlen, da der EPS8266 einfacher zu programmieren und zu aktualisieren ist und über 4 MB Flash oder mehr verfügt.

2. Wemos Charger-Boost Shield kostet $1,39 Stück. Dies ist ein weiterer Vorteil, diese Marke zu verwenden. Es hat eine Boost-Up-Platine für Lithiumbatterie (Nennspannung = 3,7 V) auf 5 V für ESP8266. Das Board kommt auch mit einer Ladeoption mit einem maximalen Ladestrom = 1M.

*Hinweis: Es gibt eine günstigere Option zum Aufladen/Boosten von Lithiumbatterien. Dieser kostet 1,77 $ für 5 Stück. Als ich dieses Board jedoch für ESP8266 verwendet habe (entweder Wemos's oder ein bloßes ESP8266), löste der Deep-Sleep-Modus von ESP8266 einen Reset aus, direkt nachdem der ESP8266 in einer Schleife von Sleep-Reset-Sleep gemacht wurde, was sehr nervig ist. Wenn Sie wissen, was passiert ist, senden Sie mir bitte eine E-Mail.

3. Wemos hat auch mehrere Abschirmungen für Temperatur und Feuchtigkeit, aber ich werde aus einzelnen Komponenten bauen. Fotowiderstand (oder lichtabhängiger Widerstand - ldr, billig), ein Helligkeitssensor wie BH1780 oder TSL2561 (ca. 0,87-0,89c Stück), ein Temperatursensor wie DS18B20 (je 75c) und eine Feuchtigkeits- und Temperaturkombination wie DHT22 ($2,35 hier) oder SHT21 ($2,20 hier). Gesamtkosten für den Sensor ~$4.

4. Lithiumbatterie. Ich habe eine von einer 7,4 V Canon Batterie gerettet, die zwei 3,7 V Batterien in Reihe oder eine 18650 Lithiumbatterie sind. Jeder 18650 kostet etwa 5 US-Dollar pro Stück. Ich habe ein Bild, das den Abbau des Kamera-Akkus zeigt. Seien Sie jedoch vorsichtig, ein Kurzschluss beim Durchschneiden der Kunststoffabdeckung kann zu extremer Hitze und Verbrennungen führen.

5. PCB-Board, Jumper, Draht, Löten, Ihre Zeit, vielleicht einige Debugging-Fähigkeiten.

Lassen Sie die Drahtkomponenten zusammen dem obigen Schema folgen.

Suchen Sie dann in der Setup-Schleife nach der Aufgabe. Es ist einfach eine einmalige Ausführung von Aufgaben und endet mit einem Sleep-Befehl.

Void setup () { Serial.begin (115200); Serial.println ("Startknoten mit dem Namen " + String (SENSORNAME)); setup_wifi(); Verzögerung (100); Wire.begin(); pinMode (ldrPin, EINGANG); SHT21.begin(); if (! tsl.begin ()) {Serial.print ("TSL2561 nicht gefunden"); während(1); } Verzögerung (100); ldr = analogRead (ldrPin); tsl.enableAutoRange(true); tsl.setIntegrationTime(TSL2561_INTEGRATIONTIME_13MS); Verzögerung (100); sensor_event_t-Ereignis; tsl.getEvent(&event); if (Ereignis. Licht) Lux = Ereignis. Licht; sonst Serial.println ("Sensorüberlastung");

h = SHT21.getHumidity();

t = SHT21.getTemperature(); tempSensor.setWaitForConversion(false); tempSensor.begin(); Verzögerung (100); if (tempSensor.getDeviceCount() == 0) { Serial.printf("DS18x20 nicht auf Pin %d\n gefunden", ds18b20); Serial.flush(); Verzögerung (1000); } Verzögerung (100); tempSensor.requestTemperatures(); t18 = tempSensor.getTempCByIndex(0); Serial.printf("\nLicht: %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); Verzögerung (100); client.setServer(mqtt_server, mqtt_port); client.setCallback (Rückruf); wieder verbinden (); Verzögerung (100); ESP.deepSleep(3e8); // 300 Millionen Mikrosekunden, 300 Sekunden, 5 Minuten; }

Befehlen Sie während des Debuggens oder Einrichtens ESP.deepsleep (), um die serielle Auslesung kontinuierlich zu ermöglichen. Wie immer wird der vollständige Code zum Hochladen auf ESP8266 hier (GitHub) gehostet.

Denken Sie daran, den Jumper zwischen RST und D0/GPIO16 zu setzen, um nach einer Zeit des Tiefschlafs ein Aufwachen auszulösen.

Jetzt ist es an der Zeit, den Code mit der Arduino IDE auf den ESP8266 hochzuladen.

Schritt 2: MQTT: ein flexibles Medium zum Veröffentlichen und Abonnieren von Daten

MQTT: ein flexibles Medium zum Veröffentlichen und Abonnieren von Daten
MQTT: ein flexibles Medium zum Veröffentlichen und Abonnieren von Daten
MQTT: ein flexibles Medium zum Veröffentlichen und Abonnieren von Daten
MQTT: ein flexibles Medium zum Veröffentlichen und Abonnieren von Daten

Erstens verwende ich MQTT immer häufiger zum Senden und Empfangen von Daten über verschiedene Sensoren und Clients in meinem Zuhause. Dies liegt an der Flexibilität, unbegrenzt nach einem Thema kategorisierte Daten zu senden und unbegrenzte Clients, um ein Thema von einem MQTT-Broker zu abonnieren. Zweitens bin ich nicht qualifiziert, MQTT ausführlich zu diskutieren. Ich habe MQTT im letzten Jahr (2017) manchmal kennengelernt, als ich Tutorials zum Einrichten einer Wetterstation und Sensoren mit Node-RED verfolgte. Wie auch immer, ich werde mein Bestes geben, um Ihnen einige Informationen zu präsentieren. Ein weiterer guter Ausgangspunkt ist Wikipedia.

Wenn Sie keine Zeit haben, sich über die Theorie zu informieren und einen MQTT-Broker einrichten möchten, habe ich dafür ein weiteres Tutorial gepostet. Schlagen Sie diesen Beitrag nach und scrollen Sie nach unten zu Schritt 4.

Um zu erklären, was Message Queuing Telemetry Transport (MQTT) in meinem Verständnis ist, habe ich ein Diagramm wie oben vorbereitet. Kurz gesagt, MQTT ist ein ISO-Standard, und ein Produkt wie mosquitto und mosquitto-client, zwei Pakete, die ich verwendet habe, um MQTT-Broker auf einem Raspberry Pi zu bauen, müssen diesem Standard entsprechen. Der MQTT-Broker wird dann zu einem Medium für Herausgeber, um eine Nachricht hineinzuschieben, und für Abonnenten, um ein Zielthema abzuhören.

Die Kombination der Arduino PubSubclient-Bibliothek mit ArduinoJson, dank seines Schöpfers Knolleary und bblanchon, erleichtert den Tüftlern und Entwicklern eine Reihe von Tools von Sensoren bis zu einem Zielgerät oder einem Endkunden.

Fahren Sie mit Create Database fort und zeigen Sie einige Daten an.

Schritt 3: Daten in SQL speichern und auf einem Webserver anzeigen

Daten in SQL speichern und auf einem Webserver anzeigen
Daten in SQL speichern und auf einem Webserver anzeigen
Daten in SQL speichern und auf einem Webserver anzeigen
Daten in SQL speichern und auf einem Webserver anzeigen

Ich habe sqlite3 verwendet, um eine Datenbank für den Webserver zu erstellen. Installieren Sie sqlite3 in Rapberry Pi, indem Sie:

sudo apt-get install sqlite3

erstellte eine Datenbank und eine Tabelle durch Eingabe in das Terminal:

sqlite3 wetterstation.db

CREATE TABLE Wetterdaten (id INT PRIMARY KEY, thetime DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit //um die SQLite-Befehlszeile zu verlassen und zum Linux-Terminal zurückzukehren

Um ein von der Wetterstation veröffentlichtes Thema anzuhören, habe ich eine Paho-Bibliothek mit Python verwendet:

#! /usr/bin/python3# übernommen von: > # 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.

Empfohlen: