Mục lục:

Trạm thời tiết địa phương: 8 bước (có hình ảnh)
Trạm thời tiết địa phương: 8 bước (có hình ảnh)

Video: Trạm thời tiết địa phương: 8 bước (có hình ảnh)

Video: Trạm thời tiết địa phương: 8 bước (có hình ảnh)
Video: Ngày Tử Hình Nữ Tử Tù Xinh Như Hoa Hậu Khiến Nhiều Người Xót Xa | Phá Án TV 2024, Tháng bảy
Anonim
Trạm thời tiết địa phương
Trạm thời tiết địa phương

Khi tôi đang tìm kiếm một dự án tuyệt vời để thực hiện cho dự án năm học đầu tiên của mình, tôi đã có rất nhiều ý tưởng về những gì phải thực hiện nhưng không có dự án nào trong số chúng tôi thấy là thách thức.

Sau đó, tôi nghĩ đến việc tạo ra một Trạm thời tiết có một cái gì đó đặc biệt cho nó. Tôi muốn có thể lưu trữ tất cả dữ liệu của mình và sau này sử dụng dữ liệu này để thống kê. Dự án này sẽ được thực hiện đặc biệt cho những người quan tâm đến khí tượng và muốn có một trạm thời tiết được tạo ra tại nhà mà không tốn nhiều chi phí như những trạm hiện có trên thị trường. Dự án cũng được thực hiện để duy trì khả năng thêm hoặc bớt các cảm biến bất kỳ lúc nào.

Tôi thực sự hạnh phúc khi thấy kết quả cuối cùng của mình tốt hơn mong đợi.

Nó được làm bằng Raspberry Pi 4 chạy linux.

  • Trang web Apache (html css js)
  • Eventlet (trang web máy chủ phụ trợ)
  • MariaDB (máy chủ cơ sở dữ liệu)

Quân nhu

  • Raspberry Pi 4:

    thẻ sd (tối thiểu 16gb)

  • Cảm biến:

    1. Cảm biến tốc độ gió QS-FS
    2. Cảm biến gió Đầu ra tín hiệu của vườn Hợp kim nhôm Cảm biến hướng gió Thiết bị đo tốc độ cánh gió https://www.banggood.com/Wind-Sensor-Garden-Signal-Output-Al Aluminum-Alloy-Wind-Direction-Sensor-Wind-Vane-Speed -Measuring-Instrument-p-1624988.html? Rmmds = myorder & cur_warehouse = CN
    3. DHT22 (độ ẩm)
    4. BMP280 (áp suất không khí)
    5. DS18B20 (nhiệt độ)
  • Nguồn cung cấp

    • Nguồn điện 5v (RPi)
    • Nguồn điện 9v (trên bộ cấp nguồn breadboard bên ngoài)
  • Bảng mạch (x2)

    T-cobbler plus cho RPi 4

  • dây nhảy
  • IC của
    • MCP3008
    • PCF8574AN
  • Màn hình LCD 16x2
  • LED (đỏ
  • Vỏ bọc (optinal)

    • thùng rượu
    • cột gỗ (2m)
    • ván gỗ (1m)

Bước 1: Chuẩn bị sẵn sàng mọi thứ

Luôn luôn có một tầm quan trọng lớn là có được tất cả các mục bạn cần trước khi bạn bắt đầu thực hiện một bước. Điều này sẽ giúp bạn tiết kiệm rất nhiều thời gian trong khi làm việc với nó.

Vì vậy, trước tiên, Bạn cần gì:

  • Raspberry Pi 4:

    thẻ sd (tối thiểu 16gb)

  • Cảm biến:

    1. Cảm biến tốc độ gió QS-FS
    2. Cảm biến gió Đầu ra tín hiệu vườn Hợp kim nhôm Cảm biến hướng gió Thiết bị đo tốc độ cánh gió
    3. DHT22 (độ ẩm)
    4. BMP280 (áp suất không khí)
    5. DS18B20 (nhiệt độ)
  • Nguồn cung cấp

    • Nguồn điện 5v (RPi)
    • Nguồn điện 9v (trên bộ cấp nguồn breadboard bên ngoài)
  • Bảng mạch (x2)
  • T-cobbler plus cho RPi 4
  • dây nhảy
  • IC của
    • MCP3008
    • PCF8574AN
  • Màn hình LCD 16x2
  • LED (đỏ)
  • Vỏ bọc (optinal)

    • thùng rượu
    • ván gỗ (1m)
    • cực (2m)

Bạn có thể tìm thấy tất cả các liên kết nơi tôi đã mua những thứ này trong phần nguồn cung cấp dưới phần giới thiệu.

Bước 2: Thiết lập RPi

Thiết lập RPi
Thiết lập RPi

Đối với dự án của chúng tôi, chúng tôi cần một RPi có cài đặt phần mềm nhất định.

  • Trang web Apache (html css js)
  • Flask Socket-IO (trang web máy chủ phụ trợ)
  • MariaDB (máy chủ cơ sở dữ liệu)

Trước khi cài đặt, hãy luôn thuận tiện để đảm bảo rằng bạn đã cài đặt phần mềm mới nhất trên RPi của mình. Để làm điều này, chỉ cần thực hiện lệnh sau:

cập nhật apt sudo

Apache:

Đầu tiên hãy nói về Apache. Apache là một máy chủ web được sử dụng trên toàn thế giới. Nó chạy trang web của bạn một cách hoàn hảo. Điều duy nhất bạn cần làm là cài đặt nó và đặt trang web của bạn vào đúng thư mục và nó ở đó.

sudo apt install apache2 -y

Đó là nó!

Để đảm bảo mọi thứ được cài đặt chính xác, hãy truy cập địa chỉ Ip pi mâm xôi trong trình duyệt của bạn và xem bạn có nhận được trang web mặc định hay không. Nếu bạn gặp bất kỳ vấn đề nào liên quan đến bước này, bạn có thể kiểm tra trang web RPi tại đây.

Eventlet:

Bây giờ chúng ta hãy cài đặt Eventlet. Nó sẽ chạy máy chủ phụ trợ của chúng tôi và sẽ tạo kết nối từ các cảm biến đến trang web của chúng tôi. Đối với điều đó, chúng tôi cần một vài gói.

Ổ cắm bình cầuIO:

pip3 cài đặt flask-socketio

Eventlet:

pip3 cài đặt eventlet

Gevent:

pip3 cài đặt gevent

Mariadb:

Mariadb là một cơ sở dữ liệu dựa trên MySQL tạo cơ sở dữ liệu quan hệ. Nó thường được sử dụng trên RPi và do đó bạn có thể tìm thấy rất nhiều trợ giúp trên internet. Để biết thêm thông tin, bạn có thể vào liên kết này.

apt cài đặt mariadb-server

Bước 3: Kết nối cảm biến và thêm mã

Kết nối cảm biến và thêm mã
Kết nối cảm biến và thêm mã
Kết nối cảm biến và thêm mã
Kết nối cảm biến và thêm mã
Kết nối cảm biến và thêm mã
Kết nối cảm biến và thêm mã

Để kết nối các cảm biến với RPi của chúng tôi, chúng tôi có thể sử dụng T-Cobbler plus. Đây là một công cụ nhỏ tiện dụng giúp bạn có thể sử dụng tất cả các ghim trên RPi của mình trên bảng mạch.

Trong dự án của tôi, tôi có 5 cảm biến:

  1. Cảm biến tốc độ gió QS-FS
  2. Cảm biến gió Đầu ra tín hiệu vườn Hợp kim nhôm Cảm biến hướng gió Thiết bị đo tốc độ cánh gió
  3. DHT22 (độ ẩm)
  4. BMP280 (áp suất không khí)
  5. DS18B20 (nhiệt độ)

Cảm biến tốc độ gió:

Trước hết, tôi bắt đầu với cảm biến tốc độ gió bởi vì tôi rất hào hứng với cảm biến này. Nó là một cảm biến với tín hiệu tương tự đầu ra 0-5v và cần điện áp tối thiểu 7 volt để hoạt động. Tôi chọn bộ chuyển đổi 9 volt để cấp nguồn cho nó.

Để đọc trong cảm biến này, tôi đã sử dụng MCP3008 là một IC để đọc tín hiệu Analog. IC có thể hoạt động trên 3.3V hoặc 5V nhưng tôi chọn 3.3V để làm cho nó tương thích với RPi. Điều này có nghĩa là tôi cần thay đổi điện áp đầu ra từ 5V thành 3,3V Tôi đã làm điều này bằng cách thêm một bộ chia điện áp được tạo bởi 2 điện trở (2k và 1k ohm).

Cảm biến hướng gió:

Hướng gió cũng quan trọng như tốc độ gió vì vậy tôi sẽ kết nối phần này tiếp theo.

Cảm biến này có thông số kỹ thuật tương tự như cảm biến tốc độ gió. Nó cũng sẽ hoạt động trên 9V và có điện áp đầu ra là 5 volt. Ngoài ra cảm biến này chúng ta sẽ kết nối với MCP3008 thông qua bộ chia điện áp.

DHT22 (độ ẩm):

DHT22 đọc độ ẩm. Nó cung cấp cho bạn một giá trị theo tỷ lệ phần trăm và giá trị của nó có thể được đọc bằng cách sử dụng giao thức I2C trên RPi. Do đó, bạn phải kích hoạt các cổng I2C trong Raspi-config. Thêm thông tin ở đây.

BMP280 (áp suất không khí):

BMP280 được sử dụng để đọc áp suất không khí. Giá trị của nó được đọc qua bus SPI trên RPi. Giao thức này cũng cần được kích hoạt trong Raspi-config. Đối với mã của tôi, tôi đã sử dụng thư viện Adafruit.

DS18B20 (nhiệt độ):

Cảm biến cuối cùng đo nhiệt độ. cảm biến này đến từ Dallas và nếu bạn đã có một chút kinh nghiệm với Dallas, bạn có thể nên biết rằng họ sử dụng bus 1Wire. Đừng ngạc nhiên nếu tôi nói rằng giao thức này cũng cần được kích hoạt trong Raspi-config.

Cách tôi kết nối các cảm biến:

Dưới dạng pdf, tôi đã tải lên một sơ đồ điện và breadboard để làm cho nó dễ dàng hơn một chút.

Sau khi có thể kết nối các cảm biến thành công và bạn đã thêm mã cần thiết để đọc tất cả các cảm biến, bạn có thể tiếp tục và chuyển sang bước tiếp theo. Nếu bạn muốn bỏ lại một cảm biến hoặc muốn bổ sung thêm, bạn có thể làm như vậy.

Bước 4: Thiết kế Ui Web

Thiết kế Ui Web
Thiết kế Ui Web
Thiết kế Ui Web
Thiết kế Ui Web
Thiết kế Ui Web
Thiết kế Ui Web

Bây giờ chúng tôi đã kết nối các cảm biến mà chúng tôi cần thiết kế cho trang web của mình.

Chúng tôi muốn trang web tạo ra một giao diện dễ dàng trong khi hiển thị tất cả dữ liệu thời gian thực của các cảm biến.

Ngoài ra, chúng tôi muốn có thể xem lịch sử của các giá trị đo này trên mỗi khoảng thời gian.

Vì vậy, đầu tiên tôi bắt đầu tìm kiếm một số cảm hứng trên web. Hầu hết tất cả những nơi chỉ có các trang web thông tin mà không thực sự có thiết kế mà tôi đang tìm kiếm. Các đài thời tiết đã có mặt trên thị trường rất có thể đã được hiển thị. Và từ màn hình đó, nguồn cảm hứng của tôi đã đến. Hầu hết các màn hình đều có thiết kế dạng lưới. Điều này đã cho tôi ý tưởng tạo trang chủ nơi tất cả các cảm biến sẽ được hiển thị.

Tuy nhiên, tôi cũng nói rằng tôi muốn tạo một trang nơi bạn có thể xem lịch sử của từng cảm biến và các giá trị của nó.

Vì lý do đó, tôi cũng đã tạo trang thứ 2 trong thiết kế của mình có chứa điều này. Trên trang này, tôi có thể thấy một số thông tin bổ sung về cảm biến của mình sẽ không được hiển thị trên trang đầu của tôi và tất nhiên là phần lịch sử.

Sau một vài giờ, tôi đã hoàn thành thiết kế đầy đủ của mình!

Thiết kế được thực hiện bằng Adobe XD.

Bước 5: Tạo cơ sở dữ liệu

Tạo cơ sở dữ liệu
Tạo cơ sở dữ liệu

Để tạm dừng phần thiết kế, tôi đã bắt đầu trên cơ sở dữ liệu của mình.

Cơ sở dữ liệu này sẽ chứa tất cả các cảm biến (5), tất cả các thiết bị truyền động (2) và các giá trị mà các cảm biến đó có.

Cơ sở dữ liệu khá dễ dàng và có một vài mối quan hệ.

Bạn có thể thấy mô hình cơ sở dữ liệu trong ảnh.

Bước 6: Mã hóa trang web: Giao diện người dùng (html Css)

Quay lại trang web!

Bây giờ tôi có một thiết kế, tôi có thể bắt đầu viết mã nó dưới dạng html css để thực sự sử dụng nó.

Trên trang chủ:

Tôi bắt đầu bằng cách coi mỗi cảm biến là một phần tử trên trang web của mình. Để sau này tôi có thể để phần này tạo ra bằng mã Javascript của tôi.

Tôi cũng đã chèn các lớp người giữ JS ngẫu nhiên vào các phần tử. Điều này sẽ làm cho nó có thể thay đổi nội dung của phần tử đó

Điều này khiến tôi mất rất nhiều thời gian vì tôi không giỏi ngôn ngữ cụ thể này.

Sau khi hoàn thành trang chủ, đã đến lúc bắt đầu ở trang lịch sử.

Trên trang lịch sử:

Trang này dễ dàng hơn một chút để tạo lại. Trong trang này cũng có những người nắm giữ js để lấy thông tin về cảm biến, một khe giá trị thời gian thực và hiển thị bảng với các giá trị đo được.

Để tạo tùy chọn tab trên trang web của tôi để chọn giữa Bảng hoặc Biểu đồ, tôi đã phải thêm một chút Javascript để làm cho các phần tử không hiển thị hoặc không hiển thị.

Bây giờ chúng tôi có một trang web tuyệt đẹp nhưng không thể hiển thị bất cứ điều gì trên đó? Hãy khắc phục điều đó.

Bạn có thể tìm thấy mã của tôi trên kho lưu trữ github của tôi:

Bước 7: Mã hóa trang web: Backend (eventlet) + Coding Frontend (javascript)

Phụ trợ:

Trong khi máy chủ phụ trợ đã được cài đặt, chúng tôi vẫn cần triển khai điều này trong dự án của mình. Đầu tiên, chúng ta cần thêm một số nhập để làm cho mọi thứ hoạt động bình thường.

from flask import Flask, request, jsonify from flask_socketio import SocketIO from flask_cors import CORS

Để làm cho máy chủ khởi động, chúng ta cần thêm những thứ sau:

socketio.run (app, debug = False, host = '0.0.0.0')

Bây giờ máy chủ đang trực tuyến nhưng nó sẽ không thể nói chuyện với giao diện người dùng.

Nó không nhận hoặc trả lại bất cứ thứ gì. Hãy thay đổi điều đó.

Để yêu cầu tất cả các cảm biến trong mối hàn cơ sở dữ liệu sẽ thêm một tuyến đường:

@ app.route (endpoint + '/ sensor', method = ['GET']) def get_sensors (): if request.method == 'GET': s = DataRepository.get_sensors () return jsonify (sensor = s), 200

Mã này sử dụng một lớp được gọi là DataRepository và nói với cơ sở dữ liệu. Ở đây nó trả lại cho chúng tôi các cảm biến mà chúng tôi đã yêu cầu.

Chúng tôi cũng cần một lộ trình để hỏi thông tin về 1 cảm biến cụ thể và một cảm biến khác để biết các giá trị của một cảm biến nhất định.

Đây là tất cả các tuyến đường nhưng để làm cho dữ liệu thời gian thực có thể. Chúng tôi cần gửi mỗi khoảng thời gian dữ liệu mà các cảm biến vừa đọc được. Để làm điều này, chúng tôi sử dụng kết nối Socket-IO. Nó là một kết nối được thiết lập từ thời điểm ai đó tải trang web bằng JS và nó giữ cho kết nối này luôn mở. Đây là kết nối song công có nghĩa là nó là kết nối hoạt động theo cả hai cách (gửi và nhận) cùng một lúc. Để sử dụng điều này, chúng ta cần thêm mã sau.

@ socketio.on ('connect') def Initial_connection (): print ('Một máy khách mới kết nối') socketio.send ("U bent geconnecteerd") # # Gửi đến máy khách!

Mã hòa bình này sẽ được chạy khi một máy khách kết nối.

Để nhận bất kỳ thông báo nào từ giao diện người dùng, bạn có thể sử dụng mã này.

@ socketio.on ('message') def message_reciosystem (): vượt qua

Bạn cũng có thể gửi tin nhắn. Điều này được thực hiện bằng cách sau.

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

Đối số đã cho đầu tiên có thể là bất kỳ thứ gì bạn muốn nhưng sẽ tương ứng với những gì bạn đặt trong JS của mình và bạn cũng có thể gửi các đối tượng với nó. Đây là tùy chọn.

Javascript:

Điều quan trọng là phải thêm một chút JS để máy chủ được kết nối với máy chủ phụ trợ để có thể hiển thị dữ liệu hiện tại và lấy thông tin từ cơ sở dữ liệu.

Chúng tôi sẽ gọi các hàm socketIO mà chúng tôi đã thực hiện để nhận và gửi dữ liệu.

Khi chúng tôi nhận được dữ liệu dưới dạng một Đối tượng Json, chúng tôi sẽ tháo dỡ nó để có được thông tin chúng tôi muốn và sau đó đưa nó vào các JS-holders mà chúng tôi đưa vào trang web của mình.

Bạn có thể tìm thấy mã của tôi trên kho lưu trữ github của tôi:

Bước 8: Làm vỏ bọc

Làm vỏ bọc
Làm vỏ bọc
Làm vỏ bọc
Làm vỏ bọc
Làm vỏ bọc
Làm vỏ bọc
Làm vỏ bọc
Làm vỏ bọc

Vỏ bọc mất rất nhiều công việc và có thể được thực hiện theo bất kỳ cách nào bạn muốn. Đây là cách tôi đã làm điều đó.

Tôi đã lấy một số Thùng rượu.

Một trong số chúng tôi đã sử dụng làm hộp để chứa RPi và hầu hết các cảm biến của tôi.

Tất nhiên, cảm biến tốc độ gió và cảm biến hướng gió không được đặt bên trong mà nằm trên xà ngang đặt trên một cây cột. Trên cột này, tôi treo cái thùng rượu đó, nơi tôi cũng làm một cánh cửa.

Bạn có thể thấy cách tôi hoàn thành dự án của mình bằng cách nhìn vào bức ảnh.

Tất nhiên đây là một ví dụ về cách bạn có thể làm điều đó. Bạn có thể làm với nó bất cứ điều gì bạn muốn.

Đề xuất: