Stacioni i motit: ESP8266 Me gjumë të thellë, SQL, Grafikimi sipas shisheve & Plotësisht: 3 hapa
Stacioni i motit: ESP8266 Me gjumë të thellë, SQL, Grafikimi sipas shisheve & Plotësisht: 3 hapa
Anonim
Stacioni i motit: ESP8266 Me gjumë të thellë, SQL, Grafikimi sipas Flask & Plotly
Stacioni i motit: ESP8266 Me gjumë të thellë, SQL, Grafikimi sipas Flask & Plotly

A do të ishte kënaqësi të njihnit temperaturën, lagështinë ose intensitetin e dritës në ballkonin tuaj? E di që do ta bëja. Kështu që unë bëra një stacion të thjeshtë moti për të mbledhur të dhëna të tilla. Seksionet e mëposhtëm janë hapat që kam ndërmarrë për të ndërtuar një të tillë.

Le të fillojmë!

Hapi 1: Stacioni i motit me sensorë të dritës, temperaturës dhe lagështisë

Stacioni i motit me sensorë të dritës, temperaturës dhe lagështisë
Stacioni i motit me sensorë të dritës, temperaturës dhe lagështisë
Stacioni i motit me sensorë të dritës, temperaturës dhe lagështisë
Stacioni i motit me sensorë të dritës, temperaturës dhe lagështisë
Stacioni i motit me sensorë të dritës, temperaturës dhe lagështisë
Stacioni i motit me sensorë të dritës, temperaturës dhe lagështisë
Stacioni i motit me sensorë të dritës, temperaturës dhe lagështisë
Stacioni i motit me sensorë të dritës, temperaturës dhe lagështisë

Kur planifikova të ndërtoja një stacion moti, ëndërroja të kisha një stacion moti të plotë që kishte shpejtësinë e erës, matjen e shiut, sensorin diellor me spektër të plotë, por doli, kjo nuk do të ishte e lirë, dhe kostoja e blerjes mund të përfundonte të paktën 100 dollarë. Hoqa dorë nga opsionet e plota dhe fillova të ndërtoj një me 10 dollarë, pak a shumë. 10 dollarë është kostoja e përbërësve bazë të stacionit të motit si pjesët më poshtë.

Këtu janë pjesët:

1. Marka ESP8266 Wemos kushton 2.39 dollarë në Aliexpress. Unë do të rekomandoja markën Wemos sepse EPS8266 e tij është më e lehtë të programohet, përditësohet dhe të ketë flash 4MB ose më shumë.

2. Wemos Charger-Boost Shield kushton $ 1.39 copë. Ky është një përfitim tjetër për të përdorur këtë markë. Ajo ka një bord ngritës për baterinë Litium (tension nominal = 3.7V) në një 5V për ESP8266. Bordi gjithashtu vjen me opsionin e karikimit me një rrymë maksimale të karikimit = 1M.

*Shënim: Ekziston një mundësi më e lirë për karikimin/ngritjen e baterisë litium. Ky kushton 1.77 dollarë për 5 copë. Sidoqoftë, kur e përdor këtë tabelë për ESP8266 (qoftë Wemos ose ESP8266 të zhveshur), mënyra e gjumit të thellë të ESP8266 shkaktoi një rivendosje menjëherë pasi bëri ESP8266 në një lak të gjumit të rivendosur të gjumit, gjë që është shumë e bezdisshme. Nëse e dini se çfarë po ndodhte, ju lutem më shkruani në inbox.

3. Wemos gjithashtu ka disa mburoja për temperaturën dhe lagështinë, por unë do të ndërtoj nga përbërës individualë. Photoresistor (ose rezistencë e varur nga drita-ldr, e lirë), një sensor ndriçimi të tillë si BH1780 ose TSL2561 (rreth 0.87-0.89c copë), një sensor temperature të tillë si DS18B20 (75c secila), dhe një kombinim lagështie dhe temperature siç janë DHT22 (2.35 dollarë këtu) ose SHT21 (2.20 dollarë këtu). Një kosto totale për sensorin 4 dollarë.

4. Bateri litiumi. Unë shpëtova një nga një bateri Canon 7.4V e cila është dy bateri 3.7V në seri ose bateri litium 18650. Çdo 18650 kushton rreth 5 dollarë secila. Unë kam një fotografi që tregon shkatërrimin e baterisë së kamerës. Kini kujdes, megjithatë, qarku i shkurtër gjatë prerjes së kapakut plastik mund të prodhojë nxehtësi ekstreme dhe të digjet.

5. Pllakë PCB, bluzë, tela, saldim, koha juaj, ndoshta disa aftësi për korrigjim.

Lërini përbërësit e telit së bashku të ndjekin skemën e mësipërme.

Pastaj, hidhini një sy detyrës në lakun e konfigurimit. Simplyshtë thjesht një detyrë e kryer një herë dhe përfundon me një komandë gjumi.

void setup () {Serial.begin (115200); Serial.println ("Nyja fillestare e quajtur" + String (SENSORNAME)); setup_wifi (); vonesë (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.filloj (); nëse (! tsl.begin ()) {Serial.print ("TSL2561 nuk u gjet"); ndërsa (1); } vonesë (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (e vërtetë); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); vonesë (100); sensor_event_t event; tsl.getEvent (& ngjarje); nëse (ngjarja.ndritja) lux = ngjarja. drita; tjetër Serial.println ("Mbingarkesa e sensorit");

h = SHT21.getHumidity ();

t = SHT21.getTemperatura (); tempSensor.setWaitForConversion (false); tempSensor.filloj (); vonesë (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 nuk gjendet në pin %d / n", ds18b20); Serial.flush (); vonesa (1000); } vonesë (100); tempSensor.requestTemperaturat (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nDrita: %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", këtu); vonesë (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (kthim në telefon); rilidheni (); vonesë (100); ESP.deepSleep (3e8); // 300 milion mikro sekonda, 300 sekonda, 5 minuta; }

Gjatë korrigjimit ose konfigurimit, urdhëroni ESP.deepsleep () që të lexoni vazhdimisht Serial. Si gjithmonë, kodi i plotë për t'u ngarkuar në ESP8266 ruhet këtu (GitHub).

Mos harroni të vendosni kërcyesin midis RST dhe D0/GPIO16 për të shkaktuar zgjimin pas një periudhe gjumi të thellë.

Tani, koha për të ngarkuar kodin duke përdorur Arduino IDE në ESP8266.

Hapi 2: MQTT: një medium fleksibël për të publikuar dhe regjistruar të dhëna

MQTT: një medium fleksibël për të publikuar dhe regjistruar të dhëna
MQTT: një medium fleksibël për të publikuar dhe regjistruar të dhëna
MQTT: një medium fleksibël për të publikuar dhe regjistruar të dhëna
MQTT: një medium fleksibël për të publikuar dhe regjistruar të dhëna

Së pari, më pëlqen të përdor MQTT për të dërguar dhe marrë të dhëna në sensorë dhe klientë të ndryshëm në shtëpinë time. Kjo ndodh sepse fleksibiliteti për të dërguar të dhëna të pakufizuara të kategorizuara sipas një teme, dhe klientë të pakufizuar për t'u abonuar në një temë nga një ndërmjetës MQTT. Së dyti, unë nuk jam i kualifikuar për të diskutuar MQTT në thellësi. Unë u njoha me MQTT ndonjëherë vitin e kaluar (2017) kur ndiqja mësimet për të ngritur një stacion moti dhe sensorë duke përdorur Node-RED. Gjithsesi, do të përpiqem të bëj çmos për t'ju paraqitur disa informacione. Një vend tjetër i mirë për të filluar është Wikipedia.

Nëse nuk keni kohë për të lexuar në lidhje me teorinë dhe dëshironi të krijoni një ndërmjetës MQTT, unë postova një tutorial tjetër vetëm për ta bërë këtë. Shikoni këtë postim dhe shkoni poshtë në Hapin 4.

Për të shpjeguar se çfarë është Mesazhi i Radhitjes së Telemetrisë (MQTT) në kuptimin tim, unë përgatita një diagram si më sipër. Me pak fjalë, MQTT është një standard ISO, dhe një produkt i tillë mushkonja dhe klient-mushkonja, dy pako që kam përdorur për të ndërtuar ndërmjetësin MQTT në një Raspberry Pi, duhet të jenë në përputhje me atë standard. Ndërmjetësi MQTT bëhet pastaj një medium për botuesit që të shtyjnë një mesazh dhe pajtimtarët të dëgjojnë një temë të synuar.

Kombinimi i bibliotekës Arduino PubSubclient me ArduinoJson, falë krijuesit të saj knolleary dhe bblanchon, e bën më të lehtë për kallajxhinjtë dhe zhvilluesit për një sërë mjetesh nga sensorë tek pajisjet e synuara ose një klient përfundimtar.

Le të vazhdojmë me krijimin e bazës së të dhënave dhe shfaqjen e disa të dhënave.

Hapi 3: Ruani të dhënat në SQL dhe shfaqini ato në një server në internet

Ruani të dhënat në SQL dhe shfaqini ato në një server në internet
Ruani të dhënat në SQL dhe shfaqini ato në një server në internet
Ruani të dhënat në SQL dhe shfaqini ato në një server në internet
Ruani të dhënat në SQL dhe shfaqini ato në një server në internet

Kam përdorur sqlite3 për të krijuar një bazë të dhënash për serverin në internet. Instaloni sqlite3 në Rapberry Pi duke:

sudo apt-get install sqlite3

krijoi një bazë të dhënash dhe një tabelë duke shtypur në terminal:

sqlite3 weatherstation.db

KRIJONI TABELA të dhënat e motit (id INT KRYESORE FILLORE, DATETIME në kohë, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // për të dalë nga linja e komandës sqlite dhe për t'u kthyer në terminalin Linux

Për të dëgjuar një temë të botuar nga stacioni i motit, kam përdorur një bibliotekë Paho me Python:

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

Recommended: