31 Januari 2026

K 3. UJI DOT MATRIKS

K3. UJI DOT MATRIKS


Kerjakan proyek ini wokwi.com




B. SKETCH YANG PERLU DIKETIK:

// Use the Parola library to scroll text on the display
//
// Demonstrates the use of the scrolling function to display text received
// from the serial interface
//
// User can enter text on the serial monitor and this will display as a
// scrolling message on the display.
// Speed for the display is controlled by a pot on SPEED_IN analog in.
// Scrolling direction is controlled by a switch on DIRECTION_SET digital in.
// Invert ON/OFF is set by a switch on INVERT_SET digital in.
//
// UISwitch library can be found at https://github.com/MajicDesigns/MD_UISwitch
// MD_MAX72XX library can be found at https://github.com/MajicDesigns/MD_MAX72XX
//

#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>

// set to 1 if we are implementing the user interface pot, switch, etc
#define USE_UI_CONTROL 0

#if USE_UI_CONTROL
#include <MD_UISwitch.h>
#endif

// Turn on debug statements to the serial output
#define DEBUG 0

#if DEBUG
#define PRINT(s, x) { Serial.print(F(s)); Serial.print(x); }
#define PRINTS(x) Serial.print(F(x))
#define PRINTX(x) Serial.println(x, HEX)
#else
#define PRINT(s, x)
#define PRINTS(x)
#define PRINTX(x)
#endif

// Define the number of devices we have in the chain and the hardware interface
// NOTE: These pin numbers will probably not work with your hardware and may
// need to be adapted
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 11
#define CLK_PIN   13
#define DATA_PIN  11
#define CS_PIN    10

// HARDWARE SPI
MD_Parola P = MD_Parola(HARDWARE_TYPE, CS_PIN, MAX_DEVICES);
// SOFTWARE SPI
//MD_Parola P = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

// Scrolling parameters
#if USE_UI_CONTROL
const uint8_t SPEED_IN = A5;
const uint8_t DIRECTION_SET = 8;  // change the effect
const uint8_t INVERT_SET = 9;     // change the invert

const uint8_t SPEED_DEADBAND = 5;
#endif // USE_UI_CONTROL

uint8_t scrollSpeed = 60;    // default frame delay value
textEffect_t scrollEffect = PA_SCROLL_LEFT;
textPosition_t scrollAlign = PA_LEFT;
uint16_t scrollPause = 2000; // in milliseconds

// Global message buffers shared by Serial and Scrolling functions
#define BUF_SIZE  75
char curMessage[BUF_SIZE] = { "" };
char newMessage[BUF_SIZE] = { "Selamat Datang di eskul Robotika Samarinda, bersama pak firdaus" };
bool newMessageAvailable = true;

#if USE_UI_CONTROL

MD_UISwitch_Digital uiDirection(DIRECTION_SET);
MD_UISwitch_Digital uiInvert(INVERT_SET);

void doUI(void)
{
  // set the speed if it has changed
  {
    int16_t speed = map(analogRead(SPEED_IN), 0, 1023, 10, 150);

    if ((speed >= ((int16_t)P.getSpeed() + SPEED_DEADBAND)) ||
        (speed <= ((int16_t)P.getSpeed() - SPEED_DEADBAND)))
    {
      P.setSpeed(speed);
      scrollSpeed = speed;
      PRINT("\nChanged speed to ", P.getSpeed());
    }
  }

  if (uiDirection.read() == MD_UISwitch::KEY_PRESS) // SCROLL DIRECTION
  {
    PRINTS("\nChanging scroll direction");
    scrollEffect = (scrollEffect == PA_SCROLL_LEFT ? PA_SCROLL_RIGHT : PA_SCROLL_LEFT);
    P.setTextEffect(scrollEffect, scrollEffect);
    P.displayClear();
    P.displayReset();
  }

  if (uiInvert.read() == MD_UISwitch::KEY_PRESS)  // INVERT MODE
  {
    PRINTS("\nChanging invert mode");
    P.setInvert(!P.getInvert());
  }
}
#endif // USE_UI_CONTROL

void readSerial(void)
{
  static char *cp = newMessage;

  while (Serial.available())
  {
    *cp = (char)Serial.read();
    if ((*cp == '\n') || (cp - newMessage >= BUF_SIZE - 2)) // end of message character or full buffer
    {
      *cp = '\0'; // end the string
      // restart the index for next filling spree and flag we have a message waiting
      cp = newMessage;
      newMessageAvailable = true;
    }
    else  // move char pointer to next position
      cp++;
  }
}

void setup()
{
  Serial.begin(57600);
  Serial.print("\n[Parola Scrolling Display]\nType a message for the scrolling display\nEnd message line with a newline");

#if USE_UI_CONTROL
  uiDirection.begin();
  uiInvert.begin();
  pinMode(SPEED_IN, INPUT);

  doUI();
#endif // USE_UI_CONTROL

  P.begin();
  P.displayText(curMessage, scrollAlign, scrollSpeed, scrollPause, scrollEffect, scrollEffect);
}

void loop()
{
#if USE_UI_CONTROL
  doUI();
#endif // USE_UI_CONTROL

  if (P.displayAnimate())
  {
    if (newMessageAvailable)
    {
      strcpy(curMessage, newMessage);
      newMessageAvailable = false;
    }
    P.displayReset();
  }
  readSerial();
}


15 November 2025

K 2: Belajar di Wokwi_Membuat Jam Digital

Arduino Uno, RTC DS1307, dan LCD I2C
Pin Arduino UnoPin RTC DS1307Pin LCD I2CFungsi
GNDGNDGNDGround (Tanah)
5VVCCVCCPower (Daya)
A4 (SDA)SDASDAData I2C
A5 (SCL)SCLSCLClock I2C





B. SKETCH YANG PERLU DIKETIK:

// Sertakan library yang dibutuhkan
#include <Wire.h>
#include <RTClib.h> // Library untuk Real Time Clock (RTC)
#include <LiquidCrystal_I2C.h> // Library untuk LCD I2C

// Inisialisasi RTC DS1307
RTC_DS1307 rtc;

// Inisialisasi LCD pada alamat 0x27 untuk layar 16x2.
// Alamat I2C umum untuk LCD adalah 0x27 atau 0x3F. Jika tidak jalan, coba ganti alamatnya.
LiquidCrystal_I2C lcd(0x27, 16, 2); 

void setup() {
  // Inisialisasi komunikasi I2C
  Wire.begin();
  
  // Inisialisasi LCD
  lcd.init();
  lcd.backlight();
  lcd.clear();
  
  // Periksa apakah modul RTC terhubung
  if (! rtc.begin()) {
    lcd.print("RTC tidak ditemukan");
    while (1); // Hentikan program
  }
  
  // Untuk mengatur waktu awal, hapus tanda komentar pada baris di bawah ini 
  // dan unggah *hanya sekali*. Setelah itu, komentar kembali baris tersebut.
  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Atur waktu ke waktu kompilasi PC
  
  lcd.print("Jam Digital");
}

void loop() {
  // Ambil waktu saat ini dari RTC
  DateTime now = rtc.now();
  
  // Posisikan kursor di baris kedua, kolom 0 (indeks dimulai dari 0)
  lcd.setCursor(0, 1); 
  
  // Tampilkan waktu dalam format HH:MM:SS
  
  // Jam
  if (now.hour() < 10) lcd.print('0'); // Tambahkan '0' di depan jika jam < 10
  lcd.print(now.hour());
  lcd.print(':');
  
  // Menit
  if (now.minute() < 10) lcd.print('0'); // Tambahkan '0' di depan jika menit < 10
  lcd.print(now.minute());
  lcd.print(':');
  
  // Detik
  if (now.second() < 10) lcd.print('0'); // Tambahkan '0' di depan jika detik < 10
  lcd.print(now.second());
  
  // Tunda selama 1 detik (1000 milidetik) sebelum update berikutnya
  delay(1000);
}

L1. Seri kode blok: kode blok di microbit

Microbit adalah penampil infomasi yang umumnya di pakai di lift biasanya menunjukkan informasi lantai berapa, dan biasanya memberikan informasi lift sedang naik atau turun. 

1. Langkah pertama buka tinkercad, create, circuit, pilih microbit 


2. Klik "Code" pilih jenis kode "Blocks"


3. Sesuaikan codeblocks seperti di gambar!








01 November 2025

DAFTAR ISI

Daftar Semua Postingan Blog Robomadina

Memuat semua postingan...

25 Oktober 2025

KODE UNTUK MENAMBAHKAN SKETCH DI BLOGGER


(Ini adalah kode sisipan untuk membuat postingan di blogger, tujuannya untuk mempermudah menambahkan kode yang akan di jelaskan)

<p><b><i>B. SKETCH YANG PERLU DIKETIK:</i></b></p><div style="border: 2px solid black; height: 300px; overflow-x: hidden; overflow-y: scroll; overflow: hidden scroll; width: 500px;"><div style="height: 250%;"><pre>#include &lt;Wire.h&gt;
#include &lt;LiquidCrystal_I2C.h&gt;

LiquidCrystal_I2C lcd(0x27, 16, 2); // alamat 0x27, ukuran LCD 16x2

String teks = "Kebersihan sebagian dari iman. Oleh Eskul Robomadina   "; // tambahkan spasi di akhir agar halus
int posisi = 0;

void setup() {
  lcd.init();
  lcd.backlight();
}

void loop() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(teks.substring(posisi, posisi + 16)); // tampilkan 16 karakter per langkah
  posisi++;
  if (posisi &gt; teks.length() - 16) {
    posisi = 0; // ulang dari awal
  }
  delay(300); // atur kecepatan scroll (ms)
}
</pre><div><br /></div></div></div>


SKETCH YANG PERLU DIKETIK:

<p><b><i>B. SKETCH YANG PERLU DIKETIK:</i></b></p><div style="border: 2px solid black; height: 300px; overflow-x: hidden; overflow-y: scroll; overflow: hidden scroll; width: 500px;"><div style="height: 250%;"><pre>#include &lt;Wire.h&gt;
#include &lt;LiquidCrystal_I2C.h&gt;

LiquidCrystal_I2C lcd(0x27, 16, 2); // alamat 0x27, ukuran LCD 16x2

String teks = "Kebersihan sebagian dari iman. Oleh Eskul Robomadina   "; // tambahkan spasi di akhir agar halus
int posisi = 0;

void setup() {
  lcd.init();
  lcd.backlight();
}

void loop() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(teks.substring(posisi, posisi + 16)); // tampilkan 16 karakter per langkah
  posisi++;
  if (posisi &gt; teks.length() - 16) {
    posisi = 0; // ulang dari awal
  }
  delay(300); // atur kecepatan scroll (ms)
}
</pre><div><br /></div></div></div>

SKETCH YANG PERLU DIKETIK (DENGAN TOMBOL COPY):

<p><b><i>B. SKETCH YANG PERLU DIKETIK:</i></b></p>

<div class="code-container" style="border: 2px solid black; width: 500px; height: 300px; position: relative; overflow-y: auto; overflow-x: hidden;">

  <button class="copy-btn" aria-label="Salin kode" title="Salin kode">
    <svg viewBox="0 0 24 24" fill="none" width="16" height="16">
      <path d="M16 21H6a2 2 0 0 1-2-2V7" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
      <rect x="8" y="3" width="13" height="13" rx="2" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
    </svg>
    <span>Copy</span>
  </button>

  <pre>#include &lt;Wire.h&gt;
#include &lt;LiquidCrystal_I2C.h&gt;

LiquidCrystal_I2C lcd(0x27, 16, 2); // alamat 0x27, ukuran LCD 16x2

String teks = "Kebersihan sebagian dari iman. Oleh Eskul Robomadina   "; // tambahkan spasi di akhir agar halus
int posisi = 0;

void setup() {
  lcd.init();
  lcd.backlight();
}

void loop() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(teks.substring(posisi, posisi + 16)); // tampilkan 16 karakter per langkah
  posisi++;
  if (posisi &gt; teks.length() - 16) {
    posisi = 0; // ulang dari awal
  }
  delay(300); // atur kecepatan scroll (ms)
}</pre>
</div>

<style>
.code-container {
  background: #f9fafb;
  font-family: "Courier New", monospace;
  border-radius: 6px;
  position: relative;
}

.code-container pre {
  margin: 0;
  padding: 10px;
  white-space: pre-wrap;
  word-wrap: break-word;
}

.copy-btn {
  position: absolute;
  top: 8px;
  right: 8px;
  background: #e5e7eb;
  border: none;
  color: #111827;
  font-size: 12px;
  padding: 4px 8px;
  border-radius: 6px;
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: 4px;
  transition: all 0.2s ease;
}

.copy-btn:hover {
  background: #d1d5db;
  color: #000;
}

.copy-btn.copied {
  background: #10b981;
  color: white;
}

.copy-btn svg {
  display: inline-block;
}
</style>

<script>
document.querySelectorAll('.copy-btn').forEach(button => {
  button.addEventListener('click', async () => {
    const code = button.parentElement.querySelector('pre').innerText;
    try {
      await navigator.clipboard.writeText(code);
      button.classList.add('copied');
      button.querySelector('span').innerText = 'Tersalin!';
      setTimeout(() => {
        button.classList.remove('copied');
        button.querySelector('span').innerText = 'Copy';
      }, 1800);
    } catch (err) {
      alert('Gagal menyalin!');
    }
  });
});
</script>

LANGKAH PALING MUDAH — BUAT ACCESS POINT ESP32

🧩 TUJUAN:

ESP32 bisa memancarkan Wi-Fi sendiri (Access Point), atau bisa juga menyambung ke modem lalu memancarkan ulang (Repeater sederhana).

LANGKAH PALING MUDAH — BUAT ACCESS POINT ESP32

🔹 1. Persiapan awal

Perangkat:

  • ESP32 board (misalnya DevKit v1)

  • Kabel USB data

  • Komputer/laptop dengan Arduino IDE

  • Koneksi internet untuk unduh library pertama kali

Software setup:

  1. Buka Arduino IDE

  2. Buka menu File → Preferences

  3. Di kolom Additional Board Manager URLs, tambahkan ini:

    https://dl.espressif.com/dl/package_esp32_index.json
  4. Klik OK

  5. Lalu buka Tools → Board → Board Manager

  6. Cari ESP32, lalu Install

🔹 2. Pilih board

Buka:

Tools → Board → ESP32 Arduino → ESP32 Dev Module


🔹 3. Upload kode Access Point

Salin kode sederhana ini ⬇️

#include <WiFi.h>

const char* ssid = "ESP32_AP";
const char* password = "12345678";

void setup() {
  Serial.begin(115200);
  Serial.println("Membuat Access Point...");

  WiFi.softAP(ssid, password);

  IPAddress IP = WiFi.softAPIP();
  Serial.print("Access Point aktif di: ");
  Serial.println(IP);
}

void loop() {
  // Kosong, tidak perlu loop terus
}

🔹 4. Upload ke ESP32

  • Sambungkan ESP32 ke laptop

  • Klik Upload (panah kanan)

  • Tunggu selesai


🔹 5. Uji koneksi

  • Buka Wi-Fi di HP atau laptop

  • Akan muncul jaringan bernama ESP32_AP

  • Masukkan password 12345678

  • Setelah terhubung, kamu bisa lihat alamat IP-nya di Serial Monitor (biasanya 192.168.4.1)

Selesai — sekarang ESP32 jadi Access Point lokal!


💡 LANGKAH OPSIONAL: Buat ESP32 Jadi Wi-Fi Repeater

Kalau kamu ingin ESP32:

  • Menyambung ke modem Wi-Fi,

  • Lalu memancarkan ulang jaringan (repeater sederhana),

Langkahnya hampir sama, tapi dengan sedikit tambahan kode:

#include <WiFi.h>

const char* ssid_ap = "ESP32_Repeater";
const char* pass_ap = "12345678";

const char* ssid_sta = "SSID_MODEM_KAMU";
const char* pass_sta = "PASSWORD_MODEM_KAMU";

void setup() {
  Serial.begin(115200);

  // Hubungkan ke modem (Station mode)
  WiFi.mode(WIFI_AP_STA);
  WiFi.begin(ssid_sta, pass_sta);
  Serial.print("Menyambung ke ");
  Serial.println(ssid_sta);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nTersambung ke modem!");

  // Nyalakan Access Point baru
  WiFi.softAP(ssid_ap, pass_ap);
  Serial.print("Access Point aktif di: ");
  Serial.println(WiFi.softAPIP());
}

void loop() {
  // Tidak perlu apa-apa
}

📶 Sekarang:

  • ESP32 akan terhubung ke modem kamu (STA mode)

  • Dan juga memancarkan Wi-Fi baru bernama “ESP32_Repeater”

Tapi perlu dicatat:
🔸 Ini bukan repeater penuh NAT/router, hanya Wi-Fi bridge sederhana (tidak semua lalu lintas internet otomatis diteruskan).
Kalau ingin repeater yang benar-benar meneruskan internet, nanti kita bisa pasang firmware NAT ESP32 (resmi dari Espressif) — langkahnya agak lanjut.


🚀 Rangkuman Cepat

TujuanKodeKesulitan
Access Point lokal (tanpa internet)✅ Mudah
AP + connect ke modem (bridge sederhana)✅ Masih mudah⭐⭐
Repeater penuh (internet diteruskan)Bisa (firmware NAT)⭐⭐⭐⭐

🧭 1️⃣. Pahami konsep dasar repeater

Sebuah Wi-Fi repeater melakukan dua hal besar:

FungsiKeterangan
1. Station (STA) modeESP32 terhubung ke Wi-Fi utama (modem/router)
2. Access Point (AP) modeESP32 memancarkan sinyal Wi-Fi baru ke HP/laptop
3. NAT/Bridge (opsional)Data internet dari router diteruskan ke klien di AP

NodeMCU (ESP8266) atau ESP32 bisa melakukan fungsi 1 dan 2 bersamaan.
Tapi agar internet benar-benar diteruskan, dibutuhkan NAT (Network Address Translation) yang hanya bisa berjalan dengan firmware khusus, bukan kode Arduino biasa.


⚙️ 2️⃣. Pilih perangkat yang cocok

PilihanKelebihanCatatan
ESP32 DevKit (WROOM / DevKit v1)Dual-core, stabil, bisa AP + STA bersamaanPaling disarankan
ESP8266 NodeMCUBisa juga, tapi kapasitas kecilKurang stabil untuk banyak klien
Tambahan opsionalAntena eksternal 2.4 GHz, adaptor 5V 2AUntuk jangkauan dan daya lebih stabil

🔌 3️⃣. Dua pendekatan membuat repeater

💡 A. Repeater sederhana (local bridge)

➡️ Bisa dibuat dengan kode Arduino IDE
➡️ ESP32 akan:

  • Connect ke router utama

  • Buat Wi-Fi baru (AP)

  • Klien bisa konek, tapi internet belum diteruskan penuh (cocok untuk jaringan lokal / captive portal / IoT gateway)

📜 Contoh kode sudah saya berikan di atas (“AP + connect ke modem”).
Kelebihan: mudah, bisa langsung jalan.
Kekurangan: internet tidak diteruskan otomatis.


⚙️ B. Repeater penuh (dengan NAT)

➡️ Ini membuat ESP32 benar-benar menjadi Wi-Fi repeater seperti TP-Link, bisa meneruskan internet dari router ke HP/laptop.

Untuk ini kamu butuh:

Atau versi praktisnya:
👉 ESP32 NAT Router by martin-ger


🧰 4️⃣. Cara instal firmware NAT (tanpa coding sulit)

  1. Download firmware binary (file .bin) dari GitHub martin-ger
    (ada versi siap flash: “esp32_nat_router.bin”)

  2. Pasang driver USB ESP32 di laptop

  3. Jalankan tool ESP32 Flash Download Tool (atau gunakan esptool.py)

  4. Flash firmware ke board

  5. Sambungkan ESP32 ke laptop via USB

  6. Setelah upload, buka Wi-Fi di HP — akan muncul SSID default, misalnya:

    ESP32_NAT_Router
  7. Koneksikan HP ke SSID itu

  8. Buka browser → ketik 192.168.4.1
    Di sana ada web admin mini untuk setting:

    • Wi-Fi utama (SSID & password)

    • Nama Wi-Fi repeater baru (SSID baru)

  9. Setelah diatur dan restart → alatmu siap digunakan.

📶 ESP32 kini benar-benar jadi Wi-Fi repeater NAT penuh.
HP/laptop yang terhubung akan dapat internet dari modem utama.


🧩 5️⃣. (Opsional) Ubah jadi alat profesional

Setelah itu kamu bisa kembangkan:

  • Tambah web interface custom (HTML di SPIFFS)

  • Tambah monitor kekuatan sinyal

  • Tambah fitur mesh antar beberapa ESP32

  • Tambah power amplifier atau antena eksternal untuk jarak lebih jauh


📊 Perbandingan hasil akhirnya

AspekESP32 RepeaterTP-Link Repeater
Internet diteruskan✅ dengan NAT firmware✅ otomatis
StabilitasBaik (2-3 klien), tergantung sinyalSangat stabil (10+ klien)
Kemudahan setupSedang (perlu flash firmware)Sangat mudah (WPS)
Harga~Rp60–70 ribuRp300–400 ribu
FleksibilitasBisa dimodifikasi sesuka hatiTidak bisa diubah

Kalau kamu mau, saya bisa buatkan tutorial langkah-demi-langkah (dengan link download firmware, cara flash, dan uji koneksi) — supaya kamu benar-benar bisa membuat repeater ESP32 berfungsi seperti TP-Link.
Apakah mau saya bantu buatkan versi itu (lengkap dengan panduan flashing)?









(Ini adalah kode sisipan untuk membuat postingan di blogger, tujuannya untuk mempermudah menambahkan kode yang akan di jelaskan)

<p><b><i>B. SKETCH YANG PERLU DIKETIK:</i></b></p><div style="border: 2px solid black; height: 300px; overflow-x: hidden; overflow-y: scroll; overflow: hidden scroll; width: 500px;"><div style="height: 250%;"><pre>#include &lt;Wire.h&gt;
#include &lt;LiquidCrystal_I2C.h&gt;

LiquidCrystal_I2C lcd(0x27, 16, 2); // alamat 0x27, ukuran LCD 16x2

String teks = "Kebersihan sebagian dari iman. Oleh Eskul Robomadina   "; // tambahkan spasi di akhir agar halus
int posisi = 0;

void setup() {
  lcd.init();
  lcd.backlight();
}

void loop() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(teks.substring(posisi, posisi + 16)); // tampilkan 16 karakter per langkah
  posisi++;
  if (posisi &gt; teks.length() - 16) {
    posisi = 0; // ulang dari awal
  }
  delay(300); // atur kecepatan scroll (ms)
}
</pre><div><br /></div></div></div>