Akhirnya, aku berjaya menyahut cabaran membuat sendiri stesen cuaca micro yang dipelopori oleh Dr Aman 9M2FLP. Aku pernah membuat sedikit komen tentang beliau beberapa tahun yang lalu selepas terlihat post beliau di muka buku.
Kisah stesen mini cuaca yang murah meriah dan mampu milik ini sangat menarik untuk dicuba. Pernah terlintas hendak mencubanya sendiri dengan membeli yang ‘ready made’, tapi bila melihat harganya, terpaksalah mengalah dulu.
Ceritanya apabila post beliau dengan menggunakan ID Dafcon terus menerus lalu di dinding muka buku aku… seperti menarik-narik dan melambai-lambai untuk terus membacanya. Akhirnya aku ‘keracunan’ juga dengan menyertai Group Telegram. Sebagai silent reader, aku baca semua post yang ada di group tersebut, bukan sekadar baca sambil lalu, tapi baca dengan teliti. Orang putih kata baca line by line. Memang perangai aku tak suka banyak tanya sebelum mencubanya sendiri. Andai sudah mencuba tetapi gagal, barulah aku akan bertanya. Aku tonton dengan teliti semua panduan yang diberikan melalui channel youtube beliau yang hampir mencecah 1.6K subscribers. Tahniah.
Board kecil ini satu benda yang sangat asing dan baru pada aku. Kalau arduino tu pernah tahu tapi tak pernah mencuba, tiba-tiba wujud pula board yang lain, mungkin adik beradiknya jugalah… iaitu dalam keluarga Internet of Thing (IoT) . Kalau sebelum ini aku banyak membuat projek dengan raspberry pi seperti router, web server, database, VOIP, streaming dan macam-macam, kini satu peluang mendapatkan ilmu yang baru. Kuncinya ialah nak dengan tak nak sahaja atau minat dengan tak minat sahaja.
Tonton YouTube
Menonton dengan tekun video Youtube yang beliau buat. Aku sangat teruja dengan penjelasan beliau yang terang dan jelas.
APRS uWX | EP01: Pemasangan Arduino IDE 2.0
APRS uWX | EP02: Pemasangan teras ESP8266 dalam Arduino IDE 2.0
APRS uWX | EP03: Pemasangan teras ESP32 dalam Arduino IDE 2.0
APRS uWX | EP04: Pemasangan ‘library’ Arduino untuk APRSuWX
Kalau nak belajar, perlu tonton video diatas sampai habis, jangan sesekali skip kononya nak cepat.
Perolehan Barang
Seperti biasalah, belinya secara dalam talian atau online. Yang paling penting ialah board dan diikuti dengan sensor.
Pilih dan beli board. ESP8266 atau ESP32. Kedua-dua jenis ni berbeza harganya, sesuai dengan spesifikasinya. Tak percaya tanyalah datuk Google.
Untuk permulaan, beli sensor DHT22 untuk mendapatkan bacaan suhu dan kelembapan udara. Sebagai tambahan, boleh juga beli sensor tekanan udara.
Perisian
Tanpa menonton video youtube seperti link diatas, pastinya kebingungan. Yang jelasnya, perisian utama yang wajib di pasang di PC kita ialah Arduino IDE.
Dua file yang wajib ada iaitu
setting.h
Nama kan file sebagai setting.h mengikut code di bawah
#ifndef SETTINGS_H_
#define SETTINGS_H_/*Maklumat spesifik yang diperlukan APRSuWX untuk berfungsi dengan tepat
************************************************************************/
#define WIFI_NAME “Wifisaya” //Ubah mengikut SSID WiFi di lokasi anda
#define WIFI_KEY “passwordwifisaya” //Ubah mengikut password WiFi di lokasi anda
#define GPS “0215.27N/10222.35E”//format GPS adalah ddmm.hh untuk degrees, minutes & hundreths of minutes
#define USER “9W2ABC-13” //Masukkan isyarat panggilan-ssid seperti 9M2FLP-13 untuk tujuan Stesen Data Cuaca
#define PASS “15643” //Masukkan APRS-passcode anda di sini, untuk dapatkan APRS-passcode boleh ke pautan: https://apps.magicbug.co.uk/passcode/
int INTERVAL = 10; //Sela masa untuk penghantaran paket APRS ke server (10 minit, mengikut konvensyen)
/*************hanya edit bahagian di dalam kotak ini sahaja*************/#define NODE “APRSmy-uWX 0.1.5e | Malaysia microWX Node”
#define TOOL “APRS Malaysia | APRSuWX”
#define VERS “0.1.5”
#define FILTER “r/48.29/14.29/100”#define SERVER “aprs.romzi.online” //Server APRS local
//#define SERVER “rotate.aprs2.net” //Server APRS global
//#define SERVER “euro.aprs2.net”
//#define SERVER “austria.aprs2.net”
#define PORT 14580#endif
APRSuWX_TempHumiBaro_0.1.5e.ino
Namakan file kepada APRSuWX_TempHumiBaro_0.1.5e.ino dan copy paste code dibawah
/*
APRSuWX – Transponder Data Cuaca Mikro (MicroWX / uWX) melalui APRS-IS
Terima kasih juga kepada semua penyokong APRS-IS Malaysia dan seluruh operator radio amatur Malaysia.Maklumat dan perancangan versi APRSuWX
**************************************
[1/10/2022] 0.1.0 – Daripada sketch asas APRS_IS daripada APRS_LIB
[2/10/2022] 0.1.1 – Penambahan template data cuaca daripada CWOP
[3/10/2022] 0.1.2 – String untuk memasukkan data ke dalam template data cuaca CWOP
[6/10/2022] 0.1.3 – Integrasi dengan sensor DHT menggunakan DHT library
[6/10/2022] 0.1.4 – Perubahan logik penghantaran paket APRS (versi sebelum tersangkut dalam penghantaran paket)
[9/10/2022] 0.1.5 – Integrasi dengan sensor barometer BME280 (Alamat I2C di 0x76)
>0.1.5a – Pembolehubah ‘interval’ untuk sela masa pancaran paket APRS ke server
>0.1.5b – Logik untuk pembatalan nilai untuk bacaan sensor bermasalah
>0.1.5c – Integrasi library BMP280 sebagai alternatif kepada BME280
>0.1.5d – Logik untuk pembatalan nilai ‘2147483647’ untuk bacaan sensor bermasalah
>0.1.5e – Pembetulan logik LED diagnostik
0.1.6 – Integrasi dengan reed switch untuk tujuan bacaan tolok hujan
0.2.0 – Pindahan platform kepada ArduinoIoT untuk tujuan OTA UpdateKaedah penggunaan
*****************
1. Sila ke tab ‘settings.h’ untuk masukkan maklumat isyarat panggilan, APRS-passcode dan maklumat wifi.
2. Pastikan ARDUINO-IDE ada telah dilengkapi dengan library ‘ESP8266WiFi.h, NTPClient.h dan APRS-IS.h’.
3. Library tambahan: ‘DHTLibrary’ untuk 0.1.3 ke atas, ‘Adafruit BME280’ untuk 0.1.5 ke atas.
4. Sambungkan NodeMCU-12E (ESP8266) kepada komputer anda, pilih papan yang betul dalam ‘tools’ dan pastikan port yang betul.
5. Lakukan proses upload ke atas litar anda.
6. Pantau SERIAL MONITOR pada kadar baud 115200 bps dan anda boleh melihat paket APRS yang keudara.Nota penafian
*************
1. Sketch ini masih lagi dalam fasa pembangunan, oleh itu fungsi APRSuWX masih lagi pada peringkat asas.
2. Sebarang kerosakan dan kehilangan harta benda adalah tanggungjawab anda sendiri.
3. Hebahan versi akan datang dibuat di t.me/APRSmy jom sertai dan sumbangkan kemahiran anda dalam pembangunan sketch ini.Jutaan terima kasih diucapkan bagi pihak Komuniti APRS Malaysia atas penglibatan anda dalam projek ini.
Komunikasi lanjut, pertanyaan dan sumbangan idea boleh dilakukan di t.me/APRSmyBersama semarakkan radio amatur Malaysia!!
*/#ifdef ESP8266 //Jenis MCU yang digunakan daripada ESP8266
#include <ESP8266WiFi.h> //ESP8266 Library
#else
#include <WiFi.h> //WiFi Library
#endif
#include <NTPClient.h> //NTPClient Library – untuk tujuan kemaskini masa @ timestamp
#include <WiFiUdp.h> //WiFiUdp Library – untuk tujuan penerimaan mesej UDP daripada server
#include <APRS-IS.h> //APRS-IS Library – untuk menjadikan fungsi APRS dalam ESP8266 sebuah realiti
#include <Wire.h> //I2C Library – untuk komunikasi I2C menggunakan SDA & SCL#include “settings.h” //Maklumat konfigurasi anda seperti isyarat panggilan, APRS-passcode dan maklumat WiFi
WiFiUDP ntpUDP; //Penerimaan mesej UDP daripada server
NTPClient timeClient(ntpUDP, 60*60); //Kemaskini masa @ timestamp daripada server
APRS_IS aprs_is(USER, PASS, TOOL, VERS); //Maklumat untuk log masuk ke dalam sistem APRS-IS globalint humi; int temp; //pembolehubah untuk sensor DHT
/*
Untuk versi 0.1.2 ini, semua data masih dimasukkan secara manual.
Pada peringkat ini, tujuan pembangunan adalah untuk mendapatkan komunikasi dan kejayaan pemindahan paket APRS sahaja.
Integrasi dengan sensor dan penghantaran data secara automatik akan dimasukkan dalam versi akan datang.Untuk tujuan ujikaji, sila masukkan nilai parameter cuaca dalam seluruh template di bawah.
*/#define arah_angin “…” //arah angin bertiup dalam darjah
#define laju_angin “…” //halaju angin dalam mph @ batu sejam
#define tiupan_angin “…” //tiupan angin maksimum dalam mph @ batu sejam (melebihi tempoh 5 minit yang lepas)
#define suhu “082” //suhu dalam unit fahrenheit (kita terpaksa ikut fahrenheit, tapi dalam APRS-IS unit ini ditukar kepada celsius disebabkan lokaliti kita)
#define hujan_sejam “…” //jumlah hujan dalam tempoh sejam (unit adalah 1/100 daripada 1 inci)
#define hujan_sehari “…” //jumlah hujan dalam tempoh 24 jam (unit adalah 1/100 daripada 1 inci)
#define hujan_hari “…” //jumlah hujan sejak tengah malam berlalu mengikut lokasi stesen uWX (unit adalah 1/100 daripada 1 inci)
#define kelembapan “80” //peratus kelembapan relatif, jika 100% digantikan dengan nilai ’00’ disebabkan format 2 angka
#define tekanan “…..” //tekanan udara diukur dengan unit 1/10 milibar
#define kecerahan “…” //kecerahan matahari yang diukur dalam unit W/m²
//Setelah muatnaik ke ESP8266, rakan² boleh semak paket APRS yang berjaya keudara di pautan:https://www.findu.com/cgi-bin/raw.cgi?call=9M2FLP-13
//Gantikan ‘9M2FLP-13’ (SSID-13 adalah stesen cuaca mengikut konvensyen) kepada isyarat panggilan peralatan yang telah diprogram/*Fungsi sensor cuaca pelbagai:
1. Hygrometer, DHT22 (Digital Humidity Sensor) – BERJAYA
2. Barometer, BME280 (Barometric Sensor) – BERJAYA
3. Ombrometer – Dalam proses
*///Deklarasi DHT
#include “DHT.h” //DHT Library – untuk sensor DHT (digital humidity & temperature)
#define DHTTYPE DHT22 //Boleh diubah kepada DHT11, DHT21 dan DHT22 mengikut jenis yang digunakan
#define dht_dpin 14 //Sensor dipasang pada GPIO 14 iaitu pin D5
DHT dht(dht_dpin,DHTTYPE); //Pemasangan semua parameter untuk menghidupkan sensor DHT
String prefixKelembapan = “h”;
String gagalKelembapan = “..”;
String prefixSuhu = “t”;
String gagalSuhu = “…”;//Deklarasi BME: pilih antara BME280 atau BMP280 untuk sensor barometric yang digunakan
#include <Adafruit_Sensor.h> //untuk operasi sensor Adafruit: Pilihan BME280/BMP280 di bawah, buang ‘//’ untuk pilih
//#include <Adafruit_BME280.h> //untuk operasi sensor BME280, sensor tekanan udara / barometer
//Adafruit_BME280 bme; //Pemasangan semua parameter untuk menghidupkan sensor BME280
#include <Adafruit_BMP280.h> //untuk operasi sensor BME280, sensor tekanan udara / barometer
Adafruit_BMP280 bmp; //Pemasangan semua parameter untuk menghidupkan sensor BMP280
#define SEALEVELPRESSURE_HPA (1007.25) //Parameter tekanan pada paras laut di Malaysia berdasarkan Meteologix.my
String prefixTekanan = “b”;
String gagalTekanan = “…..”;//Program Pemasa
long previousMillis = 0;//LED Diagnostik
int NodeLED = 16; //Untuk menunjukkan paket diterima
int EspLED = 2; //Untuk menunjukkan paket dihantarvoid setup()
{
Serial.begin(115200); //Perhubungan serial ditetapkan pada kadar baud 115200 bps
Serial.println(“APRSuWX oleh Komuniti APRS Malaysia”); delay(500);WiFi.mode(WIFI_STA); //Menukarkan mode ESP8266 anda kepada ‘Station Mode’
WiFi.begin(WIFI_NAME, WIFI_KEY); //Menghubungkan ESP8266 kepada WiFi dengan menggunakan SSID & password yang telah ditetapkan dalam ‘settings.h’
Serial.print(“Cuba menghubungkan WiFi”); ; delay(500);pinMode(NodeLED,OUTPUT);pinMode(EspLED,OUTPUT); //Mengidupkan pin NodeLED & EspLED untuk tujuan diagnostik
while(WiFi.status() != WL_CONNECTED) //Keadaan apabila WiFi berjaya dihubungkan
{
Serial.print(“.”);
delay(500);
}Serial.println(“”);
Serial.println(“WiFi berjaya terhubung”);
Serial.print(“Alamat IP: “);
Serial.println(WiFi.localIP());delay(500);
timeClient.begin(); //Menghubungkan ESP8266 untuk tujuan kemaskini masa @ timestamp daripada server NTP//Sensor DHT dimulakan
dht.begin();
Serial.println(“Sensor DHT dihubungkan”);
pinMode(dht_dpin,INPUT);
Serial.println(“Sensor DHT diaktifkan”);//Sensor BMP dimulakan
bmp.begin(0x77); //Sensor BME/BMP di alamat 0x76 menggunakan I2C Scanner
Serial.println(“Sensor BMP dihubungkan”);//Sensor BME dimulakan
//bme.begin(0x76); //Sensor BME/BMP di alamat 0x76 menggunakan I2C Scanner
//Serial.println(“Sensor BME dihubungkan”);
}void loop()
{
timeClient.update(); //Kemaskini masa @ timestamp dalam ESP8266 untuk tujuan penghantaran paket APRS
if(!aprs_is.connected()) //Keadaan apabila server APRS berjaya dihubungkan, server boleh ditetapkan dalam ‘settings.h’
{
Serial.print(“Menghubungi server APRS: “);
Serial.print(SERVER); //Maklumat server APRS yang dihubungkan
Serial.print(” di port: “);
Serial.println(PORT); //Maklumat port APRS yang dihubungkan
if(!aprs_is.connect(SERVER, PORT, FILTER))
{
Serial.println(“Server gagal terhubung”);
Serial.println(“Menunggu untuk tempoh 5 saat sebelum percubaan seterusnya…”);
delay(5000);
return; //Percubaan sekali lagi untuk cuba menghubungi server APRS apabila gagal
}
Serial.println(“Kita berjaya terhubung ke server APRS-IS!”);
}static int update_min = -11; //Pembolehubah masa untuk timestamp daripada server
if(millis() – previousMillis > (INTERVAL*60000)) //Sela masa penghantaran paket APRS
{
/*
Penjanaan Paket APRS: Untuk memeriksa paket APRS yang dijana, anda boleh ke https://www.findu.com/cgi-bin/raw.cgi?call=9M2FLP-13
·Gantikan ‘9M2FLP-13’ kepada isyarat panggilan peralatan yang telah diprogram
·Paket data APRS dijana dalam langkah ini
*///String data DHT untuk paket APRS
digitalWrite(NodeLED,HIGH);digitalWrite(EspLED,LOW); //LED diagnostik (dihidupkan) untuk paket APRS dihantar
Serial.println(“APRSuWX | Rutin kemaskini data cuaca”);
int humi = dht.readHumidity(); //Membaca data kelembapan daripada sensor DHT
int temp = dht.readTemperature(true); //Membaca data suhu fahrenheit daripada sensor DHT
char temp3[4];sprintf(temp3, “%03d”, temp); //Penukaran nilai 2 angka suhu kepada format 3 angka untuk paket APRS
String stringKelembapan = prefixKelembapan + humi;
String stringSuhu = prefixSuhu + temp3;
if(isnan(humi)||isnan(temp) || humi==2147483647 || temp==2147483647)
{
stringKelembapan = prefixKelembapan + gagalKelembapan;
stringSuhu = prefixSuhu + gagalSuhu;
Serial.print(“Kelembapan: “);Serial.print(“GAGAL”);Serial.print(“| Suhu: “);Serial.print(“GAGAL”);
}
else
{
stringKelembapan = prefixKelembapan + humi;
stringSuhu = prefixSuhu + temp3;
Serial.print(“Kelembapan: “);Serial.print(stringKelembapan);Serial.print(“| Suhu: “);Serial.print(stringSuhu);
}//String data BME untuk paket APRS
int baro = bmp.readPressure()/10; //bme.readPressure untuk BME280
String stringTekanan = prefixTekanan + baro;
if (isnan(baro) || baro==2147483647)
{
stringTekanan = prefixTekanan + gagalTekanan;
Serial.print(“| Tekanan: “);Serial.println(“GAGAL”);
}
else
{
Serial.print(“| Tekanan: “);Serial.println(baro);
stringTekanan = prefixTekanan + baro;
}//APRSuWX 0.1.2 String message = String(USER)+”>APRS,TCPIP*:=”+String(GPS)+”_”+String(arah_angin)+”/”+String(laju_angin)+”g”+String(tiupan_angin)+”t”+String(suhu)+”r”+String(hujan_sejam)+”p”+String(hujan_sehari)+”P”+String(hujan_hari)+”h”+String(kelembapan)+”b”+String(tekanan)+”L”+String(kecerahan)+”APRSmy-uWX: Malaysia microWX Station”;
/*APRSuWX 0.1.5*/ String message = String(USER)+”>APRS,TCPIP*:=”+String(GPS)+”_”+String(arah_angin)+”/”+String(laju_angin)+”g”+String(tiupan_angin)+stringSuhu+”r”+String(hujan_sejam)+”p”+String(hujan_sehari)+”P”+String(hujan_hari)+stringKelembapan+stringTekanan+”L”+String(kecerahan)+String(NODE);//Rutin pemasangan paket dan penghantaran paket ke APRS-IS
Serial.print(“[” + timeClient.getFormattedTime() + “] “);
aprs_is.sendMessage(message);
Serial.print(“Paket APRS dihantar: “);Serial.println(message);
update_min = timeClient.getMinutes();
digitalWrite(EspLED,HIGH);digitalWrite(NodeLED,LOW); //LED diagnostik (dipadamkan) untuk paket APRS dihantarpreviousMillis = millis(); //Reset kembali program pemasa
}if(aprs_is.available() > 0)
{
//Rutin penerimaan mesej daripada stream paket APRS
digitalWrite(EspLED,LOW);digitalWrite(NodeLED,HIGH); //LED diagnostik (dipadamkan) untuk paket APRS diterima
Serial.print(“[” + timeClient.getFormattedTime() + “] “);
Serial.println(aprs_is.getMessage());
digitalWrite(NodeLED,LOW);digitalWrite(EspLED,HIGH); //LED diagnostik (dihidupkan) untuk paket APRS diterima
}}
Hasilnya
Setelah script (yang telah kita edit), kemudian upload ke hardware dan sensor dipasang, akhirnya kita kecapi hasilnya.
Penghargaaan dan Terima Kasih
Setinggi-tinggi ucapan penghargaan dan terima kasih diatas usaha ini. Perkongsian ini sangat tinggi dan murni demi kemajuan kita bersama, khususnya radio amatur. Pengalaman saya sendiri, saya telah mempelajari satu benda baru dan banyak lagi yang perlu dipelajari dan explore. Terima kasih.