Minggu, 27 September 2026

IMPLEMENTASI ANALOG TO DIGITAL CONVERTER (ADC) DAN OUTPUT DIGITAL PADA MIKROKONTROLER ARDUINO UNO DAN ESP32


Disusun oleh


Muhammad Naufal Aziz

(24051204001)

Muhammad Rifqi Al Hafidh

(24051204009)

Ig. Krisna Wijaya Prihandono

(24051204032)

Ahmad Syihan Arijuddin

(24051204035)


BAB I

PENDAHULUAN

1.1 Latar Belakang

Sistem tertanam (embedded systems) dan Internet of Things (IoT) mengandalkan interaksi mendasar antara dunia fisik analog dan pemrosesan komputasi digital. Fenomena fisik seperti intensitas cahaya, suhu, dan pergeseran resistansi potensiometer bersifat kontinu (analog). Sebaliknya, unit pemroses sentral seperti mikrokontroler berbasis arsitektur AVR (Arduino Uno) maupun Tensor/Xtensa (ESP32) bekerja dalam domain diskrit biner (0 dan 1). Oleh karena itu, modul Analog to Digital Converter (ADC) menjadi komponen krusial dalam arsitektur komputer untuk mengonversi sinyal tegangan analog menjadi kuantisasi data digital.

Pada praktikum minggu kedua ini, dilakukan dua proyek implementasi input analog dan output digital berdasarkan materi perkuliahan Organisasi dan Arsitektur Komputer. Proyek pertama memanfaatkan Arduino Uno untuk membaca sinyal potensiometer melalui kanal ADC 10-bit dan secara sekuensial memetakan hasilnya untuk mengontrol 5 lampu LED secara bergantian. Proyek kedua menggunakan mikrokontroler ESP32 dengan resolusi ADC 16-bit pada MicroPython untuk membaca potensiometer geser, memetakan nilainya ke dalam skala numerik 0–9 pada tampilan LED Dot Matrix MAX7219 berbasis SPI, serta mentransmisikan data mentah ADC dan skala visual secara real-time ke broker MQTT publik (EMQX) menggunakan protokol komunikasi IoT.

1.2 Rumusan Masalah

  • Bagaimana mekanisme pemrosesan sinyal analog dari potensiometer menjadi data kuantisasi digital menggunakan fitur ADC pada mikrokontroler Arduino Uno dan ESP32?
  • Bagaimana teknik pemetaan (mapping) dan pembatasan nilai ADC untuk mengendalikan sekuensial 5 lampu LED serta menampilkan angka pada LED Dot Matrix MAX7219?
  • Bagaimana alur transmisi data hasil pembacaan sensor secara real-time dari ESP32 ke MQTT Broker dalam format JSON menggunakan arsitektur Publish-Subscribe?

1.3 Tujuan Laporan

  • Memahami prinsip kerja Analog to Digital Converter (ADC) dan konversi sinyal kontinu menjadi data digital diskrit pada mikrokontroler.
  • Mengimplementasikan pemetaan nilai ADC potensiometer untuk mengontrol output digital sekuensial 5 LED pada Arduino Uno.
  • Mengimplementasikan antarmuka SPI untuk mengendalikan LED Dot Matrix MAX7219 serta mengintegrasikan sistem ESP32 dengan protokol MQTT.

1.4 Manfaat Penulisan

  • Memberikan pemahaman mendalam mengenai arsitektur I/O analog dan digital pada mikrokontroler populer (Arduino Uno dan ESP32).
  • Menyediakan panduan teknis implementasi driver tampilan matriks berbasis SPI dan pengiriman telemetri berbasis MQTT.

BAB II

TINJAUAN PUSTAKA

2.1 Dasar Teori

Sistem mikrokontroler mengolah sinyal I/O melalui beberapa konsep dasar berikut yang merujuk pada referensi perkuliahan:

  • Konsep Tegangan Digital: Logika digital diwakili oleh level tegangan VCC (biasanya 5V atau 3.3V) sebagai logika '1' (HIGH) dan Ground/0V sebagai logika '0' (LOW). Pemberian resistor Pull-Up atau Pull-Down (umumnya 10 kΩ) berfungsi memastikan kestabilan sinyal logika agar tidak berada dalam kondisi mengambang (floating).
  • Analog to Digital Converter (ADC): Komponen internal mikrokontroler yang mengubah sinyal analog kontinu menjadi angka digital. Arduino Uno memiliki ADC 10-bit yang memetakan tegangan input 0–5V menjadi nilai integer 0–1023 (resolusi 1024 level). Sementara itu, ESP32 memiliki kanal ADC dengan pembacaan resolusi hingga 16-bit dalam MicroPython (0–65535).
  • Antarmuka SPI (Serial Peripheral Interface): Protokol komunikasi serial sinkron berkecepatan tinggi yang menggunakan pin DIN (MOSI), CLK (SCK), dan CS (Chip Select) untuk mengendalikan peripheral seperti driver LED Dot Matrix MAX7219.
  • Protokol MQTT: Protokol komunikasi data IoT yang sangat ringan (lightweight) berarsitektur Publish-Subscribe, ideal untuk mentransmisikan data mentah ADC dari edge device (ESP32) ke broker jaringan.

2.2 Komponen

Perangkat keras dan perangkat lunak yang digunakan dalam kedua proyek praktikum dirangkum pada Tabel 2.1 berikut:

No

Komponen / Software

Fungsi dan Spesifikasi

1

Arduino Uno

Mikrokontroler berbasis ATmega328P dengan ADC 10-bit (Pin A0) dan output digital PWM.

2

ESP32 Board

Mikrokontroler 32-bit dilengkapi Wi-Fi, Bluetooth, ADC 16-bit (Pin D34), dan antarmuka SPI.

3

Potensiometer (Rotary & Slide)

Sensor resistor variabel penyesuai tegangan pembagi (Voltage Divider) analog.

4

5x LED & Resistor

Komponen output indikator visual digital yang dihubungkan ke Pin 2–6 Arduino Uno.

5

LED Dot Matrix MAX7219

Tampilan matriks LED 8x8 yang dikendalikan melalui komunikasi serial SPI.

6

Wokwi Simulator & MQTTX

Platform simulasi sirkuit virtual MicroPython dan aplikasi klien penguji broker MQTT.

BAB III

PEMBAHASAN

3.1 Penjelasan Simulasi

Praktikum minggu kedua berfokus pada dua skenario simulasi sistem I/O analog dan digital yang dijelaskan sebagai berikut:

1. Proyek 1: Arduino Uno + Potensiometer 5 LED Selector

Pada proyek pertama, potensiometer rotari dihubungkan ke pin analog A0 Arduino Uno sebagai pembagi tegangan analog. Lima buah LED dipasang pada pin digital 2, 3, 4, 5, dan 6 sebagai indikator visual output. Saat kenop potensiometer diputar, nilai tegangan analog (0–5V) dibaca oleh fungsi analogRead(A0) yang menghasilkan nilai integer 0–1023. Nilai ini kemudian dipetakan menggunakan fungsi map(nilaiPot, 0, 1023, 0, 4) untuk menentukan indeks LED yang harus aktif. Fungsi constrain() dipasang untuk memastikan nilai pemetaan tidak melebihi rentang indeks 0 hingga 4. Seluruh LED dimatikan terlebih dahulu dalam setiap siklus loop(), kemudian hanya satu LED pada posisi indeks aktif yang dinyalakan. Informasi nilai potensiometer dan nomor LED aktif turut ditransmisikan ke Serial Monitor dengan baud rate 9600 bps.

2. Proyek 2: ESP32 + LED Dot Matrix MAX7219 + Potensiometer Geser & MQTT

Pada proyek kedua, potensiometer geser (Slide Potentiometer) dihubungkan ke pin analog ADC D34 pada ESP32. Tampilan LED Dot Matrix MAX7219 dihubungkan menggunakan bus SPI dengan pin DIN terhubung ke D23 (MOSI), CLK ke D18 (SCK), dan CS ke Pin D5. Sistem dijalankan menggunakan MicroPython pada simulator Wokwi. Saat potensiometer digeser, terjadi perubahan tegangan fisik yang dikonversi oleh ADC ESP32 menjadi nilai digital 16-bit (0–65535). Nilai mentah ADC ini kemudian dipetakan secara matematis menjadi skala satuan (0–9) melalui rumus skala = int((val / 65535) * 9). Angka hasil pemetaan ditampilkan secara visual pada matriks 8x8 menggunakan driver kustom max7219.py dengan konfigurasi FrameBuffer MONO_HMSB agar tampilan angka tidak terbalik. Secara bersamaan, ESP32 yang terhubung ke Wi-Fi Wokwi-GUEST membungkus nilai mentah ADC dan skala tampilan ke dalam payload JSON, lalu mempublikasikannya (Publish) setiap 1 detik ke broker MQTT publik (broker.emqx.io) pada topik 'unesa/iot/modul2/potensiometer' untuk dipantau melalui aplikasi MQTTX.

3.2 Program

Berikut adalah kode sumber (source code) resmi yang digunakan pada masing-masing proyek praktikum:

Program Proyek 1 (Arduino Uno - C++):

// ============================================================
// PROJECT : Potentiometer 5 LED Selector
// BOARD   : Arduino Uno
// ============================================================

// Pin potentiometer
const int potPin = A0;

// Pin LED
const int ledPins[] = {2, 3, 4, 5, 6};

// Jumlah LED
const int jumlahLED = 5;

void setup() {
  // Mengatur semua pin LED sebagai OUTPUT
  for (int i = 0; i < jumlahLED; i++) {
    pinMode(ledPins[i], OUTPUT);
    // Memastikan semua LED mati ketika Arduino mulai
    digitalWrite(ledPins[i], LOW);
  }
  
  // Serial Monitor untuk melihat nilai potentiometer
  Serial.begin(9600);
}

void loop() {
  // Membaca nilai potentiometer (0-1023)
  int nilaiPot = analogRead(potPin);
  
  // Mengubah nilai 0-1023 menjadi posisi 0-4
  int posisiLED = map(nilaiPot, 0, 1023, 0, jumlahLED - 1);
  
  // Membatasi nilai agar tetap 0-4
  posisiLED = constrain(posisiLED, 0, jumlahLED - 1);
  
  // Mematikan semua LED
  for (int i = 0; i < jumlahLED; i++) {
    digitalWrite(ledPins[i], LOW);
  }
  
  // Menyalakan LED sesuai posisi potentiometer
  digitalWrite(ledPins[posisiLED], HIGH);
  
  // Menampilkan informasi di Serial Monitor
  Serial.print("Nilai Potensiometer: ");
  Serial.print(nilaiPot);
  Serial.print(" | LED Aktif: L");
  Serial.println(posisiLED + 1);
  
  // Delay kecil agar pembacaan lebih stabil
  delay(50);
}

Driver Dot Matrix Proyek 2 (MicroPython - max7219.py):

from micropython import const
import framebuf

_NOOP = const(0)
_DIGIT0 = const(1)
_DECODEMODE = const(9)
_INTENSITY = const(10)
_SCANLIMIT = const(11)
_SHUTDOWN = const(12)
_DISPLAYTEST = const(15)

class Matrix8x8:
    def __init__(self, spi, cs, num):
        self.spi = spi
        self.cs = cs
        self.cs.init(cs.OUT, True)
        self.buffer = bytearray(8 * num)
        self.num = num
        fb = framebuf.FrameBuffer(self.buffer, 8 * num, 8, framebuf.MONO_HMSB)
        self.framebuf = fb
        self.fill = fb.fill
        self.pixel = fb.pixel
        self.hline = fb.hline
        self.vline = fb.vline
        self.line = fb.line
        self.rect = fb.rect
        self.fill_rect = fb.fill_rect
        self.text = fb.text
        self.scroll = fb.scroll
        self.blit = fb.blit
        self.init()

    def _write(self, command, data):
        self.cs(0)
        for m in range(self.num):
            self.spi.write(bytearray([command, data]))
        self.cs(1)

    def init(self):
        for command, data in (
            (_SHUTDOWN, 0),
            (_DISPLAYTEST, 0),
            (_SCANLIMIT, 7),
            (_DECODEMODE, 0),
            (_SHUTDOWN, 1),
        ):
            self._write(command, data)

    def brightness(self, value):
        if not 0 <= value <= 15:
            raise ValueError("out of range")
        self._write(_INTENSITY, value)

    def show(self):
        for y in range(8):
            self.cs(0)
            for m in range(self.num):
                self.spi.write(bytearray([_DIGIT0 + y, self.buffer[(y * self.num) + m]]))
            self.cs(1)

Program Utama Proyek 2 (MicroPython - main.py):

import network
import time
import json
from machine import Pin, SPI, ADC
import max7219
from umqtt.simple import MQTTClient

# 1. Konfigurasi Jaringan WiFi Wokwi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('Wokwi-GUEST', '')
print("Menghubungkan ke jaringan WiFi...")
while not wlan.isconnected():
    time.sleep(0.5)
    print(".", end="")
print("<br>Berhasil terhubung ke WiFi!")

# 2. Inisialisasi Hardware
pot = ADC(Pin(34))

# Konfigurasi SPI untuk Dot Matrix MAX7219
spi = SPI(1, baudrate=10000000, polarity=0, phase=0, sck=Pin(18), mosi=Pin(23))
cs = Pin(5, Pin.OUT)
display = max7219.Matrix8x8(spi, cs, 1)

# 3. Konfigurasi MQTT
MQTT_CLIENT_ID = "esp32_wokwi_matrix"
MQTT_BROKER = "broker.emqx.io"
MQTT_TOPIC = "unesa/iot/modul2/potensiometer"

client = MQTTClient(MQTT_CLIENT_ID, MQTT_BROKER)
try:
    client.connect()
    print("Terhubung ke Broker MQTT!")
except Exception as e:
    print("Gagal terhubung ke MQTT:", e)

# 4. Loop Utama
while True:
    try:
        # Membaca nilai dari potensiometer (0 - 65535)
        val = pot.read_u16()
        
        # Konversi nilai ke persentase (0 - 9) untuk ditampilkan di Matrix
        skala = int((val / 65535) * 9)
        
        # Tampilkan ke LED Dot Matrix
        display.fill(0)                      # Bersihkan layar
        display.text(str(skala), 0, 0, 1)   # Format: (teks, x, y, warna)
        display.show()                       # Eksekusi tampilan
        
        # Format dan kirim data ke MQTT
        payload = json.dumps({
            "nilai_adc": val,
            "persentase_layar": skala
        })
        client.publish(MQTT_TOPIC, payload)
        print("Data terkirim:", payload)
        
        time.sleep(1)
    except Exception as e:
        print("Terjadi error:", e)
        time.sleep(2)

BAB IV

PENUTUP

4.1 Kesimpulan

  • Pengolahan sinyal input analog menggunakan fitur ADC pada Arduino Uno (10-bit) dan ESP32 (16-bit) berhasil mengonversi perubahan tegangan potensiometer menjadi nilai numerik diskrit yang presisi.
  • Proyek 1 berhasil memetakan nilai ADC (0–1023) menjadi indeks posisi LED (0–4) untuk menyalakan 5 lampu LED secara sekuensial dan bergantian.
  • Proyek 2 berhasil memetakan nilai ADC (0–65535) menjadi karakter angka (0–9) pada tampilan LED Dot Matrix MAX7219 melalui komunikasi SPI serta mentransmisikan data telemetri secara real-time ke broker MQTT EMQX dalam format JSON.

4.2 Saran

  • Pengembangan selanjutnya dapat menambahkan filter pemulusan sinyal (smoothing filter) seperti Moving Average untuk meminimalkan noise pada pembacaan potensiometer.
  • Dapat diintegrasikan kontrol dua arah (subscribe) agar kecerahan LED Dot Matrix atau mode tampilan dapat diatur secara remote dari aplikasi MQTTX.

DAFTAR PUSTAKA

Kurniawan, N. Y. (2024). Digital & Analog Input Output: Mengenal Proses I/O pada Mikrokontroler [Materi Perkuliahan Modul 2]. Jurusan Teknik Informatika, Universitas Negeri Surabaya.

Modul Praktikum Organisasi & Arsitektur Komputer. (2024). Simulasi ADC dan Pengolahan Input Analog pada Mikrokontroler Arduino & ESP32. Surabaya: UNESA.

Espressif Systems. (2023). ESP32 Technical Reference Manual: Analog to Digital Converter (ADC) & SPI Controller. Espressif.

LAMPIRAN

Video Demo: https://www.youtube.com/watch?v=nrRu46zGqg4

Tidak ada komentar:

Posting Komentar