Innehållsförteckning:

Väderstation: ESP8266 Med djup sömn, SQL, diagram efter flaska & Plotly: 3 steg
Väderstation: ESP8266 Med djup sömn, SQL, diagram efter flaska & Plotly: 3 steg

Video: Väderstation: ESP8266 Med djup sömn, SQL, diagram efter flaska & Plotly: 3 steg

Video: Väderstation: ESP8266 Med djup sömn, SQL, diagram efter flaska & Plotly: 3 steg
Video: Så gör du din egen väderstation 2024, Juli
Anonim
Väderstation: ESP8266 Med djup sömn, SQL, diagram efter flaska & Plotly
Väderstation: ESP8266 Med djup sömn, SQL, diagram efter flaska & Plotly

Skulle det vara kul att veta temperaturen, luftfuktigheten eller ljusintensiteten på din balkong? Jag vet att jag skulle. Så jag gjorde en enkel väderstation för att samla in sådan information. Följande avsnitt är stegen jag tog för att bygga en.

Låt oss börja!

Steg 1: Väderstation med ljus-, temperatur- och fuktsensorer

Väderstation med sensorer för ljus, temperatur och luftfuktighet
Väderstation med sensorer för ljus, temperatur och luftfuktighet
Väderstation med sensorer för ljus, temperatur och luftfuktighet
Väderstation med sensorer för ljus, temperatur och luftfuktighet
Väderstation med sensorer för ljus, temperatur och luftfuktighet
Väderstation med sensorer för ljus, temperatur och luftfuktighet
Väderstation med sensorer för ljus, temperatur och luftfuktighet
Väderstation med sensorer för ljus, temperatur och luftfuktighet

När jag planerade att bygga en väderstation drömde jag om att ha en fullvärdig väderstation som har vindhastighet, regnmätning, fullspektrum solsensor, men det visade sig att det inte skulle vara billigt och inköpskostnaden kan sluta upp minst $ 100. Jag gav upp alla möjligheter och började bygga en med $ 10, mer eller mindre. $ 10 är kostnaden för grundläggande komponenter i väderstationen som delarna nedan.

Här är delarna:

1. ESP8266 Wemos märke kostar $ 2,39 st på Aliexpress. Jag skulle rekommendera Wemos -märket eftersom dess EPS8266 är lättare att programmera, uppdatera och ha 4 MB flash eller mer.

2. Wemos Charger-Boost Shield kostar $ 1,39 st. Detta är en annan fördel med att använda detta märke. Den har en boost-up-kort för litiumbatteri (nominell spänning = 3,7V) till en 5V för ESP8266. Kortet har också laddningsalternativ med max laddningsström = 1M.

*Obs: Det finns ett billigare alternativ för laddning/uppladdning av litiumbatterier. Den här kostar 1,77 dollar för 5 st. Men när jag använde detta kort för ESP8266 (antingen Wemos eller bara ESP8266), utlöste ESP8266 djup-sömnläge en återställning direkt efter att ESP8266 gjordes i en loop av sömn-reset-sömn, vilket är mycket irriterande. Om du vet vad som hände, vänligen inboxa mig.

3. Wemos har också flera skärmar för temperatur och luftfuktighet men jag ska bygga av enskilda komponenter. Fotoresistor (eller ljusberoende motstånd-ldr, billigt), en ljussensor som BH1780 eller TSL2561 (cirka 0,87-0,89c st), en temperatursensor som DS18B20 (75c vardera) och en fukt- och temperaturkombination som t.ex. DHT22 ($ 2,35 här) eller SHT21 ($ 2,20 här). En total kostnad för sensorn ~ $ 4.

4. Litiumbatteri. Jag räddade ett från ett 7,4V Canon -batteri som är två 3,7V -batterier i serie eller 18650 litiumbatteri. Varje 18650 kostar cirka $ 5 styck. Jag har en bild som visar rivningen av kamerabatteriet. Var dock försiktig, kortslutning när du skär igenom plastkåpan kan generera extrem värme och brinna.

5. PCB -kort, bygel, tråd, lödning, din tid, kanske några felsökningskunskaper.

Låt trådkomponenterna tillsammans följa schemat ovan.

Titta sedan efter uppgiften i installationsslingan. Det är helt enkelt en körning av uppgifter och slutar med ett sömnkommando.

void setup () {Serial.begin (115200); Serial.println ("Startnod med namnet" + Sträng (SENSORNAMN)); setup_wifi (); fördröjning (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.begin (); if (! tsl.begin ()) {Serial.print ("TSL2561 hittades inte"); medan (1); } fördröjning (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (true); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); fördröjning (100); sensorer_event_t händelse; tsl.getEvent (& event); om (event.light) lux = event.light; annars Serial.println ("Sensoröverbelastning");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (false); tempSensor.begin (); fördröjning (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 hittades inte på pin %d / n", ds18b20); Serial.flush (); fördröjning (1000); } fördröjning (100); tempSensor.requestTemperatures (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nLjus: %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); fördröjning (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (återuppringning); återanslut (); fördröjning (100); ESP.deepSleep (3e8); // 300 miljoner mikro sekunder, 300 sekunder, 5 minuter; }

Under felsökning eller konfigurering, kommandot ut ESP.deepsleep () för att ha seriell avläsning kontinuerligt. Som alltid är hela koden för att ladda upp till ESP8266 värd här (GitHub).

Kom ihåg att ta på dig bygeln mellan RST och D0/GPIO16 för att aktivera en väckning efter en period av djup sömn.

Nu är det dags att ladda upp koden med Arduino IDE till ESP8266.

Steg 2: MQTT: ett flexibelt medium för att publicera och prenumerera data

MQTT: ett flexibelt medium för att publicera och prenumerera data
MQTT: ett flexibelt medium för att publicera och prenumerera data
MQTT: ett flexibelt medium för att publicera och prenumerera data
MQTT: ett flexibelt medium för att publicera och prenumerera data

För det första blir jag förtjust i att använda MQTT för att skicka och ta emot data från olika sensorer och klienter i mitt hem. Det beror på att flexibiliteten att skicka obegränsad data kategoriserad efter ett ämne och obegränsade klienter att prenumerera på ett ämne från en MQTT -mäklare. För det andra är jag inte kvalificerad att diskutera MQTT på djupet. Jag lärde känna MQTT ibland förra året (2017) när jag följde självstudier för att ställa in en väderstation och sensorer med Node-RED. Hur som helst ska jag göra mitt bästa för att presentera lite information för dig. En annan bra plats att börja är Wikipedia.

Om du inte har tid att läsa om teorin och ville skapa en MQTT -mäklare lade jag upp en annan handledning bara för att göra det. Slå upp det här inlägget och rulla ner till steg 4.

För att förklara vad som är Message Queuing Telemetry Transport (MQTT) i min förståelse, utarbetade jag ett diagram enligt ovan. I nötskal är MQTT en ISO-standard, och en produkt som mygg och myggklient, två paket som jag använde för att bygga MQTT-mäklare på en Raspberry Pi, måste följa den standarden. MQTT -mäklaren blir sedan ett medium för utgivare att trycka in ett budskap och prenumeranter för att lyssna på ett målämne.

Kombinationen av Arduino PubSubclient -bibliotek med ArduinoJson, tack vare dess skapare knolleary och bblanchon, underlättar för tinkarna och utvecklarna för en uppsättning verktyg från sensorer till en målutrustning eller en slutklient.

Låt oss gå vidare med att skapa databas och visa lite data.

Steg 3: Spara data i SQL och visa dem på en webbserver

Spara data i SQL och visa dem på en webbserver
Spara data i SQL och visa dem på en webbserver
Spara data i SQL och visa dem på en webbserver
Spara data i SQL och visa dem på en webbserver

Jag använde sqlite3 för att skapa en databas för webbservern. Installera sqlite3 i Rapberry Pi genom att:

sudo apt-get install sqlite3

skapade en databas och en tabell genom att skriva in i terminalen:

sqlite3 weatherstation.db

SKAPA TABELL väderdata (id INT PRIMÄR KEY, thetime DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // för att lämna sqlite -kommandoraden och återgå till Linux -terminalen

För att lyssna på ett ämne publicerat av väderstationen använde jag ett Paho -bibliotek med Python:

#! /usr/bin/python3# antagen från: > # 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.

Rekommenderad: