Съдържание:

Метеорологична станция: ESP8266 С дълбок сън, SQL, Графиране по колба и график: 3 стъпки
Метеорологична станция: ESP8266 С дълбок сън, SQL, Графиране по колба и график: 3 стъпки

Видео: Метеорологична станция: ESP8266 С дълбок сън, SQL, Графиране по колба и график: 3 стъпки

Видео: Метеорологична станция: ESP8266 С дълбок сън, SQL, Графиране по колба и график: 3 стъпки
Видео: Weather Station with ESP8266-WiFi 2024, Ноември
Anonim
Метеорологична станция: ESP8266 с дълбок сън, SQL, графики чрез колба и плот
Метеорологична станция: ESP8266 с дълбок сън, SQL, графики чрез колба и плот

Ще бъде ли забавно да знаете температурата, влажността или интензитета на светлината на вашия балкон? Знам, че бих. Затова направих проста метеорологична станция за събиране на такива данни. Следващите раздели са стъпките, които предприех, за да създам такъв.

Да започваме!

Стъпка 1: Метеорологична станция със сензори за светлина, температура и влажност

Метеорологична станция със сензори за светлина, температура и влажност
Метеорологична станция със сензори за светлина, температура и влажност
Метеорологична станция със сензори за светлина, температура и влажност
Метеорологична станция със сензори за светлина, температура и влажност
Метеорологична станция със сензори за светлина, температура и влажност
Метеорологична станция със сензори за светлина, температура и влажност
Метеорологична станция със сензори за светлина, температура и влажност
Метеорологична станция със сензори за светлина, температура и влажност

Когато планирах да построя метеорологична станция, мечтаех да имам пълноценна метеорологична станция, която да има скорост на вятъра, измерване на дъжд, пълен спектър слънчев сензор, но се оказа, че това няма да е евтино и цената на покупката може да приключи най -малко $ 100. Отказах се от пълните опции и започнах да изграждам такъв с 10 или повече долара. $ 10 е цената на основните компоненти на метеорологичната станция като частите по -долу.

Ето частите:

1. Марката ESP8266 Wemos струва $ 2,39 на брой в Aliexpress. Бих препоръчал марката Wemos, защото нейният EPS8266 е по -лесен за програмиране, актуализиране и има 4MB флаш или повече.

2. Wemos Charger-Boost Shield струва $ 1,39 бр. Това е още едно предимство при използването на тази марка. Той има платка за усилване за литиева батерия (номинално напрежение = 3.7V) до 5V за ESP8266. Платката се предлага и с опция за зареждане с максимален ток на зареждане = 1M.

*Забележка: Има по -евтин вариант за зареждане/увеличаване на литиевата батерия. Тази струва 1,77 долара за 5 бр. Въпреки това, когато използвах тази платка за ESP8266 (или Wemos, или голи ESP8266), режимът на дълбок сън на ESP8266 задейства нулиране веднага след като направи ESP8266 в цикъл на сън-нулиране-сън, което е много досадно. Ако знаете какво се случва, пишете ми във входящата поща.

3. Wemos също има няколко щита за температура и влажност, но аз ще изграждам от отделни компоненти. Фоторезистор (или светлозависим резистор-ldr, евтин), сензор за осветеност като BH1780 или TSL2561 (около 0,87-0,89c бр.), Температурен сензор като DS18B20 (по 75c всеки) и комбинация от влажност и температура, като напр. DHT22 ($ 2.35 тук) или SHT21 ($ 2.20 тук). Обща цена за сензора ~ $ 4.

4. Литиева батерия. Аз спасих една от 7,4V батерия на Canon, която е две 3,7V батерии последователно или 18650 литиева батерия. Всеки 18650 струва около 5 долара на брой. Имам снимка, показваща разрушаването на батерията на камерата. Внимавайте обаче, късо съединение при прорязване на пластмасовия капак може да генерира изключителна топлина и да изгори.

5. PCB платка, джъмпер, тел, запояване, вашето време, може би някои умения за отстраняване на грешки.

Нека жичните компоненти заедно следват схемата по -горе.

След това потърсете задачата в цикъла за настройка. Това е просто еднократно изпълнение на задачи и завършва с команда за заспиване.

void setup () {Serial.begin (115200); Serial.println ("Начален възел с име" + низ (SENSORNAME)); setup_wifi (); забавяне (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.begin (); if (! tsl.begin ()) {Serial.print ("TSL2561 не е намерен"); докато (1); } забавяне (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (true); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); забавяне (100); sensors_event_t събитие; tsl.getEvent (& event); if (event.light) lux = event.light; else Serial.println ("Претоварване на сензора");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (false); tempSensor.begin (); забавяне (100); if (tempSensor.getDeviceCount () == 0) {Serial.printf ("DS18x20 не е намерен на пин %d / n", ds18b20); Serial.flush (); забавяне (1000); } забавяне (100); tempSensor.requestTemperatures (); t18 = tempSensor.getTempCByIndex (0); Serial.printf ("\ nLight: %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); забавяне (100); client.setServer (mqtt_server, mqtt_port); client.setCallback (обратно повикване); повторно свързване (); забавяне (100); ESP.deepSleep (3e8); // 300 милиона микросекунди, 300 секунди, 5 минути; }

По време на отстраняване на грешки или настройка, задайте командата на ESP.deepsleep (), за да има непрекъснато отчитане на сериен код. Както винаги, пълният код за качване в ESP8266 се хоства тук (GitHub).

Не забравяйте да поставите джъмпера между RST и D0/GPIO16, за да задействате събуждане след период на дълбок сън.

Сега е време да качите кода с помощта на Arduino IDE в ESP8266.

Стъпка 2: MQTT: гъвкав носител за публикуване и абониране на данни

MQTT: гъвкав носител за публикуване и абониране на данни
MQTT: гъвкав носител за публикуване и абониране на данни
MQTT: гъвкав носител за публикуване и абониране на данни
MQTT: гъвкав носител за публикуване и абониране на данни

Първо, все повече обичам да използвам MQTT за изпращане и получаване на данни през различни сензори и клиенти в моя дом. Това е така, защото гъвкавостта да се изпращат неограничени данни, категоризирани по тема, и неограничени клиенти да се абонират за една тема от MQTT брокер. Второ, нямам право да обсъждам задълбочено MQTT. Познавах MQTT понякога миналата година (2017), когато следвах уроци за настройка на метеорологична станция и сензори, използвайки Node-RED. Както и да е, ще се постарая да ви представя малко информация. Друго добро начало е Уикипедия.

Ако нямате време да четете за теорията и искате да създадете брокер на MQTT, публикувах друг урок само за това. Потърсете тази публикация и превъртете надолу до Стъпка 4.

За да обясня какво е телеметричен транспорт на опашки за съобщения (MQTT) според мен, подготвих диаграма както по -горе. С две думи, MQTT е стандарт ISO и продукт като комар и клиент против комари, два пакета, които използвах за изграждане на брокер MQTT на Raspberry Pi, трябва да отговарят на този стандарт. Тогава брокерът MQTT се превръща в среда за издателите, които да изпращат съобщение, и абонатите да слушат целева тема.

Комбинацията от библиотеката на Arduino PubSubclient с ArduinoJson, благодарение на създателя си knolleary и bblanchon, улеснява тинкарите и разработчиците за набор от инструменти от сензори до целево оборудване или краен клиент.

Нека да продължим със създаването на база данни и да покажем някои данни.

Стъпка 3: Запазете данните в SQL и ги покажете на уеб сървър

Запазете данни в SQL и ги покажете на уеб сървър
Запазете данни в SQL и ги покажете на уеб сървър
Запазете данни в SQL и ги покажете на уеб сървър
Запазете данни в SQL и ги покажете на уеб сървър

Използвах sqlite3 за създаване на база данни за уеб сървъра. Инсталирайте sqlite3 в Rapberry Pi чрез:

sudo apt-get install sqlite3

създаде база данни и таблица, като въведе в терминала:

sqlite3 weatherstation.db

СЪЗДАЙТЕ ТАБЛИЦА метеорологични данни (id INT PRIMARY KEY, thetime DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // за изход от командния ред на sqlite и връщане към терминала на Linux

За да слушам тема, публикувана от метеорологичната станция, използвах библиотека на Paho с Python:

#! /usr/bin/python3#, прието от: > # 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.

Препоръчано: