Dimmer PWM arduino

Dimmer adalah rangkaian elektronik yang memodifikasi bentuk sinyal ac murni menjadi sinyal terpotong-potong sehingga daya keluaran bisa diatur. Pemotongan sinyal ac ini berguna sebagai peredup lampu, memperlambat motor, mengatur pemanasan dan lainnya.

Dimmer yang lebih komplek menggunakan PWM sebagai pengendalinya. PWM bisa dihasilkan oleh rangkaian SCR, chip/IC PWM atau mikrokontroller. Dimmer PWM ini mampu menghasilkan tingkatan daya yang kecil, sehingga pengontrolan menjadi lebih presisi.

Dimmer PWM bisa dikategorikan menjadi dua macam yaitu :

  1. Penyalaan berdasarkan titik nol.
  2. Penyalaan bebas.

Penyalaan berdasarkan titik nol

Waktu penyalaan bergantung pada saat sinya menyentuh nilai nol. Maka dibutuhkan mekanisme untuk mendeteksi waktu sinyal tersebut bernilai 0.

Komponen SCR memiliki sifat forward blocking, forward conduction, dan reverse blocking, maka komponen ini cocok digunakan sebagai dimmer elektronik.

Rangkaian dimmer lampu ac yang memanfatkan sifat SCR:

Pada aplikasi dimmer digital, perlintasan titik nol harus dideteksi terlebih dahulu sebelum melakukan menyalaan, Pendeteksian nilai nol bisa dilakukan dengan rangkaian zero crossing detector / ZCD berikut :

Perancangan dimmer PWM mengikuti kaidah berikut:

  1. Waktu penyalaan, sinyal bolak-balik (AC) senantiasa bergerak naik dan turun, maka sinyal pengontrol PWM haruslah dimulai saat sinyal AC meninggalkan nilai nol
  2. Frekuensi AC, Sinyal pengontrol PWM juga harus memiliki frekuensi tepat dengan frekuensi sinyal AC (listrik)

Kendala membuat dimmer metode zero cross adalah :

  1. frekuensi ac 220v dari penyedia listrik seperti PLN bisa saja berubah-ubah. pada contoh dimmer lampu 220v, intensitas cahaya menjadi tidak konsisten. Untuk mengantisipasi ini sebaiknya dilakukan pengukuran frekuensi secara berkala.
  2. Sulit untuk sinkronisasi frekuensi jala listrik dengan frekuensi pengontrol, karena keterbatasan perhitungan digital, misalnya faktor pergeseran frekuensi akibat pembagian bilangan yang tidak sempurna. Sebagai contoh perangkat digital akan sulit mencapai frekuensi 50,00019 Hz.
  3. Memakai resources mikrokontroller seperti arduino untuk mendeteksi ZCD terus menerus.
  4. Jika ada kesalahan setting waktu penyalaan (program diinterupsi) maka beban seperti lampu akan berkedip.
  5. Pada duty cycle rendah, untuk dimmer lampu akan terlihat flicker karena perbandingan waktu on  sangat kecil dibandingkan waktu off.

Rangkaian dimmer arduino dengan beban lampu:

Penampakan modul dimmer lampu:

Penghasil sinyal PWM yang favorit adalah arduino, karena mampu menghitung frekuensi dan melakukan penyesuaian apabila ada pergeseran frekuensi:

Sketch / koding dimmer lampu arduino
fitur:

  1. input zcd dari semua pin (tidak harus pin int0/pin 9 dan int1/pin 10)
  2. input kontrol berupa duty cycle (rentang 0.0 – 100.0 %)
#define PWM         9  //!!!Mega hanya pin 10-13. 50-53, 14-15, A8-A15
#define ZCD         10 // A0 = 14, A5 = 19
#define frekuensi   50 //50 Hz
#define inputSerial 0
 
volatile uint16_t dutyCycle;
#define maxDutyCycle    ((16000000L / (2 * 1024L *  frekuensi)) - 1)
 
volatile intptr_t *portPWM;
byte bitPWM;
 
void setup() {
  Serial.begin(9600);
  Serial.println("Dimmer arduino");
  Serial.println("https://www.semesin.com/project/");
  Serial.println();
 
  TCCR2A = _BV(WGM21);
  TCCR2B = _BV(CS22) | _BV(CS21) | _BV(CS20);
  OCR2A = maxDutyCycle;
  OCR2B = setDutyCycle(0);
  TIMSK2 = _BV(OCIE2B);
 
  *digitalPinToPCMSK(ZCD) |= bit (digitalPinToPCMSKbit(ZCD));
  PCIFR  |= bit (digitalPinToPCICRbit(ZCD));
  PCICR  |= bit (digitalPinToPCICRbit(ZCD));
 
  portPWM = (volatile intptr_t *) portOutputRegister(digitalPinToPort(PWM));
  bitPWM = digitalPinToBitMask(PWM);
 
  pinMode(PWM, OUTPUT);
}
 
void loop() {
#if inputSerial
 
  if (Serial.available())
  {
    int data = Serial.parseInt();
    dutyCycle = setDutyCycle(data);
  }
   
#else
 
  for (byte i = 20; i <= 100; i++)
  {
    dutyCycle = setDutyCycle(i);
    delay(20);
  }
  for (byte i = 99; i != 20; i--)
  {
    dutyCycle = setDutyCycle(i);
    delay(20);
  }
   
#endif
 
}
uint16_t setDutyCycle(uint8_t dutyCycle)
{
  return maxDutyCycle - (1.0 * dutyCycle / 100 * (maxDutyCycle - 1)) + 1;
}
 
#if defined(__AVR_ATmega328P__)
#  if ((ZCD >= 0) & (ZCD <= 7))
ISR (PCINT2_vect)
#  elif ((ZCD >= 8) & (ZCD <= 13))
ISR (PCINT0_vect)
#  elif ((ZCD >= 14) & (ZCD <= 19))
ISR (PCINT1_vect)
#  endif
#elif  defined(__AVR_ATmega2560__)
#  if ((ZCD >= 50) & (ZCD <= 53)) || ((ZCD >= 10) & (ZCD <= 13))
ISR (PCINT0_vect)
#  elif ((ZCD >= 14) & (ZCD <= 15))
ISR (PCINT1_vect)
#  elif ((ZCD >= A8) & (ZCD <= A15))
ISR (PCINT2_vect)
#  endif
#endif
{
  OCR2B = dutyCycle;
  TCNT2 = 0;
}
 
ISR (TIMER2_COMPB_vect)
{
  *portPWM |= bitPWM;
  delayMicroseconds(30);
  *portPWM &= ~bitPWM;
}

Penyalaan bebas

Waktu penyalaan dimmer tidak dipengaruhi oleh nilai nol,

Rangkaian dimmer ac sederhana :

Sirkit melalui dioda disebut juga penyearah setengah gelombang, yang menghasilkan kondisi dimmer setengah terang. Rangkaian ini biasanya digunakan pada solder, heatgun untuk pemanasan awal.

Pengaturan dimmer PWM lebih diutamakan pada frekuensi PWM-nya. Dimmer lampu akan terlihat berkedip jika frekuensi tidak sama. Untuk mengatasi pemasalahan tersebut rangkaian peredup lampu (Dimmer) didesain dengan penggunaan frekuensi yang lebih tinggi dari frekuensi sinyal AC tanpa memperhatikan waktu nol dan nilai frekuensinya.

Sinyal PWM bisa diperoleh dari rangkaian pembangkit PWM (PWM generator) atau dari mikrokontroller seperti arduino. Aplikasi rangkaian dimmer lampu arduino (rangkaian dimmer arduino) bisa menggunakan perintah analogWrite().

Berikut komponen elektronika yang digunakan dalam perancangan dimmer PWM lampu 220v:

  1. Dioda 1N5408 4 buah
  2. Dioda 1N4007
  3. Dioda zener 10V
  4. Resistor 220 ohm 2 buah
  5. Resistor 330 ohm
  6. Resistor 68 Kohm
  7. Kapasitor 2.2 uH
  8. Optocoupler 4N35
  9. Mosfet IRF 830
  10. Lampu dan Fitting

Berikut skema rangkaian dimmer lampu dc/ac yang dikontrol PWM:

Bagikan Link halaman ini :

118 thoughts on “Dimmer PWM arduino

    1. Level listrik (daya) diatur dengan

      dutyCycle = setDutyCycle(i);
      

      bernilai antara 0-100

      dalam contoh diatas dutyCycle akan bergerak dari 0 ke 100 kemudian kembali ke 0 dan terus berulang

  1. cara menghitung output dimmer biar tetap gimana kak? soalnya pada rangkaian yang saya buat output naik turun kak

    1. Dimmer adalah sebuah rangkaian driver, jika input dibuat tetap maka output juga akan tetap
      untuk menghitungkan cukup digunakan sensor tegangan atau multi/avo tester

      output naik turun (asumsi rangkaian dimmer open loop pada 50Hz):
      * inputnya juga naik dan turun
      * pendeteksian zero cross tidak tepat
      * pendeteksian zero cross lambat sehingga terjadi miss
      * beban lebih besar dari pada kapasitas dimmer

  2. Untuk jenis lampu yang digunakan apa bisa lampu apapun kak? Karena saya coba memakai lampu TL T5 16w tidak ada respon sama sekali ?
    Apa karena saat masih upload program saya sudah menyambungkan ke arus ac nya?

    Mohon pencerahan, saya pemula di dunia elektronik

    1. Lampu TL menggunakan ballast yaitu komponen yang difungsikan untuk memberikan kejut di awal dan menurunkan tegangan jika lampu sudah hidup.
      artinya lampu tl sudah punya pengatur tegangan sendiri di dalamnya.

    1. Keluaran PWM bisa dijadikan pengontrol kecerahan lampu/kecepatan motor dengan driver yang sesuai.
      penggunaan remot infrared (remot tv) juga bisa dijadikan input bagi kontroller (mis arduino)

    1. Dalam kondisi ideal, pompa air tetap bisa nyedot air
      tapi dalam praktek ada faktor lain yang mempengaruhinya, seperti gravitasi, tekanan, massa jenis fluida, efesiensi motor dll

    1. Penyebab stop kontak menjadi panas:

      1. Arus listrik yang lewat melebihi kapasitas stop kontak
      2. Timbulnya percikan api akibat kontak tidak sempurna/adanya lapisan seperti minyak/karatan.
  3. koreksi, dengan modul dimmer robotdyn dan pada dasarnya dimmer AC220V menggunakan metode phase shifting ya bukan pwm 🙂

    1. AC dimmer sebetulnya sangat komplek pembahasannya dibandingkan dc dimmer (chopper)
      seperti modul dimmer Robotdyn ini dengan solid state triac/thyristor lebih dikhususkan untuk beban leading (non induktif) yang di istilahkan forward-phase control (FPC) dimmers.
      namun penggunaan umum lebih dikenal dengan ‘modul ac pwm’.

  4. Kapasitornya dimana yaa? Di rangkaian ada capasitor di module gada? Sama beberapa juga gada? Ane bingung jadinya. Maaf pemula

    1. di halaman ini ada dua topik
      kalo pake modul berarti menggunakan metode zcd (penyalaan berdasarkan titik nol)
      sedangkan
      rangkaian yang menggunakan kapasitor dimaksud itu adalah pwm dengan penyalaan bebas

  5. bro saya pakai 6 lampu pijar 100watt dengan 2 motor menggunakan 8 dimmer dalam 1 Arduino mega 2560 dan memakai 6 sensor dht22 ,tetapi kendalanya outputnya mati ketika memasang sensor ,apakah ada yg tidak sinskron ? mohon pencerahannnya

    1. Koding di halaman ini tidak menggunakan library

      untuk library dimmer sendiri sudah banyak yang publish, tapi saya juga ngga tau mana yang cocok dengan board ac light dimmer

  6. #if defined(__AVR_ATmega328P__)
    # if ((ZCD >= 0) & (ZCD = 8) & (ZCD = 14) & (ZCD <= 19))
    ISR (PCINT1_vect)
    # endif
    #endif

    bro kok gua dibagiian ini ada yang error ya?

    error nya gini bro

    sketch_may10b:52: error: expected unqualified-id before '{' token

    {

    ^

    exit status 1
    expected unqualified-id before '{' token

  7. kang mau tanya, apakah bisa kalau kita ingin mengontrol elemen pemanas dengan modul dimmer seperti diatas ? dan elemen pemanas seperti apa yang mas rekomendasikan ? (elemen pemanasnya akan digunakan untuk di oven)

    1. bisa
      lampu pjar dan pemanas (elemen) merupakan beban yang bersifat resistif
      umumnya pemanas terbuat dari kawat nikelin, bentuk-nya bisa macam-maca (form mica, tubular dll),
      penggunaan dimmer – pemanas => mesti sesuai dengan kapasitas (misal pemanas 2000w mesti penggunakan driver yang lebih besar dari
      2000w)

  8. bro mau nanya

    kalau dari rangkaian ini gw ganti lampunya dengan motor ac, motor exhaust fan bisa ga ya?
    atau harus ditambahin sesuatu kayak snubber circuit gitu atau?

    1. [teori]
      ‘Motor’ bersifat induktif sehingga switching-nya sebaiknya menggunakan snubber
      ‘motor ac’ bergerak berdasarkan frekuensi sehingga penggunaannya harus berbasis frekuensi

  9. Gan, kenapa saat saya compile dengan Board arduino Mega 2560 terdapat eror, sedangkan jika saya compile dengan board arduino uno tidak ada masalah.

    Pesan Error Seperti ini :
    Arduino: 1.8.9 (Windows 10), Board: “Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)”

    Build options changed, rebuilding all
    sketch_jun27a:53:1: error: expected unqualified-id before ‘{‘ token

    {

    ^

    exit status 1
    expected unqualified-id before ‘{‘ token

  10. bang, bagaimana mengatur nilai pwmnya dengan menggunakan keypad. soalnya saya bingung karena ada variabel i nya kemudian berpengaruh tidak apabila kita tidak menggunakan pin zero cross?

    1. ganti saja i dengan nilai/variabel yang diinginkan
      zcd punya peran pada Penyalaan berdasarkan titik nol, tanpa zcd (misal pada koding dihalaman ini) maka trigger-nya tidak terpicu

  11. Bang ini harusnya outputnya gimana ya? apakah lampu dari tingkat kecerahan 1 ke 100 udah itu dari tingkat kecrahan 99 ke 0?
    apakah saya salah memilih lampu? lampu jenis apa yang abang sarankan?

    Soalnya saya nyoba dan berhasil kompile namun tidak ada reaksi apa2 di lampu saya dan wiring pun sudah sesuai diagram di web ini
    untuk lampu saya menggunakan bohlam myled 5W

  12. mau tanya di atas ada #define ZCD di pin 10 namun ada keterangan (A0=14 dan A5=15) maksudnya apa ya mas bagian yang di kurungi?

    1. berarti kita tidak bisa menggunakan pin A0 dan A5 untuk ke 2 kalinya dong. misalnya kita sudah deklarasikan pin A0=14 dan A5=15 berarti apabila kita ingin menggunakan pin tersebut untuk sensor maka tidak bisa ya gan? lalu akibatnya apa gan apabila digunakan untuk fungsi lain?

  13. Kalau cara mengetahui yang mana lampu yang dimmable dan yang mana yang non dimmable bagaimana caranya ya Bang?

  14. Maaf, saya baru mecoba lagi Bang dengan bohlam yang dimmable namun masih belum bisa (setelah kode diupload ke arduino uno lampu tetap dalam keadaan mati), Apa yang harus saya lakukan ya Bang?

  15. permisi mas, kalau mau mengendalikan dimmer menggunakan lampu (pemanas) dengan input dari sensor suhu (DHT11).
    dimmer nya kan dari 0-128 mas, misalkan ;

    if suhu 28 then dimmer = 30,
    if suhu 30 then dimmer = 90,
    if suhu 32 then dimmer = 120.

    supaya otomatis, gimana tu mas . .
    mohon, penjelasannya mas, trims . . .

  16. Bang, ini kenapa yak ? pas saya coba complie sketch code nya error di bagian ini

    ISR (TIMER2_COMPB_vect)

    bunyinya gini

    dimmer_ac:77: error: expected constructor, destructor, or type conversion before ‘(‘ token

    ISR (TIMER2_COMPB_vect)

    ^

    dimmer_ac:83: error: expected declaration before ‘}’ token

    }

    ^

    exit status 1
    expected constructor, destructor, or type conversion before ‘(‘ token

  17. Permisi bang, mau bertanya. Saya sedang meneliti tentang FPC dimmer. Apakah ada referensi yang membahas lebih rinci tentang FPC dimmer ini bang ? Mohon pencerahannya. Terima kasih sebelumnya

    1. dimmer leading edge / forward phase control adalah tipe dimmer untuk beban yang umum, saya rasa sudah banyak yang bahas
      kalo di artikel ini hanya teori aplikatif untuk arduino

    1. kak, kalo kita hanya menggunakan pin pwm nya saja tanpa menggunakan pin zcd-nya apakah bisa digunakan untuk membuat dimmer ac kak? kalo bisa bagaimana caranya? teimakasih…

    1. Raspberry bisa menghasilkan sinyal PWM (dengan library yang sesuai)
      sinyal zero cross berupa digital 0v dan 3.3/5V, pembacaannya sama seperti sinyal digital biasa

      catatan : timing raspberry kurang stabil untuk kontrol perangkat seperti PWM

  18. kalau pakai arduino mega dan diganti pin di timer 3 pin digital 2 untuk ZCD dan pin 3 untuk PWM. Berarti coding yang diubah bagian mana saja ya? Terimakasih

    1. pin pwm timer 3 boleh di pin digital 2,3,4

      zcd di mega hanya pada batas pin-pin ini:
      # if ((ZCD >= 50) & (ZCD < = 53)) || ((ZCD >= 10) & (ZCD < = 13)) # elif ((ZCD >= 14) & (ZCD < = 15)) # elif ((ZCD >= A8) & (ZCD <= A15))

  19. Pak mau nyanya, kalo modul robotdyn tersebut tidak dipakai pin zero cross nya apa masih bisa mengatur intensitas lampu 220v dengan pin Pwm saja ?

  20. Saya menggunakan atmega8535 , bingung bagaimana cara memprogram pin zero crossing nya, saya cari cari tidak ada yang buat tutorial nya …
    Yang ada hanya zero crossing pada arduino…
    Mungkin bisa bantu saya bagaimana cara memprogram zero crossing pada atmega8535..

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.