Bangun Stasiun Cuaca Raspberry Pi Anda Sendiri

Build Your Own Raspberry Pi Weather Station

Raspberry Pi Sense Hat adalah papan tambahan yang dapat digunakan dengan komputer papan tunggal Raspberry Pi. Raspberry Pi Sense Hat memiliki layar LED 8x8 dan joystick 5 tombol, dan dilengkapi dengan sensor berikut:

  1. Giroskop
  2. Akselerometer
  3. Magnetometer
  4. Suhu
  5. Tekanan barometrik
  6. Kelembaban

Pada artikel ini, saya akan menunjukkan cara membuat aplikasi web stasiun cuaca berbasis Python API dengan menggunakan suhu , tekanan barometrik , dan kelembaban sensor dari Raspberry Pi Sense Hat. Untuk mengikuti artikel ini, Anda memerlukan yang berikut:



  1. Raspberry Pi 3 atau Raspberry Pi 4 dengan konektivitas jaringan.
  2. Modul Raspberry Pi Sense Hat.
  3. Adaptor daya micro-USB (Raspberry Pi 3) atau USB Type-C (Raspberry Pi 4).
  4. Kartu microSD 16 GB atau 32 GB dengan Raspberry Pi OS.
  5. Laptop atau komputer desktop untuk akses desktop jarak jauh VNC atau akses SSH ke Raspberry Pi.

CATATAN: Pada artikel ini, kita akan terhubung ke Raspberry Pi dari jarak jauh melalui VNC atau SSH menggunakan pengaturan headless dari Raspberry Pi. Jika Anda tidak ingin mengakses Raspberry Pi Anda dari jarak jauh melalui SSH atau VNC, Anda harus menghubungkan monitor, keyboard, dan mouse ke Raspberry Pi Anda.



Untuk mempelajari cara mem-flash gambar Raspberry Pi OS ke kartu microSD, silakan lihat Cara Memasang dan Menggunakan Raspberry Pi Imager . Jika Anda memerlukan bantuan untuk menginstal Raspberry Pi OS di Raspberry Pi Anda, baca Cara Install Raspberry Pi OS di Raspberry Pi 4 . Jika Anda memerlukan bantuan dengan pengaturan tanpa kepala dari Raspberry Pi, lihat Cara Menginstal dan Mengonfigurasi Raspberry Pi OS di Raspberry Pi 4 Tanpa Monitor Eksternal .



Menghubungkan Raspberry Pi Sense Hat ke Raspberry Pi

Kit Raspberry Pi Sense Hat dilengkapi dengan papan tambahan Raspberry Pi Sense Hat, header 40-pin male-to-female, dan beberapa sekrup dan spacer.

Sebelum Anda dapat memasang papan Sense Hat ke Raspberry Pi, Anda harus menghubungkan header 40-pin ke Sense Hat. Hubungkan pin pria dari header pria-wanita 40-pin ke Sense Hat seperti yang ditunjukkan pada gambar di bawah ini.



Komputer single-board Raspberry Pi memiliki 4 lubang yang dapat digunakan untuk memasang papan tambahan atau casing. Untuk memasang papan tambahan, masukkan sekrup dari bagian belakang Raspberry Pi, seperti yang ditunjukkan pada gambar di bawah.

Kemudian, sambungkan spacer ke sekrup.

Setelah Anda menambahkan keempat sekrup dan spacer, Raspberry Pi Anda akan terlihat seperti yang ditunjukkan pada gambar di bawah.

Hubungkan Raspberry Pi Sense Hat ke header laki-laki GPIO 40-pin dari Raspberry Pi, seperti yang ditunjukkan pada gambar di bawah.

CATATAN: Hati-hati saat melepaskan Raspberry Pi Sense Hat dari header GPIO 40-pin Raspberry Pi untuk menghindari bengkoknya pin Raspberry Pi GPIO.

Dengan empat sekrup yang tersisa, kencangkan Raspberry Pi Sense Hat, seperti yang ditunjukkan pada gambar di bawah.

Menghidupkan Raspberry Pi

Sekarang setelah Raspberry Pi Sense Hat terhubung ke Raspberry Pi, masukkan kartu microSD dengan OS Raspberry Pi ke dalam slot kartu microSD dari Raspberry Pi, sambungkan kabel daya ke Raspberry Pi, dan nyalakan.

Memasang Pustaka Python Raspberry Pi Sense Hat

Untuk menggunakan Raspberry Pi Sense Hat pada Raspberry Pi, indra-topi Pustaka Python harus diinstal pada Raspberry Pi OS. NS indra-topi library tersedia di repositori paket resmi Raspberry Pi OS.

Untuk menginstal Raspberry Pi indra-topi Pustaka Python pada Raspberry Pi OS, perbarui terlebih dahulu cache repositori paket APT dengan perintah berikut:

$ sudo apt update

Kemudian, jalankan perintah berikut:

$ sudo apt install sense-hat -y

Memasang Pustaka Python Flask Micro Web Framework

Kami akan menggunakan kerangka Flask Python untuk membuat aplikasi cuaca kami. Anda dapat menginstal Flask dari repositori paket resmi Raspberry Pi OS dengan perintah berikut:

$ sudo apt install python3-flask -y

Membuat Direktori Proyek

Sebaiknya buat direktori proyek untuk mengatur file proyek Anda. Untuk membuat direktori proyek ~/kerja , gunakan perintah berikut:

$ mkdir ~/work

Setelah direktori proyek dibuat, navigasikan ke direktori proyek sebagai berikut:

$ cd ~/kerja

Menguji Topi Rasa Raspberry Pi

Untuk menguji apakah Raspberry Pi Sense Hat berfungsi, kita dapat menulis skrip Python pengujian sederhana. Anda dapat membuat skrip Python baru bernama test.py dengan nano editor teks sebagai berikut:

$ nano test.py

Masukkan kode berikut di test.py mengajukan. Impor baris 1 SenseTopi dari sense_hat modul, baris 3 membuat a SenseTopi objek dan menyimpan referensi di nalar variabel, dan garis 5–6 mengatur warna semua LED 8×8 menjadi merah. Setelah selesai, tekan + x diikuti oleh DAN dan .

Anda dapat menjalankan test.py Script Python dengan perintah berikut:

$ python3 test.py

Matriks LED 8x8 harus menyala dalam warna merah seperti yang ditunjukkan pada gambar di bawah.

Untuk mematikan LED Sense Hat, jalankan jernih() metode tanpa nilai warna apa pun di test.py Skrip Python, seperti yang ditunjukkan pada tangkapan layar di bawah, dan jalankan test.py Skrip python lagi.

LED Sense Hat sekarang harus dimatikan, seperti yang ditunjukkan pada gambar di bawah.

Jika Sense Hat berfungsi dengan baik, lanjutkan ke bagian berikutnya.

Mendapatkan Data Cuaca dari Sense Hat

Anda dapat memperoleh data sensor dari Sense Hat dengan sangat mudah dengan menggunakan indra-topi Pustaka Python. Untuk mengambil data sensor dari Sense Hat, Anda dapat membuat skrip Python baru read_sensor_data.py sebagai berikut:

$ nano read_sensor_data.py

Masukkan kode berikut di read_sensor_data.py berkas Python.

darisense_hatimporSenseTopi
dari waktu importidur
nalar=SenseTopi()
nalar.jernih()
ketika benar:
suhuC=nalar.get_temperature()
tempF=suhu *(9/5)+32
tekanan=nalar.get_tekanan()
kelembaban=nalar.dapatkan_kelembaban()

mencetak('Suhu: %.2f°C/%.2f°F '%(suhuC,tempF))
mencetak('Tekanan: %.2f mb '%(tekanan))
mencetak('Kelembaban: %.2f%% '%(kelembaban))
tidur(5)

Setelah selesai, tekan + x diikuti oleh DAN dan .

Dalam kode di atas, baris 1 dan 2 mengimpor semua perpustakaan yang diperlukan, baris 4 membuat SenseTopi objek, dan baris 5 mematikan semua LED Sense Hat menggunakan tombol jernih() metode. Perulangan while pada baris 7 adalah perulangan tak terbatas yang akan menjalankan kode pada baris 8–16 selamanya.

Pada baris 8, get_temperature() Metode ini digunakan untuk membaca data suhu (dalam derajat Celcius) dari sensor kelembaban Sense Hat. Pada baris 9, data suhu diubah dari derajat Celcius ke derajat Fahrenheit. Pada baris 10, get_tekanan() metode ini digunakan untuk membaca data tekanan udara (dalam milibar) dari sensor tekanan Sense Hat. Pada baris 11, dapatkan_kelembaban() Metode ini digunakan untuk membaca data kelembaban (dalam %) dari sensor kelembaban Sense Hat.

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

Anda dapat menjalankan read_sensor_data.py Script Python sebagai berikut:

$ python3 read_sensor_data.py

Setelah skrip dijalankan, data sensor akan dicetak ke konsol.

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

Membuat Aplikasi Web Stasiun Cuaca

Di bagian ini, kami akan menunjukkan cara menggunakan kerangka web Python Flask untuk membuat API cuaca dan aplikasi cuaca. Aplikasi cuaca akan mengakses API data cuaca dan menampilkan data cuaca secara real time. Semua kode yang dibahas di bagian ini tersedia di GitHub di shovon8 / raspberry-pi-sense-hat-aplikasi-cuaca .

Pertama, buat server.py Script python di direktori proyek sebagai berikut:

$ nano server.py

Masukkan kode berikut di server.py berkas Python.

darilabuimporLabu
darilabuimporjsonify
darilabuimporrender_template
darilabuimporurl_for
darisense_hatimporSenseTopi
aplikasi=Labu(__nama__)
aplikasi.konfigurasi['SEND_FILE_MAX_AGE_DEFAULT'] = 0
nalar=SenseTopi()
nalar.jernih()
denganaplikasi.test_request_context():
url_for('statis',nama file='style.css')
url_for('statis',nama file='app.js')
@aplikasi.rute('/api')
defapi():
suhuC=nalar.get_temperature()
tempF=suhu *(9/5)+32
tekanan=nalar.get_tekanan()
tekananPsi=tekanan *0,0145038
tekananP=tekanan *100
kelembaban=nalar.dapatkan_kelembaban()

kembalijsonify({
'suhu':{ 'C': suhuC, 'F': tempF},
'tekanan':{ 'mb': tekanan, 'hPa': tekanan,
'psi': tekananPsi, 'P': tekananP},
'kelembaban': kelembaban
})
@aplikasi.rute('/')
defrumah():
kembalirender_template('./home.html')

Lalu tekan + x diikuti oleh DAN dan untuk menyelamatkan server.py skrip piton.

Pada kode di atas, baris 1-5 mengimpor semua library yang diperlukan, baris 7 membuat aplikasi Flask, baris 11 membuat objek SenseHat, dan baris 12 mematikan semua LED Sense Hat. Baris 8 menonaktifkan cache web untuk aplikasi Flask. Karena aplikasi ini ringan, tidak perlu caching. Jika Anda ingin memodifikasi aplikasi, menonaktifkan caching web akan membuat pengujian menjadi lebih mudah.

Baris 18–31 membaca data sensor dari Sense Hat dan mengembalikan data API dalam format JSON pada permintaan HTTP GET di /api titik akhir dari server web. Baris 37–39 mengembalikan beranda aplikasi web cuaca di / titik akhir dari server web. Beranda dirender dari home.html file, yang harus di templat/ direktori direktori proyek.

Jalur 14–16 digunakan untuk memungkinkan akses ke style.css dan app.js file statis. File-file ini harus di statis/ direktori direktori proyek. NS style.css file digunakan untuk menata gaya home.html beranda, dan app.js file digunakan untuk meminta data API dari /api titik akhir dan perbarui data cuaca di home.html halaman setiap 5 detik.

Buat statis/ dan templat/ direktori dalam direktori proyek sebagai berikut:

$ mkdir -v {statis,templat}

Membuat home.html file di templat/ direktori sebagai berikut:

$ nano templates/home.html

Masukkan kode berikut di home.html mengajukan.


< html >
< kepala >
< meta nama='area pandang' isi='lebar=lebar perangkat, skala awal=1.0'>
< judul >Stasiun Cuaca Raspberry Pi</ judul >
< tautan rel='stylesheet' Tipe='teks/css'
href='{{ url_for('static', file) }}'/>
</ kepala >
< tubuh >
< div Indo='isi'>
< h1 >Stasiun Cuaca Raspberry Pi</ h1 >

< div kelas='data-konten'>
< h2 >Suhu</ h2 >
< div kelas='baris data'>
< div kelas='data-sel' Indo='tempC'>
...
</ div >
< div kelas='data-sel' Indo='tempF'>
...
</ div >
</ div >
</ div >

< div kelas='data-konten'>
< h2 >Tekanan</ h2 >
< div kelas='baris data'>
< div kelas='data-sel' Indo='tekananMb'>
...
</ div >
< div kelas='data-sel' Indo='tekananPsi'>
...
</ div >
</ div >
< div kelas='baris data'>
< div kelas='data-sel' Indo='tekananHpa'>
...
</ div >
< div kelas='data-sel' Indo='tekananP'>
...
</ div >
</ div >
</ div >

< div kelas='data-konten'>
< h2 >Kelembaban</ h2 >
< div kelas='baris data'>
< div kelas='data-sel' Indo='kelembaban'>
...
</ div >
</ div >
</ div >
</ div >

< naskah Tipe='teks/javascript' src='{{ url_for('static', file) }}'></ naskah >
</ tubuh >
</ html >

Lalu tekan + x diikuti oleh DAN dan untuk menyelamatkan home.html mengajukan.

Membuat style.css file di statis/ direktori sebagai berikut:

$ nano static/style.css

Masukkan kode berikut di style.css mengajukan.

@impor url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
* {
lapisan: 0;
batas: 0;
font-family: 'Robot', Sans Serif;
}
tubuh{
Latar Belakang: #737373;
}
h1{
menampilkan: memblokir;
warna: #79DC7B;
perataan teks: Tengah;
font-berat: 400;
Latar Belakang: # 000;
lapisan: 0.5em 0;
}
h2{
menampilkan: memblokir;
Latar Belakang: # 000;
warna: #fff;
perataan teks: Tengah;
font-berat: 400;
ukuran huruf: 1em;
}
.data-konten {
batas: 10px;
berbatasan: 2px padat hitam;
radius batas: 5px;
warna latar belakang: #79DC7B;
}
.data-baris {
menampilkan:melenturkan;
arah fleksibel:baris;
}
.data-sel {
lebar: 100%;
tinggi: 80px;
menampilkan:melenturkan;
menyelaraskan-item: Tengah;
membenarkan-konten: Tengah;
font-berat: berani;
ukuran huruf: 1.5em;
warna: #006902;
}
.data-sel:melayang-layang {
Latar Belakang: #FFE891;
warna: #AA8600;
kursor: penunjuk;
}

Lalu tekan + x diikuti oleh DAN dan untuk menyelamatkan style.css mengajukan.

Buat sebuah app.js file di statis/ direktori sebagai berikut:

$ nano statis/app.js

Masukkan kode berikut di app.js mengajukan.

jendela.tambahkanEventListener('memuat',utama);
fungsiutama() {
fungsidapatkanAPIData() {
di manahttp= baruPermintaan XMLHttp();

http.perubahan status siap pakai = fungsi() {
jika(ini.keadaan siap === 4 && ini.status === 200) {
memperbarui(JSON.mengurai(ini.responteks));
}
}

http.membuka('DAPATKAN', '/api', benar);
http.mengirim();
}


fungsimemperbarui(apiData) {
di manasuhuC=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 manakelembaban=dokumen.getElementById('kelembaban');

suhuC.dalamHTML =parseFloat(apiData.suhu.C).untuk Memperbaiki(2) + '° C';
suhudalamHTML =parseFloat(apiData.suhu.F).untuk Memperbaiki(2) + '°F';

tekananMb.dalamHTML =parseFloat(apiData.tekanan.mb).untuk Memperbaiki(2) + 'mb';
tekananPsi.dalamHTML =parseFloat(apiData.tekanan.psi).untuk Memperbaiki(2) + 'psi';
tekananHpa.dalamHTML =parseFloat(apiData.tekanan.hPa).untuk Memperbaiki(2) + 'hPa';
tekananP.dalamHTML =parseFloat(apiData.tekanan.P).untuk Memperbaiki(2) + ' P';

kelembaban.dalamHTML =parseFloat(apiData.kelembaban).untuk Memperbaiki(2) + '%';
}


fungsiaplikasi() {
jendela.setInterval(fungsi() {
dapatkanAPIData();
}, 5000);
}

aplikasi();
}

Lalu tekan + x diikuti oleh DAN dan untuk menyelamatkan app.js mengajukan.

Di sini, baris 1 menjalankan utama() berfungsi ketika halaman web selesai dimuat. Dalam utama() fungsi, dapatkanAPIData() fungsi mengambil data API cuaca menggunakan AJAX dan memanggil memperbarui() fungsi (dalam baris 10) setelah data berhasil diambil. NS memperbarui() fungsi memperbarui elemen halaman web menggunakan data API.

Pada baris 20, document.getElementById() metode ini digunakan untuk mendapatkan referensi elemen halaman web dengan id suhuC . Baris 28 digunakan untuk mengganti konten elemen halaman web yang memiliki id suhuC dengan suhu (dalam Celcius) dari API. Dengan cara yang sama, konten semua elemen web (baris 21–26) diganti dengan data API masing-masing.

Dalam aplikasi() fungsi, dapatkanAPIData() dipanggil setiap 5 detik (5000 milidetik) untuk memperbarui data cuaca di aplikasi cuaca. Akhirnya, pada baris 46, aplikasi() fungsi dijalankan.

Untuk menguji aplikasi web, masukkan perintah berikut:

$ FLASK_APP=server.py labu dijalankan --host=0.0.0.0

Aplikasi cuaca harus berjalan pada port 5000 (secara default).

Untuk menguji apakah Weather API berfungsi, jalankan perintah berikut:

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

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

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

Setelah beberapa detik, aplikasi cuaca akan selesai mengambil data cuaca dari API dan menampilkannya.

Kapan saja, Anda dapat menekan + C untuk menghentikan server web.

Membuat Layanan Systemd untuk Aplikasi Web Cuaca

Di bagian ini, kami akan menunjukkan kepada Anda cara membuat file layanan systemd untuk aplikasi cuaca sehingga akan otomatis dimulai saat booting.

Pertama, buat stasiun cuaca.service file di direktori proyek Anda sebagai berikut:

$ nano stasiun cuaca.service

Masukkan baris kode berikut di stasiun cuaca.service mengajukan.

[Satuan]
Description=Aplikasi Web Stasiun Cuaca Raspberry Pi Menggunakan Raspberry Pi Sense Hat
Setelah=jaringan.target

[Melayani]
WorkingDirectory=/home/pi/work
Lingkungan=FLASK_APP=server.py
Lingkungan=FLASK_ENV=produksi
ExecStart=/usr/bin/flask run --host=0.0.0.0
StandarOutput=mewarisi
StandardError=mewarisi
Mulai ulang = selalu
Pengguna=pi

[Install]
WantedBy=multi-pengguna.target

Lalu tekan + x diikuti oleh DAN dan untuk menyelamatkan stasiun cuaca.service mengajukan.

Salin stasiun cuaca.service file ke /etc/systemd/sistem/ direktori dengan perintah berikut:

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

Muat ulang daemon systemd agar perubahan diterapkan sebagai berikut:

$ sudo systemctl daemon-reload

NS Stasiun cuaca layanan systemd seharusnya tidak aktif saat ini, seperti yang ditunjukkan pada gambar di bawah.

$ sudo systemctl status weather-station.service

Memulai Stasiun cuaca layanan dengan perintah berikut:

$ sudo systemctl start weather-station.service

Seperti yang Anda lihat, Stasiun cuaca layanan sekarang berjalan.

$ sudo systemctl status weather-station.service

Sekarang bahwa Stasiun cuaca service berfungsi, Anda dapat menambahkannya ke sistem startup Raspberry Pi OS dengan perintah berikut:

$ sudo systemctl aktifkan stasiun cuaca.service

Reboot Raspberry Pi Anda dengan perintah berikut:

$ sudo reboot

Setelah Raspberry Pi Anda boot, Stasiun cuaca service harus berjalan, seperti yang ditunjukkan pada gambar di bawah.

$ sudo systemctl status weather-station.service

Mengakses Aplikasi Cuaca dari Perangkat Lain

Untuk mengakses aplikasi cuaca dari perangkat lain di jaringan rumah Anda, Anda perlu mengetahui alamat IP Raspberry Pi Anda. Anda dapat menemukan alamat IP Raspberry Pi 4 Anda dari antarmuka manajemen web router rumah Anda. Dalam kasus kami, alamat IP adalah 192.168.0.103, tetapi alamat ini akan berbeda untuk Anda, jadi pastikan untuk mengganti alamat ini dengan alamat Anda di semua langkah selanjutnya.

Jika Anda memiliki akses ke konsol Raspberry Pi, Anda dapat menjalankan perintah berikut untuk menemukan alamat IP juga.

$ nama host -I

Setelah Anda mengetahui alamat IP Raspberry Pi Anda, Anda dapat mengaksesnya dari perangkat apa pun di jaringan rumah Anda. Seperti yang ditunjukkan pada tangkapan layar di bawah, kami telah mengakses aplikasi cuaca dari smartphone Android.

Kesimpulan

Dalam artikel ini, kami menunjukkan cara menggunakan Sense Hat Raspberry Pi untuk membangun stasiun cuaca Raspberry Pi. Kami menggunakan indra-topi Pustaka 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 mendapatkan data cuaca dari API cuaca setiap 5 detik untuk menjaga aplikasi web tetap up to date dengan data cuaca terbaru.