Мазмуну:
- 1 -кадам: Жарык, Температура жана Нымдуулук сенсорлору менен аба ырайы станциясы
- 2 -кадам: MQTT: Маалыматты жарыялоо жана жазылуу үчүн ийкемдүү орто
- 3 -кадам: SQLге маалыматтарды сактоо жана аларды веб -серверде көрсөтүү
Video: Аба ырайы станциясы: ESP8266 Deep Sleep, SQL, Flask & Plotly менен график түзүү: 3 кадам
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:38
Балкондогу температураны, нымдуулукту же жарыктын интенсивдүүлүгүн билүү кызыктуубу? Мен болмокмун билем. Ошентип, мен мындай маалыматтарды чогултуу үчүн жөнөкөй аба ырайы станциясын жасадым. Төмөнкү бөлүмдөр мен аны куруу үчүн жасаган кадамдар.
Кел, баштайлы!
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 менен кээде өткөн жылы (2017) Node-REDди колдонуп метеостанцияны жана сенсорлорду орнотуу боюнча окуу куралдарынан кийин билишим керек болчу. Кандай болбосун, мен сизге кандайдыр бир маалыматты берүүгө аракет кылам. Дагы бир жакшы жер - Википедия.
Эгерде сизде теория жөнүндө окууга убактыңыз жок болсо жана MQTT брокерин түзгүңүз келсе, мен дагы бир окуу куралын жайгаштырдым. Бул постту карап, 4 -кадамга чейин ылдый жылдырыңыз.
Түшүнүүм боюнча Message Queuing Telemetry Transport (MQTT) деген эмне экенин түшүндүрүү үчүн мен жогоруда көрсөтүлгөндөй диаграмма даярдадым. Кыскача айтканда, MQTT-бул ISO стандарты, жана мен, мисалы, чиркей жана чиркей-кардар продукты, мен Raspberry Piде MQTT брокерин курган эки пакет, ошол стандартка ылайык келиши керек. MQTT брокери кийин жарыялоочуларга билдирүү жөнөтүү жана абоненттерге максаттуу теманы угуу үчүн каражат болуп калат.
Arduino PubSubclient китепканасынын ArduinoJson менен айкалышы, анын жаратуучусу knolleary жана bblanchon урматында, сенсорлордон тартып максаттуу жабдууга же акыркы кардарга чейинки куралдар топтомун жасоочуларга жана иштеп чыгуучуларга жеңилдетет.
Берилиштер базасын түзүүнү улантып, айрым маалыматтарды көрсөтөлү.
3 -кадам: 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.
Сунушталууда:
Кесиптик аба ырайы станциясы ESP8266 жана ESP32 DIY колдонуп: 9 кадам (сүрөттөр менен)
ESP8266 жана ESP32 DIY колдонгон профессионалдуу аба ырайы станциясы: LineaMeteoStazione - бул Sensirionдун профессионалдык сенсорлору, ошондой эле кээ бир Davis Instrument компоненттери (Rain Gauge, Anemometer) менен байланышта боло турган толук аба ырайы станциясы
ESP8266 менен жөнөкөй аба ырайы станциясы: 6 кадам (сүрөттөр менен)
Жөнөкөй аба ырайы станциясы ESP8266 колдонот. Бул Нускамада мен температура, басым, климат сыяктуу маалыматтарды алуу үчүн ESP8266ны кантип колдонуу керектиги менен бөлүшөм. Жалпы көрүү саны. жана маалыматтарды сериялык монитордо көрсөтүү жана ЖКда көрсөтүү. Маалыматтар f
Акыркы 1-2 күндүн ичинде трендди көрүү үчүн Arduino, BME280 жана дисплей менен аба ырайы станциясы: 3 кадам (сүрөттөр менен)
Акыркы 1-2 күндүн ичинде трендди көрүү үчүн Arduino, BME280 жана дисплей менен метеорологиялык станция: Саламатсызбы! Алар учурдагы абанын басымын, температурасын жана нымдуулугун көрсөтөт. Аларга акыркы 1-2 күндүн ичинде курстун презентациясы жетишпеди. Бул процесске ээ болмок
Аба ырайы шамы - Аба ырайы жана температура бир караганда: 8 кадам
Аба ырайы шамы - Аба ырайы жана Температура Бир Караганда: Бул сыйкырдуу шамды колдонуп, сиз учурдагы температураны жана шарттарды дароо сыртта айта аласыз
BME280 сенсору менен ESP32 WiFi аба ырайы станциясы: 7 кадам (сүрөттөр менен)
BME280 сенсору менен ESP32 WiFi аба ырайы станциясы: Урматтуу достор, дагы бир окуу куралына кош келиңиздер! Бул окуу куралында биз WiFi иштетилген аба ырайы станциясынын долбоорун түзөбүз! Биз жаңы, таасирдүү ESP32 чипин биринчи жолу Nextion дисплейи менен бирге колдонобуз. Бул видеодо биз