INHOUDSOPGAWE:

Weerstasie: ESP8266 Met diep slaap, SQL, grafiek volgens fles en plots: 3 stappe
Weerstasie: ESP8266 Met diep slaap, SQL, grafiek volgens fles en plots: 3 stappe

Video: Weerstasie: ESP8266 Met diep slaap, SQL, grafiek volgens fles en plots: 3 stappe

Video: Weerstasie: ESP8266 Met diep slaap, SQL, grafiek volgens fles en plots: 3 stappe
Video: Arduino Nano, BME280 и SSD1306 OLED-метеостанция 2024, Julie
Anonim
Weerstasie: ESP8266 Met diep slaap, SQL, grafiek volgens fles en baie
Weerstasie: ESP8266 Met diep slaap, SQL, grafiek volgens fles en baie

Sou dit lekker wees om die temperatuur, humiditeit of ligintensiteit op u balkon te weet? Ek weet ek sou. Ek het dus 'n eenvoudige weerstasie gemaak om sulke data te versamel. Die volgende afdelings is die stappe wat ek geneem het om een te bou.

Laat ons begin!

Stap 1: Weerstasie met lig-, temperatuur- en humiditeitsensors

Weerstasie met lig-, temperatuur- en humiditeitsensors
Weerstasie met lig-, temperatuur- en humiditeitsensors
Weerstasie met lig-, temperatuur- en humiditeitsensors
Weerstasie met lig-, temperatuur- en humiditeitsensors
Weerstasie met lig-, temperatuur- en humiditeitsensors
Weerstasie met lig-, temperatuur- en humiditeitsensors
Weerstasie met lig-, temperatuur- en humiditeitsensors
Weerstasie met lig-, temperatuur- en humiditeitsensors

Toe ek beplan om 'n weerstasie te bou, het ek gedroom om 'n volwaardige weerstasie te hê met windspoed, reënmeting, volspektrumsensorsensor, maar dit blyk nie goedkoop te wees nie, en die aankoopkoste kan eindig ten minste $ 100. Ek het die volle opsies prysgegee en begin met die bou van een met $ 10, min of meer. $ 10 is die koste van die basiese komponente van die weerstasie as die onderstaande onderdele.

Hier is die dele:

1. ESP8266 Wemos -handelsmerk kos $ 2,39 stuks op Aliexpress. Ek sal die Wemos -handelsmerk aanbeveel omdat die EPS8266 makliker is om te programmeer, op te dateer en 4 MB flits of meer te hê.

2. Wemos Charger-Boost Shield kos $ 1,39 stuks. Dit is nog 'n voordeel om hierdie handelsmerk te gebruik. Dit het 'n versterkingsbord vir die litiumbattery (nominale spanning = 3.7V) tot 'n 5V vir ESP8266. Die bord het ook 'n laai -opsie met 'n maksimum laadstroom = 1M.

*Opmerking: daar is 'n goedkoper opsie vir die laai/versterking van die litiumbattery. Hierdie een kos $ 1,77 vir 5 stuks. Toe ek hierdie bord egter gebruik vir ESP8266 (óf Wemos's óf 'n blote ESP8266), het die diep slaapmodus van ESP8266 'n herstelling veroorsaak onmiddellik nadat die ESP8266 in 'n lus met slaap-reset-slaap gemaak is, wat baie irriterend is. As jy weet wat gebeur het, inbox my asb.

3. Wemos het ook verskeie skilde vir temperatuur en humiditeit, maar ek gaan van individuele komponente bou. Fotoresistor (of ligafhanklike weerstand-ldr, goedkoop), 'n ligsensor soos BH1780 of TSL2561 (ongeveer 0,87-0,89c stuks), 'n temperatuursensor soos DS18B20 (75c elk), en 'n kombinasie van humiditeit en temperatuur, soos DHT22 ($ 2,35 hier) of SHT21 ($ 2,20 hier). 'N Totale koste vir die sensor ~ $ 4.

4. Litiumbattery. Ek het een gered van 'n 7.4V Canon -battery, wat twee 3.7V -batterye in serie is of 'n 18650 -litiumbattery. Elke 18650 kos ongeveer $ 5 stuk. Ek het 'n foto wat die kamera se batterypak afgebreek het. Wees egter versigtig, kortsluiting as u deur die plastiekdeksel sny, kan uiterste hitte veroorsaak en brand.

5. PCB -bord, jumper, draad, soldeer, u tyd, miskien 'n paar ontfoutingsvaardighede.

Laat die draadkomponente saam die skema hierbo volg.

Kyk dan na die taak in die opstellus. Dit is eenvoudig 'n enkele taak en eindig met 'n slaapopdrag.

ongeldige opstelling () {Serial.begin (115200); Serial.println ("Start Node met die naam" + String (SENSORNAME)); setup_wifi (); vertraging (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.begin (); as (! tsl.begin ()) {Serial.print ("TSL2561 nie gevind nie"); terwyl (1); } vertraging (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (waar); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); vertraging (100); sensors_event_t gebeurtenis; tsl.getEvent (& event); as (event.light) lux = event.light; anders Serial.println ("Sensoroorlading");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (vals); tempSensor.begin (); vertraging (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 nie gevind op pen %d / n", ds18b20); Serial.flush (); vertraging (1000); } vertraging (100); tempSensor.requestTemperatures (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nLig: %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); vertraging (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (terugbel); herkoppel (); vertraging (100); ESP.deepSleep (3e8); // 300 miljoene mikro sekondes, 300 sekondes, 5 minute; }

Beveel ESP.deepsleep () tydens die ontfouting of opstel om voortdurend 'n seriële uitlees te hê. Soos altyd word die volledige kode vir die oplaai na ESP8266 hier aangebied (GitHub).

Onthou om die trui tussen RST en D0/GPIO16 aan te trek om wakker te word na 'n periode van diep slaap.

Dit is tyd om die kode met die Arduino IDE op te laai na die ESP8266.

Stap 2: MQTT: 'n buigsame medium om data te publiseer en in te teken

MQTT: 'n buigsame medium om data te publiseer en in te teken
MQTT: 'n buigsame medium om data te publiseer en in te teken
MQTT: 'n buigsame medium om data te publiseer en in te teken
MQTT: 'n buigsame medium om data te publiseer en in te teken

Eerstens word ek meer en meer lief daarvoor om MQTT te gebruik om data oor verskillende sensors en kliënte in my huis te stuur en te ontvang. Dit is omdat die buigsaamheid om onbeperkte data wat deur 'n onderwerp gekategoriseer is, te stuur, en onbeperkte kliënte om op 'n onderwerp van 'n MQTT -makelaar in te teken. Tweedens, ek is nie bevoeg om MQTT in diepte te bespreek nie. Ek het MQTT soms verlede jaar (2017) leer ken toe ek tutoriale gevolg het om 'n weerstasie en sensors op te stel met behulp van Node-RED. In elk geval, ek sal my bes probeer om inligting aan u voor te lê. 'N Ander goeie beginpunt is Wikipedia.

As u nie tyd het om oor die teorie te lees nie en 'n MQTT -makelaar wil opstel, het ek nog 'n handleiding geplaas om dit te doen. Soek hierdie berig en blaai af na stap 4.

Om te verduidelik wat Message Queuing Telemetry Transport (MQTT) na my mening is, het ek 'n diagram soos hierbo opgestel. In 'n neutedop is MQTT 'n ISO-standaard, en 'n produk soos muskiet en muskietkliënt, twee pakkette wat ek gebruik het, bou MQTT-makelaar op 'n Framboos Pi, moet aan die standaard voldoen. Die MQTT -makelaar word dan 'n medium vir uitgewers om 'n boodskap in te stuur en intekenare om na 'n teikenonderwerp te luister.

Die kombinasie van Arduino PubSubclient -biblioteek met ArduinoJson, danksy die skepper van knolleary en bblanchon, vergemaklik die tinkers en ontwikkelaars vir 'n stel gereedskap van sensors tot 'n teikentoerusting of 'n eindkliënt.

Gaan voort met die skep van 'n databasis en vertoon 'n paar data.

Stap 3: Stoor data in SQL en vertoon dit op 'n webbediener

Stoor data in SQL en vertoon dit op 'n webbediener
Stoor data in SQL en vertoon dit op 'n webbediener
Stoor data in SQL en vertoon dit op 'n webbediener
Stoor data in SQL en vertoon dit op 'n webbediener

Ek het sqlite3 gebruik om 'n databasis vir die webbediener te skep. Installeer die sqlite3 in Rapberry Pi deur:

sudo apt-get install sqlite3

'n databasis en 'n tabel geskep deur in die terminaal te tik:

sqlite3 weerstasie.db

SKEP TAFEL weerdata (ID INT PRIMARYRE SLEUTEL, die tyd DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // om die opdragreël sqlite te verlaat en terug te keer na Linux -terminale

Om na 'n onderwerp te luister wat deur die weerstasie gepubliseer is, het ek 'n Paho -biblioteek met Python gebruik:

#! /usr/bin/python3# aangeneem uit: > # 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.

Aanbeveel: