Inhoudsopgave:

Weerstation: ESP8266 met diepe slaap, SQL, grafieken door Flask & Plotly - Ajarnpa
Weerstation: ESP8266 met diepe slaap, SQL, grafieken door Flask & Plotly - Ajarnpa

Video: Weerstation: ESP8266 met diepe slaap, SQL, grafieken door Flask & Plotly - Ajarnpa

Video: Weerstation: ESP8266 met diepe slaap, SQL, grafieken door Flask & Plotly - Ajarnpa
Video: Arduino project - Weerstation met luchtvochtigheid, actuele temperatuur en min / max temperatuur. 2024, November
Anonim
Weerstation: ESP8266 met diepe slaap, SQL, grafieken door Flask&Plotly
Weerstation: ESP8266 met diepe slaap, SQL, grafieken door Flask&Plotly

Zou het leuk zijn om de temperatuur, luchtvochtigheid of lichtintensiteit op je balkon te weten? Ik weet dat ik dat zou doen. Dus maakte ik een eenvoudig weerstation om dergelijke gegevens te verzamelen. De volgende secties zijn de stappen die ik heb genomen om er een te bouwen.

Laten we beginnen!

Stap 1: Weerstation met licht-, temperatuur- en vochtigheidssensoren

Weerstation met licht-, temperatuur- en vochtigheidssensoren
Weerstation met licht-, temperatuur- en vochtigheidssensoren
Weerstation met licht-, temperatuur- en vochtigheidssensoren
Weerstation met licht-, temperatuur- en vochtigheidssensoren
Weerstation met licht-, temperatuur- en vochtigheidssensoren
Weerstation met licht-, temperatuur- en vochtigheidssensoren
Weerstation met licht-, temperatuur- en vochtigheidssensoren
Weerstation met licht-, temperatuur- en vochtigheidssensoren

Toen ik van plan was een weerstation te bouwen, droomde ik van een volwaardig weerstation met windsnelheid, regenmeting, full-spectrum zonnesensor, maar dat bleek niet goedkoop te zijn en de aanschafkosten zouden kunnen eindigen minstens $ 100 op. Ik gaf de volledige opties op en begon er een te bouwen met $ 10, min of meer. $ 10 zijn de kosten van basiscomponenten van het weerstation zoals de onderstaande onderdelen.

Hier zijn de onderdelen:

1. ESP8266 Wemos-merk kost $ 2,39 stuks op Aliexpress. Ik zou het merk Wemos aanbevelen omdat de EPS8266 gemakkelijker te programmeren en bij te werken is en een flash van 4 MB of meer heeft.

2. Wemos Charger-Boost Shield kost $ 1,39 stuks. Dit is een ander voordeel om dit merk te gebruiken. Het heeft een boost-up board voor lithiumbatterijen (nominale spanning = 3.7V) tot een 5V voor ESP8266. Het bord wordt ook geleverd met een oplaadoptie met een maximale laadstroom = 1M.

*Opmerking: er is een goedkopere optie voor het opladen/opvoeren van lithiumbatterijen. Deze kost $ 1,77 voor 5 stuks. Toen ik dit bord echter voor ESP8266 (ofwel Wemos's of een kale ESP8266) gebruikte, activeerde de diepe slaapmodus van ESP8266 een reset direct nadat de ESP8266 in een lus van slaap-reset-slaap was gemaakt, wat erg vervelend is. Als je weet wat er aan de hand is, stuur me dan een inbox.

3. Wemos heeft ook verschillende schilden voor temperatuur en vochtigheid maar ik ga bouwen van losse componenten. Fotoresistor (of lichtafhankelijke weerstand - ldr, goedkoop), een helderheidssensor zoals BH1780 of TSL2561 (ongeveer 0,87-0,89c stuks), een temperatuursensor zoals DS18B20 (elk 75c), en een vochtigheids- en temperatuurcombinatie zoals DHT22 ($ 2,35 hier) of SHT21 ($ 2,20 hier). Totale kosten voor de sensor ~ $ 4.

4. Lithiumbatterij. Ik heb er een gered van een 7.4V Canon-batterij, twee 3.7V-batterijen in serie of 18650 lithiumbatterijen. Elke 18650 kost ongeveer $ 5 per stuk. Ik heb een foto die de demontage van de batterij van de camera laat zien. Wees echter voorzichtig, kortsluiting bij het doorsnijden van de plastic kap kan extreme hitte genereren en brandwonden veroorzaken.

5. Printplaat, jumper, draad, solderen, je tijd, misschien wat debugging-vaardigheden.

Laat draadcomponenten bij elkaar volgen volgens het bovenstaande schema.

Zoek vervolgens naar de taak in de setup-lus. Het is gewoon een enkele reeks taken en eindigt met een slaapcommando.

void setup() { Serial.begin(115200); Serial.println("Startknooppunt genaamd " + String(SENSORNAME)); setup_wifi(); vertraging (100); Draad.begin(); pinMode(ldrPin, INPUT); SHT21.begin(); if(!tsl.begin()) { Serial.print("TSL2561 niet gevonden"); terwijl(1); } vertraging(100); ldr = analoog lezen (ldrPin); tsl.enableAutoRange(true); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); vertraging (100); sensoren_event_t gebeurtenis; tsl.getEvent(&event); if (event.light) lux = event.light; else Serial.println ("Overbelasting sensor");

h = SHT21.getVochtigheid();

t = SHT21.getTemperatuur(); tempSensor.setWaitForConversion(false); tempSensor.begin(); vertraging (100); if (tempSensor.getDeviceCount() == 0) { Serial.printf("DS18x20 niet gevonden op pin %d\n", ds18b20); Serieel.flush(); vertraging (1000); } vertraging(100); tempSensor.requestTemperatures(); t18 = tempSensor.getTempCByIndex(0); Serial.printf("\nLicht: %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.setTerugbellen (terugbellen); opnieuw verbinden(); vertraging (100); ESP.deepSleep (3e8); // 300 miljoen microseconden, 300 seconden, 5 minuten; }

Geef tijdens het debuggen of instellen de opdracht ESP.deepsleep() om continu een seriële uitlezing te hebben. Zoals altijd wordt de volledige code om te uploaden naar ESP8266 hier gehost (GitHub).

Vergeet niet om de jumper tussen RST en D0/GPIO16 aan te trekken om wakker te worden na een periode van diepe slaap.

Nu is het tijd om de code te uploaden met Arduino IDE naar de ESP8266.

Stap 2: MQTT: een flexibel medium om gegevens te publiceren en te abonneren

MQTT: een flexibel medium om gegevens te publiceren en te abonneren
MQTT: een flexibel medium om gegevens te publiceren en te abonneren
MQTT: een flexibel medium om gegevens te publiceren en te abonneren
MQTT: een flexibel medium om gegevens te publiceren en te abonneren

Ten eerste ben ik dol op het gebruik van MQTT om gegevens te verzenden en ontvangen via verschillende sensoren en clients in mijn huis. Dat komt door de flexibiliteit om onbeperkte gegevens te verzenden, gecategoriseerd op een onderwerp, en onbeperkte klanten om zich te abonneren op één onderwerp van een MQTT-makelaar. Ten tweede ben ik niet gekwalificeerd om MQTT diepgaand te bespreken. Ik heb MQTT vorig jaar (2017) soms leren kennen toen ik tutorials volgde om een weerstation en sensoren op te zetten met Node-RED. Hoe dan ook, ik zal mijn best doen om u wat informatie te geven. Een andere goede plek om te beginnen is Wikipedia.

Als je geen tijd hebt om over de theorie te lezen en een MQTT-makelaar wilt opzetten, heb ik daarvoor een andere tutorial gepost. Zoek dit bericht op en scrol omlaag naar stap 4.

Om uit te leggen wat Message Queuing Telemetry Transport (MQTT) naar mijn mening is, heb ik een diagram opgesteld zoals hierboven. In een notendop, MQTT is een ISO-standaard, en een product zoals Mosquitto en Mosquitto-client, twee pakketten die ik gebruikte om MQTT-broker op een Raspberry Pi te bouwen, moeten aan die norm voldoen. De MQTT-makelaar wordt dan een medium voor uitgevers om een bericht in te duwen en abonnees om naar een doelonderwerp te luisteren.

De combinatie van Arduino PubSubclient-bibliotheek met ArduinoJson, dankzij de maker knolleary en bblanchon, maakt het voor de knutselaars en ontwikkelaars gemakkelijker voor een set tools van sensoren tot een doelapparatuur of een eindclient.

Laten we verder gaan met het maken van een database en wat gegevens weergeven.

Stap 3: Sla gegevens op in SQL en geef ze weer op een webserver

Gegevens opslaan in SQL en ze weergeven op een webserver
Gegevens opslaan in SQL en ze weergeven op een webserver
Gegevens opslaan in SQL en ze weergeven op een webserver
Gegevens opslaan in SQL en ze weergeven op een webserver

Ik heb sqlite3 gebruikt om een database voor de webserver te maken. Installeer de sqlite3 in Rapberry Pi door:

sudo apt-get install sqlite3

creëerde een database en een tabel door in de terminal te typen:

sqlite3 weerstation.db

MAAK TABEL weerdata (id INT PRIMARY KEY, thetime DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // om de sqlite-opdrachtregel af te sluiten en terug te keren naar de Linux-terminal

Om naar een onderwerp te luisteren dat door het weerstation is gepubliceerd, heb ik een Paho-bibliotheek met Python gebruikt:

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

Aanbevolen: