Papan skor arduino 3 panel P10 dengan kontrol android

Papan skor (score board) adalah papan tempat informasi dan hasil pertandingan yang dapat dilihat oleh semua orang yang berada di arena pertandingan dan penonton.

Papan skor dengan dot matrix (dmd) dengan kontrol android melalui bluetooth ini memiliki fitur :

  1. Tambah-kurang point, skor, waktu, dan ronde pertandingan serta reset point.
  2. Informasi running text yang bisa tampil di tengah pertandingan.
  3. Master reset untuk menginisialisasi semua informasi pertandingan.

Skema papan skor arduino

lepas ‘pin 0’ arduino – bluetooth saat upload sketch:

komponen papan skor bluetooth

  1. Arduino Uno
  2. 3 buah DMD Panel P10
  3. Bluetooth HC-05
  4. Android

Sketch/koding scoring board arduino dengan android melalui bluetooth

#include <SoftwareSerial.h>
#include <DMD_Semesin.h>
#include <fonts/Arial16.h>
#include <fonts/Arial_Black_16.h>
#include <fonts/SystemFont5x7.h>
#include <fonts/SystemFont5x7Gemuk.h>
#include <Wire.h>

//defenisi pin
#define pinOE         9
#define pinSCK        8
#define pinA          6
#define pinB          7

#define DISPLAYS_WIDE 3
#define DISPLAYS_HIGH 1

#define fontPembuka     Arial16
#define fontSkor        Arial_Black_16
#define fontInformasi   SystemFont5x7
#define fontWaktu       SystemFont5x7
#define fontRonde       SystemFont5x7Gemuk

SPIDMD dmd(DISPLAYS_WIDE, DISPLAYS_HIGH);

//SoftwareSerial bluetooth(2, 3);
#define bluetooth     Serial

byte pointA, pointB, skorA, skorB, ronde = 0;
uint16_t waktu = 0;
byte Arial14TengahY;
char strInformasi[200] = "Selamat Datang";
char bufferBluetooth[200];
bool pertandinganBerjalan;
long millisDetik;
long millisEfek;
byte detikSebelumnya = 60;
bool modeInformasi;

EfekMarque efekMarque;

enum perintah {
  initPerangkat,
  pointAplus,
  pointAminus,
  pointBplus,
  pointBminus,
  skorAplus,
  skorAminus,
  skorBplus,
  skorBminus,
  rondePlus,
  rondeMinus,
  menitPlus,
  menitMinus,
  text,
  resetPoint,
  resetSemua,
  mulai,
};

DMD_TextBox boxSkorA(dmd, 0, 0, 28, 16);
DMD_TextBox boxSkorB(dmd, 68, 0, 28, 16);

void setup() {
  Serial.begin(9600);
  bluetooth.begin(9600);

  Serial.println(F("Papan skor arduino 3 panel P10 dengan kontrol android"));
  Serial.println(F("https://www.project.semesin.com"));


  dmd.setBrightness(128);
  dmd.selectFont(fontPembuka);
  dmd.clearScreen();
  dmd.begin();
  dmd.drawString(0, 0, F("Papan Skor bluetooth"));
  delay(1000);
  dmd.clearScreen();

  efekMarque.mode = nonAktif;
  efekMarque.sumber = sumberRAM;
  efekMarque.font = fontInformasi;
  efekMarque.kiri = 28;
  efekMarque.atas = 0;
  efekMarque.tinggi = 8;
  efekMarque.lebar = 40;
  efekMarque.step = 1;
  efekMarque.skip = 0;

  tampilanUtama();

  Serial.println("Sistem dimulai");

  millisDetik = millis();
}

void loop() {
  if (millisDetik != millis() / 1000L)
  {
    millisDetik = millis() / 1000L;
    if (pertandinganBerjalan)
    {
      waktu++;

      if (!modeInformasi)
      {
        tampilanUtama();
      }
    }
  }

  if (millisEfek < millis() - 100)
  {
    millisEfek = millis();
    if (efekMarque.mode == XMinus)
    {
      dmd.marqueeXMinus(&efekMarque);
    }
    else
    {
      modeInformasi = false;
      tampilanUtama();
    }
  }

  if (bluetooth.available())
  {
    byte tokenMulai = bluetooth.read();
    Serial.println(tokenMulai, HEX);
    if (tokenMulai == 0xFE)
    {
      delay(2);
      byte perintah = bluetooth.read();
      delay(2);
      byte panjang = bluetooth.read();

      for (uint16_t i = 0; i < panjang; i++)
      {
        delay(2);
        char c = bluetooth.read();
        bufferBluetooth[i] = c;
      }
      delay(2);
      byte tokenSelesai = bluetooth.read();
      if (tokenSelesai == 0xFF)
      {
        uint16_t i;
        switch (perintah)
        {
          case initPerangkat:
            bluetooth.write(237);
            break;
          case pointAplus:
            pointA++;
            break;
          case pointAminus:
            pointA--;
            break;
          case pointBplus:
            pointB++;
            break;
          case pointBminus:
            pointB--;
            break;
          case skorAplus:
            skorA++;
            break;
          case skorAminus:
            skorA--;
            break;
          case skorBplus:
            skorB++;
            break;
          case skorBminus:
            skorB--;
            break;
          case rondePlus:
            ronde++;
            break;
          case rondeMinus:
            ronde--;
            break;
          case menitPlus:
            waktu += 60 ;
            break;
          case menitMinus:
            if (waktu > 60)
              waktu -= 60;
            else
              waktu = 0;
            break;
          case resetPoint:
            pointA = 0;
            pointB = 0;
            break;
          case resetSemua:
            pointA = 0;
            pointB = 0;
            skorA = 0;
            skorB = 0;
            ronde = 0;
            waktu = 0;
            break;
          case mulai:
            pertandinganBerjalan = !pertandinganBerjalan;
            break;
          case text:
            for (i = 0; i < panjang; i++)
            {
              strInformasi[i] = bufferBluetooth[i];
            }
            strInformasi[i] = 0;
            dmd.drawFilledBox(28, 0, 67, 7, GRAPHICS_OFF);
            efekMarque.init = true;
            efekMarque.alamat = strInformasi;
            efekMarque.mode = XMinus;
            efekMarque.clear = 40;
            modeInformasi = true;

            millisEfek = millis();
            break;
        }
        if (pointA == 255)
          pointA = 0;
        if (pointB == 255)
          pointB = 0;
        if (skorA == 255)
          skorA = 0;
        if (skorB == 255)
          skorB = 0;
        if (ronde == 255)
          ronde = 0;
        if (waktu == 3600)
          waktu = 0;

        if (!modeInformasi)
        {
          tampilanUtama();
        }
      }
    }
  }
}
byte bin2bcd(byte val)
{
  return val + 6 * (val / 10);
}

void tampilanUtama()
{
  byte lebarText;
  dmd.selectFont(fontSkor);
  Arial14TengahY = (dmd.height - dmd.fontHeader.height) / 2;

  boxSkorA.clear();
  boxSkorB.clear();
  lebarText = dmd.stringWidth(String(pointA));
  dmd.drawString((28 - lebarText) / 2 + 0, Arial14TengahY, String(pointA));
  lebarText = dmd.stringWidth(String(pointB));
  dmd.drawString((28 - lebarText) / 2 + 68, Arial14TengahY, String(pointB));


  dmd.selectFont(fontWaktu);
  char waktuStr[] = "00:00";
  byte menitBCD = bin2bcd(waktu / 60);
  byte detikBCD = bin2bcd(waktu % 60);
  waktuStr[0] = (menitBCD >> 4) + 0x30;
  waktuStr[1] = (menitBCD & 0x0F) + 0x30;
  waktuStr[3] = (detikBCD >> 4) + 0x30;
  waktuStr[4] = (detikBCD & 0x0F) + 0x30;
  lebarText = dmd.stringWidth(waktuStr);
  dmd.drawString((dmd.width - lebarText) / 2, 0, waktuStr);

  dmd.selectFont(fontRonde);

  dmd.drawString(28, 8, String(skorA));
  lebarText = dmd.stringWidth(String(skorB));
  dmd.drawString((68 - lebarText), 8, String(skorB));

  lebarText = dmd.stringWidth(String(ronde));
  dmd.drawString((dmd.width - lebarText) / 2, 8, String(ronde));
}

screenshot apk papan skor

File papan skor android

 

Properti tabel dinamis app inventor dengan WebViewer

MIT App Inventor 2 menawarkan kemudahan dalam membuat aplikasi apk android. Namun dibalik kesederhanaannya App Inventor memiliki kelemahan pada aplikasi dengan jumlah komponen yang banyak. Penyebabnya adalah area design yang terbatas dan bersifat semi statis.

Perancangan tabel dinamis AI2 ini dapat memudahkan dalam merancang apk aplikasi android dengan fitur:

  1. Komponen/Palette bisa disesuaikan, sementara yang tersedia adalah tabel, judul, label, input checkbox, input select 1-4, input byte, input int, input slider, input float, input text, button, button horizontal, horizontal line.
  2. Palette tabel dengan tipe yang tersedia : label increment, label integer, label text, input checkbox, input select 1-4, input byte, input int, input slider, input float, input text, button.
  3. Penggunaan WebViewer memungkinkan tampilan sizeable atau dapat diperbesar/diperkecil.

Designer Dinamis App Inventor dengan WebViewer

Untuk menggunakan platform ini, buatlah di designer cukup satu komponen saja yaitu : WebViewer

upload file “semesin.html”, file ini berisi script yang berfungsi untuk berkomunikasi antara webViewer dengan apk app Inventor.

<body onload="document.getElementById('content').innerHTML = window.AppInventor.getWebViewString();">
<div id="content"></div>
</body>
<script type="text/javascript">
  function checkboxChange(id, value)
  {
    if (value == true)
    {
      window.AppInventor.setWebViewString(id + ',1');
    }
    else
    {
      window.AppInventor.setWebViewString(id + ',0');
    }
  }
  function inputChange(id, value)
  {
    window.AppInventor.setWebViewString(id + ',' + value);
  }
</script>

fungsi window.AppInventor.getWebViewString() adalah mengambil nilai dari app inventor (dalam format html)

sedangkan window.AppInventor.setWebViewString() berfungsi mengirimkan data ke app inventor.

 

Struktur properti dan tabel dinamis menggunakan App Inventor

Untuk membangun skema properti App Inventor, buatlah list dalam format berikut :

  • List teks
  • List tipe
  • List nilai

Apabila  list tipe bernilai tabel maka list nilai diisi dengan format :

  • List tabel teks
  • List tabel tipe
  • List tabel nilai

berikut ini contoh struktur properti designer dinamis webViewer:

disamping itu perlu juga dibangun mekanisme handler/penanganan khususnya tombol-tombol mirip properti button.onclick().

contoh tampilan membuat tabel dengan mit app inventor :

File membuat tabel dinamis dengan app inventor:

  1. DinamikPropertiWebViewer.aia
  2. DinamikPropertiWebViewer.apk
  3. semesin.html

Komunikasi data Bluetooth dengan App Inventor

Bluetooth adalah Sistem jaringan lokal tanpa kabel. Bluetooth telah digunakan secara luas pada perangkat android dan telepon pintar lainnya.

Menghubungkan ke bluetooth server

Untuk mempermudah jalan program app inventor, proses menghubungkan bluetooth ke server dimasukkan kedalam sebuah prosedur.

Prosedur ‘Hubungkan_Bluetooth’ ini bisa dipanggil dengan variabel ‘alamatBluetooth’ yang berisi alamat unik bluetooth. Sebelum dihubungkan prosedur akan mengecek status ‘bluetooth.available’, jika aktif, dilanjutkan dengan pengecekan status ‘bluetooth.IsConnected’, dan mematikan bluetooth jika sedang terkoneksi.

Selanjutnya bluetooth dihubungkan dengan fungsi ‘bluetoothClient.Connect’ dengan variabel alamat yang diberikan.

Pemanggilan bluetooth saat Inisialisasi

Apabila sistem menghubungkan bluetooth dibuat otomatis, maka bluetooth akan dihubungkan keserver dengan alamat yang tersimpan sebelumnya pada database ‘TinyDB’. Pemanfaatan database ini adalah untuk otomatisasi data saat aplikasi app dibuka tanpa perlu disetting ulang, cukup menggunakan settingan terakhir.

Koneksi bluetooth dengan alamat langsung

Jika alamat bluetooth server sudah diketahui, app bisa langsung mengkondisikan tombol sebagai pemanggil prosedur ‘hubungkan_bluetooth’ dengan alamat yang ada pada ‘textbox’.

Menghubungkan bluetooth dengan alamat pada daftar bluetooth

Daftar perangkat bluetooth yang terhubung ke android bisa diambil sebagai referensi alamat. Sebelum digunakan, elemen ‘listPicker’ digunakan sebagai penampung daftar bluetooth yang tersedia.

Apabila item yang ada dalam daftar sudah dpilih, maka akan dipanggil prosedur ‘hubungkan_Bluetooth’ dengan variabel alamat terpilih.

Putuskan hubungan bluetooth

Jika ingin memutuskan bluetooth dari server, cukup menggunakan fungsi ‘BluetoothClient.Disconect’

Cek koneksi bluetooth

Status konksitas bluetooth bisa diketahui dengan fungsi ‘BluetoothClient.IsConnected’

Mengirim data string melalui bluetooth

Untuk mengirim data melalui bluetooth, terlebih dahulu dipastikan koneksi bluetooth dengan fungsi’bluetoothClient.IsConnected’. Dan apabila terhubung, proses pengiriman string dilakukan dengan memanggil fungsi ‘bluetoothClient.SendText’ dengan variabel ‘text’ yang diisi contohnya text dalam ‘textBox’.

Menerima data dari bluetooth

Jika ada data yang dikirim melalui bluetooth, data tersebut bisa dideteksi dengan fungsi ‘bluetoothClient.SendText’ seperti pada block berikut :

Dengan bantuan ‘clock.Timer’, setiap interval waktu dilakukan pengecekan apabila ada data yang diterima lewat bluetooth, kemudian mengambilnya dengan fungsi ‘bluetooth.ReceiveText’.

Namun fungsi diatas memiliki beberapa kelemahan yaitu:

  1. Data yang diterima tidak diparsing, sehingga data apapun yang diterima adalah merupakan deretan String.
  2. Jika dalam satu interval waktu diterima beberapa data, maka data tersebut dianggap suatu kesatuan.
  3. Jika proses pengiriman data berlangsung saat interupsi timer terjadi, maka data tersebut akan terpotong (data tidak utuh).

Untuk menutui itu digunakan algoritma app inventor yang lebih rumit namun mampu berjalan pada jumlah data besar.

Proses pengambilan data dari buffer android dilakukan secara parsial sehingga terhindar dari pemotongan, dengan metode ini dimungkinkan menerima beberapa nilai variabel sekaligus (dalam lalu lintas kecepatan tinggi).

Dalam contoh ini digunakan format ‘namaVariabel’=’nilai’, dalam contoh sketch arduino :

void setup() {
  Serial.begin(9600);
  Serial.println("Koneksi Beluetooth pada Android dengan App Inventor");
  Serial.println("https://www.project.semesin.com/");
  Serial.println();
}

byte variabel1 = 0;
uint16_t variabel2 = 1000L;

void loop() {
  while (Serial.available())
  {
    Serial.write(Serial.read());
  }
  delay(1000);
  Serial.println("var1=" + String(variabel1));
  Serial.println("var2=" + String(variabel2));
  variabel1 += 1;
  variabel2 += 10;
}

Mendeteksi kegagalan bluetooth

Fungsi ‘bluetoothClient.BluetoothError’ akan mendeteksi jika terjadi kegagalan bluetooth seperti kesalahan dalam proses menghubungkan, mengirim atau menerima data. Blok diatas akan mengirimkan pesan kepada pengguna melalui label ‘pesan’.

Design cara komunikasi bluetooth app inventor:

Block lengkap sistem komunikasi bluetooth android:

apk menghubungkan bluetooh dengan app inventor:

Multi screen dengan App Inventor

Aplikasi App Inventor dibuat diatas screen. Screen adalah halaman tempat meletakkan interface, layout dan komponen lainnya.

Tutorial pindah antar screen ini mencakup metode pindah screen yang biasa digunakan.

Layout scroll

Apabila ruang (space) satu screen tidak mencukupi, maka bisa memanfaatkan layout dalam mode scroll baik vertikal maupun horizontal.

Penggunaan layout scroll sangat efektif karena ruang yang disediakan lebih besar.

Banyak Screen App Inventor

Pada aplikasi App Inventor, kita bisa membangun sebuah app dengan lebih dari satu screen. Dengan banyak screen kita bisa mengelompokkan komponen-komponen agar lebih terorganisir.

Screen bertindak sebagai alas tempat komponen. Apabila sebuah screen saat ini (screen induk) membuka screen lainnya (screen anak), maka screen anak akan menimpa screen induk.

Perpindahan antar Screen dengan nilai awal dan nilai balik

Sebuah screen bisa mengirim nilai awal (start value) ke screen anaknya. juga sebaliknya screen anak bisa mengirim hasil (result) ke screen induknya.

Dari contoh diatas :

  1. Button1 adalah tombol untuk membuka ‘screen2’, dengan kontrol ‘open another screen’ dan variabel ‘screenName’ diisi dengan ‘Screen2’, maka ketika button1 ditekan ‘screen2’ akan dibuka diatas ‘screen1’.
  2. Button2 adalah tombol untuk membuka screen3, pemanfaatan fungsi ‘open another screen with start value’ dengan variabel ‘screenName’ dan ‘startValue’ diisi dengan input interface ‘textBox1.text’, maka screen induk akan mengirimkan nilai awal dalam ‘textbox1.text’ ke ‘screen3’.
  3. Fungsi ‘other screen closed’ akan dijalankan saat terdeteksi sebuah screen anak ditutup dan dan kembali ke screen ini (induk). variabel ‘result’ akan memiliki nilai yang dikirim oleh screen anak.

Perpindahan antar screen anak

Pindah atar screen akan bisa dalam dua metode:

  1. Pindah ke screen anak lainnya sebagai screen cucu (tanpa menutup screen sekarang)
  2. Pindah ke screen anak lainnya sebagai ganti anak (dengan menutup screen sekarang).

Pada blok diatas adalah metode pindah antar screen anak sebagai ganti screen sekarang dengan tetap menginduk ke ‘screen1’.

Penggunaan fungsi ‘if’ dengan variabel ‘true’ hanya sebuah trik untuk menempatkan prosedur/fungsi lain dibawah fungsi ‘open another screen’.

Nilai awal dari screen induk

Saat ‘screen3’ dibuka, app akan menjalankan terlebih dahulu fungsi ‘Initialize’. Fungsi ini ditugaskan mengambil nilai awal yang dikirimkan oleh screen induk dalam variabel ‘get start value’ dan menyimpannya kedalam interface ‘textBox1/text’

Mengirim nilai balik ke screen induk

Ada beberapa cara untuk kembali ke screen induk, diantaranya adalah fungsi ‘BackPressed’ atau penggunaan tombol.

Fungsi ‘close screen with value’ berfungsi menutup screen dengan mengirimkan nilai balik dalam variabel ‘result’.

design app inventor banyak screen:

Screenshoot tukar screen app inventor:

apk multi screen app inventor: MultiScreen.apk

Fungsi Waktu App Inventor

Data waktu pada App Inventor berupa tanggal dan waktu yang dinyatakan dalam orde milidetik dari 1 Januari 1970. Data waktu ini bisa digunakan untuk beberapa keperluan diantaranya hitung mundur dan durasi.

Data waktu Sekarang (now)

Interface / modul clock memiliki fungsi ‘now’ yang menyediakan data waktu serta fungsi format datetime guna mendapatkan text waktu yang diinginkan.

Block diatas akan mengganti text pada label1 dengan text waktu sekarang dalam format MM/dd/yyyy hh:mm:ss a. Penggantian dilakukan setiap interval dari clock1 (default 1 detik).

Ambil waktu sistem android

Untuk mengambil data waktu ketika tombol di tekan dengan format tertentu bisa menggunakan block berikut:

Ketika button1 ditekan, text pada label2 akan diganti dengan waktu sekarang dalam format hh:mm.

Edit data waktu dengan TimePicker

TimePicker berfungsi sebagai dialog pengedit waktu dengan nilai default waktu sekarang (now)

Ketika tombol [selesai] pada dialog timePicker ditekan, text pada tombol [TimePicker] akan diganti dengan hasil pengeditan jam dan menit.

Angka dua digit (time pattern) app inventor

Agar tampilan waktu jam:menit terlihat rapi dalam format waktu hh:mm, App inventor 2 belum mengakomodir text pattern (kecuali sensor clock), untuk itu bisa dikombinasikan dengan perhitungan matematis yakni apabila angka kecil dari 10 maka akan ditambahkan ‘0’ diawalnya.

Hitung mundur (Countdown)

Hitung mundur adalah metode penghitungan waktu tunda. Hitung mundur bisa dimanfaatkan untuk berbagai keperluan seperti aktifasi sebuah interface/screen dan sebagainya.

Hitung mundur dengan app inventor diaplikasikan dalam orde mili detik, agar lebih mudah waktu hitung mundur dikonversi menjadi detik dengan fungsi DurationToSeconds.

Untuk perancangan hitung mundur dengan app inventor dibutuhkan variabel waktu mulai dan durasi. Dengan bantuan ‘Clock’ penghitungan dideteksi setiap detik.

Hitung munder dengan metode time epoch ini bisa disetting dalam orde tahunan atau sesuai kebutuhan.

Menghitung durasi dengan app inventor

Durasi / selisih waktu adalah waktu yang dibutuhkan antara dua evenr/trigger, hasilnya diperoleh dengan formula waktu event2 dikurangi waktu event1.

Penghitungan durasi diukur dalam orde mili detik.

Block lengkap fungsi waktu menggunakan app inventor:

Design fungsi waktu dengan app inventor:

Tampilan app fungsi waktu memakai app inventor:

File apk fungsi waktu pada app inventor: FungsiWaktu.apk

Simpan dan ambil data setting menggunakan metode list pada App Inventor

Database tinyDB

Cara menyimpan data input app inventor agar dapat ditampilkan kembali saat app dibuka kembali adalah dengan memanfaatkan media storage seperti TinyDB untuk menyimpan data tersebut. Data-data yang disimpan dalam database TinyDB diberi index/tag tertentu. Untuk mengambil data dari TinyDB dibutuhkan input/tag yang sesuai.

Kegunaan menyimpan data ke dalam database TinyDB adalah supaya data yang telah di entri tidak hilang setelah app ditutup.

List interface / object

Penggunaan interface dalam jumlah besar pada App Iventor sebaiknya menggunakan list, karena dengan list proses pengambilan dan penyimpanan hasil lebih mudah dan memperpendek block.

berikut keterangan block perancangan apk App Inventor:

Tahap awal penggunaan list adalah dengan menginisialisasi-nya sebagai list kosong (empty list) masing-masing kelompok interface (seperti checkbox dan textbox)

Kemudian list-list tersebut ditambahkan item yang bersesuaian, dalam contoh ini checkbox1, checkbox2, checkbox3 ditambahkan dalam list Array_checkbox. dan textbox1, textbox2, textbox3 ditambahkan dalam list Array_textbox.

Selanjutnya prosedur ambil_dari_database dipanggil untuk mengambil data-data yang tersimpan sebelumnya ke dalam masing-masing item list.

Prosedur ini menggunakan metode list dengan memecah item-item dalam variabel Array_checkbox dan Array_textbox.

Prosedur ambil data dari database akan melaksanakan fungsi mengambil data-data dari tinyDB dengan tag checkbox1, checkbox2, checkbox3 dan textbox1, textbox2, textbox3.

Prosedur Simpan_ke_database berfungsi menyimpan data-data yang telah di entry  kedalam database dengan tag/index tertentu.

Contoh penggunaan prosedur simpan_ke_database adalah saat pengguna / user menekan tombol back. Sebelum keluar dari app, terlebih dahulu dipanggil prosedur Simpan_ke_database untuk menyimpan data-data entri interface untuk digunakan kembali saat app dibuka selanjutnya.

blok app Inventor cara menyimpan data dan cara menggunakan list yang digunakan :

Design screen app inventor dengan banyak interface serupa yang di kelompokkan kedalam list yang berguna mempersingkat perulangan block.

dan apk cara menggunakan database app Inventor yang dipakai dalam contoh ini:

SimpanDanAmbilDataSetting.apk

Koneksi Arduino dan Android melalui bluetooth dan MIT App Inventor

Bluetooth dan Arduino bisa digunakan untuk berkomunikasi dengan Android menggunakan MIT App Inventor, berikut langkahnya:

Arduino + bluetooth

Mempersiapkan rangkaian yang terdiri dari Arduino mega dan modul bluetooth HC-05.

Masukkan program atau sketch berikut

String text = "";
void setup() {
  Serial.begin(9600);
  Serial1.begin(9600);

  Serial.println("Koneksi arduino dengan app inventor melalui bluetooth");
  Serial.println("Ketik pesan yang akan dikirim (pastikan setting serial ke \"both NL &amp; CR\"");
  Serial.println("https://www.project.semesin.com");
}

void loop() {
  while(Serial.available())
  {
    char c = Serial.read();
    text += c;
    if(c == '\n')
    {
      Serial1.print(text);
      text = "";
    }
  }
  while(Serial1.available())
  {
    Serial.print(char(Serial1.read()));
  }
}

Sketch ini akan menerima text dari “Serial Monitor” dan meneruskannya ke sambungan bluetooth

Begitu juga apabila ada data yang masuk melalui hubungan bluetooth akan ditampilkan ke Serial monitor.

 

Android + App Inventor

Instal apk ini di android BluetoothConnection.apk

Atau bisa mengedit Design MIT App Inventor berikut BluetoothConnection.aia

Design:

Block :

Blok inisialisasi merupakan block yang pertama kali dipanggil ketika aplikasi dijalankan, Jika bluetooth tidak aktif maka blok ini akan memberikan peringatan dan jika bluetooth aktif maka daftar perangkat bluetooth yang terhubung dimasukkan dalam daftar (list)

Blok buttonConnect.Click memiliki dua fungsi yaitu menghubungkan bluetooth dengan perangkat arduino dan memutuskan koneksi bluetooth. Jika bluetooth belum terhubung maka fungsi ini akan memanggil fungsi ListPicker1 yang menampilkan daftar perangkat bluetooth yang terhubung ke android.

Blok ListPicker1.AfterPicking merupakan sebuah even yang berjalan ketika daftar perangkat bluetooth sudah dipilih. Kemudian android diperintahkan untuk membuat sambungan bluetooth dengan perangkat arduino.

Blok buttonSend.Click bekerja saat pengguna menekan tombol kirim dan akan mengirimkan data yang ditulis di textBox.

Blok Clock1.Timer bekerja setiap interval untuk memantau adanya pengiriman data dari perangkat arduino, kemudian akan ditampilkan di layar aplikasi.

Blok Screen1.ErrorOccured merupakan sistem penanganan apabila aplikasi bermasalah dan akan memutuhkan hubungan bluetoothnya.

Block lengkapnya:

Artikel terkait : https://www.project.semesin.com/2018/06/02/komunikasi-data-bluetooth-dengan-app-inventor/