Obsah:

Meteorologická stanica: ESP8266 s hlbokým spánkom, SQL, grafy podľa banky a vykresľovania: 3 kroky
Meteorologická stanica: ESP8266 s hlbokým spánkom, SQL, grafy podľa banky a vykresľovania: 3 kroky

Video: Meteorologická stanica: ESP8266 s hlbokým spánkom, SQL, grafy podľa banky a vykresľovania: 3 kroky

Video: Meteorologická stanica: ESP8266 s hlbokým spánkom, SQL, grafy podľa banky a vykresľovania: 3 kroky
Video: Метеостанция 2024, Júl
Anonim
Meteorologická stanica: ESP8266 s hlbokým spánkom, SQL, grafy podľa banky a plottu
Meteorologická stanica: ESP8266 s hlbokým spánkom, SQL, grafy podľa banky a plottu

Bolo by zábavné poznať teplotu, vlhkosť alebo intenzitu svetla na vašom balkóne? Viem, že by som. Vytvoril som teda jednoduchú meteorologickú stanicu na zber týchto údajov. Nasledujúce časti predstavujú kroky, ktoré som vykonal pri jej zostavení.

Začnime!

Krok 1: Meteostanica so snímačmi svetla, teploty a vlhkosti

Meteostanica so snímačmi svetla, teploty a vlhkosti
Meteostanica so snímačmi svetla, teploty a vlhkosti
Meteostanica so snímačmi svetla, teploty a vlhkosti
Meteostanica so snímačmi svetla, teploty a vlhkosti
Meteostanica so snímačmi svetla, teploty a vlhkosti
Meteostanica so snímačmi svetla, teploty a vlhkosti
Meteostanica so snímačmi svetla, teploty a vlhkosti
Meteostanica so snímačmi svetla, teploty a vlhkosti

Keď som plánoval postaviť meteorologickú stanicu, snívalo sa mi o plnohodnotnej meteorologickej stanici, ktorá bude mať rýchlosť vetra, meranie dažďa, širokospektrálny solárny senzor, ale ukázalo sa, že to nebude lacné a náklady na nákup sa môžu skončiť. najmenej 100 dolárov. Vzdal som sa všetkých možností a začal som stavať jeden s viac alebo menej dolármi. 10 dolárov je cena základných komponentov meteorologickej stanice, ako sú uvedené nižšie.

Tu sú diely:

1. Značka ESP8266 Wemos stojí na Aliexpresse 2,39 dolárov. Odporúčam značku Wemos, pretože jej EPS8266 sa ľahšie programuje, aktualizuje a má 4 MB flash alebo viac.

2. Štít Wemos Charger-Boost Shield stojí 1,39 dolára. To je ďalší prínos pre používanie tejto značky. Má posilňovaciu dosku pre lítiovú batériu (nominálne napätie = 3,7 V) na 5 V pre ESP8266. Doska je dodávaná aj s možnosťou nabíjania s maximálnym nabíjacím prúdom = 1M.

*Poznámka: Existuje lacnejšia možnosť nabíjania/zosilnenia lítiovej batérie. Tento stojí 5 ks 1,77 dolára. Keď som však použil túto dosku pre ESP8266 (buď Wemosovu alebo holú ESP8266), režim hlbokého spánku ESP8266 spustil reset hneď po tom, ako sa ESP8266 dostal do slučky spánok-reset-spánok, čo je veľmi nepríjemné. Ak viete, čo sa deje, pošlite mi správu.

3. Wemos má tiež niekoľko štítov na teplotu a vlhkosť, ale chystám sa stavať z jednotlivých komponentov. Fotorezistor (alebo svetlo závislý rezistor-ldr, lacný), snímač svietivosti ako BH1780 alebo TSL2561 (asi 0,87-0,89c ks), teplotný snímač ako DS18B20 (každý 75c) a kombinácia vlhkosti a teploty, ako napr. DHT22 (2,35 dolárov tu) alebo SHT21 (2,20 dolárov tu). Celkové náklady na snímač ~ 4 doláre.

4. Lítiová batéria. Jednu som zachránil zo 7,4 V batérie Canon, čo sú dve 3,7 V batérie v sérii alebo lítiová batéria 18650. Každý 18650 stojí asi 5 dolárov za kus. Mám obrázok, ktorý ukazuje strhnutie batérie fotoaparátu. Buďte však opatrní, skratovanie pri rezaní plastovým krytom môže spôsobiť extrémne teplo a popálenie.

5. Doska plošných spojov, prepojka, drôt, spájkovanie, váš čas, možno nejaké ladiace schopnosti.

Nechajte komponenty drôtu dohromady podľa vyššie uvedenej schémy.

Potom sa pozrite na úlohu v nastavovacej slučke. Je to jednoducho jeden beh úloh a končí príkazom spánku.

void setup () {Serial.begin (115200); Serial.println („Počiatočný uzol s názvom“+ reťazec (SENSORNAME)); setup_wifi (); oneskorenie (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.begin (); if (! tsl.begin ()) {Serial.print ("TSL2561 not found"); pričom (1); } oneskorenie (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (true); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); oneskorenie (100); sensor_event_t udalosť; tsl.getEvent (& event); if (event.light) lux = event.light; else Serial.println ("Preťaženie senzora");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (false); tempSensor.begin (); oneskorenie (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 not found on pin %d / n", ds18b20); Serial.flush (); oneskorenie (1000); } oneskorenie (100); tempSensor.requestTemperatures (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nSvetlo: %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); oneskorenie (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (spätné volanie); znova pripojiť (); oneskorenie (100); ESP.deepSleep (3e8); // 300 miliónov mikrosekund, 300 sekúnd, 5 minút; }

Počas ladenia alebo nastavovania zadajte príkaz ESP.deepsleep (), aby mal sériové čítanie neustále. Ako vždy je tu uložený úplný kód na nahranie do ESP8266 (GitHub).

Nezabudnite zapojiť prepojku medzi RST a D0/GPIO16, aby sa prebudilo po období hlbokého spánku.

Teraz je čas nahrať kód pomocou Arduino IDE do ESP8266.

Krok 2: MQTT: flexibilné médium na publikovanie a predplatné údajov

MQTT: flexibilné médium na publikovanie a predplatné údajov
MQTT: flexibilné médium na publikovanie a predplatné údajov
MQTT: flexibilné médium na publikovanie a predplatné údajov
MQTT: flexibilné médium na publikovanie a predplatné údajov

Po prvé, stále viac sa mi páči používanie MQTT na odosielanie a prijímanie údajov prostredníctvom rôznych senzorov a klientov v mojom dome. Dôvodom je flexibilita odosielania neobmedzených údajov kategorizovaných podľa témy a neobmedzené množstvo klientov, ktorí sa môžu prihlásiť na jednu tému od makléra MQTT. Za druhé, nie som kvalifikovaný diskutovať o MQTT do hĺbky. S MQTT som sa zoznámil niekedy minulý rok (2017), keď som nasledoval návody na nastavenie meteorologickej stanice a senzorov pomocou Node-RED. V každom prípade sa pokúsim poskytnúť vám niekoľko informácií. Ďalším dobrým začiatkom je Wikipedia.

Ak nemáte čas čítať o teórii a chceli ste založiť makléra MQTT, zverejnil som ďalší návod, ako to urobiť. Pozrite sa na tento príspevok a posuňte sa nadol na krok 4.

Aby som vysvetlil, čo je v mojom ponímaní prenos telemetrie do frontu správ (MQTT), pripravil som diagram ako je uvedené vyššie. Stručne povedané, MQTT je štandard ISO a produkt, ako sú mosquitto a mosquitto-client, dva balíky, ktoré som použil na zostavenie brokera MQTT na Raspberry Pi, musí vyhovovať tejto norme. Sprostredkovateľ MQTT sa potom stane médiom pre vydavateľov, ktorým chce poslať správu, a pre predplatiteľov, aby si vypočuli cieľovú tému.

Kombinácia knižnice Arduino PubSubclient s ArduinoJson vďaka svojmu tvorcovi knolleary a bblanchon uľahčuje drotárom a vývojárom sadu nástrojov od senzorov po cieľové zariadenie alebo koncového klienta.

Poďme ďalej s vytvorením databázy a zobrazením niektorých údajov.

Krok 3: Uložte údaje na server SQL a zobrazte ich na webovom serveri

Uložte údaje do SQL a zobrazte ich na webovom serveri
Uložte údaje do SQL a zobrazte ich na webovom serveri
Uložte údaje do SQL a zobrazte ich na webovom serveri
Uložte údaje do SQL a zobrazte ich na webovom serveri

Na vytvorenie databázy pre webový server som použil sqlite3. Nainštalujte sqlite3 do Rapberry Pi podľa:

sudo apt-get install sqlite3

vytvoril databázu a tabuľku zadaním do terminálu:

meteorologická stanica sqlite3.db

VYTVORIŤ TABUĽKU údaje o počasí (id INT PRIMÁRNY KĽÚČ, čas DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // opustí príkazový riadok sqlite a vráti sa do terminálu Linux

Na počúvanie témy publikovanej meteorologickou stanicou som použil knižnicu Paho s jazykom Python:

#! /usr/bin/python3# prevzaté z: > # 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.

Odporúča: