جدول المحتويات:

محطة الطقس: ESP8266 مع النوم العميق ، SQL ، الرسم البياني بواسطة Flask & Plotly: 3 خطوات
محطة الطقس: ESP8266 مع النوم العميق ، SQL ، الرسم البياني بواسطة Flask & Plotly: 3 خطوات

فيديو: محطة الطقس: ESP8266 مع النوم العميق ، SQL ، الرسم البياني بواسطة Flask & Plotly: 3 خطوات

فيديو: محطة الطقس: ESP8266 مع النوم العميق ، SQL ، الرسم البياني بواسطة Flask & Plotly: 3 خطوات
فيديو: Arduino DIY Car Temperature & Humidity Sensor - ESP8266 Module 2024, شهر نوفمبر
Anonim
محطة الطقس: ESP8266 مع النوم العميق ، SQL ، الرسم البياني بواسطة Flask & Plotly
محطة الطقس: ESP8266 مع النوم العميق ، SQL ، الرسم البياني بواسطة Flask & Plotly

هل سيكون من الممتع معرفة درجة الحرارة أو الرطوبة أو شدة الضوء على شرفتك؟ أعلم أنني سأفعل. لذلك أنشأت محطة أرصاد جوية بسيطة لجمع مثل هذه البيانات. الأقسام التالية هي الخطوات التي اتخذتها لبناء واحد.

هيا بنا نبدأ!

الخطوة 1: محطة الطقس مع مستشعرات الضوء ودرجة الحرارة والرطوبة

محطة أرصاد جوية مزودة بأجهزة استشعار للضوء ودرجة الحرارة والرطوبة
محطة أرصاد جوية مزودة بأجهزة استشعار للضوء ودرجة الحرارة والرطوبة
محطة أرصاد جوية مزودة بأجهزة استشعار للضوء ودرجة الحرارة والرطوبة
محطة أرصاد جوية مزودة بأجهزة استشعار للضوء ودرجة الحرارة والرطوبة
محطة أرصاد جوية مزودة بأجهزة استشعار للضوء ودرجة الحرارة والرطوبة
محطة أرصاد جوية مزودة بأجهزة استشعار للضوء ودرجة الحرارة والرطوبة
محطة أرصاد جوية مزودة بأجهزة استشعار للضوء ودرجة الحرارة والرطوبة
محطة أرصاد جوية مزودة بأجهزة استشعار للضوء ودرجة الحرارة والرطوبة

عندما خططت لبناء محطة أرصاد جوية ، كنت أحلم بأن يكون لدي محطة أرصاد جوية كاملة لديها سرعة الرياح ، وقياس المطر ، ومستشعر شمسي كامل الطيف ، ولكن تبين أن ذلك لن يكون رخيصًا ، وقد تنتهي تكلفة الشراء ما لا يقل عن 100 دولار. لقد تخليت عن الخيارات الكاملة وبدأت في بناء واحدة بمبلغ 10 دولارات ، أو أكثر أو أقل. 10 دولارات هي تكلفة المكونات الأساسية لمحطة الطقس كما هو موضح أدناه.

ها هي الأجزاء:

1. تكاليف العلامة التجارية Wemos ESP8266 $ 2.39 على Aliexpress. أوصي بعلامة Wemos التجارية لأن EPS8266 أسهل في البرمجة والتحديث ولديه فلاش 4 ميجا بايت أو أكثر.

2. تكلفة Wemos Charger-Boost Shield تبلغ 1.39 دولارًا أمريكيًا. هذه فائدة أخرى لاستخدام هذه العلامة التجارية. يحتوي على لوحة تعزيز لبطارية الليثيوم (الجهد الاسمي = 3.7 فولت) إلى 5 فولت لـ ESP8266. تأتي اللوحة أيضًا مع خيار الشحن بحد أقصى شحن = 1M.

* ملاحظة: يوجد خيار أرخص لشحن / زيادة بطارية الليثيوم. هذا واحد يكلف 1.77 دولار مقابل محفظة 5pcs. ومع ذلك ، عندما استخدمت هذه اللوحة لـ ESP8266 (إما Wemos أو ESP8266 العاري) ، أدى وضع السكون العميق لـ ESP8266 إلى إعادة الضبط مباشرة بعد جعل ESP8266 في حلقة من النوم-إعادة تعيين-النوم ، وهو أمر مزعج للغاية. إذا كنت تعرف ما كان يحدث ، من فضلك أرسل لي بريداً إلكترونياً.

3. يحتوي Wemos أيضًا على العديد من الدروع للحرارة والرطوبة ولكنني سأقوم بالبناء من مكونات فردية. المقاوم الضوئي (أو المقاوم المعتمد على الضوء - ldr ، رخيص) ، مستشعر الإضاءة مثل BH1780 أو TSL2561 (حوالي 0.87-0.89c قطعة) ، مستشعر درجة الحرارة مثل DS18B20 (75 درجة مئوية لكل منهما) ، ومجموعة رطوبة ودرجة حرارة مثل DHT22 (2.35 دولارًا هنا) أو SHT21 (2.20 دولارًا هنا). التكلفة الإجمالية لجهاز الاستشعار ~ 4 دولارات.

4. بطارية الليثيوم. لقد أنقذت واحدة من بطارية كانون 7.4 فولت وهي بطاريتان 3.7 فولت في سلسلة أو بطارية ليثيوم 18650. كل 18650 يكلف حوالي 5 دولارات للقطعة الواحدة. لدي صورة تظهر تمزيق حزمة بطارية الكاميرا. كن حذرًا ، فالتقصير عند قطع الغطاء البلاستيكي يمكن أن يولد حرارة شديدة ويحترق.

5. مجلس ثنائي الفينيل متعدد الكلور ، العبور ، الأسلاك ، لحام ، وقتك ، ربما بعض مهارات التصحيح.

دع مكونات الأسلاك معًا تتبع التخطيطي أعلاه.

بعد ذلك ، ابحث عن المهمة في حلقة الإعداد. إنها ببساطة عملية تشغيل واحدة من المهام وتنتهي بأمر السكون.

إعداد باطل () {Serial.begin (115200) ؛ Serial.println ("بدء العقدة المسماة" + سلسلة (SENSORNAME)) ؛ setup_wifi () ، تأخير (100) ؛ Wire.begin () ؛ pinMode (ldrPin ، الإدخال) ؛ SHT21.begin () ، if (! tsl.begin ()) {Serial.print ("TSL2561 غير موجود")؛ بينما (1) ؛ } تأخير (100)؛ ldr = analogRead (ldrPin) ؛ tsl.enableAutoRange (صحيح) ، tsl.setIntegrationTime (TSL2561_INTEGRATIONTIME_13MS) ، تأخير (100) ؛ حدث sensors_event_t ؛ tsl.getEvent (& event) ؛ if (event.light) lux = event.light ؛ آخر Serial.println ("الاستشعار الزائد") ؛

ح = SHT21.getHumidity () ؛

ر = 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 ("\ n Light:٪ 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.

موصى به: