Cuprins:

Stație meteo locală: 8 pași (cu imagini)
Stație meteo locală: 8 pași (cu imagini)

Video: Stație meteo locală: 8 pași (cu imagini)

Video: Stație meteo locală: 8 pași (cu imagini)
Video: Mi-am distrus mașina… 2024, Noiembrie
Anonim
Stația meteo locală
Stația meteo locală

În timp ce căutam un proiect grozav de făcut pentru proiectul meu școlar din primul an, aveam multe idei despre ce să fac, dar niciunul dintre ei nu mi s-a părut provocator.

Mai târziu m-am gândit să fac o stație meteo care să aibă ceva special. Am vrut să pot stoca toate datele mele și ulterior să le folosesc pentru statistici. Acest proiect ar fi conceput special pentru persoanele care au un interes pentru meteorologie și doresc o stație meteo creată acasă, care nu costă la fel de mult ca cele disponibile pe piață. Proiectul este, de asemenea, conceput pentru a menține capacitatea de a adăuga sau elimina senzori în orice moment.

Am fost foarte fericit când mi-am văzut rezultatul final, care s-a dovedit mai bun decât se aștepta.

Este realizat dintr-un Raspberry Pi 4 care rulează Linux.

  • Site web Apache (html css js)
  • Eventlet (site-ul serverului backend)
  • MariaDB (server de baze de date)

Provizii

  • Raspberry Pi 4:

    card SD (min 16 GB)

  • Senzori:

    1. Senzor de viteză a vântului QS-FS
    2. Senzor de vânt Ieșire semnal de grădină Aliaj de aluminiu Senzor de direcție a vântului Instrument de măsurare a vitezei paletei de vânt 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 (umiditate)
    4. BMP280 (presiunea aerului)
    5. DS18B20 (temperatură)
  • Sursa de alimentare

    • Alimentare 5V (RPi)
    • Sursă de alimentare de 9v (pe o sursă de alimentare externă)
  • Panou (x2)

    T-cobbler plus pentru RPi 4

  • fire jumper
  • IC-uri

    • MCP3008
    • PCF8574AN
  • Afișaj LCD 16x2
  • LED (roșu
  • Carcasă (optinală)

    • lăzi de vin
    • stâlp de lemn (2m)
    • scândură de lemn (1m)

Pasul 1: Pregătirea lucrurilor

Este întotdeauna foarte important să obțineți toate articolele de care aveți nevoie înainte de a începe să lucrați la un pas. Acest lucru vă va economisi mult timp în timp ce lucrați prin el.

Deci mai întâi, De ce ai nevoie:

  • Raspberry Pi 4:

    card SD (min 16 GB)

  • Senzori:

    1. Senzor de viteză a vântului QS-FS
    2. Senzor de vânt Ieșire semnal de grădină Aliaj de aluminiu Senzor de direcție a vântului Instrument de măsurare a vitezei paletei de vânt
    3. DHT22 (umiditate)
    4. BMP280 (presiunea aerului)
    5. DS18B20 (temperatura)
  • Sursa de alimentare

    • Alimentare 5V (RPi)
    • Sursă de alimentare de 9v (pe o sursă de alimentare externă)
  • Panou (x2)
  • T-cobbler plus pentru RPi 4
  • fire jumper
  • IC-uri

    • MCP3008
    • PCF8574AN
  • Afișaj LCD 16x2
  • LED (roșu)
  • Carcasă (optinală)

    • lăzi de vin din lemn
    • scândură de lemn (1m)
    • stâlp (2m)

Puteți găsi toate linkurile de unde le-am cumpărat în secțiunea consumabile din introducere.

Pasul 2: Configurarea RPi

Configurarea RPi
Configurarea RPi

Pentru proiectul nostru avem nevoie de un RPi cu software-ul dat instalat.

  • Site web Apache (html css js)
  • Flask Socket-IO (site-ul serverului backend)
  • MariaDB (server de baze de date)

Înainte de instalare, este întotdeauna la îndemână să vă asigurați că aveți cel mai recent software instalat pe RPi. Pentru a face acest lucru, executați următoarea comandă:

actualizare sudo apt

Apache:

Mai întâi să vorbim despre Apache. Apache este un server web utilizat în toată lumea. Vă rulează site-ul fără cusur. Singurul lucru pe care trebuie să-l faceți este să îl instalați și să vă puneți site-ul în folderul potrivit și acolo este.

sudo apt instalează apache2 -y

Asta e!

Pentru a vă asigura că totul este instalat corect navigați la adresa dvs. raspberry pi Ip în browserul dvs. și vedeți dacă obțineți site-ul implicit. Dacă aveți probleme cu privire la acest pas, puteți consulta site-ul web RPi aici.

Eveniment:

Acum să instalăm Eventlet. Acesta va rula serverul nostru backend și va face conexiunea de la senzorii noștri la site-ul nostru web. Pentru asta avem nevoie de câteva pachete.

Flask-socketIO:

pip3 instalează flask-socketio

Eveniment:

pip3 instalează evenimentul

Gevent:

pip3 instalează gevent

Mariadb:

Mariadb este o bază de date bazată pe MySQL care creează baze de date relaționale. Este adesea folosit pe RPi și, prin urmare, există o mulțime de ajutor pe care îl puteți găsi pe internet. Pentru mai multe informații puteți accesa acest link.

apt instalați mariadb-server

Pasul 3: Conectarea senzorilor și adăugarea codului

Conectarea senzorilor și adăugarea codului
Conectarea senzorilor și adăugarea codului
Conectarea senzorilor și adăugarea codului
Conectarea senzorilor și adăugarea codului
Conectarea senzorilor și adăugarea codului
Conectarea senzorilor și adăugarea codului

Pentru a conecta senzorii la RPi, putem folosi un T-Cobbler plus. Acesta este un mic instrument la îndemână, care face posibilă utilizarea tuturor pinilor dvs. pe RPi pe o placă de calcul.

În proiectul meu am 5 senzori:

  1. Senzor de viteză a vântului QS-FS
  2. Senzor de vânt Ieșire semnal de grădină Aliaj de aluminiu Senzor de direcție a vântului Instrument de măsurare a vitezei paletei de vânt
  3. DHT22 (umiditate)
  4. BMP280 (presiunea aerului)
  5. DS18B20 (temperatura)

Senzor viteză vânt:

Mai întâi de toate, am început cu senzorul de viteză a vântului, deoarece am fost în mare parte încântat de acest senzor. Este un senzor cu un semnal analogic de ieșire 0-5v și are nevoie de o tensiune de minimum 7 volți pentru a funcționa. Aleg ca adaptorul de 9 volți să-l alimenteze.

Pentru a citi în acest senzor am folosit un MCP3008 care este un IC pentru a citi în semnale analogice. IC-ul poate funcționa pe 3.3V sau 5V, dar eu aleg 3.3V pentru al face compatibil cu RPi. Acest lucru a însemnat că trebuia să schimb tensiunea de ieșire de la 5V la 3,3V. Am făcut acest lucru adăugând un divizor de tensiune creat de 2 rezistențe (2k și 1k ohm).

Senzor de direcție a vântului:

Direcția vântului este la fel de importantă ca viteza vântului, prin urmare, voi conecta acest lucru în continuare.

Acest senzor are aceeași specificație ca și senzorul de viteză a vântului. De asemenea, va funcționa pe 9V și are o tensiune de ieșire de 5 volți. De asemenea, acest senzor îl vom conecta la MCP3008 printr-un divizor de tensiune.

DHT22 (umiditate):

DHT22 citește umiditatea. Vă oferă o valoare procentuală, iar valoarea sa poate fi citită folosind protocolul I2C de pe RPi. Prin urmare, trebuie să activați porturile I2C din Raspi-config. Mai multe informații aici.

BMP280 (presiunea aerului):

BMP280 este utilizat pentru a citi presiunea aerului. Valoarea sa este citită prin magistrala SPI de pe RPi. Acest protocol trebuie de asemenea activat în Raspi-config. Pentru codul meu am folosit biblioteca Adafruit.

DS18B20 (temperatura):

Ultimul senzor măsoară temperatura. acest senzor este de la Dallas și dacă ați avut puțină experiență cu Dallas, probabil că ar trebui să știți deja că utilizează 1Wire-bus. Nu vă mirați dacă spun că acest protocol trebuie activat și în Raspi-config.

Cum am conectat senzorii:

Ca pdf am încărcat o schemă electrică și de panouri pentru a o ușura puțin.

După ce ați reușit să conectați senzorii cu succes și ați adăugat codul necesar pentru a citi toți senzorii, puteți continua și trece la pasul următor. Dacă doriți să lăsați un senzor în urmă sau doriți să adăugați mai multe, puteți face acest lucru.

Pasul 4: Proiectarea unei interfețe web

Proiectarea unei interfețe web
Proiectarea unei interfețe web
Proiectarea unei interfețe web
Proiectarea unei interfețe web
Proiectarea unei interfețe web
Proiectarea unei interfețe web

Acum am conectat senzorii, avem nevoie de un design pentru site-ul nostru.

Vrem ca site-ul web să creeze un aspect ușor în timp ce afișează toate datele în timp real ale senzorilor.

De asemenea, dorim să putem vedea istoricul acestor valori măsurate pe interval de timp.

Așa că, în primul rând, am început să mă uit în jur pe web pentru o inspirație. Mai presus de toate, acolo unde sunt doar site-uri de informații mai bune, fără designul pe care îl căutam. Stațiile meteo care erau deja pe piață au avut cel mai probabil un afișaj. Și din acel afișaj mi-a venit inspirația. Majoritatea ecranelor au un design cu aspect de grilă. Acest lucru mi-a dat ideea de a crea pagina de pornire unde ar fi afișați toți senzorii.

Dar, de asemenea, am spus că am vrut să fac o pagină în care puteți vedea istoricul fiecărui senzor al valorilor sale.

Din acest motiv, am realizat și o a doua pagină în designul meu care conține acest lucru. Pe această pagină am putut vedea câteva informații suplimentare despre senzorul meu care nu ar fi afișate pe prima pagină și în afara părții istorice.

După câteva ore mi s-a pus la punct designul complet!

Designul a fost realizat folosind Adobe XD.

Pasul 5: Crearea bazei de date

Crearea bazei de date
Crearea bazei de date

Pentru a obține o pauză de la partea de proiectare am început pe baza mea de date.

Această bază de date ar conține toți senzorii (5), toate dispozitivele de acționare (2) și valorile pe care acei senzori le aveau.

Baza de date este destul de ușoară și are câteva relații.

Puteți vedea modelul bazei de date în fotografie.

Pasul 6: Codificarea site-ului: Frontend (html Css)

Înapoi la site!

Acum am un design, pot începe să-l codez ca html css pentru a-l folosi cu adevărat.

Pe pagina principală:

Am început prin a considera fiecare senzor ca pe un element de pe site-ul meu. Pentru ca mai târziu să pot lăsa această parte să se genereze prin codul meu Javascript.

Am inserat, de asemenea, clase elementare aleatorii JS-titular în elemente. Acestea ar face posibilă schimbarea conținutului acelui element

Acest lucru mi-a luat mult timp pentru că nu sunt atât de bun în această limbă.

După ce ați făcut pagina de pornire, a venit timpul să începeți de la pagina de istorie.

Pe pagina istoric:

Această pagină a fost puțin mai ușor de creat. În această pagină au fost, de asemenea, deținătorii de js pentru a obține informații despre senzor, un slot de valori în timp real și pentru a afișa tabelul cu toate valorile măsurate.

Pentru a crea o opțiune de filă pe site-ul meu web pentru a alege între Tabel sau Grafic, a trebuit să adaug un pic de Javascript pentru ca elementele să nu se afișeze sau să nu fie afișate.

Acum avem un site uimitor, dar nu putem afișa nimic pe el? Să remediem asta.

Puteți găsi codul meu în depozitul meu github:

Pasul 7: Codificarea site-ului web: Backend (eventlet) + Coding Frontend (javascript)

Backend:

În timp ce serverul backend este deja instalat, trebuie să implementăm acest lucru în proiectul nostru. Mai întâi trebuie să adăugăm câteva importuri pentru ca totul să funcționeze corect.

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

Pentru a porni serverul, trebuie să adăugăm următoarele:

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

Acum serverul este online, dar nu va putea vorbi cu frontend-ul.

Nu primește sau returnează nimic. Să schimbăm asta.

Pentru a solicita toți senzorii din baza de date wel va adăuga un traseu:

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

Acest cod folosește o clasă numită DataRepository și vorbește cu baza de date. Aici ne redă senzorii pe care i-am cerut-o.

De asemenea, avem nevoie de o rută pentru a cere informații despre un senzor specific și un altul pentru valorile unui senzor dat.

Acestea sunt toate rute, dar pentru a face posibile datele în timp real. Trebuie să trimitem la fiecare interval datele pe care senzorii tocmai le-au citit. Pentru a face acest lucru folosim conexiunea Socket-IO. Este o conexiune stabilită din momentul în care cineva încarcă site-ul web cu JS și păstrează această conexiune deschisă. Aceasta este o conexiune full-duplex, ceea ce înseamnă că este o conexiune care funcționează în ambele moduri (trimitere și primire) în același timp. Pentru a utiliza acest lucru, trebuie să adăugăm următorul cod.

@ socketio.on ('connect') def initial_connection (): print ('A new client connect') socketio.send ("U bent geconnecteerd") # # Trimiteți clientului!

Această pace a codului se execută atunci când un client se conectează.

Pentru a primi orice mesaj de pe frontend puteți utiliza acest cod.

@ socketio.on ('mesaj') def message_recived (): trece

De asemenea, puteți trimite mesaje. Acest lucru se face prin următoarele.

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

Primul argument dat poate fi orice doriți, dar va corespunde cu ceea ce puneți în JS și puteți trimite și obiecte cu acesta. Acest lucru este opțional.

Javascript:

Este important să adăugați un pic de JS pentru a conecta serverul cu serverul backend pentru a putea afișa datele curente și pentru a obține informații din baza de date.

Vom apela funcțiile socketIO pe care le-am făcut pentru a primi și a trimite date.

Când primim date ca obiect Json, le vom demonta pentru a obține informațiile pe care le dorim și apoi le vom pune în deținătorii JS pe care i-am pus pe site-ul nostru.

Puteți găsi codul meu în depozitul meu github:

Pasul 8: Realizarea unei carcase

Realizarea unei carcase
Realizarea unei carcase
Realizarea unei carcase
Realizarea unei carcase
Realizarea unei carcase
Realizarea unei carcase
Realizarea unei carcase
Realizarea unei carcase

Carcasa a necesitat multă muncă și poate fi realizată în orice mod doriți. Așa am făcut-o.

Am luat niște lăzi de vin.

Unul dintre ele l-am folosit ca cutie pentru a-mi conține RPi și majoritatea senzorilor.

Senzorul de viteză a vântului și senzorul de direcție a vântului nu au fost, desigur, așezați în interior, ci deasupra unei bare transversale plasate pe un stâlp. Pe acest stâlp am atârnat lada aceea de vin unde am făcut și o ușă.

Puteți vedea cum mi-am terminat proiectul privind fotografiile.

Acesta este desigur un exemplu al modului în care îl puteți face. Puteți face cu el orice doriți.

Recomandat: