Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Stasiun Cuaca IoT Berbasis TensorFlow Memprediksi Intensitas Curah Hujan dengan Akurat

Komponen dan Perlengkapan

Alat yang Diperlukan

Aplikasi dan Layanan Online

Tentang Proyek Ini

Khususnya pada tahun 2020, hujan lebat dan ekstrem yang tiba-tiba telah menyebabkan dampak merusak pada rumah kaca dan hasil panen di negara saya. Sayangnya, saat ini hujan yang tidak terduga dan berlebihan terjadi lebih sering dan menjadi relatif umum di beberapa area karena perubahan iklim. Sementara itu, wilayah lain menderita kekeringan. Seiring berlalunya tahun 2020, lebih dari tiga puluh lima insiden yang menyebabkan kehilangan tanaman dan ternak akibat hujan lebat dan ekstrem tercatat di wilayah saya. Untuk berkontribusi pada solusi untuk mencegah dan menghindari masalah yang diakibatkan oleh curah hujan berlebihan seperti kehilangan produktivitas pertanian, saya merencanakan proyek ini sebagai titik awal.

Pertama, saya berfokus pada efek curah hujan berlebihan pada pertanian dalam proyek ini. Namun, curah hujan berlebihan dapat menyebabkan banyak bahaya, misalnya [1]:

Seperti yang ditunjukkan dalam studi terbaru, curah hujan berlebihan dapat mempengaruhi produktivitas tanaman dengan berbagai cara, termasuk kerusakan fisik langsung, penundaan penanam dan panen, pertumbuhan akar yang terbatas, defisit oksigen, dan kehilangan nutrisi. Oleh karena itu, terlalu banyak hujan dapat berbahaya seperti kekeringan untuk pertanian: "Data dari tiga dekade terakhir menunjukkan bahwa curah hujan berlebihan dapat mempengaruhi hasil panen jagung sebesar panas dan kekeringan berlebihan. Dalam studi baru, tim ilmuwan dari Universitas Illinois menghubungkan data asuransi tanaman, iklim, tanah, dan hasil panen jagung dari tahun 1981 hingga 2016. Studi menemukan bahwa, selama beberapa tahun, curah hujan berlebihan mengurangi hasil panen jagung AS sebesar 34% relatif terhadap hasil panen yang diharapkan. Data menunjukkan bahwa kekeringan dan panas berlebihan menyebabkan kehilangan hasil panen hingga 37% selama beberapa tahun [2]".

Sayangnya, sistem peringatan dini tidak cukup untuk mencegah sepenuhnya dampak memburuk dari curah hujan berlebihan pada produk dan proses pertanian tanpa data cuaca lokal yang memadai dan awal untuk setiap rumah kaca atau pertanian. Oleh karena itu, dengan harapan menghindari dampak merusak dari curah hujan berlebihan pada pertanian, saya memutuskan untuk membuat proyek ini sebagai stasiun cuaca jarak jauh yang ramah anggaran untuk mengumpulkan dan menginterpretasikan informasi cuaca lokal untuk membuat prediksi yang lebih akurat tentang intensitas curah hujan.

Setelah melakukan beberapa penelitian tentang pembelajaran mendalam dan jaringan saraf tiruan, saya memutuskan untuk membangun jaringan saraf tiruan (ANN) berdasarkan model klasifikasi untuk menginterpretasikan data cuaca lokal yang terkumpul untuk memprediksi intensitas curah hujan menurut kelas yang diberikan. Seperti yang ditunjukkan dalam studi berikut, peneliti telah menerapkan berbagai model dan jenis jaringan saraf tiruan untuk meramalkan tidak hanya hujan tetapi juga fenomena cuaca: "Banyak eksperimen telah menggunakan jaringan saraf tiruan untuk memprediksi jumlah curah hujan kuantitatif di berbagai lokasi dan jangkauan pandang ke depan. Misalnya, peneliti di Thailand berhasil memperoleh peramalan yang sangat akurat menggunakan jaringan saraf tiruan feed-forward untuk memprediksi jumlah curah hujan kuantitatif dalam jangkauan pandang ke depan satu hingga tiga jam untuk memprediksi bahaya banjir yang mungkin terjadi. Jaringan saraf tiruan juga telah digunakan untuk memprediksi fenomena cuaca selain nilai peramalan tradisional, seperti probabilitas/jumlah curah hujan, kecepatan angin, tekanan barometrik, dll. Mereka telah digunakan dengan sangat sukses untuk memprediksi puting beliung. Selain itu, peneliti di Australia berhasil menggunakan jaringan saraf tiruan untuk mengidentifikasi kabut di berbagai jangkauan peramalan mulai dari 3 jam hingga 18 jam di sekitar Bandara Internasional Canberra [3]."

Sebelum membangun dan menguji model jaringan saraf tiruan saya, saya telah mengumpulkan data cuaca di balkon dan halaman belakang saya dalam radius tiga kilometer selama lebih dari tiga bulan untuk membuat kumpulan data cuaca lokal yang menunjukkan informasi cuaca di lingkungan saya. Untuk dapat mengeluarkan informasi cuaca bahkan dalam kondisi cuaca ekstrem, saya menggunakan Kit Stasiun Cuaca dengan Anemometer, Vin Angin, dan Tempat Hujan oleh DFRobot dengan dua papan pengembangan yang berbeda:

Oleh karena itu, saya dapat mentransfer data cuaca melalui WiFi di balkon saya atau GPRS jika jarak antara router saya dan stasiun cuaca terlalu jauh.

Saya memutuskan untuk menggunakan Google Sheets, program spreadsheet berbasis cloud, untuk mengkoleksi data cuaca yang dihasilkan oleh stasiun cuaca karena membuat kumpulan data besar dan menambahkan informasi baru adalah sederhana dengan API Google Sheets. Oleh karena itu, saya mengembangkan aplikasi web dalam PHP untuk mendapatkan data cuaca yang ditransfer oleh papan pengembangan dan menambahkannya ke dalam spreadsheet di Google Sheets.

Setelah menyelesaikan pengumpulan data cuaca selama lebih dari tiga bulan setiap lima menit, saya membangun model jaringan saraf tiruan (ANN) dengan TensorFlow untuk membuat prediksi tentang intensitas curah hujan. Secara teoretis, saya menetapkan kelas intensitas curah hujan untuk setiap pembacaan setelah menskalakan dan menormalisasi kumpulan data. Kemudian, saya melatih model jaringan saraf tiruan untuk mengklasifikasikan kelas-kelas ini:

Jadi, inilah proyek saya dalam sekilas 😃

Pada langkah-langkah berikut, Anda dapat menemukan informasi lebih detail tentang pengkodean, pengumpulan data cuaca lokal, dan pembangunan model jaringan saraf tiruan (ANN) dengan TensorFlow.

Terima kasih besar kepada DFRobot atas sponsorisasi proyek ini.

Produk yang disponsori oleh DFRobot:

⭐ Kit Stasiun Cuaca dengan Anemometer/Vin Angin/Tempat Hujan | Lihat

⭐ Shield SIM808 GPS/GPRS/GSM untuk Arduino | Lihat

Langkah 1: Merakit Kit Stasiun Cuaca dengan Anemometer, Vin Angin, dan Tempat Hujan

Kit stasiun cuaca ini mencakup anemometer, vin angin, tempat hujan, dan papan sensor untuk mengirim data cuaca melalui protokol komunikasi serial. Oleh karena itu, mudah digunakan dengan papan pengembangan untuk mengumpulkan data cuaca lokal.

Ini menghasilkan 37 byte per detik, termasuk CR/LF akhir.

c000s000g000t086r000p000h53b10020

Parser Data:

⭐ Pertama-tama, pasang anemometer dan vin angin ke jembatan dengan menggunakan baut dan dadu.

⭐ Hubungkan vin angin ke anemometer dengan menggunakan kabel telepon RJ11 dan rapatkan di bawah jembatan.

⭐ Kemudian, pasang tiang baja karat tidak karat ke jembatan dengan baut.

⭐ Pasang sela tempat hujan di bawah tempat hujan dengan baut.

⭐ Terakhir, tempatkan tempat hujan pada tiang baja karat tidak karat dengan menggunakan baut dan dadu.

⭐ Sekarang, siap untuk mengumpulkan data cuaca bahkan dalam kondisi cuaca ekstrem. Namun, papan sensor (konverter) tidak tahan cuaca, jadi saya menambahkan kotak plastik pada stasiun cuaca untuk melindungi papan sensor dan shield SIM808 di luar ruangan.

Langkah 2: Mengumpulkan Data Cuaca di Google Sheets

Untuk dapat mengirim informasi ke spreadsheet di Google Sheets, Anda perlu membuat aplikasi baru di Google Developer Console dan mendapatkan kredensial verifikasi untuk menggunakan API Google Sheets. Jika Anda pemula dalam membuat aplikasi dengan Google Developer Console, ikuti instruksi di bawah ini.

⭐ Pergi ke Google Developer Console dan klik tombol 'NEW PROJECT'. Masukkan nama proyek sebagai Remote Weather Station.

⭐ Pergi ke APIs & Services dan klik ke library API untuk mengaktifkan Google Sheets API.

Langkah 2.1: Mendapatkan Kredensial untuk Menggunakan Google Sheets API

⭐ Buka dasbor proyek dan klik tombol Credentials. Kemudian, isi formulir seperti yang digambarkan di bawah ini untuk membuat akun layanan dan kunci.

⭐ Klik tombol CREATE CREDENTIALS dan konfigurasikan layar persetujuan untuk dapat membuat OAuth client ID.

⭐ Kemudian, buat OAuth client ID baru bernama Client di bawah Desktop app (jenis aplikasi).

⭐ Setelah membuat OAuth client ID (Client) unduh kredensial (ID dan Secret) dan beri nama file sebagai credentials.json.

Langkah 2.2: Membuat Spreadsheet di Google Sheets

⭐ Pergi ke Google Sheets dan pilih Personal.

⭐ Buat spreadsheet Blank dan beri nama Remote Weather Station.

⭐ Kemudian, tentukan nama kolom sebagai baris pertama:

⭐ Jika diperlukan, modifikasi grafik untuk memeriksa data yang terkumpul, seperti yang saya lakukan.

Langkah 3: Mengembangkan Aplikasi Web dalam PHP untuk Menambahkan Data Cuaca ke Spreadsheet

Aplikasi web PHP ini digunakan untuk mendapatkan data cuaca yang ditransfer oleh papan pengembangan (ESP8266 dan SIM808) melalui permintaan HTTP Get dan menambahkan data tersebut ke spreadsheet tertentu (berdasarkan ID) di Google Sheets dengan kredensial dan token yang terverifikasi.

Aplikasi web ini memerlukan Library Klien Google untuk PHP untuk menambahkan data cuaca ke spreadsheet tertentu di Google Sheets.

⭐ Jadi, pertama-tama, buat folder bernama remote_weather_station di server Anda dan instal Library Klien Google untuk PHP di dalamnya.

Folder remote_weather_station harus menyertakan empat file ini selain Library Klien Google untuk bekerja:

Pada langkah ini, saya akan membahas dua file pertama - index.php dan account_verification_token.php:

💻 index.php

⭐ Dapatkan data cuaca lokal dari stasiun cuaca melalui permintaan Get:

// Arah Angin (wd), Kecepatan Angin Rata-rata (a_ws), Kecepatan Angin Maksimum (m_ws), Curah Hujan 1 Jam (1_rf), Curah Hujan 24 Jam (24_rf), Suhu (tem), Kelembaban (hum), Tekanan Barometrik (b_pr).
$variables_from_module;
if(isset($_GET['wd']) && isset($_GET['a_ws']) && isset($_GET['m_ws']) && isset($_GET['1_rf']) && isset($_GET['24_rf']) && isset($_GET['tem']) && isset($_GET['hum']) && isset($_GET['b_pr'])){
$variables_from_module = [
"wd" => (int)$_GET['wd'],
"a_ws" => (float)$_GET['a_ws'],
"m_ws" => (float)$_GET['m_ws'],
"1_rf" => (float)$_GET['1_rf'],
"24_rf" => (float)$_GET['24_rf'],
"tem" => (float)$_GET['tem'],
"hum" => (int)$_GET['hum'],
"b_pr" => (float)$_GET['b_pr']
];
}else{
$variables_from_module = [
"wd" => "err",
"a_ws" => "err",
"m_ws" => "err",
"1_rf" => "err",
"24_rf" => "err",
"tem" => "err",
"hum" => "err",
"b_pr" => "err"
];
}

⭐ Terhubung ke aplikasi Google Developer Console bernama Remote Weather Station dengan menggunakan file credentials.json (Langkah 2.1).

$client = new Google_Client();
$client->setApplicationName('Remote Weather Station'); // Masukkan nama aplikasi Anda.
$client->setScopes('https://www.googleapis.com/auth/spreadsheets');
$client->setAuthConfig('credentials.json');
$client->setAccessType('offline');
$client->setPrompt('select_account consent');

⭐ Muat token yang sebelumnya diotorisasi dari file (token.json), jika ada.

$tokenPath = 'token.json';
if (file_exists($tokenPath)) {
$accessToken = json_decode(file_get_contents($tokenPath), true);
$client->setAccessToken($accessToken);
print("Token Found!");
}

⭐ Jika tidak ada token sebelumnya atau kadaluarsa, minta otorisasi dari pengguna dan tetapkan kode verifikasi untuk membuat file token.json dengan fungsi file_put_contents().

if ($client->isAccessTokenExpired()) {
// Segarkan token jika memungkinkan, atau ambil yang baru.
if ($client->getRefreshToken()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
} else {
// Minta otorisasi dari pengguna.
$authUrl = $client->createAuthUrl();

...

// Tetapkan kode verifikasi untuk membuat token.json.
$authCode = trim($GLOBALS['account_verification_token']);

...

// Periksa apakah ada kesalahan dan account_verification_token dimasukkan.
if (array_key_exists('error', $accessToken)) {
throw new Exception(join(', ', $accessToken));
}else{
print("Berhasil! Segarkan halaman.");
}
}
// Simpan token ke file.
if (!file_exists(dirname($tokenPath))) {
mkdir(dirname($tokenPath), 0700, true);
}
file_put_contents($tokenPath, json_encode($client->getAccessToken()));
}

⭐ Masukkan ID spreadsheet dan rentang untuk menambahkan temuan terbaru dari stasiun cuaca ke spreadsheet.

https://docs.google.com/spreadsheets/d/spreadsheetId/edit#gid=0

// Masukkan spreadsheetId:
$spreadsheetId = '<spreadsheet_ID>';
// Masukkan rentang (baris pertama) di bawahnya nilai baru akan ditambahkan (8 baris):
$range = 'A1:H1';
// Tambahkan temuan terbaru dari stasiun cuaca ke spreadsheet.
$values = [
[$variables_from_module["wd"], $variables_from_module["a_ws"], $variables_from_module["m_ws"], $variables_from_module["1_rf"], $variables_from_module["24_rf"], $variables_from_module["tem"], $variables_from_module["hum"], $variables_from_module["b_pr"]]
];
$body = new Google_Service_Sheets_ValueRange([
'values' => $values
]);
$params = [
'valueInputOption' => "RAW"
];

...

$result = $service->spreadsheets_values->append($spreadsheetId, $range, $body, $params);
printf("<br><br>%d sel ditambahkan.", $result->getUpdates()->getUpdatedCells());

💻 account_verification_token.php

⭐ Setelah mengotorisasi aplikasi web dengan AuthUrl yang dibuat, masukkan kode verifikasi yang diberikan untuk menetapkan token akses.

$account_verification_token = "<Enter Token>"; // Masukkan kode verifikasi setelah otorisasi.

Langkah 3.1: Menyiapkan Aplikasi Web di Raspberry Pi (atau server apa pun)

Setelah membuat aplikasi web PHP, saya memutuskan untuk menjalankannya di Raspberry Pi saya, tetapi Anda dapat menjalankan aplikasi di server apa pun asalkan itu server PHP.

Jika Anda ingin menggunakan Raspberry Pi tetapi tidak tahu cara menyiapkan server web LAMP di Raspberry Pi, Anda dapat memeriksa tutorial ini.

⭐ Pertama-tama, pindahkan folder aplikasi (remote_weather_station) ke server apache (/var/www/html) menggunakan terminal karena server apache adalah lokasi yang dilindungi.

sudo mv /home/pi/Downloads/remote_weather_station /var/www/html/

⭐ Aplikasi web akan melempar kesalahan saat dibuka untuk pertama kalinya karena kode verifikasi yang hilang. Untuk mendapatkan kode verifikasi, pergi ke tautan otorisasi yang dihasilkan oleh aplikasi.

⭐ Kemudian, klik Pergi ke Remote Weather Station (tidak aman).

⭐ Berikan aplikasi dengan izin yang diperlukan.

⭐ Sekarang, salin kode verifikasi dan tempelkan ke account_verification_token.php.

⭐ Kembali ke aplikasi web. Harusnya menampilkan pesan konfirmasi: Berhasil! Segarkan halaman.

⭐ Setelah menyegarkan halaman, aplikasi web menggunakan kode verifikasi untuk mendapatkan token akses dan menyimpan token akses dalam file bernama token.json. Jadi, tidak akan melempar kesalahan lagi.

⭐ Untuk menguji apakah aplikasi web PHP menambahkan data baru ke spreadsheet yang diberikan dengan akurat:

https://localhost/remote_weather_station/?wd=12&a_ws=8&m_ws=11&1_rf=14&24_rf=84&tem=24&hum=32&b_pr=57

Langkah 4: Membaca dan Mengirim Data Cuaca dengan ESP8266 (WiFi)

Untuk mengumpulkan data cuaca di balkon saya, saya menggunakan papan pengembangan NodeMCU ESP-12E (ESP8266) dengan stasiun cuaca.

Saya memprogramnya untuk mengirim data cuaca ke aplikasi web PHP setiap lima menit.

⭐ Sertakan library yang diperlukan dan tentukan pengaturan WiFi.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
#include <SoftwareSerial.h>

// Tentukan pengaturan WiFi Anda.
const char *ssid = "<SSID>";
const char *password = "<PASSWORD>";

⭐ Tentukan pengaturan stasiun cuaca dan pin koneksi serial - D6, D5.

// Tentukan pengaturan stasiun cuaca:
char databuffer[35];
double temp;
int transferring = 0;

// Tentukan pin koneksi serial - RX dan TX.
SoftwareSerial Serial_1(D6, D5); // (Rx, Tx)

⭐ Dalam fungsi getBuffer(), ambil data dari stasiun cuaca.

void getBuffer(){
int index;
for (index = 0;index < 35;index ++){
if(Serial_1.available()){
databuffer[index] = Serial_1.read();
if (databuffer[0] != 'c'){
index = -1;
}
}
else{
index --;
}
}
}

⭐ Debug data cuaca dan buat tautan.

String weather_data = "wd=" + String(WindDirection()) + "&a_ws=" + String(WindSpeedAverage()) + "&m_ws=" + String(WindSpeedMax()) + "&1_rf=" + String(RainfallOneHour()) + "&24_rf=" + String(RainfallOneDay()) + "&tem=" + String(Temperature()) + "&hum=" + String(Humidity()) + "&b_pr=" + String(BarPressure());
String server = "https://192.168.1.24/remote_weather_station/?";

...

int WindDirection(){ return transCharToInt(databuffer,1,3); } // Arah Angin (derajat)

float WindSpeedAverage(){ temp = 0.44704 * transCharToInt(databuffer,5,7); return temp; } // Kecepatan Angin Rata-rata (1 menit)

float WindSpeedMax(){ temp = 0.44704 * transCharToInt(databuffer,9,11); return temp; } // Kecepatan Angin Maksimum (5 menit)

float Temperature(){ temp = (transCharToInt(databuffer,13,15) - 32.00) * 5.00 / 9.00; return temp; } // Suhu ("C")

float RainfallOneHour(){ temp = transCharToInt(databuffer,17,19) * 25.40 * 0.01; return temp; } // Curah Hujan (1 jam)

float RainfallOneDay(){ temp = transCharToInt(databuffer,21,23) * 25.40 * 0.01; return temp; } // Curah Hujan (24 jam)

int Humidity(){ return transCharToInt(databuffer,25,26); } // Kelembaban (%)

float BarPressure(){ temp = transCharToInt(databuffer,28,32); return temp / 10.00; } // Tekanan Barometrik (hPA)

⭐ Kirim paket data setiap 5 menit ke Raspberry Pi (atau server apa pun).

transferring++; Serial.println("Time => " + String(transferring) + "s / " + String(int(5*60)) + "s\n\n");
if(transferring == 5*60){
// Buat objek HTTP untuk membuat permintaan ke server.
HTTPClient http;
http.begin(server + weather_data);
int httpCode = http.GET();
String payload = http.getString();
Serial.println("Data Send...\nHTTP Code => " + String(httpCode) + "\nServer Response => " + payload + "\n\n");
http.end();
transferring = 0;
}
// Tunggu 1 detik...
delay(1000);

⭐ Setelah mengunggah kode ke papan pengembangan NodeMCU ESP-12E (ESP8266), itu menampilkan data cuaca setiap detik pada monitor serial dan mengirim paket data setiap lima menit (300 detik) ke aplikasi web PHP.

Connection is successful!

...

Weather Data => wd=0&a_ws=0.00&m_ws=0.00&1_rf=0.00&24_rf=0.00&tem=21.67&hum=29&b_pr=1016.70
Buffer => c000s000g000t071r000p000h29b10167*3
Time => 299s / 300s


Weather Data => wd=0&a_ws=0.00&m_ws=0.00&1_rf=0.00&24_rf=0.00&tem=21.67&hum=29&b_pr=1016.70
Buffer => c000s000g000t071r000p000h29b10167*3
Time => 300s / 300s

...

⭐ Kemudian, itu menunjukkan respons dari server.

...

Data Send...
HTTP Code => 200
Server Response => Token Found!

8 cells appended.

...

Langkah 4.1: Membaca dan Mengirim Data Cuaca dengan SIM808 (GPRS)

Untuk mengumpulkan data cuaca di halaman belakang saya, saya menggunakan shield SIM808 untuk Arduino Uno jika jarak antara stasiun cuaca dan router saya terlalu jauh.

Sebagian besar kode sama dan tercakup di langkah sebelumnya kecuali bagian di bawah ini.

⭐ Sertakan library yang diperlukan dan tentukan objek sim808.

Untuk Shield SIM808 GPS/GPRS/GSM | Unduh

#include <DFRobot_sim808.h>
#include <SoftwareSerial.h>

// Tentukan sim808.
DFRobot_SIM808 sim808(&Serial);

⭐ Inisialisasi modul SIM808 dan lanjutkan jika bekerja dengan akurat.

//******** Inisialisasi modul sim808 *************
while(!sim808.init()) {
delay(1000);
Serial.print("Sim808 init error\r\n");
}
delay(2000);
// Lanjutkan jika Modul SIM808 bekerja dengan akurat.
Serial.println("Sim808 init success");
delay(5000);

⭐ Kirim paket data setiap 5 menit ke server dengan membangun koneksi TCP untuk membuat permintaan GET.

transferring++; Serial.println("Time => " + String(transferring) + "s / " + String(int(5*60)) + "s\n\n");
if(transferring == 5*60){
//*********** Coba DHCP *******************
while(!sim808.join(F("cmnet"))) {
Serial.println("Sim808 join network error!");
delay(2000);
}
//************ DHCP Berhasil ****************
delay(5000);
Serial.println("DHCP Berhasil");
//*********** Bangun Koneksi TCP ************
if(!sim808.connect(TCP,"192.168.1.24", 80)) { // Ganti dengan server Anda.
Serial.println("Kesalahan Koneksi");
}else{
Serial.println("Koneksi OK");
}
delay(2000);

...

⭐ Setelah membuat string baris, ubah dari string ke array char untuk membuat Permintaan HTTP Get dengan SIM808.

...

String line = "GET /remote_weather_station/?" + weather_data_1 + weather_data_2 + weather_data_3 + " HTTP/1.0\r\n\r\n";
Serial.println(line);
char buffer[512];
// Ubah baris dari string ke array char untuk membuat Permintaan HTTP Get dengan SIM808.
char web_hook[110];
String_to_Char(line, 110, web_hook);
sim808.send(web_hook, sizeof(web_hook)-1);
while (true) {
int ret = sim808.recv(buffer, sizeof(buffer)-1);
if (ret <= 0){
Serial.println("Pengambilan Selesai...");
break;
}

...

⭐ Setelah mengunggah kode ke shield SIM808, itu menampilkan data cuaca setiap detik pada monitor serial dan mengirim paket data setiap lima menit (300 detik) ke aplikasi web PHP.

Langkah 4.2: Membuat Kumpulan Data Cuaca untuk lebih dari tiga bulan

Setelah menyelesaikan pengkodean, saya mulai mengkoleksi data cuaca di Google Sheets setiap lima menit selama lebih dari tiga bulan untuk membangun model jaringan saraf tiruan dan membuat prediksi tentang intensitas curah hujan.

Data Cuaca yang Terkumpul:

Kemudian, saya mengunduh spreadsheet sebagai Remote Weather Station.csv, yang terdiri dari 32219 baris sebagai kumpulan data cuaca lokal awal saya. Saya masih mengkoleksi data cuaca untuk meningkatkan kumpulan data dan model saya :)

Langkah 5: Membangun Jaringan Saraf Tiruan (ANN) dengan TensorFlow

Saat saya selesai mengkoleksi kumpulan data cuaca lokal awal saya, saya mulai bekerja pada model jaringan saraf tiruan (ANN) saya untuk membuat prediksi tentang intensitas curah hujan.

Saya memutuskan untuk membuat model jaringan saraf tiruan saya dengan TensorFlow dalam Python. Jadi, pertama-tama, saya mengikuti langkah-langkah di bawah ini untuk mendapatkan pemahaman yang lebih baik tentang data cuaca:

Setelah menerapkan langkah-langkah ini, saya memutuskan untuk menggunakan model jaringan saraf tiruan saya untuk mengklasifikasikan kelas intensitas curah hujan yang berbeda yang secara teoretis ditetapkan sebagai label (output) untuk setiap input (baris). Saya membuat kelas saya berdasarkan tingkat curah hujan, yang tergantung pada waktu yang dipertimbangkan.

Kategori berikut digunakan untuk mengklasifikasikan intensitas hujan berdasarkan tingkat curah hujan:

Menurut tingkat curah hujan, saya memproses data cuaca untuk menetapkan salah satu dari lima kelas ini untuk setiap input sebagai labelnya:

Setelah menskalakan (menormalisasi) dan memproses data cuaca, saya mendapatkan tujuh variabel input dan satu label untuk setiap pembacaan, diklasifikasikan dengan lima kelas yang disebutkan. Kemudian, saya membangun model jaringan saraf tiruan buatan dengan TensorFlow untuk mendapatkan hasil dan prediksi terbaik dengan kumpulan data awal saya.

Lapisan:

Untuk mengeksekusi semua langkah di atas, saya membuat kelas bernama Weather_Station dalam Python setelah menyertakan library yang diperlukan:

import tensorflow as tf
from tensorflow import keras
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

Selanjutnya, saya akan membahas pengkodean dalam Python untuk setiap langkah yang disebutkan di atas.

Juga, Anda dapat mengunduh IoT_weather_station_neural_network.py untuk memeriksa pengkodean.

Langkah 5.1: Visualisasi dan Penskalaan (Normalisasi) Data Cuaca

Sebelum terjun ke dalam membangun model, penting untuk memahami data cuaca untuk memberikan data yang diformat dengan baik ke model.

Jadi, pada langkah ini, saya akan menunjukkan kepada Anda cara memvisualisasikan data cuaca dan menskalakan (menormalisasikan) dalam Python.

⭐ Pertama-tama, baca data cuaca dari Remote Weather Station.csv.

csv_path = "E:\PYTHON\Remote Weather Station.csv"
df = pd.read_csv(csv_path)

⭐ Dalam fungsi graphics(), visualisasikan kolom yang diminta dari kumpulan data cuaca dengan menggunakan library Matplotlib.

def graphics(self, column_1, column_2, xlabel, ylabel):
# Tampilkan kolom yang diminta dari kumpulan data:
plt.style.use("dark_background")
plt.gcf().canvas.set_window_title('IoT Weather Station')
plt.hist2d(self.df[column_1], self.df[column_2])
plt.colorbar()
plt.xlabel(xlabel)
plt.ylabel(ylabel)
plt.title(xlabel)
plt.show()

⭐ Dalam fungsi data_visualization(), periksa semua kolom sebelum menskalakan data cuaca untuk membangun model dengan data yang diformat dengan baik.

def data_visualization(self):
# Periksa kolom yang diminta untuk membangun model dengan data yang diformat dengan baik:
self.graphics('WD', '1h_RF', 'Arah Angin (derajat)', 'Curah Hujan Satu Jam (mm)')
self.graphics('Av_WS', '1h_RF', 'Kecepatan Angin Rata-rata (m/s)', 'Curah Hujan Satu Jam (mm)')
self.graphics('Mx_WS', '1h_RF', 'Kecepatan Angin Maksimum (m/s)', 'Curah Hujan Satu Jam (mm)')
self.graphics('24h_RF', '1h_RF', 'Curah Hujan 24 Jam (mm)', 'Curah Hujan Satu Jam (mm)')
self.graphics('Tem', '1h_RF', 'Suhu (°C)', 'Curah Hujan Satu Jam (mm)')
self.graphics('Hum', '1h_RF', 'Kelembaban (%)', 'Curah Hujan Satu Jam (mm)')
self.graphics('b_PR', '1h_RF', 'Tekanan Barometrik (hPA)', 'Curah Hujan Satu Jam (mm)')

Setelah memvisualisasikan data cuaca, saya menskalakan (menormalisasikan) setiap kolom untuk memformatnya dengan baik.

Biasanya, setiap baris (pembacaan) terlihat seperti ini sebelum penskalaan:

⭐ Dalam fungsi scale_data():

⭐ Arah angin dalam satuan derajat dan sudut tidak menjadi input model yang baik. 360° dan 0° harus berada di dekat satu sama lain dan melingkar dengan lancar. Arah tidak boleh penting jika angin tidak berhembus. Oleh karena itu, ubah kolom arah angin dan kecepatan angin menjadi vektor angin untuk menafsirkannya dengan mudah dengan model jaringan saraf tiruan.

def scale_data(self):
# Arah Angin dan Kecepatan Angin:
wv = self.df.pop('Av_WS')
max_wv = self.df.pop('Mx_WS')
# Ubah ke radian.
wd_rad = self.df.pop('WD')*np.pi / 180
# Hitung komponen x dan y angin.
self.df['scaled_WX'] = wv*np.cos(wd_rad)
self.df['scaled_WY'] = wv*np.sin(wd_rad)
# Hitung komponen x dan y angin maksimum.
self.df['scaled_max_WX'] = max_wv*np.cos(wd_rad)
self.df['scaled_max_WY'] = max_wv*np.sin(wd_rad)

...

⭐ Untuk kolom yang tersisa kecuali 1h_RF, bagi mereka menjadi nilai pembacaan rata-rata untuk menskalakan (menormalisasi) dan memformat.

...

# Suhu:
tem = self.df.pop('Tem')
self.df['scaled_Tem'] = tem / 25
# Kelembaban:
hum = self.df.pop('Hum')
self.df['scaled_Hum'] = hum / 70
# Tekanan Barometrik:
bPR = self.df.pop('b_PR')
self.df["scaled_bPR"] = bPR / 1013
# Curah Hujan 24 Jam (Aproksimasi)
rain_24 = self.df.pop('24h_RF')
self.df['scaled_24h_RF'] = rain_24 / 24

Setelah menyelesaikan penskalaan (normalisasi), saya mengekstrak kolom baru ini dari kumpulan data cuaca:

Langkah 5.2: Melatih Model (ANN) pada Kelas Intensitas Curah Hujan

Sebelum membangun dan melatih model jaringan saraf tiruan dalam TensorFlow, saya perlu membuat array input dan array label dengan memproses data cuaca yang sudah discale dan dinormalisasi.

⭐ Dalam fungsi create_input_and_label():

⭐ Pertama, tambahkan setiap elemen input sebagai array NumPy ke array input dan ubah menjadi array NumPy dengan menggunakan fungsi asarray().

⭐ Setiap elemen input mencakup tujuh variabel [shape=(7, )]:

def create_input_and_label(self):
n = len(self.df)
# Buat array input menggunakan variabel yang discale:
for i in range(n):
self.input.append(np.array([self.df['scaled_WX'][i], self.df['scaled_WY'][i], self.df['scaled_max_WX'][i], self.df['scaled_max_WY'][i], self.df['scaled_Tem'][i], self.df['scaled_Hum'][i], self.df['scaled_bPR'][i]]))
self.input = np.asarray(self.input)

...

⭐ Kemudian, evaluasi tingkat curah hujan (presipitasi) aproksimatif untuk setiap pembacaan (baris).

approx_RF_rate = (1h_RF + scaled_24h_RF) * 100

⭐ Menurut tingkat curah hujan, tetapkan kelas [0 - 4] untuk setiap elemen input dan tambahkan ke array label.

...

for i in range(n):
_class = 0
# Evaluasi tingkat curah hujan aproksimatif:
approx_RF_rate = (self.df['1h_RF'][i] + self.df['scaled_24h_RF'][i]) * 100
# Sebagai label, tetapkan kelas intensitas curah hujan menurut tingkat curah hujan aproksimatif (mm):
if approx_RF_rate == 0:
_class = 0
elif approx_RF_rate < 2.5:
_class = 1
elif 2.5 < approx_RF_rate and approx_RF_rate < 7.6:
_class = 2
elif 7.6 < approx_RF_rate and approx_RF_rate < 50:
_class = 3
else:
_class = 4
self.label.append(_class)
self.label = np.asarray(self.label)

Setelah memproses data cuaca yang sudah discale untuk membuat array input dan label, saya membaginya menjadi data pelatihan (60%) dan data uji (40%):

def split_data(self):
n = len(self.df)
# (60%, 40%) - (pelatihan, uji)
self.train_input = self.input[0:int(n*0.6)]
self.test_input = self.input[int(n*0.6):]
self.train_label = self.label[0:int(n*0.6)]
self.test_label = self.label[int(n*0.6):]

Kemudian, saya membangun model jaringan saraf tiruan (ANN) saya dengan Keras dan melatihnya dengan kumpulan data pelatihan selama sembilan belas epoch.

Anda dapat memeriksa tutorial ini untuk mempelajari fungsi aktivasi, fungsi loss, epoch, dll.

def build_and_train_model(self):
# Bangun jaringan saraf tiruan:
self.model = keras.Sequential([
keras.Input(shape=(7,)),
keras.layers.Dense(16, activation='relu'),
keras.layers.Dense(32, activation='relu'),
keras.layers.Dense(64, activation='relu'),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(5, activation='softmax')
])
# Kompil:
self.model.compile(optimizer='adam', loss="sparse_categorical_crossentropy", metrics=['accuracy'])
# Latih:
self.model.fit(self.train_input, self.train_label, epochs=19)

...

Setelah melatih dengan kumpulan data pelatihan awal, akurasi model antara 0.83 dan 0.85.

Langkah 5.3: Mengevaluasi Model dan Membuat Prediksi pada Intensitas Curah Hujan

Setelah membangun dan melatih model jaringan saraf tiruan buatan saya, saya menguji akurasinya dengan menggunakan kumpulan data uji awal.

Untuk saat ini, akurasi yang dievaluasi model antara 0.72 dan 0.73 karena kumpulan data uji yang tidak memadai causing overfitting model. Namun, saya masih mengumpulkan data cuaca untuk meningkatkan akurasi model.

...

# Uji akurasi:
print("\n\nEvaluasi Model:")
test_loss, test_acc = self.model.evaluate(self.test_input, self.test_label)
print("Akurasi Terevaluasi: ", test_acc)

Kemudian, saya menggunakan model jaringan saraf tiruan saya untuk membuat prediksi pada intensitas curah hujan dengan array prediksi yang diberikan yang terdiri dari pembacaan dari stasiun cuaca setelah pelatihan model. Sebagai titik awal, model bekerja dengan baik :)

Model memprediksi kemungkinan label untuk setiap elemen input sebagai array 5 angka. Mereka mewakili "kepercayaan" model bahwa elemen input yang diberikan sesuai dengan setiap lima kelas intensitas curah hujan yang berbeda [0 - 4].

⭐ Dalam fungsi make_prediction(), buat prediksi untuk setiap elemen input dalam array yang diberikan dan dapatkan label paling akurat [0 - 4] dengan menggunakan fungsi argmax() untuk menampilkan nama kelasnya.

def make_prediction(self, pre_array):
print("\n\nPrediksi Model:\n")
prediction = self.model.predict(pre_array)
for i in range(len(pre_array)):
print("Prediksi => ", self.class_names[np.argmax(prediction[i])])

Input Prediksi:

Output Prediksi:

Koneksi dan Penyesuaian (ESP8266)

// Koneksi
// NodeMCU ESP-12E (ESP8266) :
// Stasiun Cuaca
// VV --------------------------- 5V
// D5 --------------------------- RX
// D6 --------------------------- TX
// G --------------------------- GND

Saya menghubungkan papan sensor (konverter) ke papan pengembangan NodeMCU ESP-12E (ESP8266) dan memasangnya ke kotak plastik saat mengumpulkan data cuaca di balkon saya.

Koneksi dan Penyesuaian (SIM808)

// Koneksi
// Arduino Uno:
// Shield SIM808 GPS/GPRS/GSM untuk Arduino
// D0 --------------------------- RX
// D1 --------------------------- TX
// D12 --------------------------- POWER
// Stasiun Cuaca
// 5V --------------------------- 5V
// D5 --------------------------- RX
// D6 --------------------------- TX
// GND --------------------------- GND

⭐ Catatan: Pin D0, D1, D12 ditempati oleh Shield SIM808 GPS/GPRS/GSM.

⭐ Hubungkan baterai eksternal (7-23V) agar modul SIM808 bekerja dengan baik.

⭐ Pasang anten GPS dan anten GSM ke shield SIM808.

⭐ Masukkan kartu SIM ke slot SIM pada shield SIM808.

⭐ Sebelum mengunggah kode, atur tombol fungsi pada shield ke None (1).

⭐ Unggah kode.

⭐ Kemudian, atur tombol fungsi ke Arduino (3).

⭐ Tekan tombol Boot pada shield sampai melihat LED indikator Net berkedip setiap 1 detik dan tunggu sampai kartu SIM terdaftar ke jaringan - LED indikator Net akan berkedip lambat setiap 3 detik.

⭐ Klik di sini untuk mendapatkan informasi lebih lanjut tentang Shield GSM/GPS/GPRS SIM808.

Setelah menyiapkan shield SIM808 dengan Arduino Uno, saya menghubungkan papan sensor (konverter) padanya.

Saya menempatkan semua komponen ke dalam kotak plastik untuk mengumpulkan data cuaca di luar, bahkan dalam kondisi cuaca ekstrem, karena papan sensor tidak tahan cuaca.

Kemudian, saya memasang kotak plastik ke stasiun cuaca.

Video dan Kesimpulan

Setelah menyelesaikan pengkodean dan merakit stasiun cuaca, saya mengkoleksi data cuaca lokal selama lebih dari tiga bulan setiap lima menit untuk membangun model jaringan saraf tiruan saya dengan sukses.

Saya masih mengumpulkan data cuaca di balkon dan halaman belakang saya untuk meningkatkan model jaringan saraf tiruan dan akurasinya :)

Diskusi Lebih Lanjut

☔ 💧 Karena kita memerlukan kumpulan data cuaca lokal untuk mendapatkan prediksi yang lebih akurat tentang fenomena cuaca, stasiun cuaca yang ramah anggaran dan diaktifkan NN seperti ini dapat ditempatkan di pertanian dan rumah kaca untuk menghindari dampak merusak dari curah hujan berlebihan pada pertanian.

☔ 💧 Sebagai sistem peringatan dini yang bekerja dengan jaringan saraf tiruan, kita dapat menggunakannya secara bersamaan untuk membuat gerombolan stasiun cuaca yang berkomunikasi dan menyumbang satu sama lain untuk meramalkan intensitas curah hujan dengan presisi di area lokal.

☔ 💧 Juga, kita dapat menggunakan informasi itu untuk menilai:

Referensi

[1] Cuaca ekstrem - hujan lebat, NIWA, https://niwa.co.nz/natural-hazards/extreme-weather-heavy-rainfall

[2] University of Illinois at Urbana-Champaign, News Bureau. "Curah hujan berlebihan merusak seperti panas ekstrem dan kekeringan pada hasil panen jagung." ScienceDaily. ScienceDaily, 30 April 2019. www.sciencedaily.com/releases/2019/04/190430121744.htm.

[3] Andrew Culclasure, Menggunakan Jaringan Saraf Tiruan untuk Memberikan Peramalan Cuaca Lokal, Georgia Southern University, Spring 2013, 29https://digitalcommons.georgiasouthern.edu/cgi/viewcontent.cgi?article=1031&context=etd.

Proses manufaktur

  1. Stasiun Cuaca Tenaga Surya DIY dengan Raspberry Pi
  2. Membangun Stasiun Cuaca Luar Ruangan dengan Raspberry Pi 2 dan ADS-WS1
  3. Membangun Stasiun Cuaca Raspberry Pi yang Mengirim Data Cuaca Harian melalui Email
  4. Tutorial IoT untuk Pemula: Streaming Data Suhu dari Raspberry Pi
  5. Pemantauan Cuaca Jarak Jauh dengan Raspberry Pi 3 dan PubNub
  6. Integrasikan Stasiun Cuaca Anda dengan CWOP: Panduan Praktis
  7. Membangun IoT dengan Java ME 8 pada Raspberry Pi: Bagian 1 – Integrasi Sensor GPIO
  8. Menghubungkan Raspberry Pi 3 ke Sensor DHT11 dan Mengunggah Data ke Cloud ThingsIo.ai
  9. Kirim Data IMU Adafruit 10DOF dari Raspberry Pi 2 ke Azure Event Hubs dengan Windows 10 IoT Core
  10. Stasiun Cuaca Canggih v2.0: Pemantauan Suhu, Tekanan, Kelembaban & Ketinggian Real-Time