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, 30 November 2024

[Android] Membuat Apk Grafik di MIT App Inventor

 


Tidak terasa sudah 10 tahun lebih saya tidak mengutak-atik lagi aplikasi di HP android, terakhir kali saya membikin aplikasi berbasis adobe flash (disini) berupa animasi gerak wayang. Namun sesuai nasib saya yang terasa sangat sedih ketika codingan berbasis flash mulai diblokir dimana-mana, dan ketika saya ingin beralih ke IDE programming android lainnya saya merasa kewalahan mungkin karena otak yang payah atau karena PC saya yg selalu lemot me-run aplikasi emulator. 

Bahkan ketika saya mendapatkan proyek-proyek kontrol dan IOT yang memerlukan koneksi ke smartphone, biasanya saya banyak menggunakan IOT MQTT PANEL (baca disini) sebagai aplikasi siap pakai maupun software web2apk apabila platformnya berbasis web seperti node-red (baca disini). 

Namun suatu hari saya terpaksa menggunakan kembali aplikasi web pembuat aplikasi android MIT APP INVENTOR yang sebenarnya akun saya sudah tersedia sebelum jaman pandemi. Karena memang proyeknya mengharuskan menggunakan native android (web based menggunakan web2apk nya tidak memiliki fasilitas yg diperlukan), mau tidak mau saya harus membuat apk nya dengan belajar sendiri. 

Kali ini saya akan berbagi proses belajar saya dalam memahami berbagai contoh di internet untuk membuat sebuah aplikasi yang menampilkan grafik suhu dan kelembaban. Saya tidak akan membahas dari awal namun pada proses-proses pentingnya saja dan sampai pada ending emulator yang saya gunakan bernama MUMU player dapat menjalankan grafiknya dengan lancar.


- Bagian Designer


Komponen yang saya gunakan cukup sederhana, dimana screen nya saya center vertikal horizontal, kemudian saya tambahkan beberapa label teks untuk menampilkan tulisan. Yang terpenting adalah komponen chart yang didalamnya berisi grafik chartdata2D (line) yang akan menampilkan suhu. Sedangkan untuk kelembaban saya gunakan progress bar (indeterminate di hilangkan) sehingga dapat menunjukkan tingkat kelembaban. Pada bagian bawah saya isikan informasi waktu yang sebenarnya ingin saya gunakan untuk label axis x pada grafik, namun karena keterbatasan fasilitas maka tidak dapat menampilkan waktu pada sumbu x. Jangan lupa jika berhubungan dengan pewaktu maka butuh ditambahkan yang namanya komponen clock dan diseting sesuai interval yang di inginkan.


- Bagian Block

Untuk menjelaskan proses penyusunan blok sehingga menjadi urutan coding program, harap yang ingin mencoba diwajibkan sebelumnya sudah mengerti konsep coding. Jika tidak maka akan terbentur pada konsep variabel, loop, if else, input-output, dan banyak lagi. Jadi kali ini saya akan usahakan unutk menjelaskan satu persatu.

1. Variabel


Pada gambar diatas terlihat variabel yang saya gunakan seperti X untuk menyimpan nilai axis X kemudian yang lainnya sudah jelas fungsinya sebagai apa. Paling bawah terdapat 2 variabel yang berupa list/array, ini mirip seperti list dalam python dan akan berguna untuk memasukkan nilai grafik. isi dari list disini layaknya python akan berformat JSON. Jadi jangan sampai bingung ya..


2. LOOP



Block ini sangat penting sekali dalam menjalankan keseluruhan proses, dan pada aplikasi yang saya buat ini menggunakan trigger clock1 sebagai timer untuk melakukan proses berulang (when..do) sampai akhir saat aplikasi di tutup. Didalam loop utama ini bisa ditambahkan berbagai block yang sesuai dengan keinginan jalannya program.

3. SET

Lanjutan pada gambar diatas ada beberapa proses yang dinamakan "SET" yang artinya merubah isi dari variabel maupun properties lainnya seperti text dari sebual label/tulisan, warna dan macam-macam. Seperti contoh : Set variabel global waktu yang diubah menjadi call clock1.System Time yang artinya dimasukkan timestamp saat triger interval 1 detik terjadi.


4. MATH


Operasi matematikanya sangat jelas seperti contoh diatas dimana variabel x di increment 1 sedangkan suhu dan humi diberikan nilai random. Block lainnya yang berhubungan dengan operasi matematika dapat dipelajari di bagian kiri dari layar block dan memerlukan pembiasaan untuk dapat menggunakannya secara tepat.

5. TEXT


Block text disini sangat mirip dengan operasi teks pada python, sehingga bagi yang sudah mahir coding python akan sangat terbantu, tinggal menyesuaikan jenis block apa yang akan digunakan. Seperti pada gambar diatas Block set dari text pada label akan diisikan berupa penggabungan teks dari suhu, kelembaban dan waktu. Jangan takut integer/float dan text kan bertabrakan karena otomatis jika yg dimasukkan integer/float akan dirubah menjadi text.


6. LIST



Pada gambar diatas akan dilakukan proses penambahan JSON dari list bernama point1 yang akan berisikan pasangan X (increment) dan Y berupa nilai suhu random yang sudah diproses diatasnya.


7. IF THEN ..

Pada gambar diatas terdapat conditional statement yang akan menghitung length/panjang dari list bernama point1 dimana jika (IF) panjangnya melebihi 10 data  maka (THEN) isi list pada index no 1 akan dihapus. Ini bertujuan untuk menjaga grafik tidak menumpuk terus menerus.


8. GRAFIK


Gambar diatas sangatlah jelas menunjukkan bagaimana grafik2D bernama suhu akan di call.clear / dibersihkan terlebih dahulu sebelum dimasukkan data yang berupa list point1. Karena jumlah sebelumnya dari panjang list dibatasi 10 maka grafiknya akan cukup bagus terlihat.


9. LINEAR PROGRES



Untuk linear progres sebagai tampilan dari kelembaban, jangan lupa untuk terlebih dahulu hilangkan centang (pada designer) item indeterminate agar yang tampil adalah sesuai angka kelembaban. Saya juga menambahkan if then else untuk merubah properties warna sesuai dengan variabel random dari nilai humi.


10. AI COMPANION




Dan hasil compile apk nya kemudian saya tampilkan pada MUMU player menggunakan aplikasi AI Companion, sehingga saya tidak perlu repot menginstall ulang aplikasi di emulator jika terjadi kesalahan coding. Hasilnya seperti animasi dibawah berikut :


 




Pada tulisan selanjutnya akan saya coba menghubungkan aplikasi yang saya buat menggunakan MIT APP Inventor dengan ESP32 berbasis protokol MQTT (disini).


Share:

Rabu, 06 November 2024

Praktisi Mengajar - 4 Season di Unesa Surabaya Dan Kini Hadir di Undiksha Singaraja

 


Perjalanan hidup sang penulis blog ini memang rada-rada mirip film korea, sketsa komedinya cukup banyak muncul di latar belakang cerita yg mellow menye-menye, begitu juga marah emosi ala oppa "issshhh sipaall", terlalu lebay mungkin bagi beberapa orang, tapi jangan salah ada juga  kisah ironi dan juga diwarnai cerita yg menunjukkan kegigihan hidup ala perang korea.

Terlintas ingatan anak umur 6 tahun di tahun 1986, saat itu Ellyas pical sang petinju legendaris baru saja menang melawan petinju korea jo do chun, waktu itu nontonnya di rumah paman yang kebetulan sedang "mlaspas" sanggah kemulan (tempat sembahyang). Saat itu sang pandita memercikkan air suci ke kepalaku dan seraya berkata " kamu mirip orang korea !" Mungkin omongan orang suci ini didengar oleh tuhan dan 20 tahun kemudian saya bekerja bersama orang korea dan hingga kini masih membekas sifat-sifat gigihnya ras kuning yang rada "kasar" menurut beberapa orang.



Nah kan, bener kata bapak ida pedande tahun 86 itu, saya mirip orang korea... Bangga bisa mejeng di depan jalanan kota suwon tahun 2008. Kisah ini merupakan insert coin pertama saya di kehidupan sampai akhirnya game over episode bersama sajangnim di 2013, mungkin terlihat prematur namun lumayan ada hikmahnya ketika harus di PHK dan menggunakan kesempatan insert coin ke-2 kalinya untuk re-spawn lagi di  game dengan map yang berbeda.



Duhh kalau inget coach indra safri dan evan dimas pasti terbayang momen mereka mengalahkan team u-19 korea di GBK tahun 2013 dan senin paginya saya menerima kenyataan pahit membuka amplop surat pemecatan di kantor. Ironi nya cuman hepi ketika nobar di warkop yang hanya berselang gak sampe 10 jam menjadi kesedihan yang menyayat hati...hikss hiksss



Kisah insert coin ke dua kalinya ini cukup berhasil karena membawa saya ke pengalaman menjadi pengusaha kecil yang cukup mendatangkan banyak ilmu-ilmu tak terduga. Mulai dari mengatur pajak, pengelolaan resource dan manajemen karyawan, penanganan konflik masyarakat dan banyak lagi selain paling utamanya adalah penghasilan yang dibilang stabil sampai bisa menggaji belasan karyawan di sebuah kantor yang cukup asri. Tapi pandemi membuat semuanya harus unplug the cord - power off dan terpaksa berdiam diri menunggu pandemi berakhir. Inilah momen Game Over ke-2 kalinya yang terpaksa dan harus menunggu momen yg tepat untuk insert coin yang ke-3 kalinya !



Kembali ke akar saya yang seorang engineer elektronika - mikrokontroler, inilah yang saya lakukan di era pandemi itu, kembali belajar hal-hal yang mungkin asing di telinga namun untungnya masih bisa nyambung di umur 40-an. Dan blog inilah tempat saya curahkan semua hal yang telah saya pelajari sembari mengobati kesepian karena tak ada lagi gurauan para karyawan di kantor yang harus saya tutup dan pindah ke lokasi yang lebih kecil. Momen ketika tutup inilah mengharuskan saya insert coin untuk ke-3 kalinya di 2021.


screenshot ketika jadi pengisi webinar nasional IOT ( baca disini)


Dan berhasil ! Insert coin ke tiga kalinya ini map nya berubah di lingkungan kampus Universitas Negeri Surabaya - Fakultas Vokasi - Prodi D4 Teknik Listrik. Program praktisi mengajar memang banyak membutuhkan praktisi dan saya sebagai orang yg "mengaku" praktisi yang yahh lumayan lahh, diundang oleh bapak Widi Ariwibowo selaku dosen Unesa untuk mencoba berpartisipasi. Walau akhirnya gagal di seleksi nasional praktisi mengajar namun tenaga saya masih dibutuhkan di kelas mikrokontroler. Lumayan lah kini otak saya disibukkan dengan ide-ide penelitian mengenai teknologi Kontrol-IOT-AI dan sel-sel otak saya, synapsisnya berhasil renew kembali. 



Kisah kegigihan ala series drama korea ini berlanjut ketika di tahun ke empat, saya diundang untuk mengajar di kelas kolaborasi sebagai praktisi, di kampus yg lokasinya tidak jauh dari rumah masa kecil saya di Universitas Pendidikan Ganesha Singaraja - Fakultas Teknik dan Kejuruan - Prodi Teknik Rekayasa Sistem Elektronika. Mungkin terlihat simple mengajar kuliah dasar anak semester 1 namun mimpinya sangat besar ingin berbagi ilmu elektro di masa yang akan datang, sehingga mahasiswa baru ini memiliki gambaran kedepannya akan menghadapi hal apa saja. Tidak seperti ketika saya kuliah dulu, teringat saat semester 3 saya merasa salah masuk jurusan, kenapa?  Karena kecewa harus menghadapi kuliah teknik elektro yang FULL MATEMATIKA ...Kapan nyoldernya ?  

Sebagai penutup tulisan, saya sertakan video mengajar saya yang mungkin akan membuat mengantuk (karena semi mendongeng) dan siapa tahu ada yang berani mengundang saya untuk mengajar di manapun, smk-sma-kampus, hayuk aja selama masih ada dalam koridor elektronika digital.





Share:

Rabu, 30 Oktober 2024

[Telkomiot.id] Pembacaan Meter Pdam Berbasis Mqtt dan AI-Yolo-Roboflow

 


Mikrokontroler merupakan ujung tombak dari implementasi IOT diberbagai bidang, dimana dengan kemampuan pengolahan sensor yang semakin baik dapat dimanfaatkan untuk membantu kehidupan manusia sehari-hari . Seperti halnya ilustrasi gambar paling atas merupakan pemanfaatan ESP32 untuk membantu pembacaan meter PDAM secara digital dan kemudian saya bersama mahasiswa Teknik Listrik - Vokasi Unesa Surabaya, yang kebetulan lagi Ujian Tengah Semester (UTS), ingin meng-upgrade ilmu jaman sekarang, sehingga dapat memiliki pemahaman "digitalisasi" yang benar dan tepat guna. Ayo ikuti keseruan UTS kali ini dan pembaca bisa juga mencobanya dirumah !


Ada 5 proses penting dalam kerangka berpikir untuk perancangan sistem pembacaan meteran pdam seperti gambar diatas, walau ada keterbatasan di sisi  pengambilan foto (hanya simulasi file gambar meter dalam spiffs) yang akan kita lakukan, perancangan sistem digitalisasi  meter pdam  idealnya seperti ini :


  1. ESP32 / ESP32 CAM mengambil gambar dari meter pdam dan merubahnya menjadi teks ter-encoded base64 
  2. ESP32 mengirimkan gambar dalam bentuk base64 tadi secara MQTT ke sebuah topik
  3. Cloud computing dalam hal ini google colab, melakukan subscribe ke topic dan kemudian menerima data gambar base64, melakukan decoding menjadi gambar jpg kemudian dengan bantuan model yolo/roboflow melakukan deteksi angka meter melalui proses Artificial Inteligence, dan kemudian pembacaan angka meter di publish ke topic reply. 
  4. ESP32 yang sebelumnya sudah subscribe ke topic reply akan menerima angka pembacaan meter dan diolah ke serial monitor atau display LCD/OLED sesuai kreatifitas. 
  5. Database pelanggan di pusat billing center dapat di update secara otomatis dan tagihan dicetak sesuai penggunaan air di pelanggan. 



Perangkat minimum yang kalian gunakan adalah ESP32, resistor 10Kohm dan Push button / tactile switch. Cukup hanya itu saja bisa kalian rangkai dengan atau tanpa projectboard/breadboard. 


FLOWCHART :



Catatan : "GUNAKAN ARDUINO IDE 1.8.XX (VERSI LAMA) JIKA KALIAN INGIN MENGIKUTI LANGKAH DIBAWAH INI YANG BERBASIS SPIFFS , JIKA KALIAN SUDAH PAHAM MENGENAI LITTLE FS SILAHKAN GUNAKAN SAJA ARDUINO IDE 2.X.X (BARU) "


SPIFFS merupakan file system layaknya di komputer untuk menyimpan data-data gambar, teks, audio dll didalam memori flash nya ESP32. Untuk melakukan seting arduino ide 1.8.xx kalian, ikuti langkah berikut :

1. Unduh file zip yang berisikan file java / jar  di : https://github.com/me-no-dev/arduino-esp32fs-plugin/releases/download/1.1/ESP32FS-1.1.zip


Catatan : gambar diatas hanya untuk menunjukkan dimana file dan folder arduino kalian, tidak perlu dibuka atau browse. Cuman di copy nama foldernya lalu dibuka melalui explorer dan pindahkan file jar ke directorynya.


3. Restart arduino ide kalian dan jika berhasil pada menu tools muncul menu baru "ESP32 sketch data upload". Buat file sketch/ino baru dan save terlebih dahulu.

4. Untuk seting jenis board yg dipakai pilih "ESP32 Dev Module" dan seting lainnya berupa pilihan "Huge App" seperti pada gambar berikut:


5. Fotokan meter pdam yg ada di sekitar kalian (gunakan hp) kemudian kecilkan dan compress sampai file JPG nya berukuran dibawah 30Kb namun masih dapat terbaca dengan jelas. Gunakan tools kompresi online yang saya rekomendasikan adalah : https://www.imgonline.com.ua/eng/compress-image-size.php

6. Pindahkan file gambar tadi (rename dulu dengan pdam.jpg) ke folder baru bernama "data" yg lokasinya satu tingkat dibawah folder dimana kalian menyimpan sketch atau file .ino, seperti pada ilustrasi berikut:


7. Untuk memindahkan file ke ESP32, maka setelah file gambar pdam.jpg tersimpan di folder /data, cukup lanjutkan dengan pilih tools => ESP32 sketch upload, sampai sukses seperti gambar berikut:



Selanjutnya kita akan melakukan coding ke ESP32 kita yang akan bertujuan untuk mengirimkan data secara mqtt, sehingga dibutuhkan library "pubsubclient" yang  bisa kalian install seperti biasanya. Namun karena ada keterbatasan maksimum teks yg bisa dikirim, maka kita butuh melakukan "tweak" terhadap librarynya dan ikuti saja langkah berikut:


1. Masuk ke folder arduino kamu lalu menuju libraries/pubsubclient/src dan cari file bernama pubsubclient.h lalu edit menggunakan teks editor. Temukan item bernama #define MQTT_MAX_PACKET_SIZE 256 , lalu ganti menjadi 50000 seperti gambar dibawah:




2. Setelah library disimpan, maka dapat melakukan editing coding sebagai acuan dibawah ini, sesuaikan dengan yg kamu pakai.  Saya menggunakan broker : mqtt.telkomiot.id karena masih gratis dan kecepatan serta quotanya dapat digunakan untuk data mqtt yg lumayan panjang. Jadi jika belum punya akunnya silahkan daftar dulu di www.telkomiot.id


//UTS MIKROKONTROLER 2024
//d4 teknik listrik vokasi unesa surabaya
//by: nyoman yudi kurniawan ST

#include <WiFi.h>
#include <SPIFFS.h>
#include <PubSubClient.h>
#include <Base64.h>  

#define tombol 19 //sesuaikan pin tombol yg digunakan

//sesaikan wifi yang kamu pake
const char* ssid = "Nama Wifi";
const char* password = "password";

//Kita gunakan telkomiot sebagai broker, perhatikan baik-baik
const char* mqtt_server = "mqtt.telkomiot.id"; // jangan pernah ubah ini
const char* mqtt_key = "18f8e70xxxxxxxx"; // access key akun
const char* mqtt_token = "18f8e70xxxxxxx"; // token key akun

// topic dan reply silahkan ditambah no kelompok kamu di akhir,
// semisal "/tlunesa/pdam-12" , jangan sampai sama kelompok lain 
const char* topic = "/tlunesa/pdam"; 
const char* reply = "/tlunesa/pdam/reply"; 

WiFiClient espClient;
PubSubClient client(espClient);

// Function untuk terhubung ke wifi
void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print(F("UTS Mikrokontroler 2024 - Menghubungkan ke "));
  Serial.println(ssid);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println(F("WiFi Terhubung.."));
}

// Function untuk koneksi MQTT
void reconnect() {
  while (!client.connected()) {
    Serial.print(F("Mencoba koneksi MQTT ..."));
    String clientId = "Unesa-d4-";
    clientId += String(random(0xffff), HEX);
    // menghubungkan..
    if (client.connect(clientId.c_str(),mqtt_key,mqtt_token)) {
      Serial.println(F("Terhubung ! dan Subscribe"));
      client.subscribe(reply);
    } else {
      Serial.print(F("failed, rc="));
      Serial.print(client.state());
      delay(5000);
    }
  }
}

void setup() {

  pinMode(tombol, INPUT);
  Serial.begin(9600);

  // Inisialisasi SPIFFS
  if (!SPIFFS.begin()) {
    Serial.println(F("SPIFFS Mount gagal"));
    return;
  }

  // Inisialisasi WiFi and MQTT
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

 //jika tombol ditekan (aktif low)
 if (!digitalRead(tombol))
 {
  Serial.println("");
  Serial.println(F("Tombol Ditekan.."));
  
  // buka gambar di binary mode, catatan : maksimal 30kb
  File file = SPIFFS.open("/pdam.jpg", "rb");
  if (!file) {
    Serial.println(F("Gagal membuka file di spiffs"));
    return;
  }

  // Read the file size
  size_t fileSize = file.size();
  Serial.print("File size: ");
  Serial.println(fileSize);

  // memesan alamat memory
  uint8_t* buffer = (uint8_t*)malloc(fileSize);
  if (buffer == nullptr) {
    Serial.println(F("Kesalahan mengalokasi buffer memori"));
    file.close();
    return;
  }

  // Baca data binarry ke buffer
  file.read(buffer, fileSize);
  file.close();

  // Encode gambar dalam Base64
  String encodedImage = base64::encode(buffer, fileSize);

  // bersihkan buffer
  free(buffer);

  // Publish ke topik MQTT
  
 if (client.publish(topic, encodedImage.c_str())) {
    Serial.println(F("Gambar berhasil di publish"));
  } else {
    Serial.println(F("Gagal mengirim gambar"));
  }
  // Biar brokernya gak tewas
  delay(1000);
 }   
}

//callback untuk membaca hasil subscribe/reply

void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print(F("Pesan masuk ["));
  Serial.print(topic);
  Serial.print(F("]  Pembacaan Meter :"));
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
 

}

3. Setelah sukses melakukan upload coding, kalian bisa menggunakan aplikasi MQTT seperti mqtt.fx untuk mengetest apakah data berhasil terkirim atau tidak (tentunya setelah tombol dipencet) dengan bantuan aplikasi online base64 decoding : https://base64.guru/converter/decode/image




Google colab merupakan fasilitas gratis dari google untuk meng-explore dunia cloud computing. Kali ini kita akan manfaatkan google cloud untuk mengolah data gambar kemudian melakukan komputasi AI melalui API yolo-roboflow untuk menterjemahkan data gambar meter pdam menjadi data pembacaan meter pdam.  Lakukan langkah berikut untuk membuat cloud server pembaca meter pdam di google colab :


1. Buka google colab ( https://colab.research.google.com/ ) dan login menggunakan akun google kalian. Buatlah notebook baru lalu beri nama sepantasnya. Koneksikan dengan runtime dan lakukan langkah pertama memasukkan perintah intalasi library seperti berikut :


#instal dependecies dulu biar gak salah paham
!pip install paho-mqtt==1.6.0
!pip install inference


Proses mungkin agak lama dan ada warning untuk Mulai Ulang sesi, lakukan saja seperti gambar:



2. Lanjutkan dengan menambahkan coding python sesuai contoh berikut, lalu jalankan dengan panah di kiri atas:

#UTS MIKROKONTROLER 2024
#d4 teknik listrik vokasi unesa surabaya
#by: nyoman yudi kurniawan ST

import cv2
from inference_sdk import InferenceHTTPClient
from google.colab.patches import cv2_imshow
from random import randrange
import base64
import numpy as np
import time
from paho.mqtt import client as mqtt_client


# Inisialisasi broker , samakan dengan script di esp32

broker_address="mqtt.telkomiot.id"
broker_port=1883
mqtt_key = "18f8e70xxxxxxxxxx"
mqtt_token = "18f8e70xxxxxxxxx"
topic = "/tlunesa/pdam"
reply = "/tlunesa/pdam/reply"



#koneksi ke broker
def connect_mqtt() -> mqtt_client:
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Berhasil Terhubung MQTT Broker!")
        else:
            print("Gagal koneksi mqtt, return code %d\n", rc)
    def on_publish(client,userdata,result):
        print("data reply terkirim ke broker")

    client= mqtt_client.Client(f'unesa-client-{randrange(0,1000)}')
    client.on_connect = on_connect
    client.on_publish = on_publish
    client.username_pw_set(mqtt_key,mqtt_token)
    client.connect(broker_address,broker_port, 60 )

    return client


#subscribe ke mqtt broker
def subscribe(client: mqtt_client):

    client.subscribe(topic)
    client.on_message = on_message


def on_message(client, userdata, message):

    print("Data foto masuk...")
    # Get the payload (Base64-encoded image)
    base64_image = message.payload.decode('utf-8')

    # Decode the Base64 string to binary image data
    image_data = base64.b64decode(base64_image)

    # Convert the binary data to a NumPy array
    np_arr = np.frombuffer(image_data, np.uint8)

    # Decode the image from the NumPy array
    image = cv2.imdecode(np_arr, cv2.IMREAD_COLOR)

    #terhubung dengan server Yolo / roboflow
    #jika API key nya penuh, kalian bisa daftar gratis sendiri
    CLIENT = InferenceHTTPClient(
        api_url="https://detect.roboflow.com",
        api_key="fuOy83MqlC1LtKZ25J0p" 
        )
    #lakukan pendeteksi object dengan model yolo
    results = CLIENT.infer(image, model_id="water-meter-dataset/1")


    # mendapatkan prediksi object dari result
    predictions = results['predictions']
    # Mengecek prediksis dan mengambar boxes
    for prediction in predictions:
        # Get the bounding box coordinates
        x = int(prediction['x'])
        y = int(prediction['y'])
        width = int(prediction['width'])
        height = int(prediction['height'])

        # Menggambar bounding box pada gambar meter
        cv2.rectangle(image, (x-int(width/2), y-int(height/2)), (x + int(width/2), y + int(height/2)), (0, 0, 255), 2)
        # Ambil class ID dari angka meter
        class_id = prediction['class']
        # Tambahkan nomer meter pada box 
        cv2.putText(image, class_id, (x-int(width/2), y+height+5), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 0), 2)

    #tampilin gambar hasil pengolahan yolo
    cv2_imshow(image)
    # Sorting the predictions list by 'x'
    sorted_predictions = sorted(results["predictions"], key=lambda d: d["x"])

    # penggabungan class dari nomer menjadi teks
    class_order_numbers = [int(item["class"]) for item in sorted_predictions]
    combined_number = str("".join(map(str, class_order_numbers)))

    # Jadi deh angka pembacaan meter, lalu publish kembali ke topic reply
    print( f'pembacaan meter pdam:{combined_number}')
    client.publish(reply, combined_number)



try:
    client = connect_mqtt()
    subscribe(client)

    # Start the MQTT loop 
    client.loop_start()

    time.sleep(600)  #biargak kelamaan

except KeyboardInterrupt:
    print("KeyboardInterrupt terdeteksi, stop mqtt loop...")

finally:
    client.loop_stop()
    client.disconnect()
    print("MQTT loop selesai dan client terputus")


3. Hasilnya sebagai berikut , dan pada serial monitor / debug arduino ide juga terkirim angka pembacaan meter




4. Kreatifitas kalian bisa tambahkan LCD / OLED untuk menampilkan data pembacaan meter di display yang kalian pilih. Bisa juga LED berkedip jika ada reply yg masuk, sesuaikan dengan kemampuan kalian saja. 


Hasil paling baik dari UTS mahasiswa saya dapat dilihat pada video berikut :










Share:

Selasa, 01 Oktober 2024

[telkomiot.id] Pengiriman data DHT11 menggunakan modem SIM800 - full AT command

 


Untuk dapat mengikuti praktek yang saya tampilkan ditulisan ini, maka sebelumnya pembaca sebaiknya mengikuti 2 tulisan sebelumnya yaitu :

  • Pengiriman data sensor dengan REST API / POST disini 
  • Bermain SMS gateway dengan modem simcom disini

Dengan membaca 2 tulisan diatas mungkin dapat memberikan gambaran setup hardware dan perintah-perintah dasar yang akan dipakai terutama AT COMMAND untuk modem simcom yang kali ini akan kita manfaatkan sebagai pengirim data HTTP / POST ke REST API. Daripada bingung, kita coba mengirimkan secara POST menggunakan chrome extension "Talend API Tester" yang dulu pernah sudah dijelaskan pada tulisan sebelumnya. 



Mungkin sedikit akan membingungkan bagi yang tidak terbiasa kirim mengirim teks http, namun saya tekankan gak perlu takut karena yg dikirimkan adalah teks http yang sudah memiliki pola pasti dan tinggal mengikuti saja dan menyesuaikan terutama dibagian authorization credential (access key) dimana pada telkomiot menggunakan accesss:token dengan enkripsi base64.

Sedangkan di level komunikasi modem simcom,  AT Command yg digunakan dulu pernah dibahas ( baca disini ),  dimana secara garis besar urutan untuk modem sim800 terhubung ke network internet 2G/GPRS  adalah sebagai berikut:

void connectToNetwork() {
  sim808.println("AT");
  delay(1000);
  sim808.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");
  delay(1000);
  sim808.println("AT+SAPBR=3,1,\"APN\",\"internet\"");
  delay(1000);
  sim808.println("AT+SAPBR=1,1");
  delay(2000);
  sim808.println("AT+SAPBR=2,1");
  delay(1000);
}

Untuk mengecek IP yang diberikan oleh operator, pada function diatas terdapat AT+SAPBR=2,1 , dan jika sudah terkoneksi dengan benar maka kedip dari lampu status modem menjadi lebih cepat sekitar 100ms periodenya. Lalu bagaimana dengan koneksi ke server REST API dan mengirimkan data secara POST? Berikut urutannya :


void sendDataToAPI(String data) {
  // Gabungkan accessKey dan accessToken, lalu encode ke dalam Base64
  String credentials = accessKey + ":" + accessToken;
  String base64Credentials = base64_encode(credentials.c_str());

  sim808.println("AT+HTTPINIT"); // Inisialisasi layanan HTTP
  delay(1000);

  sim808.println("AT+HTTPPARA=\"CID\",1"); // Atur identifikasi konteks ke 1
  delay(1000);

  sim808.println("AT+HTTPPARA=\"URL\",\"" + apiUrl + "\""); // Tentukan URL endpoint API
  delay(1000);

  sim808.println("AT+HTTPPARA=\"CONTENT\",\"application/json\""); // Tentukan tipe konten ke JSON
  delay(1000);

  // Tambahkan header Authorization dengan kredensial yang sudah di-encode Base64
  sim808.println("AT+HTTPPARA=\"USERDATA\",\"Authorization: Basic " + base64Credentials + "\"");
  delay(1000);

  // Persiapkan untuk mengirim data POST beserta panjangnya
  sim808.println("AT+HTTPDATA=" + String(data.length()) + ",10000"); // Tentukan panjang data
  delay(1000);

  sim808.print(data); // Kirim data JSON
  delay(10000); // Tunggu hingga data diunggah

  sim808.println("AT+HTTPACTION=1"); // Eksekusi permintaan HTTP POST (aksi 1 adalah POST)
  delay(5000); // Tunggu respons dari server

  sim808.println("AT+HTTPREAD"); // Baca respons dari server
  delay(1000);
  while (sim808.available()) {
    Serial.write(sim808.read()); // Tampilkan respons untuk debugging
  }

  sim808.println("AT+HTTPTERM"); // Akhiri sesi HTTP
  delay(1000);
}

Penjelasan Masing-Masing Perintah AT

AT+HTTPINIT:

Ini digunakan untuk menginisialisasi layanan HTTP di SIM800. Sebelum melakukan permintaan HTTP (GET atau POST), modem harus dipersiapkan dengan perintah ini.

Respons: OK jika layanan HTTP berhasil diinisialisasi.

AT+HTTPPARA="CID",1:

CID adalah "Context Identifier" yang memberitahu SIM800 koneksi GPRS mana yang akan digunakan. Di sini, CID=1 merujuk pada koneksi GPRS yang diatur dengan AT+SAPBR=1,1 di fungsi connectToNetwork().

Respons: OK jika pengaturan identifikasi konteks berhasil.

AT+HTTPPARA="URL","<your API URL>":

Perintah ini menetapkan URL dari server tempat data akan dikirim. Di sini, Anda memasukkan URL API (http://publish-data.telkomiot.id/v2.0/pubs/...).

Respons: OK jika URL berhasil diatur.

AT+HTTPPARA="CONTENT","application/json":

Perintah ini menentukan tipe konten yang dikirim. Dalam hal ini, Anda mengirim data dalam format JSON, jadi tipe konten diatur ke "application/json".

Respons: OK jika tipe konten berhasil diatur.

AT+HTTPPARA="USERDATA","Authorization: Basic <Base64 credentials>":

Perintah ini menambahkan header kustom ke permintaan HTTP. Di sini, kita menggunakannya untuk menambahkan header Authorization, yang berisi kredensial yang sudah di-encode dalam Base64 (gabungan access_key:access_token). Ini adalah cara standar untuk melakukan autentikasi dengan API.

Respons: OK jika header berhasil ditambahkan.

AT+HTTPDATA=<length>,<timeout>:

Perintah ini mempersiapkan SIM808 untuk menerima data untuk permintaan POST. Parameter <length> menentukan jumlah byte data yang akan dikirim, dan <timeout> adalah waktu (dalam milidetik) yang diizinkan untuk mengirim data. Pada kode di atas, data.length() memberikan panjang payload JSON, dan 10000 (10 detik) diberikan sebagai batas waktu.

Respons: DOWNLOAD jika SIM808 siap menerima data.

sim808.print(data):

Ini mengirim data sebenarnya (payload JSON) ke SIM800 setelah perintah AT+HTTPDATA. Modem sekarang mengetahui berapa banyak data yang akan dikirim dan menunggu dalam periode waktu yang ditentukan.

AT+HTTPACTION=1:

Perintah ini memulai permintaan HTTP POST (1 menandakan POST). SIM800 akan mengirimkan data yang telah disiapkan sebelumnya (dalam format JSON) ke URL yang ditentukan dengan header yang telah ditentukan.

Respons: OK diikuti dengan kode status HTTP, seperti 200 untuk sukses atau 404 untuk tidak ditemukan.

AT+HTTPREAD:

Setelah aksi POST selesai, perintah ini digunakan untuk membaca respons dari server. Respons ini bisa berisi informasi penting, seperti apakah permintaan berhasil.

Respons: Isi tubuh respons HTTP yang dikirim oleh server, ditampilkan di monitor Serial untuk keperluan debugging.

AT+HTTPTERM:

Ini digunakan untuk mengakhiri sesi HTTP dan melepaskan sumber daya yang digunakan oleh SIM800 untuk layanan HTTP. Sebaiknya selalu menutup sesi setelah menyelesaikan permintaan.

Respons: OK jika layanan HTTP berhasil diakhiri.


Dengan kombinasi perintah AT diatas ini, Anda bisa menghubungkan Arduino ke server web (REST API) melalui SIM800, memungkinkan untuk mengirim data sensor ke platform IoT melalui jaringan seluler.




Pada praktek yang sudah saya buat sebelumnya, saya menggunakan sensor DHT11 yang akan memberikan data suhu dan kelembaban dan selanjutnya dikirim ke telkomiot.id secara POST. Pada dashbord serta event trigger bisa disesuaikan dengan keinginan seperti yang telah dibahas pada tulisan sebelumnya. 


Koding Lengkap :


#include <SoftwareSerial.h>
#include <DHT.h>

#define DHTPIN 13      // DHT11 connected to pin 13
#define DHTTYPE DHT11  // DHT 11 sensor type
DHT dht(DHTPIN, DHTTYPE);

SoftwareSerial sim808(2, 3); // RX, TX for SIM800

String apiUrl = "http://publish-data.telkomiot.id/v2.0/pubs/APP111111111/DEV222222222"; //sesuaikan dengan endpoint aplication telkomiot
String accessKey = "11111111111111111";    //sesuaikan dengan akun telkomiot.id
String accessToken = "22222222222222222";

void setup() {
  Serial.begin(9600);
  sim808.begin(9600);
  dht.begin();
  delay(5000); // Give time for SIM800 to initialize

  connectToNetwork();
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  String postData = "{\"suhu\": \"" + String(t) + "\", \"humi\": \"" + String(h) + "\"}";
  Serial.println(postData);
  sendDataToAPI(postData);
  delay(10000); // Send data every 10 seconds
}

void connectToNetwork() {
  sim808.println("AT");
  delay(1000);
  sim808.println("AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"");
  delay(1000);
  sim808.println("AT+SAPBR=3,1,\"APN\",\"internet\"");
  delay(1000);
  sim808.println("AT+SAPBR=1,1");
  delay(2000);
  sim808.println("AT+SAPBR=2,1");
  delay(1000);
}

void sendDataToAPI(String data) {
  // Combine accessKey and accessToken, then encode them in Base64
  String credentials = accessKey + ":" + accessToken;
  String base64Credentials = base64_encode(credentials.c_str());

  sim808.println("AT+HTTPINIT");
  delay(1000);
  sim808.println("AT+HTTPPARA=\"CID\",1");
  delay(1000);
  sim808.println("AT+HTTPPARA=\"URL\",\"" + apiUrl + "\"");
  delay(1000);
  sim808.println("AT+HTTPPARA=\"CONTENT\",\"application/json\"");
  delay(1000);

  // Add Authorization header
  sim808.println("AT+HTTPPARA=\"USERDATA\",\"Authorization: Basic " + base64Credentials + "\"");
  delay(1000);

  sim808.println("AT+HTTPDATA=" + String(data.length()) + ",10000");
  delay(1000);
  sim808.print(data);
  delay(10000); // Time to send the data
  
  sim808.println("AT+HTTPACTION=1"); // Start the HTTP POST
  delay(5000);
  
  sim808.println("AT+HTTPREAD");
  delay(1000);
  while (sim808.available()) {
    Serial.write(sim808.read()); // Display response
  }
  
  sim808.println("AT+HTTPTERM"); // End HTTP session
  delay(1000);
}

String base64_encode(const char* input) {
  const char b64_alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  String encoded = "";
  int i = 0, j = 0;
  unsigned char char_array_3[3], char_array_4[4];

  while (*input) {
    char_array_3[i++] = *(input++);
    if (i == 3) {
      char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
      char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
      char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
      char_array_4[3] = char_array_3[2] & 0x3f;

      for (i = 0; i < 4; i++)
        encoded += b64_alphabet[char_array_4[i]];
      i = 0;
    }
  }

  if (i) {
    for (j = i; j < 3; j++)
      char_array_3[j] = '\0';

    char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
    char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
    char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
    char_array_4[3] = char_array_3[2] & 0x3f;

    for (j = 0; j < i + 1; j++)
      encoded += b64_alphabet[char_array_4[j]];

    while ((i++ < 3))
      encoded += '=';
  }

  return encoded;
}

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 (14) 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 (75) 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 (2) 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