สารบัญ:

สถานีตรวจอากาศท้องถิ่น: 8 ขั้นตอน (พร้อมรูปภาพ)
สถานีตรวจอากาศท้องถิ่น: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: สถานีตรวจอากาศท้องถิ่น: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: สถานีตรวจอากาศท้องถิ่น: 8 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: ลูกสาวจัดให้ พ่อไปดื่มสังสรรค์กับเพื่อนไม่ยอมเข้าบ้าน | Social Viral | ข่าวช่อง8 2024, กรกฎาคม
Anonim
สถานีตรวจอากาศท้องถิ่น
สถานีตรวจอากาศท้องถิ่น

ขณะที่ฉันกำลังมองหาโครงการดีๆ ที่จะทำสำหรับโครงการโรงเรียนปีแรกของฉัน ฉันมีความคิดหลายอย่างที่ต้องทำ แต่ไม่มีสิ่งใดที่ฉันพบว่ามีความท้าทาย

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

ฉันมีความสุขมากเมื่อเห็นผลสุดท้ายซึ่งออกมาดีเกินคาด

มันทำจาก Raspberry Pi 4 ที่ใช้ linux

  • เว็บไซต์ Apache (html css js)
  • Eventlet (เว็บไซต์เซิร์ฟเวอร์แบ็กเอนด์)
  • MariaDB (เซิร์ฟเวอร์ฐานข้อมูล)

เสบียง

  • ราสเบอร์รี่ Pi 4:

    sd-card (ขั้นต่ำ 16gb)

  • เซนเซอร์:

    1. เซ็นเซอร์วัดความเร็วลม QS-FS
    2. Wind Sensor เอาต์พุตสัญญาณสวน อลูมิเนียมอัลลอยด์ เซ็นเซอร์ทิศทางลม Wind Vane Speed Measuring Instrument https://www.banggood.com/Wind-Sensor-Garden-Signal-Output-Aluminum-Alloy-Wind-Direction-Sensor-Wind-Vane-Speed -Measuring-Instrument-p-1624988.html?rmmds=myorder&cur_warehouse=CN
    3. DHT22 (ความชื้น)
    4. BMP280 (ความกดอากาศ)
    5. DS18B20 (อุณหภูมิ)
  • พาวเวอร์ซัพพลาย

    • แหล่งจ่ายไฟ 5v (RPi)
    • แหล่งจ่ายไฟ 9v (บนแหล่งจ่ายไฟแบบเขียงหั่นขนมภายนอก)
  • เขียงหั่นขนม (x2)

    T-cobbler plus สำหรับ RPi 4

  • สายจัมเปอร์
  • ไอซี

    • MCP3008
    • PCF8574AN
  • จอ LCD 16x2
  • LED (สีแดง
  • ปลอก (optinal)

    • ลังไวน์
    • เสาไม้ (2m)
    • ไม้กระดาน (1m)

ขั้นตอนที่ 1: เตรียมของให้พร้อม

การรับสิ่งของทั้งหมดที่คุณต้องการเป็นสิ่งสำคัญเสมอก่อนที่คุณจะเริ่มทำงานในขั้นตอนใดขั้นตอนหนึ่ง วิธีนี้จะช่วยคุณประหยัดเวลาได้มากในขณะที่ทำงานผ่านราง

อย่างแรกเลย

อะไรที่คุณต้องการ:

  • ราสเบอร์รี่ Pi 4:

    sd-card (ขั้นต่ำ 16gb)

  • เซนเซอร์:

    1. เซ็นเซอร์วัดความเร็วลม QS-FS
    2. Wind Sensor เอาต์พุตสัญญาณสวน อลูมิเนียมอัลลอยด์ทิศทางลม เซนเซอร์ Wind Vane Speed Measuring Instrument
    3. DHT22 (ความชื้น)
    4. BMP280 (ความดันอากาศ)
    5. DS18B20 (อุณหภูมิ)
  • พาวเวอร์ซัพพลาย

    • แหล่งจ่ายไฟ 5v (RPi)
    • แหล่งจ่ายไฟ 9v (บนแหล่งจ่ายไฟแบบเขียงหั่นขนมภายนอก)
  • เขียงหั่นขนม (x2)
  • T-cobbler plus สำหรับ RPi 4
  • สายจัมเปอร์
  • ไอซี

    • MCP3008
    • PCF8574AN
  • จอ LCD 16x2
  • ไฟ LED (สีแดง)
  • ปลอก (optinal)

    • ลังไวน์
    • ไม้กระดาน (1m)
    • เสา (2m)

คุณสามารถค้นหาลิงก์ทั้งหมดที่ฉันซื้อได้ในส่วนวัสดุสิ้นเปลืองภายใต้บทนำ

ขั้นตอนที่ 2: การตั้งค่า RPi

การตั้งค่า RPi
การตั้งค่า RPi

สำหรับโครงการของเรา เราจำเป็นต้องมี RPi พร้อมติดตั้งซอฟต์แวร์ที่กำหนด

  • เว็บไซต์ Apache (html css js)
  • Flask Socket-IO (เว็บไซต์เซิร์ฟเวอร์แบ็กเอนด์)
  • MariaDB (เซิร์ฟเวอร์ฐานข้อมูล)

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

sudo apt อัปเดต

อาปาเช่:

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

sudo apt ติดตั้ง apache2 -y

แค่นั้นแหละ!

เพื่อให้แน่ใจว่าทุกอย่างได้รับการติดตั้งอย่างถูกต้อง ให้ท่องไปยังที่อยู่ IP ของราสเบอร์รี่ pi ในเบราว์เซอร์ของคุณและดูว่าคุณได้รับเว็บไซต์เริ่มต้นหรือไม่ หากคุณมีปัญหาใดๆ เกี่ยวกับขั้นตอนนี้ คุณสามารถตรวจสอบเว็บไซต์ RPi ได้ที่นี่

เหตุการณ์:

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

Flask-socketIO:

pip3 ติดตั้ง flask-socketio

เหตุการณ์:

pip3 ติดตั้ง eventlet

เกเวนต์:

pip3 ติดตั้ง gevent

มาเรียด:

Mariadb เป็นฐานข้อมูลที่ใช้ MySQL ซึ่งสร้างฐานข้อมูลเชิงสัมพันธ์ มักใช้กับ RPi ดังนั้นจึงมีความช่วยเหลือมากมายที่คุณสามารถหาได้บนอินเทอร์เน็ต สำหรับข้อมูลเพิ่มเติม คุณสามารถไปที่ลิงค์นี้

apt ติดตั้งเซิร์ฟเวอร์ mariadb

ขั้นตอนที่ 3: เชื่อมต่อเซ็นเซอร์และเพิ่มรหัส

การเชื่อมต่อเซ็นเซอร์และการเพิ่มรหัส
การเชื่อมต่อเซ็นเซอร์และการเพิ่มรหัส
การเชื่อมต่อเซ็นเซอร์และการเพิ่มรหัส
การเชื่อมต่อเซ็นเซอร์และการเพิ่มรหัส
การเชื่อมต่อเซ็นเซอร์และการเพิ่มรหัส
การเชื่อมต่อเซ็นเซอร์และการเพิ่มรหัส

ในการเชื่อมต่อเซ็นเซอร์กับ RPi ของเรา เราสามารถใช้ T-Cobbler plus นี่เป็นเครื่องมือเล็กๆ ที่มีประโยชน์ซึ่งทำให้สามารถใช้หมุดทั้งหมดของคุณบน RPi บนเขียงหั่นขนมได้

ในโครงการของฉัน ฉันมีเซ็นเซอร์ 5 ตัว:

  1. เซ็นเซอร์วัดความเร็วลม QS-FS
  2. Wind Sensor เอาต์พุตสัญญาณสวน อลูมิเนียมอัลลอยด์ทิศทางลม เซนเซอร์ Wind Vane Speed Measuring Instrument
  3. DHT22 (ความชื้น)
  4. BMP280 (ความดันอากาศ)
  5. DS18B20 (อุณหภูมิ)

เซ็นเซอร์ความเร็วลม:

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

ในการอ่านในเซ็นเซอร์นี้ ฉันใช้ MCP3008 ซึ่งเป็น IC เพื่ออ่านในสัญญาณแอนะล็อก IC สามารถทำงานบน 3.3V หรือ 5V แต่ฉันเลือก 3.3V เพื่อให้เข้ากันได้กับ RPi ซึ่งหมายความว่าฉันต้องเปลี่ยนแรงดันเอาต์พุตจาก 5V เป็น 3.3V ฉันทำโดยเพิ่มตัวแบ่งแรงดันไฟฟ้าที่สร้างโดยตัวต้านทาน 2 ตัว (2k และ 1k ohm)

เซ็นเซอร์ทิศทางลม:

ทิศทางลมมีความสำคัญพอๆ กับความเร็วลม ดังนั้นผมจะเชื่อมโยงต่อไป

เซ็นเซอร์นี้มีข้อกำหนดเดียวกันกับเซ็นเซอร์วัดความเร็วลม นอกจากนี้ยังทำงานบน 9V และมีแรงดันเอาต์พุต 5 โวลต์ นอกจากนี้เซ็นเซอร์นี้เราจะเชื่อมต่อกับ MCP3008 ผ่านตัวแบ่งแรงดันไฟฟ้า

DHT22 (ความชื้น):

DHT22 อ่านความชื้น มันให้ค่าเป็นเปอร์เซ็นต์และสามารถอ่านค่าได้โดยใช้โปรโตคอล I2C บน RPi ดังนั้น คุณต้องเปิดใช้งานพอร์ต I2C ใน Raspi-config ข้อมูลเพิ่มเติมที่นี่

BMP280 (ความดันอากาศ):

BMP280 ใช้สำหรับอ่านค่าความกดอากาศ ค่าของมันจะถูกอ่านผ่านบัส SPI บน RPi ต้องเปิดใช้งานโปรโตคอลนี้ใน Raspi-config ด้วย สำหรับรหัสของฉันฉันใช้ห้องสมุด Adafruit

DS18B20 (อุณหภูมิ):

เซ็นเซอร์สุดท้ายวัดอุณหภูมิ เซ็นเซอร์นี้มาจากดัลลัส และหากคุณเคยมีประสบการณ์เล็กน้อยกับดัลลัส คุณน่าจะรู้อยู่แล้วว่าพวกเขาใช้ 1Wire-bus อย่าแปลกใจถ้าฉันบอกว่าต้องเปิดใช้งานโปรโตคอลนี้ใน Raspi-config ด้วย

ฉันเชื่อมต่อเซ็นเซอร์อย่างไร:

ในฐานะที่เป็น pdf ฉันได้อัปโหลดรูปแบบไฟฟ้าและเขียงหั่นขนมเพื่อให้ง่ายขึ้นเล็กน้อย

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

ขั้นตอนที่ 4: การออกแบบ Web Ui

การออกแบบ Web Ui
การออกแบบ Web Ui
การออกแบบ Web Ui
การออกแบบ Web Ui
การออกแบบ Web Ui
การออกแบบ Web Ui

ตอนนี้เราเชื่อมต่อเซ็นเซอร์แล้ว เราต้องการการออกแบบสำหรับเว็บไซต์ของเรา

เราต้องการให้เว็บไซต์สร้างรูปลักษณ์ที่ง่ายในขณะที่แสดงข้อมูลเรียลไทม์ของเซ็นเซอร์ทั้งหมด

นอกจากนี้ เราต้องการที่จะสามารถเห็นประวัติของค่าที่วัดได้เหล่านี้ต่อช่วงเวลา

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

แต่ฉันยังบอกด้วยว่าฉันต้องการสร้างหน้าที่คุณสามารถดูประวัติของค่าของเซ็นเซอร์แต่ละตัวได้

ด้วยเหตุนี้ฉันจึงสร้างหน้าที่ 2 ในการออกแบบของฉันที่มีสิ่งนี้ ในหน้านี้ ฉันสามารถเห็นข้อมูลเพิ่มเติมเกี่ยวกับเซ็นเซอร์ของฉันซึ่งจะไม่ปรากฏบนหน้าแรกและนอกหลักสูตรในส่วนประวัติ

หลังจากนั้นไม่กี่ชั่วโมง ฉันก็ออกแบบได้อย่างสมบูรณ์!

การออกแบบถูกสร้างขึ้นโดยใช้ Adobe XD

ขั้นตอนที่ 5: การสร้างฐานข้อมูล

การสร้างฐานข้อมูล
การสร้างฐานข้อมูล

เพื่อที่จะได้พักจากส่วนการออกแบบ ฉันเริ่มใช้ฐานข้อมูลของฉัน

ฐานข้อมูลนี้จะประกอบด้วยเซ็นเซอร์ทั้งหมด (5) แอคทูเอเตอร์ทั้งหมด (2) และค่าที่เซ็นเซอร์เหล่านั้นมี

ฐานข้อมูลค่อนข้างง่ายและมีความสัมพันธ์กันเล็กน้อย

คุณสามารถดูรูปแบบฐานข้อมูลในภาพถ่าย

ขั้นตอนที่ 6: การเข้ารหัสเว็บไซต์: ส่วนหน้า (html Css)

กลับไปที่เว็บไซต์!

ตอนนี้ฉันมีการออกแบบที่ฉันสามารถเริ่มเขียนโค้ดเป็น html css เพื่อใช้งานได้จริง

ในหน้าแรก:

ฉันเริ่มต้นด้วยการพิจารณาเซ็นเซอร์แต่ละตัวเป็นองค์ประกอบบนเว็บไซต์ของฉัน เพื่อที่ฉันจะได้ในภายหลังให้ส่วนนี้สร้างโดยรหัส Javascript ของฉัน

ฉันยังแทรกคลาสผู้ถือ JS แบบสุ่มลงในองค์ประกอบ สิ่งเหล่านี้จะทำให้สามารถเปลี่ยนเนื้อหาขององค์ประกอบนั้นได้

ต้องใช้เวลามากเพราะฉันไม่ค่อยเก่งภาษานี้

เมื่อทำโฮมเพจเสร็จแล้วก็ถึงเวลาเริ่มต้นที่หน้าประวัติ

ในหน้าประวัติศาสตร์:

หน้านี้สร้างใหม่ได้ง่ายกว่าเล็กน้อย ในหน้านี้ยังมีผู้ถือ js เพื่อรับข้อมูลเกี่ยวกับเซ็นเซอร์ ช่องค่าเรียลไทม์ และเพื่อแสดงตารางพร้อมค่าที่วัดได้ทั้งหมด

ในการสร้างแท็บตัวเลือกบนเว็บไซต์ของฉันเพื่อเลือกระหว่างตารางหรือแผนภูมิ ฉันต้องเพิ่ม Javascript เล็กน้อยเพื่อทำให้องค์ประกอบไม่แสดงหรือแสดง

ตอนนี้เรามีเว็บไซต์ที่สวยงามแต่ไม่สามารถแสดงอะไรบนนั้นได้ใช่หรือไม่ มาแก้ไขกันเถอะ

คุณสามารถค้นหารหัสของฉันบนที่เก็บ github ของฉัน:

ขั้นตอนที่ 7: การเข้ารหัสเว็บไซต์: แบ็กเอนด์ (eventlet) + การเข้ารหัสส่วนหน้า (javascript)

แบ็กเอนด์:

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

จาก flask นำเข้า Flask, ขอ, jsonify จาก flask_socketio นำเข้า SocketIO จาก flask_cors นำเข้า CORS

ในการทำให้เซิร์ฟเวอร์เริ่มทำงาน เราต้องเพิ่มสิ่งต่อไปนี้:

socketio.run(แอพ ดีบัก=เท็จ โฮสต์='0.0.0.0')

ขณะนี้เซิร์ฟเวอร์ออนไลน์อยู่ แต่จะไม่สามารถพูดคุยกับส่วนหน้าได้

ไม่ได้รับหรือส่งคืนสิ่งใด มาเปลี่ยนกันเถอะ

ในการขอเซ็นเซอร์ทั้งหมดในฐานข้อมูล เราจะเพิ่มเส้นทาง:

@app.route(endpoint + '/sensors', methods=['GET']) def get_sensors(): if request.method == 'GET': s = DataRepository.get_sensors() ส่งคืน jsonify(sensors=s), 200

รหัสนี้ใช้คลาสที่เรียกว่า DataRepository และพูดกับฐานข้อมูล ที่นี่ทำให้เราได้รับเซ็นเซอร์ที่เราขอกลับคืนมา

นอกจากนี้เรายังต้องการเส้นทางเพื่อสอบถามข้อมูลเกี่ยวกับเซ็นเซอร์เฉพาะ 1 ตัวและอีกตัวหนึ่งสำหรับค่าของเซ็นเซอร์ที่กำหนด

นี่เป็นเส้นทางทั้งหมด แต่เพื่อให้ข้อมูลเรียลไทม์เป็นไปได้ เราจำเป็นต้องส่งข้อมูลที่เซ็นเซอร์เพิ่งอ่านทุกช่วง ในการดำเนินการนี้ เราใช้การเชื่อมต่อ Socket-IO เป็นการเชื่อมต่อที่สร้างขึ้นจากช่วงเวลาที่มีคนโหลดเว็บไซต์ด้วย JS และเปิดการเชื่อมต่อนี้ไว้ นี่คือการเชื่อมต่อแบบฟูลดูเพล็กซ์ ซึ่งหมายความว่าเป็นการเชื่อมต่อที่ทำงานทั้งสองวิธี (ส่งและรับ) พร้อมกัน ในการใช้สิ่งนี้เราต้องเพิ่มรหัสต่อไปนี้

@socketio.on('connect') def initial_connection(): print('A new client connect') socketio.send("U bent geconnecteerd") # # ส่งไปยังไคลเอนต์!

ความสบายใจของรหัสนี้ทำงานเมื่อไคลเอ็นต์เชื่อมต่อ

หากต้องการรับข้อความจากส่วนหน้า คุณสามารถใช้รหัสนี้ได้

@socketio.on('message') def message_recieved(): pass

คุณยังสามารถส่งข้อความ สิ่งนี้ทำได้โดยสิ่งต่อไปนี้

socketio.emit('Update_RTD', dict_results, broadcast=True)

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

จาวาสคริปต์:

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

เราจะเรียกฟังก์ชัน socketIO ที่เราทำไว้เพื่อรับและส่งข้อมูล

เมื่อเราได้รับข้อมูลเป็น Json Object เราจะทำการรื้อมันเพื่อรับข้อมูลที่เราต้องการแล้วใส่ไว้ในผู้ถือ JS ที่เราใส่ไว้ในเว็บไซต์ของเรา

คุณสามารถค้นหารหัสของฉันบนที่เก็บ github ของฉัน:

ขั้นตอนที่ 8: การสร้างปลอก

การทำปลอก
การทำปลอก
การทำปลอก
การทำปลอก
การทำปลอก
การทำปลอก
การทำปลอก
การทำปลอก

ตัวเคสใช้ความพยายามอย่างมากและสามารถทำได้ทุกวิธีที่คุณต้องการ นี่คือวิธีที่ฉันทำ

ฉันเอาลังไวน์มา

หนึ่งในนั้นที่ฉันใช้เป็นกล่องบรรจุ RPi และเซ็นเซอร์ส่วนใหญ่ของฉัน

แน่นอนว่าเซ็นเซอร์วัดความเร็วลมและเซ็นเซอร์ทิศทางลมไม่ได้ถูกวางไว้ข้างใน แต่อยู่บนคานขวางที่วางอยู่บนเสา บนเสานี้ฉันแขวนลังไวน์นั้นไว้ซึ่งฉันทำประตูด้วย

คุณสามารถดูว่าฉันทำโปรเจ็กต์เสร็จได้อย่างไรโดยดูที่รูปถ่าย

แน่นอนว่านี่คือตัวอย่างวิธีการทำ คุณสามารถทำอะไรกับมันได้ตามที่คุณต้องการ

แนะนำ: