๐ŸŒŠ Analog I/O: ADC & PWM

Membaca dunia analog (analogRead) dan mengontrol keluaran "setengah nyala" (analogWrite/PWM).

๐Ÿ“Œ 1. Dunia Analog vs Digital

Sinyal digital hanya 0 atau 5V. Sinyal analog bisa berapapun di antaranya โ€” suhu 36,5ยฐC, cahaya 40%, tegangan sensor 2,7V. Untuk "berbicara" dengan dunia analog, MCU punya dua alat:

ADC โ€” Analog to Digital Converter

Membaca tegangan 0-5V dan mengubahnya menjadi angka 0 sampai 1023 (10-bit: 2ยนโฐ = 1024 nilai). Fungsi: analogRead(). Pin: A0-A5.

PWM โ€” Pulse Width Modulation

Menyala-mati sangat cepat (ยฑ500 Hz) dengan rasio tertentu, sehingga terlihat seperti tegangan menengah. Fungsi: analogWrite(). Pin: 3, 5, 6, 9, 10, 11.

๐Ÿ“Œ 2. analogRead(): Membaca Sensor

Rangkaian potensio ke pin analog A0
Potensio ke pin analog A0: 0โ€“5V terbaca sebagai 0โ€“1023
int nilai = analogRead(A0); // 0 .. 1023 float volt = nilai * 5.0 / 1023.0; // konversi ke tegangan
Raw (analogRead)Tegangan
00 V
256ยฑ 1,25 V
512ยฑ 2,5 V
768ยฑ 3,75 V
10235 V
Fungsi map()

Memetakan angka dari satu rentang ke rentang lain โ€” paling sering dipakai untuk sensor:

long map(x, inMin, inMax, outMin, outMax); // Contoh: raw 0..1023 -> PWM 0..255 int pwm = map(raw, 0, 1023, 0, 255); // Contoh: raw 0..1023 -> suhu 0..100 (jika sensor linear) int suhu = map(raw, 0, 1023, 0, 100);
Output:

๐Ÿ“Œ 3. analogWrite(): PWM

PWM bukan tegangan analog โ€” ia adalah sinyal digital yang nyala-mati super cepat. Duty cycle = porsi waktu "nyala".

analogWrite(pin, 0); // 0% -> selalu LOW (LED mati) analogWrite(pin, 128); // 50% -> setengah nyala analogWrite(pin, 255); // 100% -> selalu HIGH (LED penuh) // Sinyal PWM 50%: // HIGH โ”€โ”€โ” โ”Œโ”€โ”€โ” โ”Œโ”€โ”€ // โ””โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”˜ // |< 50% >|< 50% >| // periode ยฑ 2 ms (500 Hz)
Output:
โš ๏ธ analogWrite() hanya bekerja di pin PWM: 3, 5, 6, 9, 10, 11 (di Uno). Di pin lain, ia hanya berperilaku seperti digitalWrite.

๐Ÿ“Œ 4. Contoh: Lampu Otomatis dengan LDR

LDR (Light Dependent Resistor) = resistor yang nilainya turun saat terang. Dipasang sebagai pembagi tegangan ke pin analog, lalu dibaca: gelap โ†’ raw kecil, terang โ†’ raw besar.

Output:

Angka 512 adalah threshold (ambang) โ€” nilai tengah 0-1023. Di dunia nyata, ambang yang pas ditentukan dengan mencoba-coba (kalibrasi).

๐Ÿง  Latihan

  1. Baca potensio A0, cetak raw, tegangan (V), dan nilai persen (0-100%) ke Serial.
  2. Buat "dimmer": potensio A0 mengontrol PWM pin 9. Jika raw < 100, LED dipaksa mati (proteksi).
  3. Jelaskan kenapa PWM bisa membuat LED terlihat "setengah terang" padahal sinyalnya digital.
  4. Buat alarm getaran palsu: sensor A0 normalnya 512; jika menyimpang > 50 dari 512, bunyikan "alarm" (cetak ke Serial) dan nyalakan pin 13.