Apa Itu Op-Amp? Rumus Penguatan, LM358, dan Rangkaian Arduino
Apa itu op-amp dan bagaimana cara kerjanya? Rumus penguatan inverting dan non-inverting, buffer, komparator, pinout LM358 dan LM741, catu tunggal, dan ADC Arduino.
Op-amp (operational amplifier, penguat operasional) adalah sirkuit terpadu kecil, biasanya dengan delapan pin, yang mengalikan selisih tegangan super kecil di antara kedua inputnya hingga ratusan ribu kali. Itulah jawaban singkat untuk apa itu op-amp, tapi penguatan sebesar itu sendirian tidak terlalu berguna. Keajaibannya muncul ketika beberapa resistor mengembalikan sebagian output ke input: op-amp lalu berubah menjadi penguat presisi yang penguatannya ditentukan oleh rasio resistor, menjadi buffer, komparator, atau filter. Dari preamp mikrofon sampai sensor detak jantung, dari modul timbangan sampai kartu suara, hampir di setiap sudut elektronika analog ada op-amp.
Ketika kamu bekerja dengan Arduino, alasan utama kamu butuh op-amp adalah ini: banyak sensor menghasilkan sinyal dalam orde milivolt, sedangkan ADC Arduino Uno hanya bisa membedakan langkah sebesar 4,88 mV. Termokopel tipe K hanya menghasilkan 4,1 mV pada 100 °C; kalau disambungkan langsung, Arduino nyaris tidak merasakan suhu itu. Di panduan ini kamu akan belajar aturan op-amp ideal, rumus penguatan inverting dan non-inverting, voltage follower, komparator, pinout LM358 dan LM741, pemakaian catu tunggal, serta cara menyesuaikan sinyal mikrofon dan termokopel dengan ADC Arduino, ESP32, dan Raspberry Pi Pico, semuanya dengan nilai nyata.
Apa itu op-amp dan bagaimana cara kerjanya?
Op-amp punya lima terminal dasar: input non-inverting (+), input inverting (−), output, dan dua pin catu daya (V+ dan V−). Op-amp hanya melihat selisih di antara kedua inputnya lalu mengalikannya dengan penguatan loop terbuka (A): Vout = A × (V+ − V−). Pada LM358, A biasanya 100.000 (100 dB). Artinya, selisih hanya 0,1 mV di antara input sudah meminta 10 V di output; tapi output tidak bisa melewati catu daya, jadi output op-amp tanpa umpan balik hampir selalu menempel ke salah satu rail, dengan kata lain saturasi. Perilaku ini berguna di rangkaian komparator. Untuk membuat penguat, sebagian output dikembalikan ke input inverting lewat resistor; ini disebut umpan balik negatif, dan sejak itu penguatan ditentukan oleh resistor, bukan oleh op-amp.
| Karakteristik | Op-amp ideal | LM358 (tipikal) | LM741 (tipikal) |
|---|---|---|---|
| Penguatan loop terbuka | Tak terhingga | 100.000 (100 dB) | 200.000 (106 dB) |
| Arus input (bias) | 0 | 20 nA | 80 nA |
| Tegangan offset input | 0 | 3 mV (maks. 7 mV) | 1 mV (maks. 5 mV) |
| Produk penguatan-bandwidth (GBW) | Tak terhingga | 0,7 MHz | Sekitar 1 MHz |
| Slew rate | Tak terhingga | 0,3 V/µs | 0,5 V/µs |
| Ayunan output | Sampai ke rail | Mendekati 0 V, batas atas V+ − 1,5 V | 1–3 V di dalam tiap rail |
| Catu daya | Tanpa batas | 3–30 V tunggal atau ±1,5–±15 V | Disarankan ±10–±18 V (LM741C) |
Aturan op-amp ideal: hubung singkat virtual dan arus input nol
- Aturan 1 – Input tidak menarik arus: op-amp ideal punya hambatan input tak terhingga, jadi tidak ada arus yang mengalir ke pin + dan −. Kenyataannya LM358 menarik sekitar 20 nA, yang bahkan pada resistor 100 kΩ hanya menimbulkan galat 2 mV.
- Aturan 2 – Hubung singkat virtual (virtual short): dengan umpan balik negatif, output melakukan apa saja supaya kedua input berada di tegangan yang sama, jadi V+ = V−. Kedua input tidak tersambung satu sama lain, tapi tegangannya sama.
- Aturan praktis – Output tidak bisa melewati catu daya: walaupun rumus meminta 12 V, op-amp yang diberi daya 5 V hanya bisa naik sampai batas catu, dan LM358 hanya sampai sekitar 3,5 V. Output yang tertahan di batas itu disebut clipping atau saturasi.
Dengan aturan ini, hampir semua rangkaian op-amp bisa kamu selesaikan di kertas dalam beberapa baris: cari dulu tegangan di input +, anggap input − berada di tegangan yang sama, lalu tulis arus yang lewat resistor dengan hukum Ohm. Karena arus tidak bisa masuk ke input, arus itu harus lewat resistor umpan balik, dan dari situ kamu dapat tegangan output. Ingat: aturan kedua hanya berlaku kalau ada umpan balik negatif. Di rangkaian tanpa umpan balik, misalnya komparator, kedua input berada di tegangan berbeda dan output menempel di salah satu rail. Kalau ingin menyegarkan lagi hitungan arus dan tegangan, lihat panduan Hukum Ohm.
Penguat non-inverting: rumus penguatan dan contohnya
Di penguat non-inverting, sinyal langsung masuk ke input +. Resistor umpan balik (Rf) dipasang dari output ke input −, dan resistor ground (Rg) dari input − ke GND. Kedua resistor ini membentuk pembagi tegangan: tegangan di input − adalah Vout × Rg / (Rf + Rg). Menurut aturan hubung singkat virtual, nilai ini sama dengan input, sehingga muncul rumus Vout = Vin × (1 + Rf / Rg). Dengan Rf = 10 kΩ dan Rg = 1 kΩ penguatannya 11, jadi sinyal 100 mV menjadi 1,1 V. Output bergerak searah dengan input, penguatannya tidak pernah di bawah 1, dan hambatan input rangkaian sangat tinggi, jadi tidak membebani sensor.
| Rf | Rg (Rin di rangkaian inverting) | Penguatan non-inverting | Penguatan inverting |
|---|---|---|---|
| 10 kΩ | 10 kΩ | 2 (6,0 dB) | −1 (0 dB) |
| 47 kΩ | 10 kΩ | 5,7 (15,1 dB) | −4,7 (13,4 dB) |
| 10 kΩ | 1 kΩ | 11 (20,8 dB) | −10 (20 dB) |
| 100 kΩ | 4,7 kΩ | 22,3 (27,0 dB) | −21,3 (26,6 dB) |
| 100 kΩ | 1 kΩ | 101 (40,1 dB) | −100 (40 dB) |
Penguat inverting dan ground virtual
Di penguat inverting, input + diikat ke GND dan sinyal mencapai input − lewat resistor Rin; Rf lagi-lagi dipasang di antara output dan input −. Menurut aturan hubung singkat virtual, input − juga berada di 0 V, padahal tidak tersambung ke GND; ini disebut ground virtual. Arus Vin / Rin yang lewat Rin tidak bisa masuk ke input, jadi harus mengalir lewat Rf, dan output menjadi Vout = −(Rf / Rin) × Vin. Dengan Rin = 10 kΩ dan Rf = 47 kΩ penguatannya −4,7: input 0,5 V menghasilkan output −2,35 V. Tanda minus berarti sinyalnya terbalik. Hambatan input rangkaian ini kira-kira sebesar Rin, jadi bisa membebani sensor yang hambatan internalnya tinggi.
Pemakaian menarik dari topologi inverting adalah penguat penjumlah (mixer): sambungkan beberapa sinyal ke input −, masing-masing lewat resistornya sendiri, dan output menjadi jumlah berbobot sinyal-sinyal itu dalam keadaan terbalik. Tapi di rangkaian Arduino dengan catu tunggal, input + penguat inverting harus diikat ke sebuah referensi, misalnya setengah tegangan catu, bukan ke GND; kalau tidak, input positif akan meminta output negatif dan output menempel di 0 V. Dalam kasus ini rumusnya menjadi Vout = Vref − (Rf / Rin) × (Vin − Vref).
Voltage follower (buffer): rangkaian paling berguna dengan penguatan 1
Sambungkan output langsung ke input − dan beri sinyal ke input +, maka kamu mendapat voltage follower (buffer). Karena Rf nol dan Rg tak terhingga, penguatannya tepat 1 dan Vout = Vin. Kenapa rangkaian yang tidak menguatkan ini berguna? Karena hampir tidak menarik arus dari inputnya, tapi bisa memberikan arus beberapa miliampere di outputnya; sumber berimpedansi tinggi diubah menjadi sumber berimpedansi rendah. Datasheet ATmega328P menyebutkan ADC-nya bekerja paling baik dengan impedansi sumber 10 kΩ atau kurang. Pembagi tegangan 100 kΩ + 100 kΩ berperilaku seperti sumber 50 kΩ, dan ketika Arduino berpindah antarkanal, pembacaannya bisa bergeser beberapa langkah. Pasang follower setelah pembagi, dan masalahnya hilang.
Pemakaian klasik follower lainnya: menghaluskan sinyal PWM dengan filter RC lalu mem-buffer-nya untuk membuat DAC sederhana, membagi tegangan referensi dari potensiometer ke beberapa rangkaian sekaligus, dan menggerakkan kabel panjang dari output op-amp, bukan dari output sensor yang lemah. Dengan catu tunggal, LM358 bisa mengikuti sampai 0 V, tapi dengan catu 5 V tidak bisa naik melewati sekitar 3,5 V; kalau ingin mem-buffer seluruh rentang 0–5 V, pilih op-amp rail-to-rail.
Op-amp sebagai komparator
Kalau dipakai tanpa umpan balik, op-amp menjadi saklar yang membandingkan dua tegangan: kalau input + lebih tinggi beberapa milivolt saja dari input −, output naik ke batas atas, dan kalau lebih rendah, output turun ke 0 V. Lampu tidur tanpa mikrokontroler adalah contoh yang bagus. Sambungkan titik tengah pembagi yang disusun berurutan 5V, 10 kΩ, LDR, GND ke input +, lalu kaki tengah (wiper) potensiometer ke input −. Dalam gelap, hambatan LDR naik, tegangan titik tengah melewati ambang yang kamu atur dengan pot, dan LED yang tersambung ke output lewat 330 Ω menyala. LM358 cukup untuk tugas ini, tapi lambat: dengan slew rate 0,3 V/µs, output butuh lebih dari 10 µs untuk naik dari 0 ke 3,5 V.
Untuk tugas yang butuh transisi cepat dan bersih, dipakai komparator sungguhan seperti LM393. Pinout LM393 sama dengan LM358, tapi outputnya open-collector: ia hanya bisa menarik output ke GND, dan butuh resistor pull-up, misalnya 10 kΩ, di antara output dan catu supaya bisa HIGH. Berkat ini, kamu bisa mengikat pull-up ke 3,3 V dan dengan aman memasukkan output komparator yang diberi daya 5 V ke ESP32 atau Pico. Chip kecil di sebelah trimmer biru pada sensor suara KY-038 dan pada modul kelembapan tanah, hujan, api, dan gas hampir selalu LM393.

Dengan sinyal yang berubah pelan atau berderau di dekat ambang, output komparator bisa bergetar ratusan kali per detik; lampu tidur berkedip-kedip ketika senja. Solusinya adalah histeresis, dengan kata lain Schmitt trigger. Beri sinyal ke input + lewat resistor R1 10 kΩ, lalu sambungkan resistor R2 1 MΩ dari output kembali ke input +. Setiap kali output berubah, umpan balik positif ini menggeser ambang sedikit; jarak antara ambang naik dan ambang turun kira-kira ayunan output × R1 / R2. Dengan output yang berayun 0–5 V, 5 × 10k / 1M menghasilkan histeresis 50 mV, biasanya cukup untuk menelan derau. Ide yang sama bisa kamu terapkan di software dengan dua ambang terpisah; contoh ESP32 di bawah melakukan persis itu.
Pinout LM358 dan LM741
Dua op-amp yang paling sering kamu temui di elektronika hobi adalah LM358 dua kanal dan LM741 klasik satu kanal. Keduanya hadir dalam kemasan DIP 8 pin. Pegang chip supaya tulisannya terbaca, dengan takik (notch) menghadap ke kiri: pin 1 ada di kiri bawah dan nomornya naik berlawanan arah jarum jam. Pinout keduanya berbeda, jadi yang satu tidak bisa begitu saja dipasang menggantikan yang lain:
| Pin | LM358 (op-amp ganda) | LM741 (op-amp tunggal) |
|---|---|---|
| 1 | 1OUT – output A | Offset null (penyetel offset) |
| 2 | 1IN− – input inverting A | Input inverting (−) |
| 3 | 1IN+ – input non-inverting A | Input non-inverting (+) |
| 4 | GND (V−) | V− (catu negatif) |
| 5 | 2IN+ – input non-inverting B | Offset null (penyetel offset) |
| 6 | 2IN− – input inverting B | Output |
| 7 | 2OUT – output B | V+ (catu positif) |
| 8 | VCC (V+) | NC (tidak tersambung) |
| Karakteristik | LM358 | LM741 | MCP6002 |
|---|---|---|---|
| Kanal | 2 | 1 | 2 |
| Catu daya | Catu tunggal 3–30 V | Disarankan catu ganda ±10–±18 V | Catu tunggal 1,8–6 V |
| Dengan catu tunggal 5 V | Bisa | Praktis tidak bisa | Bisa |
| Pada 3,3 V | Kurang baik (output maks. ~1,8 V) | Tidak bisa | Sangat baik |
| Rentang input | 0 V sampai V+ − 1,5 V | ~3 V di dalam rail | Sampai 0,3 V melewati rail |
| Rentang output (pada 5 V) | ~0,02–3,5 V | Tidak bisa dipakai | 0,025–4,975 V (rail-to-rail) |
| GBW / slew rate | 0,7 MHz / 0,3 V/µs | ~1 MHz / 0,5 V/µs | 1 MHz / 0,6 V/µs |
| Arus catu | 0,35 mA / kanal | 1,7 mA | 0,1 mA / kanal |
LM741 sudah jadi bintang buku pelajaran sejak 1968, tapi dirancang untuk catu simetris seperti ±15 V: inputnya harus berada sekitar 3 V dan outputnya 1–3 V di dalam rail. Dengan catu tunggal 5 V, setelah margin itu dikurangi tidak ada rentang yang tersisa untuk dipakai; kalau rangkaian LM741 tidak jalan ketika diberi daya dari pin 5V Arduino, inilah penyebabnya. Sebaliknya, LM358 memang dirancang untuk catu tunggal: rentang inputnya mencakup 0 V, outputnya bisa mendekati 0 V sampai beberapa milivolt, dan satu-satunya kekurangannya adalah batas atasnya di V+ − 1,5 V. Di board 3,3 V seperti ESP32 dan Pico, pakai op-amp rail-to-rail seperti MCP6002; pinout-nya sama dengan LM358, jadi bisa langsung dipasang di rangkaian. Kalau butuh empat kanal, LM324 14 pin adalah saudara empat kanal LM358.
Pemakaian catu tunggal: ground virtual dan rail-to-rail
Kebanyakan rangkaian op-amp di buku pelajaran memakai catu simetris seperti ±15 V, dan sinyalnya berayun di kedua sisi 0 V. Di dunia Arduino, biasanya kamu hanya punya 5 V atau 3,3 V. Ini bukan masalah untuk sinyal DC yang selalu positif, seperti termokopel, resistor shunt, atau LM35; sinyal ini bisa langsung dikuatkan dengan op-amp yang rentang inputnya mencakup 0 V. Tapi sinyal AC yang berayun positif dan negatif, seperti mikrofon, harus diangkat dulu ke tengah tegangan catu. Untuk itu kamu membuat tegangan titik tengah dengan dua resistor dan menambahkan kapasitor 10 µF di sebelahnya untuk mengurangi derau. Titik ini disebut ground virtual atau referensi; sinyal ditumpangkan di atasnya lewat kapasitor kopling.
- Pilih op-amp yang tepat: model yang rentang inputnya tidak mencakup 0 V, seperti LM741 atau TL072, akan terpotong secara tak terduga di catu tunggal; pakai LM358, LM324, atau MCP6002.
- Perhitungkan batas output: output LM358 pada 5 V berkisar sekitar 0,02–3,5 V, jadi untuk sinyal AC titik tengah sekitar 1,8 V lebih seimbang daripada 2,5 V. MCP6002 bisa mendekati kedua rail sampai sekitar 25 mV, jadi titik tengahnya bisa tepat VCC/2.
- Beri daya op-amp dari tegangan yang sama dengan board: op-amp yang diberi daya 12 V bisa mendorong lebih dari 10 V ke pin ESP32 atau Pico kalau penguatannya salah.
- Pakai GND bersama: ground sensor, op-amp, dan board harus disatukan; alasannya bisa kamu baca di panduan Ground Bersama (GND).
- Jangan biarkan kanal yang tidak terpakai mengambang: rangkai separuh LM358 yang tersisa sebagai follower (output ke input −) dan ikat input +-nya ke GND atau ke titik tengah; input yang mengambang bisa memicu osilasi dan konsumsi arus yang tidak perlu.
Menguatkan sinyal mikrofon: preamp mikrofon electret
Mikrofon electret biasanya punya sensitivitas sekitar −44 dBV/Pa, artinya bahkan pada tekanan suara keras 94 dB, mikrofon hanya memberi sekitar 6 mV. Ucapan normal dari jarak satu meter hanya sekitar 0,1 mV, sedangkan tepukan tangan tepat di sebelah mikrofon bisa mencapai beberapa puluh milivolt. Dengan langkah 4,88 mV milik Arduino, sinyal ini tidak terlihat sama sekali atau hanya bergerak beberapa langkah; ini juga menjelaskan kenapa output analog modul seperti sensor suara KY-038 begitu lemah. Solusinya adalah penguat AC non-inverting dengan penguatan sekitar 100. Rangkaian di bawah memakai kanal A dari LM358:
| Komponen | Nilai | Sambungan |
|---|---|---|
| Resistor bias mikrofon | 2,2 kΩ | Di antara 5V dan kaki + mikrofon (kaki − mikrofon ke GND) |
| Kapasitor kopling C1 | 1 µF | Dari kaki + mikrofon ke pin 3 LM358 (1IN+) |
| Resistor titik tengah | 100 kΩ dan 56 kΩ | 100 kΩ dari pin 3 ke 5V, 56 kΩ dari pin 3 ke GND (sekitar 1,8 V) |
| Umpan balik Rf | 100 kΩ | Di antara pin 1 (1OUT) dan pin 2 (1IN−) |
| Rg dan C2 | 1 kΩ + 10 µF | Seri dari pin 2 ke GND (kaki − C2 ke GND) |
| Catu daya | Pin 8 dan pin 4 | Pin 8 ke 5V, pin 4 ke GND, 100 nF di antara keduanya |
| Output | Pin 1 | A0 Arduino Uno (ESP32 GPIO 34, Pico GP26: dengan MCP6002 dan 3,3 V) |
Berkat kapasitor C2, rangkaian ini menjadi follower dengan penguatan 1 untuk DC; ketika hening, output diam di titik tengah, sekitar 1,8 V. Tapi pada frekuensi audio, C2 berperilaku seperti hubung singkat dan penguatannya menjadi 1 + 100k / 1k = 101 (40 dB). Frekuensi cutoff bawah ditentukan oleh Rg dan C2: 1 / (2π × 1 kΩ × 10 µF) ≈ 16 Hz. Batas atasnya ditentukan oleh produk penguatan-bandwidth op-amp: 0,7 MHz / 101 ≈ 7 kHz pada LM358, cukup untuk suara ucapan. Kalau ingin penguatan lebih besar, ingat bahwa bandwidth menyusut dengan faktor yang sama; kalau butuh penguatan 1000, lebih baik dibagi menjadi dua tahap masing-masing sekitar 32.
1// LM358 mikrofon ön yükselteci ile ses seviyesi / Sound level with an LM358 mic preamp
2const int MIC_PIN = A0; // LM358 pin 1 (1OUT)
3const float GAIN = 101.0; // 1 + 100k / 1k
4const unsigned long WINDOW_MS = 50; // ölçüm penceresi / sampling window
5
6void setup() {
7 Serial.begin(115200);
8}
9
10void loop() {
11 int minV = 1023, maxV = 0;
12 unsigned long start = millis();
13 while (millis() - start < WINDOW_MS) { // 50 ms boyunca örnekle / sample for 50 ms
14 int v = analogRead(MIC_PIN);
15 if (v < minV) minV = v;
16 if (v > maxV) maxV = v;
17 }
18 float ppVolt = (maxV - minV) * 5.0 / 1023.0; // tepe-tepe çıkış / peak-to-peak output
19 float micMv = ppVolt * 1000.0 / GAIN; // mikrofonun kendi sinyali / the mic's own signal
20
21 Serial.print("Çıkış / output: ");
22 Serial.print(ppVolt, 3);
23 Serial.print(" V p-p Mikrofon / mic: ");
24 Serial.print(micMv, 2);
25 Serial.println(" mV p-p");
26}Kode ini mengambil sampel sebanyak mungkin selama 50 ms, mencari nilai terkecil dan terbesar, lalu mengubah selisihnya ke volt; itulah amplitudo puncak ke puncak (peak-to-peak) suara. Membagi hasilnya dengan 101 memberi tegangan yang dihasilkan mikrofon itu sendiri. Di ruangan yang tenang, output hanya bergerak beberapa langkah ADC (0,01–0,02 V), sedangkan tepukan tangan di dekatnya dengan mudah melewati 1 V. Kalau sinyalnya terpotong, yaitu output menyentuh 0 V atau 3,5 V, turunkan Rf ke 47 kΩ. Cara membuat pengukuran lebih stabil bisa kamu temukan di panduan menyaring data sensor.
Menguatkan termokopel: termokopel tipe K dan LM358
Termokopel tipe K menghasilkan tegangan kecil yang sebanding dengan selisih suhu di sambungan tempat dua logam berbeda bertemu: sekitar 41 µV/°C. Kamu mengukur 4,1 mV pada 100 °C, 20,6 mV pada 500 °C, dan 41,3 mV pada 1000 °C. Kalau disambungkan langsung ke Arduino, satu langkah ADC (4,88 mV) setara dengan kira-kira 119 °C; itu bukan pengukuran. Penguat non-inverting dengan penguatan 101 yang dibangun di kanal B LM358 menaikkan sinyal menjadi 4,14 mV/°C: sekarang satu langkah sekitar 1,2 °C, dan batas output 3,5 V milik LM358 memungkinkan pembacaan sampai sekitar 700–800 °C, tergantung offset-nya. Pengkabelannya: kaki + termokopel ke pin 5 (2IN+), kaki − ke GND; Rf = 100 kΩ di antara pin 7 dan pin 6, Rg = 1 kΩ di antara pin 6 dan GND; pin 7 ke A1 Arduino. Pada tipe K, kawat alumel, yaitu kaki −, sedikit bersifat magnetis, cara praktis untuk membedakan kedua kakinya.
Termokopel sebenarnya mengukur selisih antara sambungan panas dan sambungan dingin, tempat kawatnya bertemu dengan sambungan tembaga. Untuk mendapat suhu sebenarnya, kamu harus mengukur suhu sambungan dingin secara terpisah lalu menambahkannya; ini disebut kompensasi sambungan dingin. Kode di bawah memakai LM35 yang dipasang tepat di sebelah terminal sambungan untuk keperluan ini (output ke A2). Selain itu, offset input LM358 sebesar 3–7 mV juga ikut dikalikan 101 dan menimbulkan galat 0,3–0,7 V di output, yaitu 70–170 °C. Kode ini mengukur offset tersebut ketika mulai lalu menguranginya dari pembacaan berikutnya, jadi nyalakan board ketika probe berada di suhu ruang.
1// K tipi termokupl + LM358 (kazanç 101) + LM35 soğuk uç / K-type thermocouple + LM358 (gain 101) + LM35 cold junction
2const int TC_PIN = A1; // LM358 pin 7 (2OUT)
3const int LM35_PIN = A2; // LM35 çıkışı / LM35 output
4const float GAIN = 101.0; // 1 + 100k / 1k
5const float MV_PER_C = 0.041; // K tipi: yaklaşık 41 µV/°C / K-type: about 41 µV/°C
6float zeroMv = 0; // açılışta ölçülen ofset / offset measured at power-up
7
8float readMv(int pin) {
9 long sum = 0;
10 for (int i = 0; i < 64; i++) sum += analogRead(pin); // 64 okumanın ortalaması / average of 64 readings
11 return sum / 64.0 * 5000.0 / 1023.0;
12}
13
14void setup() {
15 Serial.begin(115200);
16 delay(500);
17 zeroMv = readMv(TC_PIN); // prob oda sıcaklığında olmalı / probe must be at room temperature
18 Serial.print("Ofset / offset: ");
19 Serial.print(zeroMv, 1);
20 Serial.println(" mV");
21}
22
23void loop() {
24 float coldC = readMv(LM35_PIN) / 10.0; // LM35: 10 mV/°C
25 float tcMv = (readMv(TC_PIN) - zeroMv) / GAIN; // termokupl gerilimi / thermocouple voltage
26 float hotC = coldC + tcMv / MV_PER_C; // soğuk uç telafisi / cold-junction compensation
27
28 Serial.print("Ortam / ambient: ");
29 Serial.print(coldC, 1);
30 Serial.print(" °C Prob / probe: ");
31 Serial.print(hotC, 1);
32 Serial.println(" °C");
33 delay(500);
34}Menyesuaikan dengan ADC Arduino: memasukkan sinyal ke rentang yang tepat
Tugas sebenarnya op-amp di proyek Arduino adalah memindahkan sinyal sensor ke rentang tempat ADC bisa memakainya paling efisien. Aturannya sederhana: nilai maksimum sinyal sebaiknya mendekati puncak rentang ADC, tapi tidak meluber ke ujung-ujung tempat op-amp dan ADC tidak linear. Misalnya, LM35 memberi 0–500 mV di antara 0 dan 50 °C; kalau dibaca langsung di Uno, resolusinya 0,49 °C per langkah. Kuatkan sinyal yang sama dengan penguatan 6,6 menjadi 0–3,3 V, dan resolusinya turun ke 0,074 °C. Berikut desainnya langkah demi langkah:
- Cari rentang output sensor: catat tegangan output minimum dan maksimum dari datasheet (LM35, 0–50 °C: 0–0,5 V).
- Pilih rentang target: zona amannya sekitar 0,02–3,5 V untuk Uno dengan LM358, 0,15–2,5 V untuk ESP32, dan 0,03–3,25 V untuk Pico dengan MCP6002.
- Hitung penguatannya: G = maksimum target / maksimum sensor = 3,3 / 0,5 = 6,6. Supaya 1 + Rf / Rg = 6,6 di penguat non-inverting, pilih Rf = 56 kΩ dan Rg = 10 kΩ.
- Hilangkan offset: kalau sensor bekerja di rentang yang tidak mulai dari nol, misalnya 1–2 V, kurangi dulu tegangan referensinya (Vref di penguat inverting, atau penguat selisih), baru kuatkan.
- Lindungi dan filter: pasang resistor seri 1 kΩ di antara output op-amp dan pin ADC, dan 100 nF di antara pin dan GND. Filter RC ini meredam derau di atas sekitar 1,6 kHz dan membatasi arus gangguan yang masuk ke pin.
- Hitung balik di software: bagi tegangan terukur dengan penguatan untuk mendapat tegangan sensor sebenarnya (Vsensor = Vadc / G); ukur resistornya dengan multimeter supaya nilai penguatannya pasti.
| Board | ADC | Rentang input yang disarankan | Langkah | Pin analog |
|---|---|---|---|---|
| Arduino Uno | 10-bit | 0–5 V (0–1,1 V dengan referensi internal) | 4,88 mV (1,07 mV) | A0–A5 |
| ESP32 | 12-bit | Sekitar 0,15–2,5 V (atenuasi bawaan 11 dB) | ~0,8 mV | GPIO 32–39 (ADC1, tetap bisa dipakai ketika Wi-Fi aktif) |
| Raspberry Pi Pico | 12-bit | 0–3,3 V | 0,81 mV | GP26, GP27, GP28 |
Membaca output op-amp dengan ESP32: saklar tepuk
Karena ESP32 bekerja di 3,3 V, buat rangkaian mikrofon yang sama dengan MCP6002 dan beri daya dari pin 3V3; pakai dua resistor 100 kΩ untuk titik tengah (1,65 V). Kalau kamu memberi daya LM358 dari 5 V, outputnya bisa mencapai 3,5 V dan membebani pin ESP32. Sambungkan output op-amp ke GPIO 34, salah satu kanal ADC1 yang tetap bekerja ketika Wi-Fi aktif. Kode di bawah mengukur amplitudo puncak ke puncak dalam jendela 20 ms, memakai nilai milivolt terkalibrasi dari analogReadMilliVolts(), dan menerapkan histeresis di software dengan dua ambang terpisah: setiap tepukan membalik status LED di board. Kalau baru pertama kali memakai board ini, mulai dari langkah pengaturan di panduan Apa Itu ESP32.
1// ESP32: MCP6002 mikrofon yükselteci ile el çırpma anahtarı / ESP32: clap switch with an MCP6002 mic preamp
2const int MIC_PIN = 34; // MCP6002 çıkışı, ADC1 kanalı / MCP6002 output, ADC1 channel
3const int LED_PIN = 2; // dahili LED / onboard LED
4const int ON_MV = 800; // üst eşik, mV tepe-tepe / upper threshold, mV peak-to-peak
5const int OFF_MV = 300; // alt eşik: histerezis / lower threshold: hysteresis
6
7bool loud = false;
8bool ledOn = false;
9
10void setup() {
11 Serial.begin(115200);
12 pinMode(LED_PIN, OUTPUT);
13}
14
15void loop() {
16 int minMv = 3300, maxMv = 0;
17 unsigned long start = millis();
18 while (millis() - start < 20) { // 20 ms pencere / 20 ms window
19 int mv = analogReadMilliVolts(MIC_PIN); // kalibre edilmiş mV / calibrated mV
20 if (mv < minMv) minMv = mv;
21 if (mv > maxMv) maxMv = mv;
22 }
23 int pp = maxMv - minMv;
24
25 if (!loud && pp > ON_MV) { // üst eşik aşıldı: alkış / upper threshold crossed: a clap
26 loud = true;
27 ledOn = !ledOn;
28 digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
29 Serial.printf("Alkış / clap: %d mV p-p\n", pp);
30 delay(250); // yankıları yok say / ignore echoes
31 } else if (loud && pp < OFF_MV) { // ses alt eşiğin altına indi / sound fell below the lower threshold
32 loud = false;
33 }
34}Raspberry Pi Pico dan MicroPython: mengukur arus dengan resistor shunt
Tugas praktis lain untuk op-amp adalah mengukur arus. Kalau kamu memasang resistor shunt 0,1 Ω di antara kaki negatif motor atau LED strip dan GND, arus 1 A hanya menimbulkan tegangan jatuh 100 mV di resistor itu. Penguat non-inverting yang dibangun dengan MCP6002 (Rf = 100 kΩ, Rg = 4,7 kΩ) mengalikan tegangan itu dengan 22,3: sekarang 1 A menjadi 2,23 V, dan dengan rentang 3,3 V milik Pico kamu bisa mengukur sampai sekitar 1,45 A. Ujung atas shunt masuk ke pin 3 MCP6002 dan output op-amp (pin 1) ke pin GP26 (ADC0) Pico; op-amp diberi daya dari pin 3V3(OUT), dan GND catu beban disatukan dengan GND Pico. Pada 1,5 A, shunt membuang daya 0,225 W, jadi pakai resistor dengan rating minimal 0,5 W.
1# Pico: 0,1 Ω şönt + MCP6002 (kazanç 22,3) ile akım ölçümü / current sensing with a 0.1 Ω shunt + MCP6002 (gain 22.3)
2from machine import ADC
3import time
4
5adc = ADC(26) # GP26 = ADC0, MCP6002 pin 1
6VREF = 3.3
7GAIN = 1 + 100000 / 4700 # Rf = 100k, Rg = 4.7k -> 22.3
8SHUNT = 0.1 # şönt direnci, ohm / shunt resistance, ohms
9
10def read_volts(n=100):
11 total = 0
12 for _ in range(n): # 100 okumanın ortalaması / average of 100 readings
13 total += adc.read_u16()
14 return total / n * VREF / 65535
15
16zero = read_volts() # yük kapalıyken ofset / offset with the load off
17print("Sıfır / zero: {:.3f} V".format(zero))
18
19while True:
20 v_out = read_volts() - zero
21 amps = v_out / GAIN / SHUNT # I = V / R
22 print("Akım / current: {:.3f} A".format(max(amps, 0)))
23 time.sleep(0.5)Ketika mulai, dengan beban dalam keadaan mati, kode ini mengukur offset op-amp lalu menguranginya dari pembacaan berikutnya; merata-rata 100 pembacaan meredam derau ADC. Untuk arus yang lebih besar, turunkan nilai shunt atau penguatannya; cek tegangan di shunt dan daya yang dibuangnya dengan kalkulator hukum Ohm. Kalau ingin solusi siap pakai, sensor arus ACS712 berbasis efek Hall mengukur arus sambil menjaga beban tetap terisolasi dari rangkaianmu. Kalau baru pertama kali menyiapkan Pico, panduan Apa Itu Raspberry Pi Pico membahas instalasi MicroPython.
Rangkaian op-amp lainnya
| Rangkaian | Rumus / perilaku | Dipakai di mana? |
|---|---|---|
| Penguat penjumlah (mixer) | Vout = −Rf × (V1/R1 + V2/R2 + …) | Mixer audio, menggabungkan beberapa sinyal |
| Penguat selisih | Vout = (R2 / R1) × (V2 − V1) | Menghilangkan offset, mengukur selisih tegangan dua titik |
| Penguat instrumentasi | Penguatan tinggi yang diatur satu resistor, penolakan mode bersama (common-mode rejection) yang sangat baik | Load cell, jembatan Wheatstone, sinyal biomedis |
| Integrator | Kapasitor di jalur umpan balik; output adalah integral input terhadap waktu | Pembangkit gelombang segitiga, kendali PI |
| Filter aktif (Sallen-Key) | Filter orde dua dengan dua resistor dan dua kapasitor | Filter audio, filter anti-aliasing sebelum ADC |
| Schmitt trigger | Komparator dengan umpan balik positif, dua ambang terpisah | Output digital bersih dari sinyal berderau |
Untuk sensor jembatan seperti load cell, yang kedua outputnya berada di tengah tegangan catu dan selisihnya hanya beberapa milivolt, chip siap pakai lebih praktis: HX711 berisi penguat dengan penguatan sampai 128 dan ADC 24-bit. Sementara itu, op-amp di board sensor denyut menguatkan sekaligus memfilter sinyal lemah dari sensor cahaya, itulah sebabnya Arduino langsung melihat gelombang denyut yang jelas pada percobaan pertama.

Ide proyek op-amp
- Lampu tepuk: gerakkan modul relay dengan preamp mikrofon dan kode ESP32 yang memakai histeresis.
- VU meter: ubah amplitudo puncak ke puncak menjadi bar yang naik mengikuti musik di LED strip WS2812B.
- Termometer oven: ukur sampai 500 °C dengan penguat termokopel dan tampilkan nilainya di layar OLED.
- Lampu tidur tanpa kode: buat LED yang menyala dalam gelap dengan LDR dan komparator LM358, tanpa mikrokontroler sama sekali.
- Timbangan digital: baca load cell dengan HX711 dan buat timbangan dapur yang akurat sampai gram.
- Pemantau arus motor: ukur arus motor mobil robotmu dengan shunt dan op-amp, lalu hentikan motor ketika arusnya naik karena motornya macet.
Kesalahan umum dan cara memperbaikinya
| Gejala | Kemungkinan penyebab | Solusi |
|---|---|---|
| Output selalu di 0 V atau di batas atas | Tidak ada umpan balik atau tersambung ke input yang salah; penguatan terlalu tinggi; input di luar rentang input | Pastikan Rf masuk ke input −, turunkan penguatan, pastikan input berada di antara 0 dan V+ − 1,5 V |
| Rangkaian LM741 tidak jalan di 5 V | LM741 butuh catu simetris yang lebih tinggi | Pakai LM358 atau MCP6002 |
| Output tidak bisa naik di atas 3,5 V | Output LM358 berhenti di V+ − 1,5 V | Pilih penguatan yang sesuai atau pakai op-amp rail-to-rail |
| Pembacaan berderau dan melompat-lompat | Tidak ada decoupling catu, kabel panjang, penguatan terlalu tinggi tanpa perlu | 100 nF di pin catu, kabel pendek, filter RC di output, merata-rata di software |
| Rangkaian berosilasi sendiri | Op-amp langsung menggerakkan kabel panjang atau beban kapasitif besar | Tambahkan resistor seri 100–470 Ω di output |
| Output komparator tidak pernah HIGH | LM393 bertipe open-collector dan tidak ada pull-up | Sambungkan 4,7–10 kΩ di antara output dan catu |
| Pin ESP32 atau Pico rusak | Op-amp diberi daya 5 V atau 12 V dan outputnya melewati 3,3 V | Beri daya op-amp dari 3,3 V, atau tambahkan pembagi dan dioda clamp di output |
| Output tertahan di 0 V dengan sinyal kecil | Offset input negatif menahan output tetap rendah di catu tunggal | Pakai op-amp presisi atau beri bias kecil pada input |
Op-amp adalah penerjemah yang mengubah dunia analog menjadi bahasa yang dimengerti mikrokontroler: begitu kamu tahu dua aturan dan dua rumus penguatan, sinyal apa pun bisa kamu buat cocok untuk ADC, entah dari mikrofon, termokopel, resistor shunt, atau sensor jembatan. Pakai kalkulator penguatan op-amp untuk mencoba nilai; di aplikasi BlueGrays kamu akan menemukan proyek analog seperti pengukuran cahaya dengan LDR, lampu tidur, voltmeter digital, pengukuran suhu dengan NTC, serta sensor api dan gas, langkah demi langkah lengkap dengan skema rangkaian dan kode.
Pertanyaan umum
Op-amp dipakai untuk apa?
Op-amp dipakai untuk menguatkan sinyal lemah, membandingkan dua tegangan, menjumlahkan atau mengurangkan sinyal, memfilternya, dan mem-buffer sumber berimpedansi tinggi. Di proyek Arduino, op-amp paling sering dipakai untuk menaikkan sinyal orde milivolt dari mikrofon, termokopel, atau resistor shunt ke level yang bisa dibaca ADC.
Bagaimana cara menghitung penguatan op-amp?
Untuk penguat non-inverting, penguatannya 1 + Rf / Rg, dan untuk penguat inverting −Rf / Rin. Misalnya, dengan Rf = 100 kΩ dan Rg = 1 kΩ, penguatan non-inverting-nya 101 dan penguatan inverting-nya −100. Nilainya dalam desibel adalah 20 × log10(penguatan).
Apa bedanya LM358 dan LM741?
LM358 berisi dua op-amp dalam satu kemasan, bekerja dengan catu tunggal 3–30 V, dan rentang inputnya mencakup 0 V, jadi bisa langsung dipakai dengan 5 V Arduino. LM741 adalah op-amp tunggal yang dirancang untuk catu simetris seperti ±15 V dan praktis tidak bisa bekerja dengan catu tunggal 5 V. Pinout keduanya juga berbeda.
Bisakah op-amp bekerja dengan catu tunggal 5 V?
Bisa, model yang dirancang untuk catu tunggal seperti LM358, LM324, dan MCP6002. Untuk sinyal AC, input harus diangkat ke tengah tegangan catu dan batas output harus diperhitungkan; output LM358 hanya mencapai sekitar 3,5 V dengan catu 5 V.
Apa bedanya op-amp dan komparator?
Op-amp punya kompensasi frekuensi supaya tetap stabil dengan umpan balik negatif, dan outputnya bisa mengeluarkan maupun menyerap arus. Komparator seperti LM393 dirancang untuk switching cepat tanpa umpan balik, dan kebanyakan punya output open-collector yang butuh resistor pull-up. Op-amp bisa dipakai sebagai komparator yang lambat, tapi komparator tidak boleh dipakai sebagai penguat.
Apa itu op-amp rail-to-rail?
Input atau output op-amp rail-to-rail bisa mendekati tegangan catu sampai beberapa puluh milivolt. Misalnya, MCP6002 mengeluarkan 0,025–4,975 V dengan catu 5 V, sedangkan LM358 hanya mencapai sekitar 3,5 V. Di board 3,3 V seperti ESP32 dan Raspberry Pi Pico, kamu butuh op-amp rail-to-rail untuk memakai seluruh rentang ADC.
Proyek untuk dibuat setelah membaca ini
Lihat semua proyek
Mengukur Intensitas Cahaya dengan LDR
Ingin melihat seberapa terang kamarmu dalam bentuk angka? LDR, komponen kecil yang bereaksi terhadap cahaya, mengukur cahaya di sekitarnya, dan Arduino menulis nilainya ke layar komputermu setiap sete

Lampu Tidur dengan LDR
Lampu tidur kecil yang menyala sendiri ketika gelap dan mati ketika pagi tiba. Sensor cahaya mengukur seberapa terang ruangan, dan Arduino menyalakan LED ketika cukup gelap lalu mematikannya lagi keti

Membaca Intensitas Cahaya dengan Modul LDR ESP32
Memantau secara real-time di Serial Monitor nilai ADC mentah modul LDR dan persentase cahaya relatif yang dihitung dari nilai acuan gelap dan terang. Persentase ini bukan pengukuran lux. Mengajarkan logika kalibrasi modul. Ideal dikerjakan sebelum Proyek 10, karena dipakai untuk menentukan nilai ambang.

Voltmeter Digital dengan Layar LCD
Cari tahu berapa tegangan yang diberikan baterai atau adaptor daya dengan alat ukur buatanmu sendiri. Pembagi dari dua resistor menurunkan tegangan tinggi ke tingkat yang bisa dibaca board, dan Arduin

Mengukur Suhu dengan NTC dan Layar LCD 2x16
Ukur suhu di sekitarmu dengan sensor yang mirip manik-manik kecil. Komponen bernama NTC ini makin mudah dilewati listrik ketika makin hangat; Arduino membaca perubahan itu, mengubahnya menjadi derajat

Menggunakan Sensor Api
Penjaga kecil yang melihat api lebih dulu darimu, di dapur atau di bengkel. Sensor api menangkap cahaya tak terlihat yang dipancarkan api; selama semuanya aman LED hijau menyala, dan ketika melihat ny

Menggunakan Sensor Gas
Penjaga kecil yang menyadari kebocoran gas di dapur lebih dulu darimu. Sensor gas terus mengendus udara; selama semuanya aman LED hijau tetap menyala, dan ketika gas di udara melewati tingkat tertentu

Kendali Kecerahan LED dengan Potensiometer ESP32 (Analog → PWM)
Di proyek ini, kita mengendalikan kecerahan LED secara analog memakai potensiometer. Pin ADC ESP32 membaca tegangan 0-3,3V dari potensiometer, lalu nilai ini diubah menjadi sinyal PWM (Pulse Width Modulation) dan dikirim ke LED. Hasilnya, ketika kamu memutar potensiometer, LED perlahan menerang dan meredup. Dengan Arduino Core 3.0+, analogWrite() bisa langsung dipakai; di ESP32-S2/S3, resolusi ADC tetap 12-bit.
Artikel lainnya
Aplikasi BlueGrays
Rakit rangkaian ini langkah demi langkah di ponselmu
Skema pengkabelan, kode, dan daftar komponen dalam satu layar. 200+ proyek Arduino, ESP32, dan Pico siap dibuat.
Pindai dengan ponselmu
Arahkan kamera ke kode ini dan toko aplikasi di ponselmu akan terbuka.
atau buka toko aplikasi

