Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Ayo Migrasi TV Digital

    Kami bantu anda untuk memahami lebih jelas mengenai migrasi tv digital, apa sebabnya dan bagaimana efek terhadap kehidupan. Jasa teknisi juga tersedia dan siap membantu instalasi - setting perangkat - pengaturan antena dan distribusi televisi digital ke kamar kos / hotel

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Sabtu, 15 Juni 2024

IOT - GPS dengan bantuan apps smartphone netGPS

 


Kalau kita kembali belajar IOT di awal-awal maka akan dikenalkan dengan yang namanya piramida IOT. Bagian paling ujung dari piramida ini adalah pelaporan ke orang yang akan membutuhkan informasi melalui IOT. Salah satu contoh pelaporan adalah GIS (Geographic Information System) dimana data yang diambil oleh sensor dan dikirimkan secara IOT akan ditampilkan pada peta. Tentunya cuap-cuap saya diawal ini akan terasa omong kosong kalau alat GPS nya seperti yang pernah saya bahas disini, susah di koneksikan...ala mak jang !

Sadar atau tidak sadar, pada kenyataannya, smartphone yang kita pakai mesti ada penerima GPS lho mas broo ! nah..benda yang selalu kita pegang tiap saat ini seharusnya dan pastinya dapat memberikan koordinat bujur dan lintang selama berada pada lokasi terbuka. Masalahnya bagaimana cara membagi pembacaan hardware GPS pada smartphone android ke perangkat IOT? 



Aplikasi android yang saya gunakan adalah netGPS yang akan mengirimkan data GPS secara TCP (berfungsi sebagai TCP server) dan mengirimkan sebagai teks log dari berbagai macam standar data GPS yang digunakan oleh smartphone android. Aplikasi ini cukup jadul jadi jika ingin menginstallnya harap gunakan cara selain google play jika ternyata HP kamu ditolak.




Contoh standar pembacaan teks NMEA (National Marine Electronics Association)  yang saya gunakan sederhana saja cukup sebaris ( karena saya butuhnya hanya koordinat saja) dan saya pilihkan standar $GPRMC. Saya butuh membayar 15ribu rupiah ke aplikasi ini untuk dapat memilih secara custom pesannya seperti pada gambar diatas. Dari sebuah website saya dapatkan standar pesannya adalah sebagai berikut:


$GPRMC

Recommended minimum specific GPS/Transit data

eg1. $GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62
eg2. $GPRMC,225446,A,4916.45,N,12311.12,W,000.5,054.7,191194,020.3,E*68

225446 Time of fix 22:54:46 UTC A Navigation receiver warning A = OK, V = warning 4916.45,N Latitude 49 deg. 16.45 min North 12311.12,W Longitude 123 deg. 11.12 min West 000.5 Speed over ground, Knots 054.7 Course Made Good, True 191194 Date of fix 19 November 1994 020.3,E Magnetic variation 20.3 deg East *68 mandatory checksum

Dan kemudian saya parsing data dari teks $GPRMC, namun karena saya tukang koding abal-abal, butuh bantuan chatGPT dan hasilnya saya diberikan script yang sangat jitu !


#include <ESP8266WiFi.h>

const char* ssid = "YourHotspotSSID";
const char* password = "YourHotspotPassword";

// Example NMEA GPRMC string
String nmeaString = "$GPRMC,043652,A,0713.64753,S,11243.78,E,,,290524,000.7,E,A*33";

void setup() {
  Serial.begin(115200);
  parseNMEA(nmeaString);
}

void loop() {
  // No code needed here for this example
}

double convertNMEACoordinate(String nmeaCoord, bool isLongitude) {
  // Determine the length of degrees part (3 for longitude, 2 for latitude)
  int degreesLength = isLongitude ? 3 : 2;
  // Extract the degrees part
  double degrees = nmeaCoord.substring(0, degreesLength).toInt();
  // Extract the minutes part and convert to decimal
  double minutes = nmeaCoord.substring(degreesLength).toFloat();
  degrees += minutes / 60.0;
  return degrees;
}

void parseNMEA(String nmea) {
  // Check if the string starts with "$GPRMC"
  if (nmea.startsWith("$GPRMC")) {
    // Buffer for each field in the NMEA string
    char buf[75];
    nmea.toCharArray(buf, 75);

    // Tokenize the NMEA string by comma
    char* token = strtok(buf, ",");
    
    // Index to track the position in the NMEA string
    int index = 0;
    
    // Variables to hold parsed data
    String time, status, latitude, latitudeDirection;
    String longitude, longitudeDirection, date;

    while (token != NULL) {
      switch (index) {
        case 1: time = String(token); break;
        case 2: status = String(token); break;
        case 3: latitude = String(token); break;
        case 4: latitudeDirection = String(token); break;
        case 5: longitude = String(token); break;
        case 6: longitudeDirection = String(token); break;
        case 9: date = String(token); break;
      }
      token = strtok(NULL, ",");
      index++;
    }

    // Convert latitude and longitude
    double latitudeDegrees = convertNMEACoordinate(latitude, false);
    if (latitudeDirection == "S") {
      latitudeDegrees = -latitudeDegrees;
    }

    double longitudeDegrees = convertNMEACoordinate(longitude, true);
    if (longitudeDirection == "W") {
      longitudeDegrees = -longitudeDegrees;
    }

    // Prepare buffer for formatted longitude
    char longitudeStr[20];
    dtostrf(longitudeDegrees, 1, 7, longitudeStr);

    // Prepare buffer for the final concatenated string
    char resultStr[40];  // Adjust size based on expected combined length
    strcpy(resultStr, "latitude ");
    strcat(resultStr, longitudeStr);

    // Print the parsed data
    Serial.println("Time: " + time);
    Serial.println("Status: " + status);
    Serial.print("Latitude: ");
    Serial.println(latitudeDegrees, 7);
    Serial.print("Longitude: ");
    Serial.println(longitudeDegrees, 7);
    Serial.print("Concatenated String: ");
    Serial.println(resultStr);  // Print concatenated string
    Serial.println("Date: " + date);

    // Convert and print additional data if necessary
    // Convert time to HH:MM:SS format
    String hours = time.substring(0, 2);
    String minutes = time.substring(2, 4);
    String seconds = time.substring(4, 6);
    Serial.println("Formatted Time: " + hours + ":" + minutes + ":" + seconds);

    // Convert date to DD/MM/YY format
    String day = date.substring(0, 2);
    String month = date.substring(2, 4);
    String year = date.substring(4, 6);
    Serial.println("Formatted Date: " + day + "/" + month + "/" + year);
  } else {
    Serial.println("Invalid NMEA string");
  }
}

Penjelasan:

1. Function konversi NMEA  (convertNMEACoordinate): 

  • Mengonversi koordinat NMEA ke format derajat desimal.


2. Function Penguraian (parseNMEA):

  • Memberi token pada string NMEA dan mengekstrak bidang yang relevan.
  • Mengonversi lintang dan bujur menjadi derajat desimal.
  • Menyesuaikan tanda berdasarkan arah (N/S untuk garis lintang, E/W untuk garis bujur).

3. Memformat Bujur/Lintang:

  • Fungsi dtostrf memformat garis bujur/lintang menjadi string dengan 7 tempat desimal.

4. Concatenate string:

  • Buffer resultStr disiapkan untuk menampung hasil gabungan.
  • Fungsi strcpy menginisialisasi resultStr dengan label "latitude".
  • Fungsi strcat menambahkan string garis bujur yang diformat ke resultStr.

5. Print / output :

  • String gabungan dicetak ke Serial Monitor.

Kode ini mem-parsing string NMEA GPRMC, mengubah garis lintang dan garis bujur menjadi derajat desimal, memformat garis bujur menjadi string dengan 7 tempat desimal, dan menggabungkannya dengan label longitude dan latitude. String gabungan kemudian dicetak pada serial monitor.




Untuk menerima pesan $GPRMC dari smartphone, saya akan membuat ESP8266-wemos saya sebagai client dan terhubung dengan hotpsot dari Smartphone yang saya gunakan. Hal ini akan memudahkan saya karena Smartphone saya fungsikan sebagai TCP server di IP Gatewaynya ( 192.168.43.1) pada port yg saya pilih 8088. IP ini adalah IP umum yang digunakan oleh hotspot smartphone android, namun sudah saya akali pada script agar TCP server yang di-bind-kan adalah IP gatewaynya, selanjutnya menunggu data GPS berupa teks $GPRMC.


/* GPS SMARTPHONE (netGPS Android) to ESP8266
Hardware : DHT 11 & OLED SSD1306 128x64
This script is incomplete, you should add data sending 
via IOT protocol, MQTT, HTTP  or Lora
www.aisi555.com 
*/


#include <ESP8266WiFi.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "DHT.h"


#define SCREEN_WIDTH 128 // display display width, in pixels
#define SCREEN_HEIGHT 64 // display display height, in pixels

#define DHT_PIN D4   // pin sensor DS18B20


#define display_RESET     -1 // Reset pin 
#define SCREEN_ADDRESS 0x3C ///address i2c oled 
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, display_RESET);



#define DHTTYPE DHT11  //Sensor DHT11
DHT dht(DHT_PIN, DHTTYPE); 


const char* ssid = "myHotspot";
const char* password = "99999999";

// Server details
IPAddress serverIP;  // Define server IP address (gateway IP)
const uint16_t serverPort = 8088;

WiFiClient client;

bool gpsOK = false;
char longitudeStr[20];
char latitudeStr[20];

void setup() {
  Serial.begin(9600);
   Serial.println("");
  Serial.println(F(" ...www.aisi555.com GPS From Smartphone ...."));

    // initialize display display with address 0x3C for 128x64
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    while (true);
  }

  delay(2000);         // wait for initializing
  display.clearDisplay(); // clear display

  
  display.setTextSize(1);          // text size
  display.setTextColor(WHITE);     // text color
  
  displayDisplayCenter("www.aisi555.com", 4);
  displayDisplayCenter("Connecting to wifi.. ",56);

  
    // Connect to Wi-Fi network
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  delay(1000);



  display.clearDisplay(); // clear display
  displayDisplayCenter("www.aisi555.com", 4);
  displayDisplayCenter("Connecting to Aps..",56);
  
  IPAddress gatewayIP = WiFi.gatewayIP();
  serverIP = gatewayIP;  // Use the gateway IP as server IP

  // Attempt to connect to the server
  if (!client.connect(serverIP, serverPort)) {
    Serial.println("Connection to server failed");
  } else {
    Serial.println("Connected to server");
  }


  dht.begin();

  
}


void writeTempHumid(){ //kirim data pengukuran DHT
   
 
    float h = dht.readHumidity();
    float t = dht.readTemperature();

    if (isnan(h) || isnan(t)) {
      Serial.println("Failed to read from DHT sensor!");
    }
    
    Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" °C ");
  
    String tempString;
  
    tempString  = String(t, 1); // 
    tempString += (char)247;
    tempString += "C | ";
    tempString += String(h, 0);;
    tempString += " %";
  
    //biar ketumpuk hitam dulu biar bersih

    display.fillRect(0,17,128,48,BLACK);
    
  //lanjut tulis warna putih
   display.setTextColor(WHITE);
   
   String latString;
   latString  = "Lat: ";
   latString += String(latitudeStr);
   displayDisplayCenter(latString,20);

   String lonString;
   lonString  = "Lon: ";
   lonString += String(longitudeStr);
   displayDisplayCenter(lonString,30);
   displayDisplayCenter(tempString,42);

   if(gpsOK)displayDisplayCenter("GPS is Connected",56);
   else displayDisplayCenter("GPS disconnected !",56);


   /* ADD YOUR IOT DATA SENDING SCRIPT BELOW  */
   
  }


void loop() {

  if (runEvery(5000)) {
    writeTempHumid();
  }
  
  if (client.connected()) {
    // Check if data is available to read
    
    gpsOK=true;
    
    while (client.available()) {
      String receivedData = client.readStringUntil('\n');  // Read data until newline
      Serial.print("Received data: ");
      Serial.println(receivedData);

      // Process the received data
      // Add your data processing logic here

      parseNMEA(receivedData);
    }
  } else {
    // Reconnect if connection is lost
    if (!client.connect(serverIP, serverPort)) {
      Serial.println("Reconnection to server failed");
      gpsOK=false;
      delay(1000);  // Wait before retrying
    } else {
      Serial.println("Reconnected to server");
    }
  }
}

//function agar tulisan rata tengah (center)

void displayDisplayCenter(String text, int posisi) {
  int16_t x1;
  int16_t y1;
  uint16_t width;
  uint16_t height;

  display.getTextBounds(text, 0, 0, &x1, &y1, &width, &height);

  display.setCursor((SCREEN_WIDTH - width) / 2, posisi);
  display.println(text); // text to display
  display.display();
}



double convertNMEACoordinate(String nmeaCoord, bool isLongitude) {
  // Determine the length of degrees part (3 for longitude, 2 for latitude)
  int degreesLength = isLongitude ? 3 : 2;
  // Extract the degrees part
  double degrees = nmeaCoord.substring(0, degreesLength).toInt();
  // Extract the minutes part and convert to decimal
  double minutes = nmeaCoord.substring(degreesLength).toFloat();
  degrees += minutes / 60.0;
  return degrees;
}

void parseNMEA(String nmea) {
  // Check if the string starts with "$GPRMC"
  if (nmea.startsWith("$GPRMC")) {
    // Buffer for each field in the NMEA string
    char buf[75];
    nmea.toCharArray(buf, 75);

    // Tokenize the NMEA string by comma
    char* token = strtok(buf, ",");
    
    // Index to track the position in the NMEA string
    int index = 0;
    
    // Variables to hold parsed data
    String time, status, latitude, latitudeDirection;
    String longitude, longitudeDirection,date;

    while (token != NULL) {
      switch (index) {
        case 1: time = String(token); break;
        case 2: status = String(token); break;
        case 3: latitude = String(token); break;
        case 4: latitudeDirection = String(token); break;
        case 5: longitude = String(token); break;
        case 6: longitudeDirection = String(token); break;
        case 9: date = String(token); break;
      }
      token = strtok(NULL, ",");
      index++;
    }

    // Convert latitude and longitude
    double latitudeDegrees = convertNMEACoordinate(latitude, false);
    if (latitudeDirection == "S") {
      latitudeDegrees = -latitudeDegrees;
    }

    double longitudeDegrees = convertNMEACoordinate(longitude, true);
    if (longitudeDirection == "W") {
      longitudeDegrees = -longitudeDegrees;
    }

    //kirim ke display 
    dtostrf(longitudeDegrees, 1, 7, longitudeStr);
    dtostrf(latitudeDegrees, 1, 7, latitudeStr);
    

    // Print the parsed data
    Serial.println("Time: " + time);
    Serial.println("Status: " + status);
    Serial.print("Latitude: ");
    Serial.println(latitudeDegrees, 7);
    Serial.print("Longitude: ");
    Serial.println(longitudeDegrees, 7);
    Serial.println("Date: " + date);

    // Convert and print additional data if necessary
    // Convert time to HH:MM:SS format
    String hours = time.substring(0, 2);
    String minutes = time.substring(2, 4);
    String seconds = time.substring(4, 6);
    Serial.println("Formatted Time: " + hours + ":" + minutes + ":" + seconds);

    // Convert date to DD/MM/YY format
    String day = date.substring(0, 2);
    String month = date.substring(2, 4);
    String year = date.substring(4, 6);
    Serial.println("Formatted Date: " + day + "/" + month + "/" + year);
  } else {
    Serial.println("Invalid NMEA string");
  }
}

//timer
boolean runEvery(unsigned long interval)
{
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
    return true;
  }
  return false;
}

Dan jika script kamu benar dapat mengirimkan data GPS menggunakan lorawan seperti berikut :
 


Dan kemudian pengolahan data GIS nya kita dapat manfaatkan google maps atau yang secara online yaitu kepler.gl (lihat gambar paling atas). Keberhasilan pengaplikasian trik saya ini sangat bergantung pada sensitifitas GPS receiver pada smartphone, sehingga syarat mutlak adalah HP kamu berada pada lokasi yg open space / langit terbuka.

SELAMAT MENCOBA
Share:

Selasa, 04 Juni 2024

Magang Industri Unesa 2024 - Topik : LoRa & LoRaWan

 


Kegiatan magang industri kali ke-3 bersama mahasiswa prodi teknik listrik fakultas vokasi Universitas Negeri Surabaya baru saja menyelesaikan presentasi dan pemaparan tugas akhir. Magang ini berlangsung dari februari 2024 s/d mei 2024 dan mengambil topik komunikasi LoRa dan LoRaWan. Masih berpola magang secara mandiri, disini perusahaan saya men-simulasikan sebuah proyek ke masing-masing peserta yang berjumlah 4 orang. 

Kali ini saya akan membagi apa saja hasil dari project yang saya berikan yang mungkin berguna bagi pembaca, terutama mahasiswa yang mungkin masih kebingungan mencari ide untuk praktek kerja atau tugas akhir.


- M. Erfin Pratama Setyawan : Antena LoRa 433 Mhz



Tugas yang dikerjakan adalah merancang antena Lora 433 Mhz  dengan 3 type antena yaitu :

  • Stick antenna
  • Dipole Antena
  • Yagi Antena

Pada dasarnya antena yang dirancang harus mengikuti kaedah-kaedah dan hitungan fisika dari propagasi gelombang radio dan ini mungkin agak melenceng dari jurusan kuliah peserta magang. Namun  ini tidak menjadi masalah, sebab satu hal yang sangat vital dalam pengiriman Long Range adalah antena yang MATCH ! Sehingga daya pancar dari modul semtech SX1278 yang hanya 100 miliwatt  dapat memancar dengan efisien dan kemudian diterima sinyalnya dengan baik pula disisi penerima.

Dan benar saja hasil dari tugas akhir mas erfin dapat mengirim LoRa dari 2 ujung jembatan suramadu menggunakan antena yagi modifikasi antena TV. Jaraknya cukup mencengangkan yaitu 5 km lebih. Begitu juga berhasil mengirimkan sinyal antara 2 gedung kampus Unesa ketintang vs Unesa lidah dengan jarak 6.5 km.



Video presentasi selengkapnya dapat dilihat disini :




- Yoko Hermanto : IOT Gateway untuk pertanian

 



Salah satu kegunaan komunikasi lora adalah untuk membantu bidang pertanian, dimana umumnya lahan pertanian berada pada lokasi di pedesaan. Lokasi yang kemungkinan besar akan kesulitan dijangkau sinyal GSM maupun wifi menginspirasi yoko untuk membuat sebuah IOT gateway yang akan menerima data suhu dan kelembaban tanah di sebuah lokasi pertanian.

Simulasi dilakukan dengan membaca kondisi tanah di sebuah pot yang terdapat tanaman sri rejeki (aglonema). Secara konsep IOT pada edge node computing , seharusnya microcontroller esp32 yang digunakan sudah mampu untuk melakukan pengukuran sensor kelembaban tanah secara mandiri dan melakukan otomasi penyiraman air ke dalam pot. 



IOT gateway nya akan menerima data dari komunikasi point yo point LoRa  dan kemudian mengirimkannya melalui protokol MQTT menuju aplikasi di sisi internet lainnya seperti MQTT Explorer. Video selengkapnya bisa dilihat disini:




- Satria Ego Varia : Monitoring & Kontrol Listrik Jarak Jauh Dengan LoRa - Whatsapp 



Kalau ini saya lumayan kagum dengan kemampuan koding peserta magang ini. Jadi saya persingkat saja, alat yang dibuat adalah kontrol relay serta monitoring beban listrik ac (sensor pzem) yang kemudian dikirimkan menggunakan esp32 dan komunikasi P2P antar modul LoRa, dimana mikrokontroler di salah satu sisi bertindak sebagai IOT gateway. Ajaibnya ujung dari sistem IOT adalah pelaporan serta kontrol kelistrikan menggunakan whatsapp. Canggih bukan ? Yuk kita simak saja videonya :




- Ajudan Laksamana : Drive Test Coverage Lorawan di Surabaya -Sidoarjo



Saya lumayan gembira bercampur sedih dengan tugas akhir magang yg dipegang judan ini, karena sebenarnya modul GPS yang saya pinjamkan  ini merupakan modul jadul yg dulu saya persiapkan untuk kawan yang memberi project IOT pertama saya. Masih ingat tulisan saya disini ? Ujung nya proyek ini gagal karena sang pemberi proyek direnggut covid 19.

Tugas yang saya berikan juga kelanjutan dari perkenalan pertama saya menggunakan LoRaWan Telkom Antares (baca disini)  dimana alat yang digunakan masih yang dulu itu, hasil solderan saya sendiri, dan kini hanya ditambahakan modul GPS ke port RX nya. Walau judan kemudian agak terhalang karena sakit, dia berhasil melakukan drive test yang cukup menggambarkan betapa buruknya coverage LoRaWan telkom di Surabaya-Sidoarjo.




Ada yang tertarik magang di saya lagi? Eittt episode selanjutnya bertemakan "Image Processing" dan "Artificial Inteligent" lhooo... Berani ?

Share:

Senin, 27 Mei 2024

LoRaWan Antares - Menampilkan Grafik di Aplikasi Android IOT MQTT PANEL

 



Kesulitan mendasar kembali ditemukan saat menggunakan LoRaWan telkom ber platform Antares, padahal ini merupakan ujung "raja terakhir" dari setiap kali bermain IOT. Bagian ini adalah membuat tampilan menarik dari hanya sekedar teks uplink dari console antares, namun beberapa kali saya menemukan anak-anak mahasiswa kesulitan juga dibagian awal. Jadi library yang saya gunakan mungkin satu-satunya solusi yang berhasil mengirimkan LoRaWan ke antares (Guaya puoooll). Heheheh... baca dulu deh disini ya...



Lalu ada lagi sambungan setelah mereka (pembaca blog) saya ajari kirim-kiriman, ehhh pengolahan datanya menjadi grafik belum bisa, jadi nanggung banget ! Kalau dilihat dari fasilitas chart di antares pada menu widget...yakkk ampunnn..coba deh lihat..



Belum dapat dinamakan grafik kalau seperti ini, karena data lorawan yang masuk belum sama sekali diparsing. Kesusahan kali ya membuat json parser data seperti ini di php ? Ingat dulu pembahasan saya disini ? baca dulu deh.. 

Akses data antares yang di subscribe via MQTT selalu ada pada 1 topic :  /oneM2M/resp/antares-cse/access:key/json  

Uplink perangkat LoRaWan akan menghasilkan output mqtt seperti berikut ini :


{
   "m2m:rsp" : {
      "rsc" : 2001,
      "rqi" : "123456",
      "pc" : {
         "m2m:cin" : {
            "rn" : "cin_tuYp3j-bTIy5fUm4",
            "ty" : 4,
            "ri" : "/antares-cse/cin-tuYp3j-bTIy5fUm4",
            "pi" : "/antares-cse/cnt-661860573",
            "ct" : "20240527T095651",
            "lt" : "20240527T095651",
            "st" : 0,
            "cnf" : "message",
            "cs" : 296,
            "con" : "{\"type\": \"uplink\",\"port\": 1,\"data\": { \"suhu\": 27.81,\"humi\": 75},\"counter\": 2,\"devEui\": \"4fd4a31429711655\",\"radio\": {\"gps_time\": 1400813829,\"hardware\": {\"snr\": -17.6,\"rssi\": -116},\"datarate\": 0,\"modulation\": {\"bandwidth\": 125000,\"spreading\": 12},\"delay\": 0.060113125618098,\"freq\": 922,\"size\": 40}}"
         }
      },
      "to" : "",
      "fr" : "/antares-cse"
   }
}

Data yang berguna ada di "con" sehingga harus parsing json dulu ...nah dari pada bingung, kita belajar dulu menerima data yg masuk dari LoRaWan menggunakan python sebagai penerima MQTT nya. Jangan lupa untuk menginstall library Paho-Mqtt, dimana kalau menggunakan google colab bisa install versi 1.6.0 saja yang lebih sederhana. Script ini secara realtime akan menerima data masuk jika LoRaWan menerima uplink dari device.


!pip install paho-mqtt==1.6.0



from paho.mqtt import client as mqtt_client
import time
from time import sleep
from random import randrange


# Inisialisasi broker antares
broker_address="mqtt.antares.id"
broker_port=1883

#sesuaikan dengan acces key antares kamu
antareskey= "access:key"
antaresdevice = "aplikasi/device"

#topik subscribe hanya 1 saja untuk tiap akun
topicsubantares = f'/oneM2M/resp/antares-cse/{antareskey}/json'


def connect_mqtt() -> mqtt_client:
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client= mqtt.Client(f'aisi555-client-{randrange(0,1000)}') 
    client.on_connect = on_connect
    client.connect(broker_address, broker_port)
    return client


def subscribe(client: mqtt_client):
    def on_message(client, userdata, msg):
        print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")

    client.subscribe(topicsubantares)
    client.on_message = on_message


def run():
    client = connect_mqtt()
    subscribe(client)
    client.loop_forever()


if __name__ == '__main__':
    run()


Hasil dari script diatas akan menampilkan semua data yang masuk, memang ini kekurangan oneM2M dimana tidak melayani sub mqtt per device. Hasilnya kita harus parsing per device di "pi:" lalu di bandingkan dengan device yang sedang kita olah datanya.



Sekalian saja saya kemudian akan parsing "con" dan mengambil beberapa data seperti suhu, humi, snr dan rssi. Scriptnya seperti ini :


from paho.mqtt import client as mqtt_client
import time
from time import sleep
from random import randrange
import json


# Inisialisasi broker
broker_address="mqtt.antares.id"
broker_port=1883

antareskey= "access:key"
antaresdevice = "/antares-cse/device-uri" 

topicsubantares = f'/oneM2M/resp/antares-cse/{antareskey}/json'


def connect_mqtt() -> mqtt_client:
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client= mqtt.Client(f'aisi555-client-{randrange(0,1000)}') 
    client.on_connect = on_connect
    client.connect(broker_address, broker_port)
    return client


def subscribe(client: mqtt_client):
    def on_message(client, userdata, msg):
        #print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")
        olah_data(msg.payload.decode())
    client.subscribe(topicsubantares)
    client.on_message = on_message

def olah_data(datanya):
  # Parsing json
  data = json.loads(datanya)
  penerima = data["m2m:rsp"]["pc"]["m2m:cin"]["pi"] 
  # ambil con untuk data
  con_json_str = data["m2m:rsp"]["pc"]["m2m:cin"]["con"]  
  # Parse the JSON string inside "con"
  con_data = json.loads(con_json_str)
  
  print(f"Terima dari device : {penerima}")
  print("Suhu:", con_data["data"]["suhu"], " Celcius")
  print("kelembaban:", con_data["data"]["humi"], " %")
  print("Radio SNR:", con_data["radio"]["hardware"]["snr"])
  print("Radio RSSI:", con_data["radio"]["hardware"]["rssi"]) 


def run():
    client = connect_mqtt()
    subscribe(client)
    client.loop_forever()


if __name__ == '__main__':
    run()
	


Tapi masih belum juga bisa menampilkan grafik ke IOT MQTT PANEL seperti yang sering saya bahas setiap membuat proyek IOT disini.  Untuk itu saya membuat bridge untuk menjembatani MQTT diantara antares dan aplikasi melalui broker mqtt gratisan HIVEMQ. Wahh benar-benar script python saya berfungsu jadi bridge ini, dimana saya melakukan koneksi ke 2 buah broker, antares saya sub dan hivemq saya pub.  Saya kutipkan beberapa  potongan penting:




def olah_data(datanya):
  # Parsing json
  data = json.loads(datanya)
  penerima = data["m2m:rsp"]["pc"]["m2m:cin"]["pi"] 
  # ambil con untuk data
  con_json_str = data["m2m:rsp"]["pc"]["m2m:cin"]["con"]  
  # Parse the JSON string inside "con"
  con_data = json.loads(con_json_str)
  
 
  if(penerima == antaresdevice):
    print(f"Terima dari device : {penerima}")
    print("Suhu:", con_data["data"]["suhu"], " Celcius")
    print("Kelembaban:", con_data["data"]["humi"], " %")
    print("Radio SNR:", con_data["radio"]["hardware"]["snr"])
    print("Radio RSSI:", con_data["radio"]["hardware"]["snr"]) 
    print("Kirim ke HiveMQ !")
    hivemq.publish("/aisi555/suhu", con_data["data"]["suhu"])
    hivemq.publish("/aisi555/humi", con_data["data"]["humi"])
    hivemq.publish("/aisi555/snr", con_data["radio"]["hardware"]["snr"])
    hivemq.publish("/aisi555/rssi", con_data["radio"]["hardware"]["snr"])


def run():
    #konek ke antares
    client = connect_mqtt()
    #konek ke Hivemq
	global hivemq
    hivemq = connect_hivemq()
    #subscribe ke antares
	subscribe(client)
    client.loop_forever()


Hasilnya seperti ini, langsung bisa dari Sensor ==> LoRaWan Antares ==> google colab ==> grafik apk IOT MQTT PANEL (gambar paling atas) secara real time. Script saya potong dan seperti biasa kontak saya jika berminat belajar lebih dalam lagi. 








Share:

Minggu, 19 Mei 2024

LoRaWan TTGO - ESP32 - Telkom Antares

 



Breaking news: Telkom akan melakukan migrasi LoRaWan ke Telkomiot.id, Silahkan baca disini


Setelah beberapa tahun yang lalu blog ini berhasil mengoprek "LoRaWan" milik Telkom-Antares, ternyata nasib library loraid atau lorawan antares kelihatannya tidak di maintenance lagi. Walaupun tahun 2023 ada update di website nya antares tapi ini khusus untuk hardware yang di desain dan bekerjasama dengan antares langsung. Saya menjadi sedikit khawatir satu hari sinyal lorawan di telkom antares menghilang atau berpindah pemilik seperti terkejutnya saya melihat platform iot telkomiot (telkomiot.id) yang tiba-tiba hadir kembali namun masih gagal konek.

Beberapa mahasiswa masih rajin menghubungi saya untuk bertanya hal library ini, namun tetap saya sarankan mengikuti teknik saya menggunakan library yang walau belum lengkap (menurut penyusunnya) namun terbukti bisa mengirim data, seperti yang dilihat pada tulisan saya sebelumnya disini.



Mikrokontroler yang saya gunakan dulu adalah arduino, dan sudah berhasil mengirim data secara benar secara radio LoRaWan lanjut masuk ke platform antares. Masalahnya ada pembaca yang gagal kirim ketika menggunakan mikrokontroller modern ESP32 semacam TTGO yang sekarang makin terjangkau. "LoRa Init Failed" begitu katanya ! Yahh kalau ini pasti ada hubugannya dengan error di koneksi SPI.




Kebetulan saja saya ada project yang menggunakan TTGO dan benar saja koding saya terdahulu tidak jalan di TTGO, analisa saya karena ESP32 memiliki 2 buah port SPI, sehingga untuk SPI.begin() nya harus dilakukan penulisan port MISO, MOSI, SCK dan CS. Dan langsung saja saya kreasikan beserta display Oled nya TTGO yang walau kurang berguna (karena boros daya) namun untuk sekelas proyekan atu tugas kampus bisa memperindah tampilan.

Modul TTGO LoRa adalah perangkat yang dirancang untuk memfasilitasi pengembangan aplikasi IoT dengan kemampuan komunikasi jarak jauh yang andal dan konsumsi daya rendah. Berikut ini adalah fasilitas utama yang ditawarkan oleh modul TTGO LoRa serta informasi mengenai frekuensi kerjanya.


Fasilitas Modul TTGO LoRa

  • Mikrokontroler ESP32: Modul ini dilengkapi dengan mikrokontroler ESP32 yang memiliki dual-core CPU, Wi-Fi, dan Bluetooth. ESP32 adalah salah satu mikrokontroler yang paling populer di kalangan pengembang karena kemampuannya yang serbaguna dan efisiensi daya.
  • Chip LoRa SX1276/78: Chip LoRa ini memungkinkan komunikasi jarak jauh dengan konsumsi daya yang rendah. Chip ini terkenal karena kinerjanya yang stabil dan jangkauan yang luas.
  • Antena LoRa: Modul ini dilengkapi dengan antena LoRa eksternal yang meningkatkan kualitas sinyal dan jangkauan komunikasi.
  • Layar OLED: Banyak varian TTGO LoRa dilengkapi dengan layar OLED kecil (biasanya 0.96 inci) yang dapat digunakan untuk menampilkan informasi seperti status koneksi, data sensor, atau informasi lainnya.
  • Port USB: Modul ini memiliki port USB untuk kemudahan pemrograman dan daya, memungkinkan pengembang untuk dengan mudah mengunggah kode dan menguji perangkat mereka.
  • Slot Kartu SD: Beberapa varian TTGO LoRa memiliki slot kartu SD untuk penyimpanan data tambahan, memudahkan penyimpanan log data dalam aplikasi yang memerlukan pencatatan jangka panjang.
  • GPIO dan Pin I/O Analog: Modul ini menyediakan beberapa General Purpose Input/Output (GPIO) dan pin input/output analog yang dapat digunakan untuk menghubungkan berbagai sensor dan aktuator.
  • Dukungan Perangkat Lunak: TTGO LoRa kompatibel dengan Arduino IDE, PlatformIO, dan berbagai alat pengembangan lainnya. Hal ini memudahkan pengembang untuk memulai dan membuat prototipe proyek IoT mereka.


Frekuensi Kerja Modul TTGO LoRa


Modul TTGO LoRa bekerja pada beberapa frekuensi yang disesuaikan dengan peraturan komunikasi di berbagai wilayah. Frekuensi utama yang digunakan adalah:


  • 433 MHz: Frekuensi ini sering digunakan di wilayah Eropa dan Asia.
  • 868 MHz: Digunakan terutama di Eropa, frekuensi ini sesuai dengan regulasi ISM (Industrial, Scientific, and Medical).
  • 915 MHz: Frekuensi ini umum digunakan di Amerika Utara dan Australia.
  • 923 MHZ : Indonesia menggunakand Band Plan AS_923_2

Pemilihan frekuensi yang tepat tergantung pada wilayah penggunaan dan regulasi lokal. Modul TTGO LoRa yang berbeda dapat disesuaikan dengan frekuensi yang sesuai dengan kebutuhan proyek dan kepatuhan regulasi.


Konfigurasi PIN seperti berikut :


#define SCK 5

#define MISO 19

#define MOSI 27

#define SS 18

#define RST 14

#define DIO0 26


//OLED pins

#define OLED_SDA 4

#define OLED_SCL 15 

#define OLED_RST 16

#define SCREEN_WIDTH 128 // OLED display width, in pixels

#define SCREEN_HEIGHT 64 // OLED display height, in pixels


Hasilnya ketika saya mendekati BTS lorawan, maklum di depan rumah sejak setahun lalu ada bangunan tinggi yang menghalangi pengiriman, seperti berikut ini :



Saya bagi script sederhana untuk pengiriman LoRaWan pada TTGO-ESP32 yang bisa membantu kamu belajar. Sebaiknya baca-baca dulu pembahasan LoRaWan sebelumnya agar bisa paham library yang saya pake.



/*

LoRaWan - Antares - ESP32(TTGO)
by www.aisi555.com
2024 


*/

//Libraries for LoRa
#include <SPI.h>
#include <LoRa.h>
#include <LoRaWanPacket.h>

//Libraries for OLED Display
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

//Gunakan pin ini untuk TTGO, sesuaikan jika berbeda
#define SCK 5
#define MISO 19
#define MOSI 27
#define SS 18
#define RST 14
#define DIO0 26

//OLED pins
#define OLED_SDA 4
#define OLED_SCL 15 
#define OLED_RST 16
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RST);



//Sesuaikan dev address dan key device LoRa
const char *devAddr = "aaaaaaaa";
const char *nwkSKey = "bbbbbbbbbbbbbbbb0000000000000000";
const char *appSKey = "0000000000000000cccccccccccccccc";


struct LoRa_config
{
  long Frequency;
  int SpreadingFactor;
  long SignalBandwidth;
  int CodingRate4;
  bool enableCrc;
  bool invertIQ;
  int SyncWord;
  int PreambleLength;
};


//Scanning frekuensi satu persatu di BAND AS_923_2

long LoRa_frek_INA_923_start = 921200000 ;
long LoRa_frek_INA_923_end   = 922600000 ;
long LoRa_frek_step = 200000;
long LoRa_frek_INA_923 = LoRa_frek_INA_923_start;
                                     
static LoRa_config txLoRa = {LoRa_frek_INA_923, 12, 125000, 5, true, false, 0x34, 8};


void LoRa_setConfig(struct LoRa_config config)
{
  LoRa.setFrequency(LoRa_frek_INA_923);
  LoRa.setSpreadingFactor(config.SpreadingFactor);
  LoRa.setSignalBandwidth(config.SignalBandwidth);
  LoRa.setCodingRate4(config.CodingRate4);
  if (config.enableCrc)
    LoRa.enableCrc();
  else
    LoRa.disableCrc();
  if (config.invertIQ)
    LoRa.enableInvertIQ();
  else
    LoRa.disableInvertIQ();
  LoRa.setSyncWord(config.SyncWord);
  LoRa.setPreambleLength(config.PreambleLength);
  LoRa.setTxPower(20); //max power ubah jika ingin irit

}

void LoRa_TxMode()
{
  LoRa_setConfig(txLoRa);
  LoRa.idle();
}


void setup() {
   //initialize Serial Monitor
  Serial.begin(9600);
  
  //reset OLED display via software
  pinMode(OLED_RST, OUTPUT);
  digitalWrite(OLED_RST, LOW);
  delay(20);
  digitalWrite(OLED_RST, HIGH);
  
  //initialize OLED
  Wire.begin(OLED_SDA, OLED_SCL);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c, false, false)) { // Address 0x3C for 128x32
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(0,0);
  display.print("LORAWAN AISI555");
  display.display();

  Serial.println("LoRaWan Antares Test");

  LoRaWanPacket.personalize(devAddr, nwkSKey, appSKey);

  //SPI LoRa pins
  SPI.begin(SCK, MISO, MOSI, SS);
  //setup LoRa transceiver module
  LoRa.setPins(SS, RST, DIO0);
  
  if (!LoRa.begin(txLoRa.Frequency)) {
    Serial.println("LoRa Gagal. Cek perkabelan kamu...");
    while (true);
  }

  Serial.println("LoRa init berhasil.");
  Serial.println();
  display.setCursor(0,10);
  display.println("LoRa Initializing OK!");
  display.display(); 

}

void loop() {
  if (runEvery(5000)) { // ganti interval kirim lorawan

    Serial.print("Send Message! frek = ");
    Serial.println(LoRa_frek_INA_923);
    
    
    LoRa_sendMessage();

    display.clearDisplay();
    display.setCursor(0,0);
    display.print("KIRIM LORAWAN AIS555");
    display.setCursor(0,20);
    display.print("frekuensi: ");
    
    float freku = LoRa_frek_INA_923/1000000.0;
    display.print(freku , 1);  
    display.print(" MHz ");
    display.display();



  if( LoRa_frek_INA_923 >= LoRa_frek_INA_923_end ) LoRa_frek_INA_923 = LoRa_frek_INA_923_start;
  else LoRa_frek_INA_923 += LoRa_frek_step;
  }

}


void LoRa_sendMessage()
{
  LoRa_TxMode();
  LoRaWanPacket.clear();
  LoRaWanPacket.print("coba kirim frek : ");
  LoRaWanPacket.print(String(LoRa_frek_INA_923));
  
  
  if (LoRaWanPacket.encode()) 
  {
    LoRa.beginPacket();
    LoRa.write(LoRaWanPacket.buffer(), LoRaWanPacket.length());
    LoRa.endPacket();
  }

  
}

boolean runEvery(unsigned long interval)
{
  static unsigned long previousMillis = 0;
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval)
  {
    previousMillis = currentMillis;
    return true;
  }
  return false;
}
   
Share:

Kamis, 09 Mei 2024

[AI] Gateway IOT Melalui Radio - ESP8266 - HT - RTL/SDR - PYTHON - MQTT

 


Saya sampai kebingungan dibuatnya, sebaiknya saya meng-kategori-kan tulisan kali ini dibagian mana ya? Nyenggol banyak topik sih.. Makanya judulnya jadi sedikit kepanjangan. 

Gini...pada intinya kebahagiaan saya tak terkira ketika berhasil mengirimkan data sensor suhu LM35 yang saya baca dengan menggunakan ESP 8266 dan kemudian saya kirimkan menggunakan Walkie Talkie. Dibagian Penerima akan saya terjemahkan data audio tadi dengan menggunakan layanan google speech dan sedikit bantuan ChatGpt untuk meng-koding python, VOILA... Jadi deh seperti gambar diatas.


- PYTHON SPEECH RECOGNITION

Bagian yang paling 'sakti' ini menggunakan python sebagai penterjemah suara manusia menjadi text, layaknya subtitle otomatis pada youtube. Dengan layanan google yang masih 'free' ini dan berbagai bahasa di dunia dapat dilayani termasuk bahasa Indonesia. Salah satu contoh coding sederhana untuk menterjemahkan suara microphone ke teks, saya bagikan seperti berikut ini :


import speech_recognition as sr
import threading
import sys
import keyboard

# Flag to indicate if escape key is pressed
escape_pressed = False

def check_escape():
    global escape_pressed
    print("Press Escape key to quit recognition...")
    keyboard.wait('esc')
    escape_pressed = True

def recognize_speech():
    global escape_pressed
    # Initialize recognizer
    recognizer = sr.Recognizer()

    # Start a separate thread to check for Escape key press
    escape_thread = threading.Thread(target=check_escape)
    escape_thread.start()

    while not escape_pressed:
        # Capture microphone input
        with sr.Microphone() as source:
            print("Listening for speech...")
            recognizer.adjust_for_ambient_noise(source)  # Adjust for ambient noise
            audio = recognizer.listen(source)

        try:
            print("Recognizing...")
            # Recognize speech using Google Speech Recognition bahasa Indonesia 
            text = recognizer.recognize_google(audio, language='id-ID')
            print("You said:", text)
        except sr.UnknownValueError:
            print("Sorry, I couldn't understand what you said.")
        except sr.RequestError as e:
            print("Could not request results from Google Speech Recognition service; {0}".format(e))

    print("Exiting...")
    sys.exit()

if __name__ == "__main__":
    recognize_speech()
Gunakan mic pada laptop atau PC kalian untuk mencobanya dan IT'S MAGIC ! Jangan lupa layanan ini memerlukan koneksi internet ke server speech recognition dari google.


- ESP8266 SENSOR READER & PTT SENDER




Untuk pembahasan di bagian ini anda dapat membaca tulisan saya sebelumnya disini : 




- RTL SDR dan VB AUDIO



Kalau ini sih beberapa tulisan kebelakang terutama april 2024, banyak sekali membahas tentang RTL-SDR dengan dongle usb murah meriah (tidak menyesal saya membelinya). Dengan merouting audionya melalui VB AUDIO menjadikan output suara SDR# menjadi  input MIC, maka software python - speech recognition dapat menterjemahkan audio menjadi teks yang berguna. 

Jika tidak menggunakan rtl-sdr bagaimana? Ya gunakan HT penerima dan dekatkan mic pc ke speaker HT atau ambil speaker out dari jack female yg tersedia ke line input PC.


- MQTT dan IOT MQTT PANEL


Barang ini sudah sampai bosen mungkin ya dibahas disini, kalau gak keberatan masuk aja ke tulisan pertama saya mengenai protokol IOT paling laris yaitu MQTT ( baca disini ). Jadi terasa mudah sekali jika terbiasa dan mengenal luar dalam protokol ini, apalagi ketika dimudahkan dengan library python Paho-mqtt (baca disini), sehingga dengan bantuan broker gratis dari Hivemq maka data suhu dapat dikirimkan ke smartphone menggunakan apk android : IOT MQTT PANEL. Jadi deh gateway IOT nya dan dapat dimanfaatkan untuk monitoring berbagai macam data dari lokasi yang lumayan jauh selama pesawat radio HT dapat menjangkaunya.




- KALAU SUARA HT ORANG LAIN IKUTAN MASUK DAN ADA YANG NGUPING ?


Untuk hal ini terdapat beberapa norma atau etika pada komunitas radio amatir seluruh dunia, dimana yang dikirimkan perangkat radio amatir adalah suara/data yang "clear" tanpa enkripsi. Wong jalur frekuensi bersama kok sembunyi-sembunyi? Jadi bisa juga data nya di olah menjadi digital seperti RATTLEGRAM di video saya dibawah ini, namun bagaimana dengan monitoring yang dilakukan oleh semisal satpam yang hanya berbekal Hotel Tango dengan Buntut Tikus ?






- JARINGAN GSM DAN WIFI SUDAH BANYAK, NGAPAIN PAKE RADIO HT LAGI ?






Kalau ditanya seperti ini, sederhana saja kok,  kenapa juga radio HT / ORARI / RAPI/ SATPAM/ POLISI dll masih banyak instansi yang menggunakannya ? Dibalik seperti itu saja pertanyaannya maka akan ada kesan 'unda-undi'  (bahasa jawa : untung-rugi) mengenai pengiriman data via radio HT. Bagaimana jika ingin mengetahui debit air di bendungan yang berada jauh di hilir sungai dan blankspot sinyal gsm ? Radio HT solusinya broo.. LORA ? coba deh loranya dibawa ke hutan pasti 100 meter penerimaan sudah megap-megap terserap pepohonan. Starlink ?  Hanya kelas juragan tambang kali yang mampu..


- HASIL dan KESIMPULAN

Video berikut ini menjawab semuanya dan jika berminat untuk mengembangkannya silahkan kontak saya di 08155737755 .






- DISCLAIMER :

"Penggunaan frekuensi radio amatir merupakan domain dari #Kemkominfo, #ORARI dan #RAPI. Jangan sekali-kali menggunakan frekuensi amatir untuk tujuan lain sebagai #Amatir Radio yang tunduk pada aturan-aturan baku yang mengikat. Jika perangkat kamu akan memancarkan pembacaan data, silahkan berkomunikasi lanjut dengan pengelola lokal orari setempat agar tidak terjadi masalah dikemudian hari. Tulisan ini hanya sebagai pembuktian teknologi radio untuk pelaporan data #IOT jaman sekarang"

Share:

Rabu, 08 Mei 2024

[AI] Kirim Data Suhu LM35 Lewat Radio Amatir / HT


 
Disclaimer : " Penggunaan frekuensi radio amatir merupakan domain dari Kemkominfo, ORARI dan RAPI. Jangan sekali-kali menggunakan frekuensi amatir untuk tujuan lain daripada Amatir Radio yang tunduk pada aturan-aturan baku yang mengikat. Jika perangkat kamu akan memancarkan pembacaan data, silahkan berkomunikasi lanjut dengan pengelola lokal orari setempat agar tidak terjadi masalah dikemudian hari. Tulisan ini hanya sebagai pembuktian teknologi radio untuk pelaporan data jaman sekarang"

Suatu hari ketika saya scanning frekuensi maritim (150Mhz-170Mhz) menggunakan RTL-SDR yang beberapa bulan ini sedang saya gandrungi, terdengar sayup-sayup suara operator yang membacakan laporan cuaca di wilayah syahbandar pelabuhan tanjung perak Surabaya. Suaranya begitu "kurang bersemangat", mungkin karena dia sadar data cuaca untuk kapal shiping line, sudah lengkap dan mudah didapatkan melalui internet atau radar mereka, jadi operator ini hanya menjalankan tugas rutinitas yang harus dia lakukan sesuai perintah instansi. 

Tahukah kamu, di belahan bumi Amerika utara terdapat stasiun radio amateur WWV yang bekerja pada 2,5Mhz, 5Mhz, 10 Mhz, 15 Mhz dan 20Mhz, dimana secara berkala akan memberikan informasi waktu yang akurat berdasarkan jam atom. Yang berbicara di radio adalah suara mesin/komputer. Sempat juga saya melihat youtuber asal kanada yg scanning radio di dekat pelabuhan, laporan cuaca nya dibacakan juga oleh komputer, seperti halnya suara google map ketika kita berkendara dan menggunakan panduan arah.

Lalu teringat lah saya pada suatu kejadian letusan gunung merapi dan gunung agung beberapa tahun yg lalu, dimana laporan kegempaan seismik ditautkan pada sebuah frekuensi radio amatir VHF dengan tone yang berayun jika ada guncangan / letusan di puncak. Dan di wilayah rural seperti pegunungan, radio amatir / HT menjadi sarana komunikasi handalan. Jadi penggunaan radio HT untuk pengiriman data serta warning lumayan masih diperlukan.

Lalu bagaiman sih caranya menggantikan operator manusia menjadi suara text to speech (TTS) layaknya suara google ? Ayo saya share caranya... Pertama-tama tentunya kamu butuh memiliki sepasang radio HT / Walkie Talkie untuk melakukan experimen ini. Dan saya pilihkan merek baofeng yang sedang laris manis digunakan satpam dimana-mana.



Saya akan menggunakan mikrocontroller ESP8266 - Wemos yang berfungsi sebagai :

  1. Pembaca Sensor Suhu LM35
  2. Penerjemah pembacaan suhu menjadi urutan file mp3
  3. Pemutar audio mp3
  4. Pemutus - sambung transmit PTT (Push To Talk) sesuai kebutuhan


Dengan komponen beserta rangkaian secara lengkap seperti ini :



Lalu pertanyaannya apakah ESP8266 dapat memutar file audio langsung tanpa memerlukan player lainnya semacan DF player ? Ooooo itu sudah lama saya tau, dengan memanfaatkan I2S dari generasi ESP8266 atau ESP32 maka memutar file audio sangatlah mudah. Silahkan meluncur ke : https://github.com/earlephilhower/ESP8266Audio untuk belajar bagaimana cara memutar beberapa jenis file audio secara langsung, tanpa atau dengan DAC.

Untuk melakukan generate audio robot, maka gunakan layanan TTS (text to speech) yang versi bahasa Indonesia secara gratis dapat di googling seperti BOTIKA. Kalau punya teman atau saudara yg suaranya renyah dapat juga direkam beberapa file pembacaan angka "satu", "dua", "sebelas" dan lainnya. Seperti contoh yang saya buat dan letakkan di folder /data dibawah directory project arduino saya.



Untuk melakukan upload file suara mp3 ke ESP8266 maka diperlukan library SPIFFS yang memungkinkan ESP memiliki penyimpanan file tersendiri. Langkah pengaturan dan cara upload nya bisa dibaca disini : https://randomnerdtutorials.com/install-esp8266-filesystem-uploader-arduino-ide/.


Sedangkan script lengkap yang bisa kalian coba, saya bagikan secara FREE alias GRATEEESS 


/* Pengubah pembacaan Suhu LM35 ke suara dan dikirim via HT Baofeng  
   www.aisi555.com  08155737755 nyoman yudi kurniawan 2024
   
   Pada IDE gunakan mode clock ESP8266 160MHz, serta mode SPIFFS sebesar 1MB atau lebih
   Pelajari cara "Tools->ESP8266/ESP32 Sketch Data Upload" untuk menyimpan MP3 di SPIFFS
   Baca disini : https://randomnerdtutorials.com/install-esp8266-filesystem-uploader-arduino-ide/
   File mp3 simpan di folder /data pada direktori sketch arduino, dengan nama file berikut
   rekam sendiri di HP/PC atau gunakan layanan text to speech untuk membuat tiap file

   0.mp3  
   1.mp3
   2.mp3
   3.mp3
   4.mp3
   5.mp3
   6.mp3
   7.mp3
   8.mp3
   9.mp3
   10.mp3 ==> sepuluh
   11.mp3 ==> sebelas
   1_1.mp3 ==> belas
   p.mp3  ==> puluh
   d.mp3  ==> derajat
   k.mp3  ==> koma
   s.mp3  ==> ucapan pertama /salam
  
  
  Selanjutnya bisa baca di www.aisi555.com
  Gunakan secara gratis dan bertanggung jawab
  semua aturan penggunaan frekuensi radio amatir mengacu pada ORARI/RAPI/KEMKOMINFO/BALMON
*/

#include <Arduino.h>
#include <ESP8266WiFi.h>

#include "AudioFileSourceSPIFFS.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2SNoDAC.h"

//sesuaikan pin PTT 
#define ptt 5
#define lm35 A0

int16_t suhu = 337;
uint8_t proses = 0;


AudioGeneratorMP3 *mp3;
AudioFileSourceSPIFFS *file;
AudioOutputI2SNoDAC *out;



void setup()
{
  pinMode(ptt, OUTPUT);
  digitalWrite(ptt, LOW);
  WiFi.mode(WIFI_OFF); 
  Serial.begin(115200);
  delay(1000);
  SPIFFS.begin();
  Serial.println("======= www.aisi555.com ========");
  Serial.println("  kirim Suhu LM 35 ke HT yukkkkk");
  Serial.println("================================");
  
  audioLogger = &Serial;

  //baca suhu LM35 di A0, Vin = 3.3 volt

    int16_t analogValue = analogRead(lm35);
    
    suhu = analogValue  * (3300/1024);
    Serial.println(analogValue);
    Serial.print("Suhu : ");
    Serial.println(suhu);
  

  //awal mulai pertama
  proses=1;
  //kirim PTT dan kirim suara ke HT
  digitalWrite(ptt, HIGH);
  delay(500);
  
  file = new AudioFileSourceSPIFFS("/s.mp3");
  out = new AudioOutputI2SNoDAC();  
  mp3 = new AudioGeneratorMP3();
  mp3->begin(file, out);
}


void tts(int16_t angka) //disini proses memilih angka jadi file mp3
{   
    uint8_t pilih;
    if (proses == 2) {
       pilih = angka/100;

      if ( angka <200 && angka >=120 ) pilih = (angka /10) % 10;
      else if (angka <120 && angka >=110) pilih =11; 
      else if (angka <110 && angka >=100) pilih =10;
      else if (angka <100 && angka >=0) pilih = angka /10;
    
    }
    else if (proses == 4){  
      pilih = (angka /10) % 10;
      if (pilih == 0) return;
      if (angka <200 && angka >=0) return;  
    
    }
    else if (proses == 6) pilih = angka % 10;

   switch (pilih) {
     case 0 : file = new AudioFileSourceSPIFFS("/0.mp3");
        break;
     case 1 : file = new AudioFileSourceSPIFFS("/1.mp3");
        break;
     case 2 : file = new AudioFileSourceSPIFFS("/2.mp3");
        break;
     case 3 : file = new AudioFileSourceSPIFFS("/3.mp3");
        break;   
     case 4 : file = new AudioFileSourceSPIFFS("/4.mp3");
        break;
     case 5 : file = new AudioFileSourceSPIFFS("/5.mp3");
        break;
     case 6 : file = new AudioFileSourceSPIFFS("/6.mp3");
        break;
     case 7 : file = new AudioFileSourceSPIFFS("/7.mp3");
        break;
     case 8 : file = new AudioFileSourceSPIFFS("/8.mp3");
        break;
     case 9 : file = new AudioFileSourceSPIFFS("/9.mp3");
        break; 
     case 10 : file = new AudioFileSourceSPIFFS("/10.mp3");
        break;        
     case 11 : file = new AudioFileSourceSPIFFS("/11.mp3");
        break;
   }

  out = new AudioOutputI2SNoDAC();  
  mp3 = new AudioGeneratorMP3();
  mp3->begin(file, out);
   
}




void loop()
{
  if (mp3->isRunning()) {
    if (!mp3->loop()) mp3->stop();
  } else {
    
    if(proses == 7){
      
    proses =1;
    Serial.printf("MP3 play selesai\n");
    //matikan PTT
    digitalWrite(ptt, LOW);


    
    delay(5000);
    //ulang reset ESP agar fresh terus 
    ESP.reset();
 
    }

   else if ( proses == 1){ //puluhan
    proses=2;
    tts(suhu);
   }
   else if ( proses == 2){ //puluh, belas atau lewat
    proses=3;
     
     if( suhu <200 && suhu >=120 ) file = new AudioFileSourceSPIFFS("/1_1.mp3");
     else if( suhu <120 && suhu >=0 ) file = new AudioFileSourceSPIFFS(NULL);
     else file = new AudioFileSourceSPIFFS("/p.mp3");
    
     out = new AudioOutputI2SNoDAC();  
     mp3 = new AudioGeneratorMP3();
     mp3->begin(file, out);
   }   
   else if ( proses == 3){ //satuan
    proses=4;
    tts(suhu);
   }    
   else if ( proses == 4){ // koma
     proses=5;
     file = new AudioFileSourceSPIFFS("/k.mp3"); 
     out = new AudioOutputI2SNoDAC();  
     mp3 = new AudioGeneratorMP3();
     mp3->begin(file, out);
   }  
   else if ( proses == 5){ //desimal
    proses=6;
    tts(suhu);
   } 

   else if ( proses == 6){ //derajat
     proses=7;
     file = new AudioFileSourceSPIFFS("/d.mp3");
     out = new AudioOutputI2SNoDAC();  
     mp3 = new AudioGeneratorMP3();
     mp3->begin(file, out);
   }
     
  }
}

Dan jika kalian sukses dan beruntung (karena setiap kali compile hasilnya bisa error mulu, jadi kesabaran adalah kunci), akan kira-kira seperti video dibawah ini :








Share:

Rabu, 24 April 2024

[RTL-SDR] AIS di frekuensi 161.975 Mhz : Kukira noise ternyata data kapal laut

 


Tulisan kali ini lebih 'push the boundary' dari perangkat dongle usb - epro fitipower yang kebanyakan untuk monitoring cuap-cuap para briker menolak tua. Setelah melihat beberapa peta aprs.fi dan iri melihat pergerakan kapal laut di luar negeri sana banyak yang mengirimkan data lokasi juga (baca disini dulu), saya jadi berpikir apakah di kapal lautnya ada perangkat aprs nya ? Ohhh ternyata tidak, tiap kapal laut resmi yang mempunyai ijin berlayar diharuskan memasang transponder/beacon bernama AIS, yang menurut salah satu laman di aprs.fi (baca disini), memancar di frekuensi 161.975 Mhz dan 162.025 Mhz. Dan teringatlah suatu saat ketika saya (dulu) melihat ada denyut yg khas di frekuensi ini



  

Mungkin gambar capture SDR# saya ini kurang kontrastnya jadi waterfalnya terlihat hanya seperti noise, namun dari beberapa youtube menjelaskan kalau lokasi kamu dekat pelabuhan akan ada sinyal beacon berformat data GMSK 9600bps yang dipancarkan radius 75km. Kebetulan saja saya sedang berdomisili dilokasi dekat pelabuhan tanjung perak Surabaya. Apakah 'noise' berdenyut yang saya terima dengan antena dipole copotan yagi VHF ini dapat menerima dan mendecode data AIS, mari kita bedah langkah2nya.


1. Gunakan VB audio virtual cable , untuk melakukan routing jalur audio ke software lain, biasanya menuju ke software decoder audio ke data. Jadi dengan software ini maka tidak pusing menggunakan kabel loop dari line out ke line in. Download gratis kok, gunakan googling aja untuk mencari lokasi websitenya.



Perlu penyesuaian output dan input dari ke-2 software ini, di sisi penghasil audio semisal sdr# di ubah routing output audio ke VB cable input  sedangkan pada software decodernya dibagian audio input ubah juga ke VB cable output.


2. Software decoder yang digunakan adalah Shipplotter (shareware trial 21 hari) dan Aismon yang gratis namun data teks AIVDM nya tidak di decode kan (butuh decoding data manual ke website). SDR# Airspy saya sudah saya routing audionya ke VB audio dan saya hilangkan filter audionya ( WAJIB !). 




Tuning dilakukan pergeseran sesuai gambar pulse sinyal pada waterfall dimana pada setup perangkat saya bergeser ke 161.863.600 (maklum dongle murmer jadi gesernya gak tentu). Jika dongle kamu memakai oscilator yang paten maka tinggal menghitung pergeserannya dan input pada bagian error ppm sehingga tuningnya pas di frekuensi AIS 161.975 Mhz / 162.025 Mhz. Jangan gunakan squelch dan atur sampai audionya tedeteksi sekitar 50 %- 80% dari level max yang tersedia.


3. Output dari shipplotter lumayan banyak dari peta sampai radar dan semuanya dilakukan di database internal, namun sebagai orang awam di dunia perhubungan laut maka hal ini membuat saya sedikit "cupu". Yah gpp yang penting ini hasil capture saya.






4. AISMon mengasilkan output yang lebih sederhana namun mudah dimengerti, dimana keluaran datanya bisa lewat serial com, text file maupun text via UDP, jadi bisa di decode lebih lanjut yang akan saya bahas belakangan. Paling gampang ketika sinyal AIS mulai diterima dan ada pesan sukses di decode adalah membuka AISmon.log melalui notepad.



 

Selanjutnya textnya yang berformat AIVDM dapat di decode di berbagai software yang tersedia online atau melalui python (nanti saya bahas dikemudian hari). Contoh decoding teks nya seperti ini.





Dari gambar capture hasil decoding diatas, kebanyakan pesan yang dikirimkan AIS message 1,2,3 yang merupakan lokasi dari pergerakan kapal namun jarang yang mencantumkan database nama kapal secara langsung, namun menggunakan MMSI ID dari kapal. Pesan yang lebih lengkap ada di message type 5 sehingga kalau di search di website tracking kapal laut juga bisa ketemu kok.




Website vesselfinder ini menurut yang saya baca membaca sinyal AIS yang ditangkap oleh beberapa satelit AIS yang terbang di luar angkasa seperti kepler, jaxa dan yang membanggakan telkomsat milik telkom juga mempunyai layanan AIS monitoring via satellite https://ais.telkomsat.co.id.







Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (11) arduino (27) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (26) euro2020 (13) gcc (1) gsm (1) iklan (1) infrared (2) Input Output (3) iot (74) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (11) lorawan (2) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (8) radio (28) raspberry pi (9) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) telkomiot (5) transistor (2) troubleshoot (3) tulisan (94) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3) yolo (7)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika