DISCLAIMER : Bermain dengan listrik PLN 220 volt adalah berbahaya, selalu gunakan sarung tangan kain untuk menghindari terjadinya sengatan listrik
Gambar diatas adalah perubahan sinyal yang ingin kita capai untuk mendeteksi yang dinamakan Zero crossing dari gelombang sinusoidal listrik AC. Perhatikan gambar rangkaian berikut dan akan saya jelaskan prinsip kerjanya.
- Resistor 47K berjumlah 2 buah sebagai pembatas arus sehingga dapat bekerja pada tegangan AC yang dapat ditolelir oleh dioda bridge
- Dioda bridge berfungsi untuk menjadi rectifier merubah sinus menjadi full wave rectified AC dimana saat sinus berada di tegangan negatif akan dibalik menjadi positif
- Optocoupler yang dipilihkan bisa berjenis 4N25 / PC817 yang kemudian akan mendeteksi ketika sinyal sinus berada disekitar 0 volt yang menyebabkan led internalnya OFF
- Resistor pull up 10K akan menyebabkan kondisi logic ZCD = 0 saat LED ON dan ketika LED OFF (pada optocoupler) maka akan menyebabkan pulse pada output ZCD yang menuju microcontroller.
- Interupt pada ESP8266
ESP 8266 memiliki kecepatan prosesor yang cukup tinggi bila dibandingkan seri arduino, sehingga portnya kebanyakan dapat digunakan sebagai input interrupt. Jika menggunakan arduino uno berbasis mega328 maka pin interruptnya hanya ada di pin I/O nomer 2.
Untuk belajar konsep interrupt dapat dibaca pada tulisan saya sebelumnya disini.
Ada yang spesial pada interrupt di ESP8266 dimana function untuk melakukan interrupt harus disediakan di RAM, sehingga jika menggunakan contoh pada arduino akan terjadi overflow dan ram akan error. Untuk itu dibutuhkan penambahan ini :
ICHACE_RAM_ATTR void perintah_zcd()
{
// masukkan perintah eksekusi interupt jika memakai sketch jadul
}
IRAM_ATTR void perintah_zcd()
{
// masukkan perintah eksekusi interupt jika sketch 3.o keatas
}
Jadi script contoh yang lengkap untuk pendeteksi Zero Crossing sebagai berikut:
#define zcd_pin 3 //sesuaikan dengan pin esp kamu
int x = 0;
void setup() {
Serial.begin(9600);
pinMode(zcd_pin, INPUT_PULLUP);
attachInterrupt(zcd_pin, deteksi, FALLING); // attach Interrupt
}
void loop() {
}
ICHACE_RAM_ATTR void deteksi()
{
x++;
Serial.print("ZCD terdeteksi ke: ");
Serial.println(x);
}
0 komentar:
Posting Komentar