Cuprins:
- Pasul 1: Stație meteo cu senzori de lumină, temperatură și umiditate
- Pasul 2: MQTT: un mediu flexibil pentru publicarea și abonarea datelor
- Pasul 3: Salvați datele în SQL și afișați-le pe un server Web
Video: Stație meteo: ESP8266 Cu somn profund, SQL, graficare prin balon și complot: 3 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:42
Ar fi distractiv să știi temperatura, umiditatea sau intensitatea luminii de pe balconul tău? Știu că aș face-o. Așa că am făcut o stație meteo simplă pentru a colecta astfel de date. Următoarele secțiuni sunt pașii pe care i-am făcut pentru a construi unul.
Să începem!
Pasul 1: Stație meteo cu senzori de lumină, temperatură și umiditate
Când am planificat să construiesc o stație meteo, visam să am o stație meteo completă care să aibă viteza vântului, măsurarea ploii, senzor solar cu spectru complet, dar s-a dovedit că nu ar fi ieftin, iar costul achiziției s-ar putea termina. până la cel puțin 100 USD. Am renunțat la opțiunile complete și am început să construiesc una cu 10 USD, mai mult sau mai puțin. 10 dolari reprezintă costul componentelor de bază ale stației meteo, precum părțile de mai jos.
Iată părțile:
1. Marca ESP8266 Wemos costă 2,39 USD buc pe Aliexpress. Aș recomanda marca Wemos, deoarece EPS8266 este mai ușor de programat, actualizat și are 4 MB bliț sau mai mult.
2. Wemos Charger-Boost Shield costă 1,39 USD buc. Acesta este un alt avantaj al utilizării acestui brand. Are o placă de creștere a bateriei cu litiu (tensiune nominală = 3,7 V) până la 5 V pentru ESP8266. De asemenea, placa vine cu opțiune de încărcare cu un curent de încărcare maxim = 1M.
* Notă: există o opțiune mai ieftină pentru încărcarea / creșterea bateriei cu litiu. Acesta costă 1,77 USD pentru 5 bucăți. Cu toate acestea, când am folosit această placă pentru ESP8266 (fie pentru Wemos, fie pentru un ESP8266 gol), modul deep-sleep al ESP8266 a declanșat o resetare imediat după ce a făcut ESP8266 într-o buclă de sleep-reset-sleep, ceea ce este foarte enervant. Dacă știți ce se întâmplă, vă rog să mă primiți.
3. Wemos are, de asemenea, mai multe scuturi pentru temperatură și umiditate, dar voi construi din componente individuale. Fotorezistor (sau rezistor dependent de lumină - ldr, ieftin), un senzor de luminozitate precum BH1780 sau TSL2561 (aproximativ 0,87-0,89c buc), un senzor de temperatură precum DS18B20 (75c fiecare) și un combo de umiditate și temperatură, cum ar fi DHT22 (2,35 USD aici) sau SHT21 (2,20 USD aici). Un cost total pentru senzor ~ 4 USD.
4. Baterie litiu. Am salvat una dintr-o baterie Canon de 7.4V, care este două baterii de 3.7V în serie sau baterie 18650 litiu. Fiecare 18650 costă aproximativ 5 USD bucata. Am o imagine care arată detașarea acumulatorului camerei. Aveți grijă, însă, scurtcircuitul atunci când tăiați capacul din plastic poate genera căldură extremă și arde.
5. Placă PCB, jumper, sârmă, lipire, timpul dvs., poate unele abilități de depanare.
Lăsați componentele de sârmă împreună să urmeze schema de mai sus.
Apoi, căutați sarcina în bucla de configurare. Este pur și simplu o singură etapă de sarcini și se termină printr-o comandă de repaus.
void setup () {Serial.begin (115200); Serial.println ("Nod de pornire numit" + Șir (SENSORNAME)); setup_wifi (); întârziere (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.begin (); if (! tsl.begin ()) {Serial.print ("TSL2561 not found"); în timp ce (1); } întârziere (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (adevărat); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); întârziere (100); senzori_eveniment_t eveniment; tsl.getEvent (& event); if (event.light) lux = event.light; else Serial.println ("Suprasarcină senzor");
h = SHT21.getHumidity ();
t = SHT21.getTemperature (); tempSensor.setWaitForConversion (fals); tempSensor.begin (); întârziere (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 nu a fost găsit pe pinul% d / n", ds18b20); Serial.flush (); întârziere (1000); } întârziere (100); tempSensor.requestTemperatures (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nLumina:% 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); întârziere (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (apel invers); reconectați (); întârziere (100); ESP.deepSleep (3e8); // 300 milioane micro secunde, 300 secunde, 5 minute; }
În timpul depanării sau configurării, comandați ESP.deepsleep () pentru a avea citire serială continuu. Ca întotdeauna, codul complet de încărcat în ESP8266 este găzduit aici (GitHub).
Nu uitați să puneți jumperul între RST și D0 / GPIO16 pentru a declanșa o trezire după o perioadă de somn profund.
Acum, este timpul să încărcați codul utilizând Arduino IDE pe ESP8266.
Pasul 2: MQTT: un mediu flexibil pentru publicarea și abonarea datelor
În primul rând, îmi place să folosesc MQTT pentru a trimite și primi date de la diferiți senzori și clienți de acasă. Acest lucru se datorează faptului că flexibilitatea de a trimite date nelimitate clasificate în funcție de un subiect și clienții nelimitați să se aboneze la un subiect de la un broker MQTT. În al doilea rând, nu sunt calificat să discut în detaliu MQTT. Am cunoscut uneori MQTT anul trecut (2017) când urmau tutoriale pentru a configura o stație meteo și senzori folosind Node-RED. Oricum, voi încerca tot posibilul să vă prezint câteva informații. Un alt loc bun pentru a începe este Wikipedia.
Dacă nu aveți timp să citiți despre teorie și doriți să creați un broker MQTT, am postat un alt tutorial doar pentru a face acest lucru. Căutați această postare și derulați în jos la Pasul 4.
Pentru a explica ce este Message Queuing Telemetry Transport (MQTT) în înțelegerea mea, am pregătit o diagramă ca mai sus. Pe scurt, MQTT este un standard ISO, iar un produs precum mosquitto și mosquitto-client, două pachete pe care le-am folosit construiesc un broker MQTT pe un Raspberry Pi, trebuie să respecte standardul respectiv. Brokerul MQTT devine apoi un mediu pentru ca editorii să trimită un mesaj și abonații să asculte un subiect țintă.
Combinația bibliotecii Arduino PubSubclient cu ArduinoJson, datorită creatorului său knolleary și bblanchon, facilitează jucătorii și dezvoltatorii pentru un set de instrumente, de la senzori la un echipament țintă sau un client final.
Permiteți să continuați cu crearea bazei de date și să afișați câteva date.
Pasul 3: Salvați datele în SQL și afișați-le pe un server Web
Am folosit sqlite3 pentru a crea o bază de date pentru serverul web. Instalați sqlite3 în Rapberry Pi prin:
sudo apt-get install sqlite3
a creat o bază de date și un tabel tastând în terminal:
sqlite3 weatherstation.db
CREATE TABLE weatherdata (id INT PRIMARY KEY, thetime DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);
.exit // pentru a ieși din linia de comandă sqlite și a reveni la terminalul Linux
Pentru a asculta un subiect publicat de stația meteo, am folosit o bibliotecă Paho cu Python:
#! / usr / bin / python3 # adoptat din: > # 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.
Recomandat:
Stație meteo asistată prin satelit: 5 pași
Stație meteo asistată prin satelit: Acest proiect este destinat persoanelor care doresc să colecteze propriile date meteorologice. Poate măsura viteza și direcția vântului, temperatura și umiditatea aerului. De asemenea, este capabil să asculte sateliți meteo care orbitează Pământul o dată la 100 de minute. Voi
Senzor de mișcare ESP-01 cu somn profund: 5 pași
Senzor de mișcare ESP-01 cu somn profund: am lucrat la realizarea unor senzori de mișcare de casă care trimit un mesaj de e-mail la declanșare. Există multe exemple instructabile și alte exemple de a face acest lucru. De curând am avut nevoie să fac asta cu un senzor de mișcare PIR cu baterie și un ESP
Stație meteo DIY și stație senzor WiFi: 7 pași (cu imagini)
Stație meteo DIY și stație senzor WiFi: În acest proiect vă voi arăta cum să creați o stație meteo împreună cu o stație senzor WiFi. Stația senzorului măsoară datele locale de temperatură și umiditate și le trimite, prin WiFi, către stația meteo. Stația meteo afișează apoi t
Cum se construiește o stație meteo folosind XinaBox și Ubidots prin HTTP: 7 pași
Cum să construiți o stație meteo folosind XinaBox și Ubidots prin HTTP: Aflați cum să vă creați propria stație meteo la Ubidots, utilizând XinaBox xChips (IP01, CW01 și SW01) Modulul ESP8266 Core și Wi-Fi (xChip CW01) permite utilizatorilor să trimită date de la xChip-urile modulare ale XinaBox către cloud. Aceste date pot fi monitorizate de la distanță
Economisirea duratei de viață a bateriei cu somn profund: 20 de pași
Economisirea duratei de viață a bateriei cu un somn profund: Sunteți interesat să utilizați o baterie cu ESP32? Dacă da, voi discuta astăzi câteva informații tehnice importante referitoare la acest subiect. Știm că acest microcontroler cheltuie multă energie atunci când transmite informații. Consumă