สถานีตรวจอากาศ IoT พร้อม RPi และ ESP8266: 10 ขั้นตอน
สถานีตรวจอากาศ IoT พร้อม RPi และ ESP8266: 10 ขั้นตอน

วีดีโอ: สถานีตรวจอากาศ IoT พร้อม RPi และ ESP8266: 10 ขั้นตอน

วีดีโอ: สถานีตรวจอากาศ IoT พร้อม RPi และ ESP8266: 10 ขั้นตอน
วีดีโอ: Arduino ESP8266 BLYNK IOT - ทดลอง Sensor DHT22/DHT11 วัดอุณหภูมิ และ ความชื้นในอากาศ 2025, มกราคม
Anonim
สถานีตรวจอากาศ IoT พร้อม RPi และ ESP8266
สถานีตรวจอากาศ IoT พร้อม RPi และ ESP8266

ในบทช่วยสอนก่อนหน้านี้ เราได้เล่นกับ NodeMCU เซ็นเซอร์ และเรียนรู้วิธีบันทึกและบันทึกข้อมูลบนแพลตฟอร์ม ThingSpeak (แพลตฟอร์ม Internet of Things (IoT) ที่ให้คุณรวบรวมและจัดเก็บข้อมูลเซ็นเซอร์ในคลาวด์และพัฒนาแอปพลิเคชัน IoT):

IOT MADE EASY: เก็บข้อมูลสภาพอากาศระยะไกล: UV และอุณหภูมิอากาศและความชื้น

ด้วยบทช่วยสอนใหม่นี้ เราจะเรียนรู้วิธีการทำเช่นเดียวกัน แต่ในเวลานี้ การใช้ Raspberry Pi เพื่อเก็บข้อมูลจากเซ็นเซอร์ต่างๆ และสำรวจวิธีการสื่อสารระหว่างอุปกรณ์และเว็บต่างๆ:

เซนเซอร์และประเภท Cominication:

  • DHT22 (อุณหภูมิและความชื้น) ==> การสื่อสารแบบดิจิตอล
  • BMP180 (อุณหภูมิและความดัน) ==> โปรโตคอล I2C
  • DS18B20 (อุณหภูมิ) ==> 1-Wire Protocol

แผนภาพบล็อกแสดงสิ่งที่เราจะได้รับเมื่อสิ้นสุดโครงการนี้:

ขั้นตอนที่ 1: BoM - บิลวัสดุ

  1. Raspberry Pi V3 - 32.00 เหรียญสหรัฐ
  2. DHT22 เซ็นเซอร์อุณหภูมิและความชื้นสัมพัทธ์ - USD 9.95
  3. ตัวต้านทาน 4K7 โอห์ม
  4. DS18B20 เซ็นเซอร์อุณหภูมิกันน้ำ - USD 5.95
  5. ตัวต้านทาน 4K7 โอห์ม
  6. BMP180 เซ็นเซอร์ความดันบรรยากาศ อุณหภูมิ และระดับความสูง - USD 6.99

ขั้นตอนที่ 2: การติดตั้งเซ็นเซอร์อุณหภูมิและความชื้น

การติดตั้งเซ็นเซอร์อุณหภูมิและความชื้น
การติดตั้งเซ็นเซอร์อุณหภูมิและความชื้น

เซนเซอร์ตัวแรกที่จะติดตั้งคือ DHT22 สำหรับเก็บข้อมูลอุณหภูมิอากาศและความชื้นสัมพัทธ์ ไซต์ ADAFRUIT ให้ข้อมูลที่ดีเกี่ยวกับเซ็นเซอร์เหล่านั้น ร้อง ข้อมูลบางส่วนที่ดึงมาจากที่นั่น:

ภาพรวม

เซ็นเซอร์อุณหภูมิและความชื้น DHT ราคาประหยัดเป็นแบบพื้นฐานและช้ามาก แต่เหมาะสำหรับมือสมัครเล่นที่ต้องการบันทึกข้อมูลพื้นฐาน เซ็นเซอร์ DHT ประกอบด้วยสองส่วน ได้แก่ เซ็นเซอร์ความชื้นแบบคาปาซิทีฟ และเทอร์มิสเตอร์ ภายในมีชิปพื้นฐานที่ทำการแปลงแอนะล็อกเป็นดิจิทัลและแยกสัญญาณดิจิตอลที่มีอุณหภูมิและความชื้น สัญญาณดิจิตอลนั้นค่อนข้างง่ายที่จะอ่านโดยใช้ไมโครคอนโทรลเลอร์

DHT22 ลักษณะสำคัญ:

  • ราคาถูก
  • กำลังไฟ 3 ถึง 5V และ I/O
  • การใช้กระแสไฟสูงสุด 2.5mA ระหว่างการแปลง (ขณะขอข้อมูล)
  • เหมาะสำหรับการอ่านค่าความชื้น 0-100% ด้วยความแม่นยำ 2-5%
  • เหมาะสำหรับการอ่านค่าอุณหภูมิ -40 ถึง 125°C ความแม่นยำ ±0.5°C
  • ไม่เกิน 0.5 Hz อัตราการสุ่มตัวอย่าง (ทุกๆ 2 วินาที)
  • ขนาดตัวเครื่อง 15.1mm x 25mm x 7.7mm
  • 4 พินที่มีระยะห่าง 0.1"

โดยปกติแล้วคุณจะใช้เซ็นเซอร์ในระยะทางน้อยกว่า 20 ม. ควรเชื่อมต่อตัวต้านทาน 4K7 โอห์มระหว่างขา Data และ VCC พินข้อมูลเอาต์พุต DHT22 จะเชื่อมต่อกับ Raspberry GPIO 16. ตรวจสอบไดอะแกรมไฟฟ้าด้านบน เชื่อมต่อเซ็นเซอร์กับพิน RPi ดังนี้:

  1. พิน 1 - Vcc ==> 3.3V
  2. พิน 2 - ข้อมูล ==> GPIO 16
  3. พิน 3 - ไม่เชื่อมต่อ
  4. พิน 4 - Gnd ==> Gnd

อย่าลืมติดตั้งตัวต้านทาน 4K7 โอห์มระหว่าง Vcc และดาต้าพิน

เมื่อเชื่อมต่อเซ็นเซอร์แล้ว เราต้องติดตั้งไลบรารีบน RPi ของเราด้วย

การติดตั้งไลบรารี DHT:

บน Raspberry ของคุณ เริ่มต้นใน /home ไปที่ /Documents

cd Documents

สร้างไดเร็กทอรีเพื่อติดตั้งไลบรารีและย้ายไปที่นั่น:

mkdir DHT22_Sensor

cd DHT22_Sensor

บนเบราว์เซอร์ของคุณ ไปที่ Adafruit GitHub:

github.com/adafruit/Adafruit_Python_DHT

ดาวน์โหลดไลบรารี่โดยคลิกที่ลิงค์ดาวน์โหลด zip ทางด้านขวาและคลายซิปไฟล์เก็บถาวรในโฟลเดอร์ Raspberry Pi ที่เพิ่งสร้างขึ้น จากนั้นไปที่ไดเร็กทอรีของไลบรารี (โฟลเดอร์ย่อยที่สร้างขึ้นโดยอัตโนมัติเมื่อคุณคลายซิปไฟล์) และรันคำสั่ง:

sudo python3 setup.py ติดตั้ง

เปิดโปรแกรมทดสอบ (DHT22_test.py) จาก GITHUB. ของฉัน

นำเข้า Adafruit_DHT

DHT22Sensor = Adafruit_DHT. DHT22 DHTpin = 16 ความชื้น อุณหภูมิ = Adafruit_DHT.read_retry(DHT22Sensor, DHTpin) หากความชื้นไม่ใช่ None และอุณหภูมิไม่ใช่ None: print('Temp={0:0.1f}*C Humidity={1:0.1 f}%'.format(อุณหภูมิ ความชื้น)) else: print('ไม่สามารถอ่านได้ ลองอีกครั้ง!')

รันโปรแกรมด้วยคำสั่ง:

python3 DHT22_test.py

หน้าจอการพิมพ์ Terminal ด้านล่างแสดงผล

ภาพ
ภาพ

ขั้นตอนที่ 3: การติดตั้ง DS18B20 - เซ็นเซอร์อุณหภูมิ

การติดตั้ง DS18B20 - เซ็นเซอร์อุณหภูมิ
การติดตั้ง DS18B20 - เซ็นเซอร์อุณหภูมิ
การติดตั้ง DS18B20 - เซ็นเซอร์อุณหภูมิ
การติดตั้ง DS18B20 - เซ็นเซอร์อุณหภูมิ

ภาพรวมเซนเซอร์:

เราจะใช้ในบทช่วยสอนนี้เกี่ยวกับเซ็นเซอร์ DS18B20 รุ่นกันน้ำ มีประโยชน์มากสำหรับอุณหภูมิระยะไกลในสภาพเปียก เช่น บนดินชื้น เซ็นเซอร์ถูกแยกออกมาและสามารถวัดได้จนถึง 125oC (Adafrut ไม่แนะนำให้ใช้เกิน 100oC เนื่องจากปลอกหุ้มสาย PVC)

DS18B20 เป็นเซ็นเซอร์ดิจิทัลที่ทำให้ใช้งานได้ดีแม้ในระยะทางไกล! เซ็นเซอร์อุณหภูมิดิจิตอลแบบ 1 สายเหล่านี้มีความเที่ยงตรงพอสมควร (±0.5°C ในช่วงส่วนใหญ่) และสามารถให้ความแม่นยำสูงสุด 12 บิตจากตัวแปลงดิจิทัลเป็นแอนะล็อกออนบอร์ด มันใช้งานได้ดีกับ NodeMCU โดยใช้พินดิจิทัลเพียงอันเดียว และคุณยังสามารถเชื่อมต่อหลายอันเข้ากับพินเดียวกันได้ แต่ละอันมี ID 64 บิตที่ไม่ซ้ำกันซึ่งถูกฝังไว้ที่โรงงานเพื่อสร้างความแตกต่าง

เซ็นเซอร์ทำงานตั้งแต่ 3.0 ถึง 5.0V ซึ่งหมายความว่าสามารถขับเคลื่อนโดยตรงจาก 3.3V ที่จัดหาโดยหนึ่งในหมุด Raspberry (1 หรือ 17)

เซ็นเซอร์มี 3 สาย:

  • สีดำ: GND
  • สีแดง: VCC
  • สีเหลือง: 1-Wire Data

คุณสามารถค้นหาข้อมูลทั้งหมดได้ที่นี่: DS18B20 เอกสารข้อมูลสินค้า

การติดตั้งเซนเซอร์:

ทำตามไดอะแกรมด้านบนและทำการเชื่อมต่อ:

  • Vcc ==> 3.3V
  • Gnd ==> Gnd
  • ข้อมูล ==> GPIO 4 (ค่าเริ่มต้นสำหรับไลบรารี)

การติดตั้งไลบรารี Python:

ต่อไป มาติดตั้งไลบรารี่ Python ที่จะจัดการกับเซ็นเซอร์กัน:

sudo pip3 ติดตั้ง w1thermsensor

ก่อนเรียกใช้สคริปต์เพื่อทดสอบเซ็นเซอร์ ให้ตรวจสอบว่าอินเทอร์เฟซ "1-Wire" เปิดใช้งานอยู่ใน RPi ของคุณหรือไม่ (ดูหน้าจอการพิมพ์ด้านบน)

อย่าลืมรีสตาร์ท RPi ของคุณหลังจากเปลี่ยนการกำหนดค่า

การทดสอบเซ็นเซอร์:

สำหรับการทดสอบเซ็นเซอร์ สามารถใช้สคริปต์หลามแบบง่ายได้:

เวลานำเข้า

จาก w1thermsensor นำเข้า W1ThermSensor ds18b20Sensor = W1ThermSensor () ในขณะที่ True: temperature = ds18b20Sensor.get_temperature() พิมพ์ ("อุณหภูมิ %s องศาเซลเซียส" % อุณหภูมิ) time.sleep (1)

ขั้นตอนที่ 4: การติดตั้ง BMP180

การติดตั้ง BMP180
การติดตั้ง BMP180
การติดตั้ง BMP180
การติดตั้ง BMP180
การติดตั้ง BMP180
การติดตั้ง BMP180

ภาพรวมเซนเซอร์:

BMP180 เป็นรุ่นต่อจาก BMP085 ซึ่งเป็นเซ็นเซอร์ความดันดิจิตอลที่มีความแม่นยำสูงรุ่นใหม่สำหรับการใช้งานของผู้บริโภค อุปกรณ์อิเล็กทรอนิกส์แรงดันต่ำและใช้พลังงานต่ำของ BMP180 ได้รับการปรับให้เหมาะสมสำหรับใช้ในโทรศัพท์มือถือ พีดีเอ อุปกรณ์นำทาง GPS และอุปกรณ์กลางแจ้ง ด้วยเสียงรบกวนจากระดับความสูงที่ต่ำเพียง 0.25 ม. ในเวลาแปลงที่รวดเร็ว BMP180 ให้ประสิทธิภาพที่เหนือกว่า อินเทอร์เฟซ I2C ช่วยให้สามารถรวมระบบกับไมโครคอนโทรลเลอร์ได้อย่างง่ายดาย BMP180 ใช้เทคโนโลยี piezo-resistive เพื่อความแข็งแรงทนทานของ EMC ความแม่นยำสูงและเป็นเส้นตรงตลอดจนความเสถียรในระยะยาว

สามารถดูแผ่นข้อมูล BMP ฉบับสมบูรณ์ได้ที่นี่: BMP180 - Digital Pressure Sensor

การติดตั้งเซนเซอร์:ทำตามแผนภาพด้านบนและทำการเชื่อมต่อ:

  • วิน ==> 3.3V
  • GND ==> GND
  • SCL ==> GPIO 3
  • SDA ==> GPIO 2

การเปิดใช้งานอินเทอร์เฟซ I2C

ไปที่การกำหนดค่า RPi และยืนยันว่าเปิดใช้งานอินเทอร์เฟซ I2C แล้ว หากไม่เป็นเช่นนั้น ให้เปิดใช้งานและรีสตาร์ท RPi

การใช้ BMP180

หากทุกอย่างได้รับการติดตั้งเรียบร้อย และทุกอย่างเชื่อมต่อเรียบร้อย ตอนนี้คุณก็พร้อมที่จะเปิด Pi ของคุณแล้วเริ่มดูว่า BMP180 กำลังบอกอะไรคุณเกี่ยวกับโลกรอบตัวคุณ

สิ่งแรกที่ต้องทำคือตรวจสอบว่า Pi เห็น BMP180 ของคุณหรือไม่ ลองทำสิ่งต่อไปนี้ในหน้าต่างเทอร์มินัล:

sudo i2cdetect -y 1

หากคำสั่งทำงาน คุณควรเห็นสิ่งที่คล้ายกันในหน้าจอ Terminal Print ด้านบน ซึ่งแสดงว่า BMP180 อยู่ในช่อง '77'

การติดตั้งไลบรารี BMP180:

สร้างไดเร็กทอรีเพื่อติดตั้งไลบรารี:

mkdir BMP180_Sensorcd BMP180_Sensor

บนเบราว์เซอร์ของคุณ ไปที่ Adafruit GITHub:

github.com/adafruit/Adafruit_Python_BMP

ดาวน์โหลดไลบรารี่โดยคลิกที่ลิงค์ดาวน์โหลด zip ทางด้านขวาและเปิดเครื่องรูดไฟล์เก็บถาวรในโฟลเดอร์ Raspberry Pi ที่คุณสร้างขึ้น จากนั้นไปที่โฟลเดอร์ย่อยที่สร้างและรันคำสั่งต่อไปนี้ในไดเร็กทอรีของไลบรารี:

sudo python3 setup.py ติดตั้ง

เปิด Python IDE ของคุณแล้วสร้างโปรแกรมทดสอบแล้วตั้งชื่อ เช่น BMP180Test.py

นำเข้า Adafruit_BMP. BMP085 เป็น BMP085sensor = BMP085. BMP085() print('Temp = {0:0.2f} *C'.format(sensor.read_temperature())) print('Pressure = {0:0.2f} Pa' format(sensor.read_pressure())) print('Altitude = {0:0.2f} m'.format(sensor.read_altitude())) print('Sealevel Pressure = {0:0.2f} Pa'.format(sensor).read_sealevel_pressure()))

ดำเนินการโปรแกรมทดสอบ:

python3 BMP180Test.py

หน้าจอการพิมพ์ Terminal ด้านบนแสดงผล

โปรดทราบว่าความดันจะแสดงใน Pa (Pascals) ดูขั้นตอนต่อไปเพื่อทำความเข้าใจหน่วยนี้ให้ดีขึ้น

ขั้นตอนที่ 5: การวัดสภาพอากาศและระดับความสูงด้วย BMP180

การวัดสภาพอากาศและระดับความสูงด้วย BMP180
การวัดสภาพอากาศและระดับความสูงด้วย BMP180

มาใช้เวลาทำความเข้าใจเพิ่มเติมอีกหน่อยเกี่ยวกับสิ่งที่เราจะได้รับจากการอ่านค่า BMP คุณสามารถข้ามส่วนนี้ของบทช่วยสอน หรือกลับมาในภายหลัง

หากคุณต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับการอ่านเซ็นเซอร์ โปรดไปที่บทช่วยสอนที่ยอดเยี่ยมนี้:https://learn.sparkfun.com/tutorials/bmp180-barome…

BMP180 ออกแบบมาเพื่อวัดความดันบรรยากาศได้อย่างแม่นยำ ความกดอากาศแตกต่างกันไปตามสภาพอากาศและระดับความสูง

ความกดอากาศคืออะไร?

คำจำกัดความของความดันบรรยากาศคือแรงที่อากาศรอบตัวคุณใช้ไปกับทุกสิ่ง น้ำหนักของก๊าซในบรรยากาศสร้างความดันบรรยากาศ หน่วยความดันทั่วไปคือ "ปอนด์ต่อตารางนิ้ว" หรือ psi เราจะใช้สัญกรณ์สากลที่นี่ นั่นคือนิวตันต่อตารางเมตรซึ่งเรียกว่าปาสกาล (Pa)

ถ้าเอาเสากว้าง 1 ซม. ลมจะหนักประมาณ 1 กก.

น้ำหนักนี้กดลงบนรอยเท้าของคอลัมน์นั้นสร้างความดันบรรยากาศที่เราสามารถวัดด้วยเซ็นเซอร์เช่น BMP180 เนื่องจากคอลัมน์อากาศกว้างเซนติเมตรนั้นมีน้ำหนักประมาณ 1 กิโลกรัม จึงตามมาว่าความดันระดับน้ำทะเลเฉลี่ยอยู่ที่ประมาณ 101325 ปาสกาลหรือดีกว่า 1013.25 hPa (1 hPa เรียกอีกอย่างว่า milibar - mbar) สิ่งนี้จะลดลงประมาณ 4% สำหรับทุก ๆ 300 เมตรที่คุณขึ้นไป ยิ่งคุณสูงเท่าไหร่ คุณก็จะเห็นแรงกดดันน้อยลง เพราะเสาที่อยู่ด้านบนสุดของชั้นบรรยากาศนั้นสั้นกว่ามากและมีน้ำหนักน้อยกว่า สิ่งนี้มีประโยชน์ที่จะทราบ เพราะการวัดความดันและทำคณิตศาสตร์ คุณสามารถกำหนดความสูงของคุณได้

ความกดอากาศที่ 3,810 เมตร เป็นเพียงครึ่งหนึ่งของที่ระดับน้ำทะเล

BMP180 ให้แรงดันสัมบูรณ์ในหน่วยปาสกาล (Pa) ปาสกาลหนึ่งเป็นแรงกดเพียงเล็กน้อย ประมาณปริมาณกระดาษหนึ่งแผ่นที่จะวางลงบนโต๊ะ คุณมักจะเห็นการวัดเป็นเฮกโตปาสคาล (1 hPa = 100 Pa) ไลบรารีที่ใช้ที่นี่แสดงค่าทศนิยมของเอาต์พุตใน hPa ซึ่งมีค่าเท่ากับหนึ่งมิลลิบาร์ (mbar)

ต่อไปนี้คือการแปลงบางส่วนเป็นหน่วยแรงดันอื่นๆ:

  • 1 hPa = 100 Pa = 1 mbar = 0.001 bar
  • 1 hPa = 0.75006168 ทอร์
  • 1 hPa = 0.01450377 psi (ปอนด์ต่อตารางนิ้ว)
  • 1 hPa = 0.02953337 inHg (นิ้วของปรอท)
  • 1 hpa = 0.00098692 atm (บรรยากาศมาตรฐาน)

ผลกระทบของอุณหภูมิ

เนื่องจากอุณหภูมิส่งผลต่อความหนาแน่นของก๊าซ และความหนาแน่นส่งผลต่อมวลของก๊าซ และมวลส่งผลต่อความดัน (ต๊าย) ความดันบรรยากาศจะเปลี่ยนแปลงอย่างมากตามอุณหภูมิ นักบินรู้ว่าสิ่งนี้เป็น "ระดับความสูงที่มีความหนาแน่น" ซึ่งทำให้การบินในวันที่อากาศหนาวเย็นง่ายกว่าวันที่อากาศร้อนเพราะอากาศหนาแน่นกว่าและมีผลตามหลักอากาศพลศาสตร์มากกว่า เพื่อชดเชยอุณหภูมิ BMP180 มีเซ็นเซอร์อุณหภูมิที่ค่อนข้างดีและเซ็นเซอร์ความดัน

ในการอ่านค่าความดัน คุณต้องอ่านค่าอุณหภูมิก่อน จากนั้นจึงรวมค่านั้นกับการอ่านค่าความดันดิบเพื่อให้ได้ค่าความดันที่ชดเชยอุณหภูมิในขั้นสุดท้าย (ห้องสมุดทำให้ทั้งหมดนี้ง่ายมาก)

การวัดความดันสัมบูรณ์

หากแอปพลิเคชันของคุณต้องการการวัดความดันสัมบูรณ์ สิ่งที่คุณต้องทำคืออ่านค่าอุณหภูมิ จากนั้นอ่านค่าความดัน (ดูรายละเอียดในตัวอย่างแบบร่าง) การอ่านค่าความดันสุดท้ายจะอยู่ใน hPa = mbar หากต้องการ คุณสามารถแปลงหน่วยนี้เป็นหน่วยอื่นโดยใช้ปัจจัยการแปลงข้างต้น

โปรดทราบว่าความดันสัมบูรณ์ของบรรยากาศจะแตกต่างกันไปตามระดับความสูงของคุณและรูปแบบสภาพอากาศในปัจจุบัน ซึ่งทั้งสองสิ่งนี้มีประโยชน์ในการวัด

การสังเกตสภาพอากาศ

ความกดอากาศที่ตำแหน่งใดก็ตามบนโลก (หรือที่ใดก็ตามที่มีบรรยากาศ) ไม่คงที่ ปฏิสัมพันธ์ที่ซับซ้อนระหว่างการหมุนของโลก ความเอียงของแกน และปัจจัยอื่นๆ ส่งผลให้บริเวณที่เคลื่อนที่มีความดันสูงขึ้นและต่ำลง ซึ่งจะทำให้สภาพอากาศแปรปรวนที่เราเห็นทุกวัน คุณสามารถคาดการณ์การเปลี่ยนแปลงในระยะสั้นของสภาพอากาศได้ด้วยการดูการเปลี่ยนแปลงของแรงกดดัน ตัวอย่างเช่น แรงดันที่ลดลงมักจะหมายถึงสภาพอากาศที่เปียกชื้นหรือพายุกำลังใกล้เข้ามา (ระบบแรงดันต่ำกำลังเคลื่อนเข้ามา) ความกดอากาศที่สูงขึ้นมักจะหมายความว่าอากาศแจ่มใสกำลังใกล้เข้ามา (ระบบความกดอากาศสูงกำลังเคลื่อนผ่าน) แต่อย่าลืมว่าความดันบรรยากาศก็แตกต่างกันไปตามระดับความสูง ความดันสัมบูรณ์ในบ้านของฉัน Lo Barnechea ในชิลี (ระดับความสูง 950 เมตร) จะต่ำกว่าความดันสัมบูรณ์ในซานฟรานซิสโกเสมอ (น้อยกว่า 2 เมตร เกือบเท่ากับระดับน้ำทะเล) หากสถานีตรวจอากาศเพิ่งรายงานความดันสัมบูรณ์ จะเป็นการยากที่จะเปรียบเทียบการวัดความดันจากสถานที่หนึ่งไปยังอีกที่หนึ่งโดยตรง (และการพยากรณ์อากาศในขนาดใหญ่ขึ้นอยู่กับการวัดจากสถานีให้ได้มากที่สุด)

ในการแก้ปัญหานี้ สถานีตรวจอากาศจะลบผลกระทบของระดับความสูงออกจากการอ่านค่าความดันที่รายงานโดยการเพิ่มความดันคงที่ที่เทียบเท่าทางคณิตศาสตร์เพื่อทำให้ดูเหมือนกับว่าการอ่านค่าที่ระดับน้ำทะเล เมื่อคุณทำเช่นนี้ การอ่านค่าในซานฟรานซิสโกที่สูงกว่า Lo Barnechea มักจะเป็นเพราะรูปแบบสภาพอากาศ ไม่ใช่เพราะระดับความสูง

การทำเช่นนี้มีฟังก์ชั่นในห้องสมุดที่เรียกว่าระดับน้ำทะเล(P, A). การดำเนินการนี้ใช้ความดันสัมบูรณ์ (P) ในหน่วย hPa และระดับความสูงปัจจุบันของสถานี (A) เป็นเมตร และขจัดผลกระทบของระดับความสูงออกจากความดัน คุณสามารถใช้เอาต์พุตของฟังก์ชันนี้เพื่อเปรียบเทียบการอ่านสภาพอากาศของคุณกับสถานีอื่นๆ ทั่วโลกได้โดยตรง

การกำหนดระดับความสูง

เนื่องจากความดันแตกต่างกันไปตามระดับความสูง คุณจึงใช้เซ็นเซอร์ความดันเพื่อวัดระดับความสูงได้ (โดยมีข้อแม้บางประการ) ความกดอากาศเฉลี่ยของบรรยากาศที่ระดับน้ำทะเลคือ 1013.25 hPa (หรือ mbar) สิ่งนี้จะลดลงเหลือศูนย์เมื่อคุณปีนไปสู่สุญญากาศของอวกาศ เนื่องจากเส้นโค้งของการดรอปดาวน์นี้เป็นที่เข้าใจกันดี คุณจึงสามารถคำนวณความแตกต่างของระดับความสูงระหว่างการวัดความดันสองครั้ง (p และ p0) ได้โดยใช้สมการเฉพาะ

หากคุณใช้ความดันระดับน้ำทะเล (1013.25 hPa) เป็นความดันพื้นฐาน (p0) ผลลัพธ์ของสมการจะเป็นระดับความสูงปัจจุบันของคุณเหนือระดับน้ำทะเล มีฟังก์ชันในไลบรารีที่เรียกว่าความสูง (P, P0) ที่ช่วยให้คุณได้รับ "ความสูงที่คำนวณได้"

คำอธิบายข้างต้นดึงมาจากบทช่วยสอน BMP 180 Sparkfun

ขั้นตอนที่ 6: HW. ที่สมบูรณ์

HW ที่สมบูรณ์
HW ที่สมบูรณ์

ขั้นตอนที่ 7: การส่งข้อมูลไปยัง ThingSpeak

กำลังส่งข้อมูลไปยัง ThingSpeak
กำลังส่งข้อมูลไปยัง ThingSpeak

ณ จุดนี้ เราได้เรียนรู้วิธีเตรียม RPi เพื่อเก็บข้อมูลจากเซ็นเซอร์ทั้ง 3 ตัว โดยพิมพ์บนเทอร์มินัล ถึงเวลาดูวิธีการส่งข้อมูลเหล่านั้นไปยังแพลตฟอร์ม IoT อย่าง ThingSpeak

เอาล่ะ!

ก่อนอื่น คุณต้องมีบัญชีที่ ThinkSpeak.com

ทำตามคำแนะนำเพื่อสร้างช่องและจดรหัสช่องของคุณและเขียนคีย์ API

ดาวน์โหลดสคริปต์ Python จาก GitHub ของฉัน: localData ToTS_v1_EXT.py

แสดงความคิดเห็นส่วนที่สำคัญที่สุดของรหัส:

ขั้นแรก มานำเข้าไลบรารี ThingSpeak กำหนดไคลเอนต์ WiFi และกำหนดเราเตอร์ในพื้นที่ของคุณและข้อมูลประจำตัว Thinkspeak:

นำเข้าสิ่งที่พูด

มีหลายวิธีในการสื่อสารกับ ThingSpeak วิธีที่ง่ายที่สุดคือการใช้ไลบรารีของไคลเอ็นต์สำหรับ API ของ Thingspeak.com ที่พัฒนาโดย Mikolaj Chwaliz และ Keith Ellis

ห้องสมุดสามารถดาวน์โหลดได้จาก https://github.com/mchwalisz/thingspeak หรือใช้ PIP บนเทอร์มินัล:

sudo pip3 ติดตั้ง thingspeak

ถัดไป ภายในสคริปต์ อัปเดตข้อมูลรับรองช่อง ThingSpeak

chId = 9999999 # ป้อนด้วยรหัสช่องของคุณ

tsKey='ENTER ด้วยคีย์เขียนช่องของคุณ' tsUrl='https://api.thingspeak.com/update' ts = thingspeak. Channel(chId, tsUrl, tsKey)

ตอนนี้ เรามาเริ่มต้นเซ็นเซอร์ 3 ตัวกัน:

# DS18B20 1-Wire ห้องสมุด

จากการนำเข้า w1thermsensor W1ThermSensor ds18b20Sensor = W1ThermSensor () # โดยค่าเริ่มต้น GPIO 4 ถูกใช้โดยไลบรารี # DHT22 การนำเข้าไลบรารี Adafruit_DHT DHT22Sensor = Adafruit_DHT. DHT22 DHTpin = 16 # BMP180 ไลบรารีนำเข้า Adafruit_BMP. BMP085 เป็น BMP085 bMP085 เป็น BMP085 คุณควรกำหนดระดับความสูงจริงที่สถานีตรวจอากาศของคุณตั้งอยู่ โดยอัปเดตตัวแปรส่วนกลาง "altReal" ในกรณีของฉัน สถานีของฉันตั้งอยู่เหนือระดับน้ำทะเล 950 เมตร

ทั่วโลก altReal

altReal = 950

เมื่อป้อนความสูงจริงของสถานีเป็นอินพุต เราจะสามารถรับความดันสัมบูรณ์ ความดันระดับน้ำทะเล อุณหภูมิ และระดับความสูงโดยใช้ฟังก์ชัน bmp180GetData(altitude):

def bmp180GetData (ระดับความสูง):

temp = bmp180Sensor.read_temperature() pres = bmp180Sensor.read_pressure() alt=bmp180Sensor.read_altitude() presSeaLevel = pres / pow (1.0 - ระดับความสูง/44330.0, 5.255) temp = รอบ (อุณหภูมิ 1) pres = รอบ (กด/100, 2) # ความดันสัมบูรณ์ใน hPa (หรือ mbar) alt=รอบ (alt) presSeaLevel = รอบ (presSeaLevel/100, 2) # ความดันสัมบูรณ์ใน hPa (หรือ mbar) กลับ temp, pres, alt, presSeaLevel

ฟังก์ชัน getLocalData() จะส่งคืนข้อมูลในเครื่องทั้งหมดที่สถานีของเราจับ:

def getLocalData():

global timeString global humLab global tempExt global tempLab global presSL global altLab global presAbs # รับเวลาในการอ่านตอนนี้ = datetime.datetime.now() timeString = now.strftime("%Y-%m-%d %H:%M") # อ่านอุณหภูมิภายนอก (ระยะทาง 1 เมตร) tempExt = รอบ (ds18b20Sensor.get_temperature (), 1) tempLab, presAbs, altLab, presSL = bmp180GetData(altReal) humDHT, tempDHT = Adafruit_DHT.read_retry (DHT22Sensor, DHT ispin) หากไม่ใช่ humD และ tempDHT ไม่ใช่ไม่มี: humLab = รอบ (humDHT

เมื่อคุณมีข้อมูลทั้งหมดที่บันทึกไว้โดยฟังก์ชันด้านบนแล้ว คุณต้องส่งข้อมูลเหล่านั้นไปที่ ThingSpeak คุณจะทำได้โดยใช้ฟังก์ชัน sendDataTs():

def sendDataTs ():

data = { "field1": tempLab, "field2": tempExt, "field3": humLab, "field4": presSL, "field5": altLab } ts.update(data) print ("[INFO] ข้อมูลที่ส่งสำหรับ 5 ฟิลด์: ", tempLab, tempExt, humLab, presSL, altLab)

เมื่อข้อมูลช่องของคุณอัปเดตแล้ว ให้บันทึกสคริปต์และดำเนินการบนเทอร์มินัลของคุณ:

sudo Python3 localData_ToTs_v1_EXT.py

เกี่ยวกับโปรโตคอลการสื่อสาร

โปรดทราบว่าการใช้ "ไลบรารีของสิ่งที่พูด" "ไลบรารีคำขอ" จะถูกนำเข้า ซึ่งเป็นไลบรารี Apache2 Licensed HTTP ซึ่งเขียนด้วยภาษา Python เอกสารประกอบคำขอติดตั้งอย่างเป็นทางการสามารถพบได้ที่นี่:

docs.python-requests.org/en/latest/user/install/

หากจำเป็น ก่อนเรียกใช้สคริปต์ของคุณ คุณสามารถตรวจสอบว่ามีการติดตั้งไลบรารีคำขอหรือไม่:

คำขอติดตั้ง sudo pip3

หรือคุณสามารถใช้ MTTQ เป็นวิธีการส่งข้อมูลไปยัง ThingSpeak MQTT นั้นแตกต่างจาก HTTP เมื่อได้รับการออกแบบมาโดยเฉพาะให้มีน้ำหนักเบาและมีไว้สำหรับอุปกรณ์ฝังตัวที่มี RAM และ CPU ต่ำ นอกจากนี้ ในกรณีส่วนใหญ่ MQTT ใช้แบนด์วิดท์น้อยกว่า

อ้างถึงบทช่วยสอนนี้: อัปเดตช่อง ThingSpeak โดยใช้ MQTT บน Raspberry Pi สำหรับรายละเอียดเพิ่มเติม

ขั้นตอนที่ 8: การส่งข้อมูลระยะไกลไปยัง ThingSpeak โดยใช้ ESP8266

การส่งข้อมูลระยะไกลไปยัง ThingSpeak โดยใช้ ESP8266
การส่งข้อมูลระยะไกลไปยัง ThingSpeak โดยใช้ ESP8266
การส่งข้อมูลระยะไกลไปยัง ThingSpeak โดยใช้ ESP8266
การส่งข้อมูลระยะไกลไปยัง ThingSpeak โดยใช้ ESP8266

สำหรับขั้นตอนนี้ เราจะใช้ HW เดียวกันกับที่อธิบายไว้ใน muy กวดวิชา:

IOT MADE EASY: เก็บข้อมูลสภาพอากาศระยะไกล: UV และอุณหภูมิอากาศและความชื้น

รหัสที่เราจะใช้ที่นี่ โดยพื้นฐานแล้วเป็นรหัสเดียวกับที่ใช้ในบทช่วยสอนนั้น แสดงความคิดเห็นส่วนที่สำคัญที่สุดของรหัส:

ขั้นแรก ให้เรียกไลบรารี่ ESP8266 กำหนดไคลเอนต์ WiFi และกำหนดเราเตอร์ในพื้นที่ของคุณและข้อมูลประจำตัวของ Thinkspeak:

/* NodeMCU ESP12-E */

#include ไคลเอนต์ WiFiClient; const char* MY_SSID = "ป้อนด้วย SSDID ของคุณ"; const char* MY_PWD = "ป้อนด้วยรหัสผ่านของคุณ"; /* Thinkspeak */ const char* TS_SERVER = "api.thingspeak.com"; String TS_API_KEY ="ENTER ด้วยรหัสเขียนของคุณ";

ประการที่สอง ให้รวมไลบรารีที่สำคัญมากสำหรับโครงการ IoT: SimpleTimer.h:

/* ตัวตั้งเวลา */

#include SimpleTimer จับเวลา;

ประการที่สาม ระหว่างการติดตั้ง () เราจะเริ่มต้นการสื่อสารแบบอนุกรม เรียกใช้ฟังก์ชัน connectWiFi() และกำหนดเวลา โปรดทราบว่าบรรทัดของรหัส: timer.setInterval(60000L, sendDataTS); จะเรียกใช้ฟังก์ชัน sendDataTS() ทุกๆ 60 วินาที เพื่ออัปโหลดข้อมูลไปยังช่อง ThinkSpeak

การตั้งค่าเป็นโมฆะ ()

{ … Serial.begin(115200); ล่าช้า(10); … connectWifi(); timer.setInterval (60000L, sendDataTS); … }

สุดท้ายแต่ไม่ท้ายสุด ระหว่างลูป () คำสั่งเดียวที่จำเป็นคือการเริ่มตัวจับเวลาและแค่นั้นเอง!

วงเป็นโมฆะ ()

{ … timer.run(); // เริ่ม SimpleTimer }

ด้านล่างนี้ คุณสามารถดูฟังก์ชันสำคัญสองอย่างที่ใช้จัดการกับการสื่อสารของ Thinkspeak:

การเชื่อมต่อ ESP12-E กับเครือข่าย WiFi ของคุณ:

/***************************************************

* การเชื่อมต่อ WiFi *********************************************** ***/ เป็นโมฆะ connectWifi () { Serial.print ("กำลังเชื่อมต่อกับ" + * MY_SSID); WiFi.begin(MY_SSID, MY_PWD); ในขณะที่ (WiFi.status () != WL_CONNECTED) { ล่าช้า (1000); Serial.print("."); } Serial.println(""); Serial.println ("เชื่อมต่อ WiFi แล้ว"); Serial.println(""); }

ESP12-E กำลังส่งข้อมูลไปยัง ThinkSpeak:

***************************************************

* ส่งข้อมูลไปที่ช่อง Thinkspeak ******************************************** ******* เป็นโมฆะ sendDataTS (เป็นโมฆะ) { ถ้า (ไคลเอนต์เชื่อมต่อ (TS_SERVER, 80)) { สตริง postStr = TS_API_KEY; postStr += "&field6="; postStr += สตริง (ชั่วคราว); postStr += "&field7="; postStr += สตริง (ฮัม); postStr += "&field8="; postStr += สตริง (dataSensorUV); postStr += "\r\n\r\n"; client.print("POST /update HTTP/1.1\n"); client.print("โฮสต์: api.thingspeak.com\n"); client.print("การเชื่อมต่อ: ปิด\n"); client.print("X-THINGSPEAKAPIKEY: " + TS_API_KEY + "\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("เนื้อหา-ความยาว: "); client.print(postStr.length()); client.print("\n\n"); client.print(postStr); ล่าช้า (1000); } ส่ง++; client.stop(); }

รหัสที่สมบูรณ์สามารถพบได้ใน GitHub ของฉัน: NodeMCU_UV_DHT_Sensor_OLED_TS_EXT

เมื่อคุณอัปโหลดรหัสไปยัง NodeMCU แล้ว มาต่อแบตเตอรี่ภายนอกและทำการวัดภายใต้ดวงอาทิตย์กัน ฉันวาง Remote Station ไว้บนหลังคาและเริ่มบันทึกข้อมูลบน ThingSpeak.com ดังที่แสดงในรูปด้านบน

ขั้นตอนที่ 9: บันทึกย่อสุดท้าย

บันทึกสุดท้าย
บันทึกสุดท้าย

จุดประสงค์หลักของบทช่วยสอนนี้คือเพื่อแสดงวิธีเชื่อมต่อ Raspberry Pi กับ ThingSpeak นี่เป็นวิธีที่ดีในการบันทึกข้อมูลและบันทึกลงบนแพลตฟอร์ม IoT

ด้วยการใช้โอกาสนี้ เรายังส่งข้อมูลไปยังช่องสัญญาณเฉพาะนั้น โดยเก็บข้อมูลจากสถานีระยะไกลโดยใช้ ESP8266 วิธีนี้ใช้ได้ แต่ไม่ใช่วิธีที่ดีที่สุด เนื่องจากเรามีการดำเนินการ "แบบอะซิงโครนัส" บางครั้งทั้ง RPi และ ESP8266 จึงพยายามเข้าสู่ระบบพร้อมกัน (หรือในช่วงเวลาเล็ก ๆ) สิ่งที่ ThingSpeak ปฏิเสธ อุดมคติคือ ESP8266 ส่งข้อมูลภายในเครื่องไปยัง Raspberry Pi และตัวสุดท้ายมีหน้าที่จัดการข้อมูลทั้งหมด การทำเช่นนั้น "สถานีหลัก" (Raspberry Pi) สามารถทำได้ 3 สิ่ง:

  • บันทึกข้อมูลทั้งหมดบนฐานข้อมูลท้องถิ่น
  • นำเสนอข้อมูลทั้งหมดบนหน้าเว็บท้องถิ่น (โดยใช้ Flask ตามที่แสดงในภาพด้านบน)
  • กำลังส่งข้อมูลทั้งหมดไปยัง ThingSpeak พร้อมกัน

ในบทช่วยสอนในอนาคต เราจะสำรวจตัวเลือกเหล่านั้น

ขั้นตอนที่ 10: สรุป

บทสรุป
บทสรุป

และเช่นเคย ฉันหวังว่าโครงการนี้จะช่วยให้ผู้อื่นค้นพบหนทางสู่โลกที่น่าตื่นเต้นของอิเล็กทรอนิกส์!

สำหรับรายละเอียดและรหัสสุดท้าย โปรดไปที่ศูนย์ฝาก GitHub ของฉัน: RPi-NodeMCU-Weather-Station

สำหรับโครงการเพิ่มเติม โปรดเยี่ยมชมบล็อกของฉัน: MJRoBot.org

คอยติดตาม! บทช่วยสอนถัดไป เราจะส่งข้อมูลจากสถานีตรวจอากาศระยะไกลไปยังสถานีกลาง โดยอิงตามเว็บเซิร์ฟเวอร์ Raspberry Pi:

Saludos จากทางใต้ของโลก!

พบกันใหม่ในคำสั่งต่อไปของฉัน!

ขอขอบคุณ, มาร์เซโล