Skalasi Data & Modularisasi

Mempelajari cara menskalakan data sensor dengan fungsi map() dan memecah program besar menjadi fungsi-fungsi modular yang reusable.

90 Menit
Modul 4: Logika Pemrograman Menengah
Pertemuan 11

TPTujuan Pembelajaran

  1. Peserta didik dapat menggunakan fungsi map() dan constrain() untuk skalasi data sensor
  2. Peserta didik dapat memecah program besar menjadi fungsi-fungsi modular yang reusable
  3. Peserta didik dapat menggunakan #define dan const untuk konstanta yang terdokumentasi
  4. Peserta didik dapat membangun program terstruktur dengan fungsi inisialisasi, baca sensor, dan output

Pengenalan Skalasi Data

Bayangkan kalian memiliki peta dunia yang besar dan ingin memindahkannya ke selembar kertas HVS. Kalian tidak mungkin menggambar benua sebesar ukuran aslinya, bukan? Kalian harus menskalakannya(membuat skalanya) agar sesuai dengan ukuran kertas.

Dalam Arduino, kita sering mendapat data sensor dalam bentuk nilai kasar (seperti nilai ADC `0-1023`), tetapi kita ingin mengubahnya menjadi persentase kelembaban tanah (`0-100%`) atau derajat servo (`0-180`). Proses mengubah rentang data ini disebut skalasi data.

Fungsi map() dan constrain()

Misalkan, sensor kelembaban tanah memberikan nilai `850` saat sangat kering, dan `350` saat terendam air. Kita ingin mengonversi nilai `850-350` ini menjadi persentase `0-100%`.

ContohMap.ino
cpp
int rawData = analogRead(A0);
// Skalasi dari 850..350 menjadi 0..100
int persen = map(rawData, 850, 350, 0, 100);

Fungsi constrain(x, a, b) akan memaksa nilai x agar selalu berada di antara a dan b.

ContohConstrain.ino
cpp
int rawData = analogRead(A0);
int persen_sementara = map(rawData, 850, 350, 0, 100);
// Pastikan tidak pernah kurang dari 0 dan lebih dari 100
int persen_final = constrain(persen_sementara, 0, 100);

Modularisasi Program

Saat kode program robotikamu mencapai ratusan baris, menaruh semuanya di dalam fungsi loop()seperti melempar semua barang di kamar ke dalam satu keranjang: sangat sulit untuk mencari barang yang spesifik!

Modularisasi adalah memecah program menjadi fungsi-fungsi kecil (modul) yang memiliki satu tugas spesifik. Ini seperti menaruh pakaian di lemari pakaian, buku di rak buku, dan sepatu di rak sepatu.

Struktur program modular yang dipecah menjadi fungsi-fungsi kecil

Konstanta dengan #define dan const

Sering kali kita menggunakan pin yang sama berkali-kali di program (misalnya Pin 13). Alih-alih menulis angka 13 di mana-mana, kita bisa memberikan "nama" untuk nilai tersebut agar lebih mudah dibaca dan diedit jika nanti pinnya berubah.

Struktur Program Ideal

Sekarang, mari kita gabungkan semuanya! Kita akan membuat program lengkap untuk memantau suhu (DHT11) dan kelembaban tanah (Soil Moisture). Program ini akan sangat bersih karena kita menggunakan konstanta,fungsi map/constrain, dan modularisasi.

ModularSensorSystem.ino
cpp
// ── Konstanta ──
#define SOIL_PIN   A0
#define DHT_PIN    2
#define LED_PIN    13
#define BUZZER_PIN 8

#include <DHT.h>
DHT dht(DHT_PIN, DHT11);

// ── Modul: Inisialisasi ──
void initSistem() {
  Serial.begin(9600);
  dht.begin();
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUZZER_PIN, OUTPUT);
  Serial.println("[INIT] Sistem berhasil diinisialisasi");
}

// ── Modul: Baca Sensor ──
float bacaSuhu() {
  return dht.readTemperature();
}

int bacaKelembabanTanah() {
  int raw = analogRead(SOIL_PIN);
  // Skalasi ADC ke persentase (0-100%)
  return constrain(map(raw, 850, 350, 0, 100), 0, 100);
}

// ── Modul: Output & Aksi ──
void tampilkanData(float suhu, int kelembaban) {
  Serial.print("Suhu: "); Serial.print(suhu); Serial.print("C | ");
  Serial.print("Tanah: "); Serial.print(kelembaban); Serial.println("%");
}

void periksaPeringatan(float suhu, int kelembaban) {
  bool terlalupanas = suhu > 35.0;
  bool tanahKering  = kelembaban < 25;
  
  if (terlalupanas || tanahKering) {
    digitalWrite(LED_PIN, HIGH);
    tone(BUZZER_PIN, 800, 300);
    if (terlalupanas) Serial.println("⚠ SUHU TINGGI!");
    if (tanahKering)  Serial.println("⚠ TANAH KERING!");
  } else {
    digitalWrite(LED_PIN, LOW);
    noTone(BUZZER_PIN);
  }
}

// ── Setup & Loop ──
void setup() { initSistem(); }

void loop() {
  float suhu = bacaSuhu();
  int kelembaban = bacaKelembabanTanah();
  
  tampilkanData(suhu, kelembaban);
  periksaPeringatan(suhu, kelembaban);
  
  delay(3000);
}
Serial Monitor Output
[INIT] Sistem berhasil diinisialisasi Suhu: 31.5C | Tanah: 45% Suhu: 31.8C | Tanah: 45% Suhu: 36.2C | Tanah: 44% ⚠ SUHU TINGGI! Suhu: 36.5C | Tanah: 22% ⚠ SUHU TINGGI! ⚠ TANAH KERING!

Troubleshooting

Masalah:Program error 'dht tidak dikenali'

Solusi:Pastikan library DHT sudah terinstall di Arduino IDE dan #include <DHT.h> ditulis dengan benar.


Masalah:Kelembaban tanah selalu 0% atau 100%

Solusi:Ubah angka '850' dan '350' pada fungsi map() sesuai dengan nilai mentah sensor kalian saat dicelupkan ke air dan ditaruh di udara kering.

Kuis

Sebuah sensor LDR memberikan nilai ADC 100 saat gelap dan 900 saat terang. Jika kalian ingin mengonversinya menjadi intensitas cahaya 0 (gelap) hingga 100 (terang), baris kode mana yang benar?

Sedang

Latihan Praktik

Merapikan Kode Sederhana

Diberikan kode berikut yang masih berantakan. Tugas kalian adalah:

  1. Gunakan #define untuk pin sensor (A1) dan pin LED (10).
  2. Pindahkan logika membaca sensor ke fungsi int bacaCahaya().
  3. Gunakan map() dan constrain() pada fungsi tersebut agar mengembalikan nilai `0-100%`.
Kesimpulan Pertemuan Ini
  • map() berfungsi mengubah skala data dari satu range ke range lain.
  • constrain() berfungsi mengunci data agar tidak keluar dari batas min dan max.
  • Modularisasi membuat kode lebih mudah dibaca, di-debug, dan dikembangkan kembali.
  • Menggunakan konstanta (#define / const) sangat dianjurkan untuk deklarasi Pin Arduino.

RRefleksi

Luangkan 2–3 menit untuk menjawab pertanyaan di bawah secara jujur.

Kejutan & Penemuan

Apa yang paling mengejutkan atau menarik hari ini?

Apakah kamu pernah mengalami error karena salah tulis angka pin berulang-ulang?

Masih Membingungkan

Apa yang masih membingungkan atau ingin kamu pahami lebih dalam?

Bagian mana dari konsep modularisasi yang masih terasa membingungkan?

Rencana Selanjutnya

Apa yang ingin kamu coba atau pelajari minggu depan?

Cobalah untuk mulai membuat fungsi setup() dan loop() kosong, dan tulis fungsi-fungsi kalian di bawahnya sebelum diisi kode detail.

Refleksi tidak dinilai — ini adalah ruang jujurmu untuk berpikir.