Bina Stesen Cuaca Raspberry Pi Sendiri

Build Your Own Raspberry Pi Weather Station



Raspberry Pi Sense Hat adalah papan tambahan yang boleh digunakan dengan komputer papan tunggal Raspberry Pi. Topi Raspberry Pi Sense mempunyai paparan LED 8 × 8 dan kayu bedik 5 butang, dan dilengkapi dengan sensor berikut:

  1. Giroskop
  2. Pecut
  3. Magnetometer
  4. Suhu
  5. Tekanan barometrik
  6. Kelembapan

Dalam artikel ini, saya akan menunjukkan kepada anda cara membuat aplikasi web stesen cuaca berdasarkan Python API dengan menggunakan suhu , tekanan barometrik , dan kelembapan sensor Topi Raspberry Pi Sense. Untuk mengikuti artikel ini, anda memerlukan perkara berikut:







  1. Raspberry Pi 3 atau Raspberry Pi 4 dengan sambungan rangkaian.
  2. Modul Raspberry Pi Sense Hat.
  3. Penyesuai kuasa USB mikro (Raspberry Pi 3) atau USB Jenis-C (Raspberry Pi 4).
  4. Kad microSD 16 GB atau 32 GB dengan OS Raspberry Pi.
  5. Komputer riba atau komputer meja untuk akses desktop jauh VNC atau akses SSH ke Raspberry Pi.

CATATAN: Dalam artikel ini, kami akan menyambung ke Raspberry Pi dari jauh melalui VNC atau SSH menggunakan penyediaan tanpa kepala Raspberry Pi. Sekiranya anda tidak mahu mengakses Raspberry Pi anda dari jarak jauh melalui SSH atau VNC, anda perlu menyambungkan monitor, papan kekunci, dan tetikus ke Raspberry Pi anda.



Untuk mengetahui cara memancarkan gambar Raspberry Pi OS ke kad microSD, rujuk Cara Memasang dan Menggunakan Raspberry Pi Imager. Sekiranya anda memerlukan bantuan memasang Raspberry Pi OS pada Raspberry Pi anda, baca Cara Memasang Raspberry Pi OS pada Raspberry Pi 4 . Sekiranya anda memerlukan bantuan dengan penyediaan Raspberry Pi tanpa kepala, lihat Cara Memasang dan Mengkonfigurasi OS Raspberry Pi pada Raspberry Pi 4 Tanpa Monitor Luaran.



Menyambungkan Raspberry Pi Sense Hat ke Raspberry Pi

Kit Raspberry Pi Sense Hat dilengkapi dengan papan tambahan Raspberry Pi Sense Hat, header lelaki-ke-wanita 40-pin, dan beberapa skru dan spacer.





Sebelum anda boleh memasang papan Sense Hat ke Raspberry Pi, anda harus menyambungkan tajuk 40 pin ke Sense Hat. Sambungkan pin lelaki dari header lelaki-wanita 40-pin ke Sense Hat seperti yang ditunjukkan dalam gambar di bawah.



Komputer papan tunggal Raspberry Pi mempunyai 4 lubang yang dapat digunakan untuk memasang papan tambah atau casing. Untuk memasang papan tambah, masukkan skru dari bahagian belakang Raspberry Pi, seperti yang ditunjukkan dalam gambar di bawah.

Kemudian, sambungkan spacer ke skru.

Setelah anda menambah keempat-empat skru dan spacer, Raspberry Pi anda akan kelihatan seperti yang ditunjukkan dalam gambar di bawah.

Sambungkan Raspberry Pi Sense Hat ke header lelaki GPIO 40 pin dari Raspberry Pi, seperti yang ditunjukkan dalam gambar di bawah.

CATATAN: Berhati-hatilah semasa memutuskan sambungan Raspberry Pi Sense Hat dari tajuk GPIO Raspberry Pi 40-pin untuk mengelakkan membengkokkan pin Raspberry Pi GPIO.

Dengan empat skru yang tinggal, kencangkan Raspberry Pi Sense Hat, seperti yang ditunjukkan dalam gambar di bawah.

Menghidupkan Raspberry Pi

Setelah Raspberry Pi Sense Hat disambungkan ke Raspberry Pi, masukkan kad microSD dengan OS Raspberry Pi ke slot kad microSD Raspberry Pi, sambungkan kabel kuasa ke Raspberry Pi, dan hidupkan.

Memasang Perpustakaan Raspberry Pi Sense Hat Python

Untuk menggunakan Raspberry Pi Sense Hat pada Raspberry Pi, the topi akal Pustaka Python mesti dipasang pada OS Raspberry Pi. The topi akal perpustakaan boleh didapati di repositori pakej rasmi Raspberry Pi OS.

Untuk memasang Raspberry Pi topi akal Pustaka Python pada Raspberry Pi OS, kemas kini cache repositori pakej APT terlebih dahulu dengan arahan berikut:

$ sudo apt kemas kini

Kemudian, jalankan arahan berikut:

$ sudo apt install sense-hat -y

Memasang Pustaka Flask Micro Web Framework Python

Kami akan menggunakan kerangka Flask Python untuk membuat aplikasi cuaca kami. Anda boleh memasang Flask dari repositori pakej rasmi Raspberry Pi OS dengan arahan berikut:

$ sudo apt pasang python3-flask -y

Membuat Direktori Projek

Adalah idea yang baik untuk membuat direktori projek untuk menyusun fail projek anda. Untuk membuat direktori projek ~ / bekerja , gunakan arahan berikut:

$ mkdir ~ / kerja

Setelah direktori projek dibuat, arahkan ke direktori projek seperti berikut:

$ cd ~ / kerja

Menguji Topi Raspberry Pi Sense

Untuk menguji sama ada Raspberry Pi Sense Hat berfungsi, kita boleh menulis skrip Python ujian sederhana. Anda boleh membuat skrip Python baru yang dipanggil test.py dengan nano penyunting teks seperti berikut:

$ nano test.py

Masukkan kod berikut di test.py fail. Baris 1 import SenseHat daripada akal_apa modul, baris 3 mencipta a SenseHat objek dan menyimpan rujukan di akal pemboleh ubah, dan garis 5-6 menetapkan warna semua 8 × 8 LED menjadi merah. Setelah selesai, tekan + X diikuti oleh DAN dan .

Anda boleh menjalankan test.py Skrip Python dengan arahan berikut:

$ python3 test.py

Matriks LED 8 × 8 harus bersinar dengan warna merah seperti yang ditunjukkan dalam gambar di bawah.

Untuk mematikan LED Sense Hat, jalankan jelas () kaedah tanpa nilai warna di test.py Skrip Python, seperti yang ditunjukkan dalam tangkapan skrin di bawah, dan jalankan test.py Skrip Python lagi.

LED Sense Hat kini harus dimatikan, seperti yang ditunjukkan dalam gambar di bawah.

Sekiranya Topi Sense berfungsi dengan baik, teruskan ke bahagian seterusnya.

Mendapatkan Data Cuaca dari Sense Hat

Anda dapat memperoleh data sensor dari Hat Sense dengan mudah dengan menggunakan topi akal Perpustakaan Python. Untuk mengambil data sensor dari Hat Sense, anda boleh membuat skrip Python baru baca_sensor_data.py seperti berikut:

$ nano read_sensor_data.py

Masukkan kod berikut di baca_sensor_data.py Fail Python.

dariakal_apamengimportSenseHat
dari masa mengimporttidur
akal=SenseHat()
akal.jelas()
sementara Betul:
tempC=akal.get_temperature()
tempF=tempC *(9/5)+32
tekanan=akal.get_tekanan()
kelembapan=akal.get_kelembapan()

mencetak('Suhu:% .2f ° C /%. 2f ° F n'%(tempC,tempF))
mencetak(Tekanan:% .2f mb n'%(tekanan))
mencetak('Kelembapan:% .2f %% n n'%(kelembapan))
tidur(5)

Setelah selesai, tekan + X diikuti oleh DAN dan .

Dalam kod di atas, baris 1 dan 2 mengimport semua perpustakaan yang diperlukan, baris 4 membuat a SenseHat objek, dan baris 5 mematikan semua LED Topi Sense menggunakan jelas () kaedah. Gelung sementara pada baris 7 adalah gelung tak terhingga yang akan menjalankan kod pada baris 8–16 selamanya.

Selaras 8, the get_temperature () kaedah digunakan untuk membaca data suhu (dalam darjah Celsius) dari sensor kelembapan Topi Sense. Pada baris 9, data suhu ditukar dari darjah Celsius ke darjah Fahrenheit. Dalam baris 10, the get_pressure () kaedah digunakan untuk membaca data tekanan udara (dalam millibars) dari sensor tekanan Hat Sense. Pada baris 11, the get_humidity () kaedah digunakan untuk membaca data kelembapan (dalam%) dari sensor kelembapan Sense Hat.

Garis 13–15 digunakan untuk mencetak data sensor ke konsol, dan baris 16 digunakan untuk menunggu selama 5 saat sebelum membaca data sensor lagi.

Anda boleh menjalankan baca_sensor_data.py Skrip Python seperti berikut:

$ python3 read_sensor_data.py

Setelah skrip dijalankan, data sensor akan dicetak ke konsol.

Sekarang kita dapat membaca data sensor dari Hat Sense, tekan + C untuk menghentikan program.

Membuat Aplikasi Web Stesen Cuaca

Di bahagian ini, kami akan menunjukkan kepada anda bagaimana menggunakan kerangka web Python Flask untuk membuat API cuaca dan aplikasi cuaca. Aplikasi cuaca akan mengakses API data cuaca dan menunjukkan data cuaca dalam masa nyata. Semua kod yang dibincangkan dalam bahagian ini terdapat di GitHub di aplikasi shovon8 / raspberry-pi-sense-hat-weather-app .

Pertama, buat a pelayan.py Skrip Python dalam direktori projek seperti berikut:

$ nano server.py

Masukkan kod berikut di pelayan.py Fail Python.

darikelalangmengimportKelalang
darikelalangmengimportjsonify
darikelalangmengimportrender_template
darikelalangmengimporturl_untuk
dariakal_apamengimportSenseHat
aplikasi=Kelalang(__nama__)
aplikasi.konfigurasi['SEND_FILE_MAX_AGE_DEFAULT'] = 0
akal=SenseHat()
akal.jelas()
denganaplikasi.test_request_context():
url_untuk('statik',nama fail='gaya.css')
url_untuk('statik',nama fail='app.js')
@aplikasi.laluan('/ api')
defapi():
tempC=akal.get_temperature()
tempF=tempC *(9/5)+32
tekanan=akal.get_tekanan()
tekananPsi=tekanan *0.0145038
tekananP=tekanan *100
kelembapan=akal.get_kelembapan()

kembalijsonify({
'suhu':{ 'C': tempC, 'F': tempF},
'tekanan':{ 'mb': tekanan, 'hPa': tekanan,
'psi': tekananPsi, 'P': tekananP},
'kelembapan': kelembapan
})
@aplikasi.laluan('/')
defkediaman():
kembalirender_template('./home.html')

Kemudian, tekan + X diikuti oleh DAN dan untuk menyelamatkan pelayan.py Skrip Python.

Dalam kod di atas, baris 1–5 mengimport semua perpustakaan yang diperlukan, baris 7 membuat aplikasi Flask, baris 11 membuat objek SenseHat, dan baris 12 mematikan semua LED dari Sense Hat. Baris 8 melumpuhkan caching web untuk aplikasi Flask. Oleh kerana aplikasi ini ringan, tidak perlu cache. Sekiranya anda ingin mengubah suai aplikasinya, maka cache web dilumpuhkan akan menjadikan ujian lebih mudah.

Garis 18–31 membaca data sensor dari Sense Hat dan mengembalikan data API dalam format JSON pada permintaan HTTP GET di / api titik akhir pelayan web. Garis 37–39 mengembalikan halaman utama aplikasi web cuaca di / titik akhir pelayan web. Halaman utama diberikan dari rumah.html fail, yang sepatutnya ada di templat / direktori direktori projek.

Garis 14–16 digunakan untuk membenarkan akses ke gaya.css dan app.js fail statik. Fail-fail ini mesti ada di statik / direktori direktori projek. The gaya.css fail digunakan untuk menggayakan rumah.html laman utama, dan app.js file digunakan untuk meminta data API dari / api titik akhir dan mengemas kini data cuaca di rumah.html halaman setiap 5 saat.

Buat statik / dan templat / direktori dalam direktori projek seperti berikut:

$ mkdir -v {statik, templat}

Buat a rumah.html fail di templat / direktori seperti berikut:

templat $ nano / home.html

Masukkan kod berikut di rumah.html fail.


< html >
< kepala >
< meta nama='viewport' kandungan='lebar = lebar peranti, skala awal = 1.0'>
< tajuk >Stesen Cuaca Raspberry Pi</ tajuk >
< pautan rel='helaian gaya' menaip='teks / css'
href='{{url_for (' static ', nama file =' style.css ')}}'/>
</ kepala >
< badan >
< div ID='kandungan'>
< h1 >Stesen Cuaca Raspberry Pi</ h1 >

< div kelas='kandungan-data'>
< h2 >Suhu</ h2 >
< div kelas='barisan data'>
< div kelas='sel data' ID='tempC'>
...
</ div >
< div kelas='sel data' ID='tempF'>
...
</ div >
</ div >
</ div >

< div kelas='kandungan-data'>
< h2 >Tekanan</ h2 >
< div kelas='barisan data'>
< div kelas='sel data' ID='tekananMb'>
...
</ div >
< div kelas='sel data' ID='tekananPsi'>
...
</ div >
</ div >
< div kelas='barisan data'>
< div kelas='sel data' ID='tekananHpa'>
...
</ div >
< div kelas='sel data' ID='tekananP'>
...
</ div >
</ div >
</ div >

< div kelas='kandungan-data'>
< h2 >Kelembapan</ h2 >
< div kelas='barisan data'>
< div kelas='sel data' ID='kelembapan'>
...
</ div >
</ div >
</ div >
</ div >

< skrip menaip='teks / javascript' src='{{url_for (' static ', nama file =' app.js ')}}'></ skrip >
</ badan >
</ html >

Kemudian, tekan + X diikuti oleh DAN dan untuk menyelamatkan rumah.html fail.

Buat a gaya.css fail di statik / direktori seperti berikut:

$ nano static / style.css

Masukkan kod berikut di gaya.css fail.

@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
pembalut: 0;
margin: 0;
keluarga fon: 'Robot', sans-serif;
}
badan{
latar belakang: # 737373;
}
h1{
paparan: sekatan;
warna: # 79DC7B;
selaras teks: pusat;
berat fon: 400;
latar belakang: # 000;
pembalut: 0.5 pagi 0;
}
h2{
paparan: sekatan;
latar belakang: # 000;
warna: #F F F;
selaras teks: pusat;
berat fon: 400;
Saiz huruf: 1em;
}
.data-kandungan {
margin: 10px;
sempadan: 2px padat hitam;
jejari sempadan: 5px;
warna latar belakang: # 79DC7B;
}
.data-baris {
paparan:lentur;
arah lentur:barisan;
}
.data-sel {
lebar: 100%;
ketinggian: 80 piksel;
paparan:lentur;
barang selaras: pusat;
membenarkan-kandungan: pusat;
berat fon: berani;
Saiz huruf: 1.5em;
warna: # 006902;
}
.data-sel:berlegar {
latar belakang: # FFE891;
warna: # AA8600;
kursor: penunjuk;
}

Kemudian, tekan + X diikuti oleh DAN dan untuk menyelamatkan gaya.css fail.

Buat sebuah app.js fail di statik / direktori seperti berikut:

$ nano statik / app.js

Masukkan kod berikut di app.js fail.

tingkap.tambahEventListener('muat',utama);
fungsiutama() {
fungsigetAPIData() {
di manahttp= baruPermintaan XMLHttp();

http.pertukaran sudahpun = fungsi() {
sekiranya(ini.Negeri siap === 4 && ini.status === 200) {
kemas kini(JSON.menghurai(ini.Teks respons));
}
}

http.buka('DAPATKAN', '/ api', benar);
http.hantar();
}


fungsikemas kini(apiData) {
di manatempC=dokumen.getElementById('tempC');
di manatempF=dokumen.getElementById('tempF');
di manatekananMb=dokumen.getElementById('tekananMb');
di manatekananPsi=dokumen.getElementById('tekananPsi');
di manatekananHpa=dokumen.getElementById('tekananHpa');
di manatekananP=dokumen.getElementById('tekananP');
di manakelembapan=dokumen.getElementById('kelembapan');

tempC.dalaman HTML =parseFloat(apiData.suhu.C).keBetulkan(2) + '° C';
tempF.dalaman HTML =parseFloat(apiData.suhu.F).keBetulkan(2) + '° F';

tekananMb.dalaman HTML =parseFloat(apiData.tekanan.mb).keBetulkan(2) + 'mb';
tekananPsi.dalaman HTML =parseFloat(apiData.tekanan.psi).keBetulkan(2) + 'psi';
tekananHpa.dalaman HTML =parseFloat(apiData.tekanan.hPa).keBetulkan(2) + 'hPa';
tekananP.dalaman HTML =parseFloat(apiData.tekanan.P).keBetulkan(2) + 'P';

kelembapan.dalaman HTML =parseFloat(apiData.kelembapan).keBetulkan(2) + '%';
}


fungsiaplikasi() {
tingkap.setInterval(fungsi() {
getAPIData();
}, 5000);
}

aplikasi();
}

Kemudian, tekan + X diikuti oleh DAN dan untuk menyelamatkan app.js fail.

Di sini, baris 1 menjalankan utama () berfungsi apabila halaman web selesai dimuat. Di dalam utama () fungsi, yang getAPIData () fungsi mengambil data API cuaca menggunakan AJAX dan memanggil kemas kini () berfungsi (dalam baris 10) setelah data berjaya diambil. The kemas kini () fungsi mengemas kini elemen halaman web menggunakan data API.

Dalam baris 20, the document.getElementById () kaedah digunakan untuk mendapatkan rujukan elemen halaman web dengan id tempC . Baris 28 digunakan untuk menggantikan kandungan elemen laman web yang mempunyai id tempC dengan suhu (dalam Celsius) dari API. Dengan cara yang sama, isi semua elemen web (baris 21–26) diganti dengan data API masing-masing.

Di dalam aplikasi() fungsi, yang getAPIData () dipanggil setiap 5 saat (5000 milisaat) untuk mengemas kini data cuaca dalam aplikasi cuaca. Akhirnya, pada baris 46, the aplikasi() fungsi dijalankan.

Untuk menguji aplikasi web, masukkan perintah berikut:

$ FLASK_APP = pelarian termos server.py --host = 0.0.0.0

Aplikasi cuaca harus berjalan di port 5000 (secara lalai).

Untuk menguji sama ada Weather Weather berfungsi, jalankan arahan berikut:

$ curl -s http: // localhost: 5000 / api | json_pp

Seperti yang anda lihat, data Weather API dicetak ke konsol. Oleh itu, API berfungsi.

Untuk menguji aplikasi Cuaca, lawati http: // localhost: 5000 dari penyemak imbas web Chromium. Aplikasi Cuaca harus dimuat di penyemak imbas web, tetapi tidak ada data cuaca yang harus ditampilkan pada awalnya.

Setelah beberapa saat, aplikasi cuaca akan selesai mengambil data cuaca dari API dan memaparkannya.

Pada bila-bila masa, anda boleh menekan + C untuk menghentikan pelayan web.

Membuat Perkhidmatan Systemd untuk Aplikasi Web Cuaca

Di bahagian ini, kami akan menunjukkan kepada anda cara membuat fail perkhidmatan systemd untuk aplikasi cuaca sehingga akan dimulakan secara automatik semasa boot.

Pertama, buat a cuaca-stesen.khidmat fail dalam direktori projek anda seperti berikut:

$ nano weather-station.service

Masukkan baris kod berikut di cuaca-stesen.khidmat fail.

[Unit]
Penerangan = Aplikasi Web Stesen Cuaca Raspberry Pi Menggunakan Topi Raspberry Pi Sense
Selepas = network.target

[Perkhidmatan]
WorkingDirectory = / rumah / pi / kerja
Persekitaran = FLASK_APP = server.py
Persekitaran = FLASK_ENV = pengeluaran
ExecStart = / usr / bin / flask run --host = 0.0.0.0
StandardOutput = mewarisi
StandardError = mewarisi
Mulakan semula = selalu
Pengguna = pi

[Pasang]
WantedBy = multi-user.target

Kemudian, tekan + X diikuti oleh DAN dan untuk menyelamatkan cuaca-stesen.khidmat fail.

Salin cuaca-stesen.khidmat fail ke / etc / systemd / sistem / direktori dengan arahan berikut:

$ sudo cp -v weather-station.service / etc / systemd / system /

Muat semula daemon sistemd agar perubahan tersebut berlaku seperti berikut:

$ sudo systemctl daemon-reload

The stesen kaji cuaca perkhidmatan systemd tidak aktif pada masa ini, seperti yang ditunjukkan dalam tangkapan skrin di bawah.

$ sudo systemctl status weather-station.service

Mulakan stesen kaji cuaca perkhidmatan dengan arahan berikut:

$ sudo systemctl mulakan cuaca-station.service

Seperti yang anda lihat, stesen kaji cuaca perkhidmatan kini berjalan.

$ sudo systemctl status weather-station.service

Sekarang bahawa stesen kaji cuaca perkhidmatan berfungsi, anda boleh menambahkannya ke sistem permulaan Raspberry Pi OS dengan arahan berikut:

$ sudo systemctl mengaktifkan cuaca-station.service

Nyalakan semula Raspberry Pi anda dengan arahan berikut:

but semula $ sudo

Setelah Raspberry Pi anda but, stesen kaji cuaca perkhidmatan harus berjalan seperti yang ditunjukkan dalam tangkapan skrin di bawah.

$ sudo systemctl status weather-station.service

Mengakses Aplikasi Cuaca dari Peranti Lain

Untuk mengakses aplikasi cuaca dari peranti lain di rangkaian rumah anda, anda perlu mengetahui alamat IP Raspberry Pi anda. Anda boleh mendapatkan alamat IP Raspberry Pi 4 anda dari antara muka pengurusan web penghala rumah anda. Dalam kes kami, alamat IP adalah 192.168.0.103, tetapi alamat ini akan berbeza untuk anda, jadi pastikan untuk mengganti alamat ini dengan alamat anda dalam semua langkah seterusnya.

Sekiranya anda mempunyai akses ke konsol Raspberry Pi, anda boleh menjalankan perintah berikut untuk mencari alamat IP juga.

$ nama host -I

Setelah anda mengetahui alamat IP Raspberry Pi anda, anda boleh mengaksesnya dari mana-mana peranti di rangkaian rumah anda. Seperti yang ditunjukkan dalam tangkapan skrin di bawah, kami telah mengakses aplikasi cuaca dari smartphone Android.

Kesimpulannya

Dalam artikel ini, kami menunjukkan cara menggunakan Raspberry Pi Sense Hat untuk membina stesen cuaca Raspberry Pi. Kami menggunakan topi akal Perpustakaan Python untuk mengekstrak data cuaca dari Raspberry Pi Sense Hat. Kemudian, kami menggunakan kerangka web mikro Flask Python untuk membuat API cuaca dan aplikasi web. Aplikasi web mendapat data cuaca dari API cuaca setiap 5 saat untuk memastikan aplikasi web sentiasa diperbarui dengan data cuaca terkini.