Мазмуну:

Аба ырайы станциясы: ESP8266 Deep Sleep, SQL, Flask & Plotly менен график түзүү: 3 кадам
Аба ырайы станциясы: ESP8266 Deep Sleep, SQL, Flask & Plotly менен график түзүү: 3 кадам

Video: Аба ырайы станциясы: ESP8266 Deep Sleep, SQL, Flask & Plotly менен график түзүү: 3 кадам

Video: Аба ырайы станциясы: ESP8266 Deep Sleep, SQL, Flask & Plotly менен график түзүү: 3 кадам
Video: Home Weather Station - NodeMCU & BME280 2024, Июль
Anonim
Аба ырайы бекети: ESP8266 Deep Sleep, SQL, Flask & Plotly менен график түзүү
Аба ырайы бекети: ESP8266 Deep Sleep, SQL, Flask & Plotly менен график түзүү

Балкондогу температураны, нымдуулукту же жарыктын интенсивдүүлүгүн билүү кызыктуубу? Мен болмокмун билем. Ошентип, мен мындай маалыматтарды чогултуу үчүн жөнөкөй аба ырайы станциясын жасадым. Төмөнкү бөлүмдөр мен аны куруу үчүн жасаган кадамдар.

Кел, баштайлы!

1 -кадам: Жарык, Температура жана Нымдуулук сенсорлору менен аба ырайы станциясы

Аба ырайы, жарык, температура жана нымдуулук сенсорлору менен
Аба ырайы, жарык, температура жана нымдуулук сенсорлору менен
Аба ырайы, жарык, температура жана нымдуулук сенсорлору менен
Аба ырайы, жарык, температура жана нымдуулук сенсорлору менен
Аба ырайы, жарык, температура жана нымдуулук сенсорлору менен
Аба ырайы, жарык, температура жана нымдуулук сенсорлору менен
Аба ырайы, жарык, температура жана нымдуулук сенсорлору менен
Аба ырайы, жарык, температура жана нымдуулук сенсорлору менен

Мен метеостанция курууну пландап жатканда, шамалдын ылдамдыгы, жамгырдын өлчөөсү, күндүн толук спектринин сенсоруна ээ болгон толук кандуу метеостанцияга ээ болууну кыялданчумун, бирок бул арзан болбойт, жана сатып алуу наркы бүтүшү мүмкүн жок дегенде $ 100 чейин. Мен толук варианттардан баш тартып, аздыр -көптүр $ 10 менен кура баштадым. $ 10 - төмөндөгү бөлүктөр катары метеостанциянын негизги компоненттеринин баасы.

Бул жерде бөлүктөр:

1. ESP8266 Wemos брендинин баасы Aliexpress $ 2.39 даана. Мен Wemos брендин сунуштайт элем, анткени анын EPS8266 программасы, жаңыртылышы жана 4МБ флэш же андан көп болушу оңой.

2. Wemos Charger-Boost Shieldдин баасы $ 1.39 даана. Бул брендди колдонуунун дагы бир пайдасы. Бул ESP8266 үчүн 5V үчүн литий батарейка (номиналдык чыңалуу = 3.7V) үчүн жогорулатуу тактасы бар. Такта ошондой эле эң жогорку кубаттоо заряды = 1М болгон кубаттоочу параметр менен келет.

*Эскертүү: Литий батареясын кубаттоо/жогорулатуу үчүн арзаныраак вариант бар. Бул 5 даана үчүн $ 1.77 турат. Бирок, мен бул тактаны 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 ("Башталган түйүн" + String (SENSORNAME)); setup_wifi (); кечиктирүү (100); Wire.begin (); pinMode (ldrPin, INPUT); SHT21.begin (); if (! tsl.begin ()) {Serial.print ("TSL2561 табылган жок"); while (1); } кечиктирүү (100); ldr = analogRead (ldrPin); tsl.enableAutoRange (чыныгы); tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS); кечиктирүү (100); sensors_event_t окуясы; tsl.getEvent (& окуя); if (event.light) lux = event.light; else Serial.println ("Сенсордун ашыкча жүктөлүшү");

h = SHT21.getHumidity ();

t = SHT21.getTemperature (); tempSensor.setWaitForConversion (жалган); 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 -кадамга чейин ылдый жылдырыңыз.

Түшүнүүм боюнча Message Queuing Telemetry Transport (MQTT) деген эмне экенин түшүндүрүү үчүн мен жогоруда көрсөтүлгөндөй диаграмма даярдадым. Кыскача айтканда, MQTT-бул ISO стандарты, жана мен, мисалы, чиркей жана чиркей-кардар продукты, мен Raspberry Piде MQTT брокерин курган эки пакет, ошол стандартка ылайык келиши керек. MQTT брокери кийин жарыялоочуларга билдирүү жөнөтүү жана абоненттерге максаттуу теманы угуу үчүн каражат болуп калат.

Arduino PubSubclient китепканасынын ArduinoJson менен айкалышы, анын жаратуучусу knolleary жана bblanchon урматында, сенсорлордон тартып максаттуу жабдууга же акыркы кардарга чейинки куралдар топтомун жасоочуларга жана иштеп чыгуучуларга жеңилдетет.

Берилиштер базасын түзүүнү улантып, айрым маалыматтарды көрсөтөлү.

3 -кадам: SQLге маалыматтарды сактоо жана аларды веб -серверде көрсөтүү

SQLге маалыматтарды сактаңыз жана аларды веб -серверде көрсөтүңүз
SQLге маалыматтарды сактаңыз жана аларды веб -серверде көрсөтүңүз
SQLге маалыматтарды сактаңыз жана аларды веб -серверде көрсөтүңүз
SQLге маалыматтарды сактаңыз жана аларды веб -серверде көрсөтүңүз

Мен веб -сервер үчүн маалымат базасын түзүү үчүн sqlite3 колдондум. Sqlite3ти Rapberry Piге орнотуңуз:

Sudo apt-get sqlite3 орнотуу

терминалга терүү менен маалымат базасын жана таблицаны түздү:

sqlite3 аба ырайы бекети.db

ТАБЛИЦА аба ырайын түзүү (id INT PRIMARY KEY, the time DATETIME, ldr INT, tls2561 INT, ds18b20 REAL, tsht21 REAL, hsht21 REAL);

.exit // sqlite буйрук сабынан чыгуу жана Linux терминалына кайтуу

Аба ырайы бекети тарабынан чыгарылган теманы угуу үчүн мен 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.

Сунушталууда: